1 :
デフォルトの名無しさん :
04/11/26 21:49:00
2 :
デフォルトの名無しさん :04/11/26 21:49:42
3 :
デフォルトの名無しさん :04/11/26 21:50:28
4 :
デフォルトの名無しさん :04/11/26 21:51:02
5 :
デフォルトの名無しさん :04/11/26 21:52:01
6 :
デフォルトの名無しさん :04/11/26 21:52:34
7 :
デフォルトの名無しさん :04/11/26 21:53:19
8 :
デフォルトの名無しさん :04/11/26 21:54:20
9 :
デフォルトの名無しさん :04/11/26 21:56:14
あ"ー
あ"ー
あ"ー?
あ"ー
STLつかうと一気に実行ファイルサイズが10倍に?!
1天乙
>>13 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
屁
>>15 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
>>19 #include <stdafx.h>
後死ね。
>>21 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
ここは人工無能のいるスレでつか?
26 :
デフォルトの名無しさん :04/11/26 22:50:18
age
伊能四郎のような感じですか?
珍子産む嚢
29 :
デフォルトの名無しさん :04/11/27 01:00:31
真・スレッドストッパー。。。( ̄ー ̄)ニヤリッ
真・スレッドリジューマー。。。( ̄ー ̄)ニヤリッ
初めてみたw
どっちが本刷れ?
>>33 時間的にはこっちが本スレ。
ネタスレ用にされた方は削除依頼してほしいんだけど。
このスレ一回ageた方がいいのかもしれん。
前回に続き重複か。 今後は宣言してから建てるようにしてくれや。
36 :
デフォルトの名無しさん :04/11/27 10:45:33
age
下のコードなんですが、なんとか一時オブジェクトを作らずに済ます方法は無いでしょうか #include <iostream> #include <list> class Destroy{ char* name; public: Destroy( char* new_name ){ name = NULL; setName( new_name ); } Destroy( const Destroy& destroy ){ name = NULL; setName( destroy.name ); } ~Destroy(){ delete [] name; std::cout << "デストラクタが呼ばれました" << std::endl; } void setName( const char* new_name ){ if( name ){ delete [] name; } int size = strlen(new_name); name = new char[ strlen(new_name)+1 ]; strcpy( name, new_name ); } }; int main(){ std::list<Destroy> list_destroy; list_destroy.push_back( "Hage" ); std::cout << "--------終了--------" << std::endl; return 0; }
Destroyへのポインタを格納するようにするとか。 ただそれするとリストを使う意味があるかどうかという問題が。
>>39 ありゃ、それしか無いんですか。
ポインタで持つのは良くやるのですが、仰るとおりで、終了時に一々deleteが
必要で面倒なんですよね。面倒というかなるべく危険は避けたいというか。
まぁ、しょうがないので一時オブジェクト有りで…レスありがとうございました。
>>40 >終了時に一々deleteが必要で面倒なんですよね。
スマートポインタ
counted pointer を copy-on-write で
43 :
デフォルトの名無しさん :04/11/27 21:19:07
テンプレートクラスにBridgeパターン、もしくはpimplイディオムで、インターフェースと実装を分離したいのですが、どうすればいいのでしょうか。 当たり前なんですが、以下のようにするとエラーです。 // Test.h class Test_impl; template<typename T> class Test { Test_impl<T> *pImpl; public: Test( void ); ~Test( void ); void Set( T data ); T Get( void ); };
// test_impl.cpp #include "test.h" template<typename T> class Test_impl { T p; public: Test_impl( void ){} ~Test_impl( void ){} void Set( T data ){ p = data; } T& Get( void ){ return p; } }; template<typename T> Test<T>::Test( void ) { pImpl = new Test_impl<T>; } template<typename T> Test<T>::~Test( void ) { delete pImpl; }
Getが参照返してるのは見なかったことにして下さい……。
>>43 Test_implの前方宣言にもtemplate<typename T>を書けばコンパイルは通ったけど?
>>43 // Test.h
template<typename T>
class Test
{
class Impl;
Impl *pImpl;
// test_impl.cpp
#include "test.h"
template<typename T>
class Test<T>::Impl
{
48 :
デフォルトの名無しさん :04/11/27 23:00:31
あ、忘れてました。 コンパイルは通ると思いますが、実際に宣言すると、外部参照でエラーがでるかと思います。
#include "test.h" int main( void ) { Test test; // !エラー return 0; }
しょせんプリプロセッサだから。
Test<T> が TestImpl<T> をnewするため、TestImplの定義以降に、Test<T> のコンストラクタを定義しないといけないんですが、テンプレートクラスなんで、出来ないんですよね、、、
まさかリンクしてないだけ
あれだ。「explicit instantiation」
clsss Test test; だったりして・・・
>>52 export が使えない以上、test_inst.cpp を作って、
// test_inst.cpp
#include "test_impl.cpp" // cpp は変えたほうがいいかも
template class T<int>;
template class T<char>;
エラーが出なくなるまで explicit instantiation を並べるしかないんじゃない?
>>56 ありがとうございます。この方法でいきたいと思います。
規格書丸暗記した。もう俺にC++に関して分からないことはない。
ごめんうそついちゃった。今がんばって読んでます。
規格書、印刷しようと思っても紙代も馬鹿になんないな… 本とか出てるの?本買った方が安いかも。
>>61 ANSI/ISOとJISで差異とかあります?ないなら日本語だし願ったり叶ったり
なんですが。
ありがとう。でも高いー。
サソクス
67 :
デフォルトの名無しさん :04/11/29 00:13:24
>>63 www.jsa.or.jp へ行くと、内容の同一性についてもはっきり区分わけしてあるよ
>IDT: identical(一致) >以下の場合、地域又は国家規格は国際規格と一致している。 > a) 地域又は国家規格が、技術的内容、構成及び文言において一致している。又は、 > b) 地域又は国家規格が、ISO/IEC GUIDE 21の4.2節に規定した最小限の編集上の変更はあるが、技術的内容において一致している。「逆も同様の原理」があてはまる。
69 :
デフォルトの名無しさん :04/11/29 03:44:04
今時紙に印刷されたものを読もうなんてださいな。
71 :
デフォルトの名無しさん :04/11/29 03:51:06
72 :
デフォルトの名無しさん :04/11/29 12:56:47
VC++で計算した数値を引数で表示したいんですが、printfで表示されません。だからMessageBoxを使って表示したいんですがエラーがでます。どうしたらいいんでしょうか?どなたか分かる人教えてください。
>>72 言ってることがわかりません。
コードとエラーメッセージをコピペしてください。
74 :
デフォルトの名無しさん :04/11/29 13:49:31
> 分かる人教えてください。 と書いてあるんだから分からない人は黙っていろよ。
おまえもな
コードです。 int delta_time=final_time-initial_time; MessageBox(hwnd,delta_time,"時間",MB_OK); エラーメッセージは 'hwnd' : 定義されていない識別子です。 hwndをこのコードの前に HWND hwnd; と宣言するとこのエラーがでます。 'MessageBoxA' : 2 番目の引数を 'int' から 'const char *' に変換できません 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です と表示されます。 誰か分かる人教えてもらえると助かります。
>>77 MessageBoxは文字列しか受け付けない。
文字列へ直せ。
MessageBox(NULL, _itoa(delta_time), "時間", MB_OK);
79 :
デフォルトの名無しさん :04/11/29 22:25:53
〜〜file1〜〜 〜〜file2〜〜 datax1 datay1 datax2 datay2 datax3 datay3 って感じでデータが並んでいるファイルがいくつもあって、それを5つごとに 決まった順番で一つのファイルにまとめたいです。データを順番に並べたんですが どんどん書き出していくと、file1とfile2と…の間に1行空行ができてしまいます。 具体的にどういうプログラムを書いたかというと ifstream ifs; ofstream ofs; char datax[20],datay[20]; ifs.open(file1); ofs.open(outputfile) while(!ifs.eof()){ ifs >> datax >> datay; ofs << datax << " " << datay << "\n"; } ifs.close(); ifs.open(file2); while(!ifs.eof()){ ifs >> datax >> datay; ofs << datax << " " << datay << "\n"; } ofs.close(); って感じです。実際はfile1、file2と指定するのにループとか使ってるけど。
空行があると、その後の処理がまた面倒になるので、空行は 入ってほしくないんですが、このプログラムでおかしいところって ありますか?
ttp://namazu.org/~satoru/unimag/9/ ここのHPのテキスト "abracadabra" の Suffix Array を作成する C 言語のサンプルプログラムのソースを
VC++6.0でビルドするとerror C2440: 'initializing' : 'void *' から 'int *' に変換することはできません。とエラーが出ます
どうにかならんもんでしょうか?
C++ではなくCとしてコンパイルする。 「C言語のサンプルプログラム」って、てめーで書いてるじゃねーか。
VC++6, 7.1で、デストラクタを呼び出すときに、 クラス名でなく、変数名を使えるんですが、正しい仕様ですか? g++ではコンパイルがとおりませんでした。 //以下コード struct C { C(){cout << "C" << endl;} ~C(){cout << "~C" << endl;} }; int main() { C c; new(&c) C; c.~c(); } //以上コード //以下出力 C C ~C ~C //以上出力
86 :
困りました :04/11/30 14:03:26
VC6 で、最頻値の平均を計算するテンプレート関数を作りました。 /** * Calculate average of mode elements (most frequently appearing elements). * @param cont Container of numeric values. * @return Mode average. */ template<typename Cont> Cont::value_type ModeAverage(const Cont& cont) { typedef map<Cont::value_type, int> ValueCounter; ValueCounter counter; // Count up value furequency and get max frequency. int maxFreq = 0; { Cont::const_iterator it; for (it = cont.begin(); it != cont.end(); it++) { int& c = counter[*it]; c += 1; maxFreq = MAX(maxFreq, c); } }
87 :
困りました :04/11/30 14:03:45
// Sum up container element of the max frequency. Cont::value_type sum = 0.0; int sumCount = 0; { ValueCounter::const_iterator it; for (it = counter.begin(); it != counter.end(); it++) { if ((*it).second == maxFreq) { sum += (*it).first; sumCount++; } } } return sum / sumCount; }
88 :
困りました :04/11/30 14:04:10
// Sum up container element of the max frequency. Cont::value_type sum = 0.0; int sumCount = 0; { ValueCounter::const_iterator it; for (it = counter.begin(); it != counter.end(); it++) { if ((*it).second == maxFreq) { sum += (*it).first; sumCount++; } } } return sum / sumCount; }
89 :
困りました :04/11/30 14:04:48
ごめんなさい。2重送信してしまいました。。。
90 :
困りました :04/11/30 14:05:37
上記の関数をテストする関数を書きました。 // test ModeAverage { double data[10] = { 2.0, 1.0, 2.0, 5.0, 3.0, 4.0, 5.0, 2.0, 5.0, 4.0 }; vector<double> v; for (int i = 0; i < 10; i++) { v.push_back(data[i]); } double ave = ModeAverage(v); double must = (2.0 + 5.0) / 2; ASSERT(DOUBLE_EQUAL(ave, must, 1.0e-100)); }
91 :
困りました :04/11/30 14:06:19
このテストが、アクセス違反を起こします。 原因は何が考えられるでしょうか?
ここは宿題スレじゃないよ
すいません、 int& c = counter[*it]; の前に if (counter.find(*it) == counter.end()) { counter.insert(ValueCounter::value_type(*it, 0)); } を入れたら正常動作しました。 でもおかしいですね。 map の [ ] は自動的に要素を追加してくれるはずなのに。。。
cout<< (1==0)?'a':'b'; うんこ
識者の方にお伺いをしたく思います。 スレ違いかもしれませんが・・・ VC++6.0でCreateFileでCOMポート開いて、通信速度を 1bpsに設定して、オシロスコープで波形観測してみますた。 本当は、通常のCOMポートって、デバイスマネージャ等で設定 できる値以外にどんな値がセットできるかを確認するうえでの プログラムをしたのですが、幸い1bpsに関してもポート設定 ができましたもので、ならばこの糞遅いボーレートの観測を してやろうと思いまして。 しかし、です。どうみても1秒間隔でビットが送られているように みえません。送ったデータは&hAAで、ビット的に10101010となる ものです。つまり、ハイ・ローの間隔が1秒毎にしたわけです。 擬似的に1bpsが実現していて、ハードウェア的に1bpsは実現して なかったということでしょうか?
誤爆?
ネタ?
釣り?
結論:スレ違い。
100 :
デフォルトの名無しさん :04/12/02 00:30:24
自分で確保したメモリ領域に対して、あるクラスのコンストラクタをコールすることは出来ないのでしょうか?
>101 ありがとうございます。下記コードを試してみたところ、再定義されましたとエラーが出ました。 void* operator new(size_t size, void* p) { return p; } どこかで定義されているだろうと思い、以下のテストコードを試してみましたが、エラーが出てしまいました。 ・・・ int i[32]; int *pi = new(i) int; } 環境はVisualC++2002です。何か根本的な間違いをしているのでしょうか?
自己解決しました。 #ifdef _DEBUG #define new DEBUG_NEW #endif が原因でした。お騒がせしました。
今プログラミング言語C++の例外処理のところを読んでいたら explicit auto_ptr (X* p = 0) throw() { ptr=p; } という記述が出てきたのですが、このthrow()とはどういう意味なのでしょうか? 前後を読んでみても何も説明がないようなのですが。
「例外を投げるかもしれない関数です」という意味です
>>105 P440に書いてありました。
ありがとうございました。
throw(e1, e2) は e1 , e2 型、それから派生した型のどれかが投げられる可能性があるという意味 なにも例外を投げない時は throw() と書く
可能性で言い出したら、 std::exceptionとその派生がスローする可能性をどう扱うべきなのかと言う点で ザルのような仕様だよね。
111 :
デフォルトの名無しさん :04/12/02 12:22:02
一つのクラスが記述されたcppファイルがただいま251KBなのですが、 これってどうでしょう、大きすぎますか? 一応コンポジット関係にあったクラスすら、他のファイルに切り分けたのですが それでもこの結果です。 些末ですし、普段ならさほど気にならないのですが、 オープンソースにしなければで・・・恥かきたくないなぁ。
いっそさっさとオープンにして、その判断を任せればいいんでは? 恥ったって、バージョン上がるごとに過去のソースは恥ずかしく思えるだろうし(たぶん) むしろその恥を隠すために更新が滞らなくなれば尚更(・∀・)イイ
>>112-133 ぶっちゃけ開発放棄のためのオープンs…ゴッホゴッホ
確かに内容にもよりますし、中見ないことには判断出来ないですよね。
レスありがとうございました。
ブランクの何にも書いてないただのウィンドウを作ってみたところ、 一回目だけちゃんとえらーが出ずに窓が開けたんですが、 二回目以降はプロセスにとどまったまま開かず、数回コンパイル>ビルド を繰り返したところ、 DebugLINK : fatal error LNK1168: cannot open Debug/Win.exe for writing というメッセージでコンパイルすらできなくなり、そしてまたビルドしたら開かず、コンパイルはまたできるようになって。 一応ネットで模範のコードを2つと、本に書いてあったコード全部試してみて 同じ結果だったので、作り方に問題があるとは思えないけど。。。 プロセスを強制終了させてまたビルドし直しても、またプロセスに留まるだけ。。 これは仕様なの?
>>115 PostQuitMessageしてないと超予想
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } こんな感じでPostQuitMessageしてるよ。
>>115 たぶん仕様です。
115が「そういう動作をするコード」を書いたので、C++コンパイラやらOSやらは
正しく仕様どおりにそういう動作をしている、ってこと。
C++は不特定多数で開発するオプソには不向き。 中心となる人が優れていて、最初の公開の段階で ある程度見通しがいいものならいいんだけど。
じゃぁある程度見通しがたっていなくともC言語なら開発しやすいわけ?
>>120 クラス名とかメソッド名の名前付けのセンスがあわない時に泣きたくなる位じゃないかと思うがなぁ。
仕事ならなんとかなるけど、好きで作ってる物でかち合うと悲しいんだよなぁ。
ひととおり動くβ版ができてから公開ってのがいいかもね。 設計段階からオープンにするとたしかにしんどそう。
ぶっちゃけ、オープンソースで開発しようったってコード書くやつなんか
限られてる。特に動かないうちなんか興味を持たれることすらまずない。
逆に動かないものを公開するとそれっきりになる危険すらある。
なので、
>>122 に賛成。
設計から付き合うやつなんて、まずいないって。
>>123 まぁ、知合い同士でわいわいする為のネタ。
125 :
デフォルトの名無しさん :04/12/03 01:11:15
よく、クラスで演算子を定義する時には、 「+」の処理で、あらかじめ実装しておいた「+=」を使えばいいとか聞くけど、 なぜ「+=」の処理で「+」を使うようにしないの? 「+=」は、「a=a+b」を「a+=b」という風に簡略化して書くためにあるものだから、 「+」を先に実装するもんだと思うんだが……。 別におかしいと言ってるわけじゃないんだけど、何か理由があるのかと気になる。
+=は代入先のオブジェクトがあるので、テンポラリオブジェクトなしで 演算を終えることができるため。
128 :
ほんたま :04/12/03 07:09:41
プログラマーのみなさん、教えてください。 ひとつのオブジェクトを2つに分裂させるコードを書きたいのですが、どう書けばいいのですか? 擬似的に2つに分裂したように見えるのではなくて、実際に2つに分裂するコードを書きたいのです。 つまり1つから2つのオブジェクトが同時に発生し、2つのオブジェクトの発生にはほんの少しの時間差もないという、事実上の分裂を書きたいのですが…
↓何事もなかったかのようにC++相談室をお送りします。
130 :
デフォルトの名無しさん :04/12/03 12:03:05
点のリスト PointList を作りました。 struct Point { double x, y, z; } typedef vector<Point> PointList; ここで PointList 内の点を列挙することは簡単です。 イテレータを使えばいいです。 PointList points = ...; PointList::const_iterator it; for (it = points.begin(); it != points.end(); it++) { ... } では、PointList 内の x 座標を列挙するするイテレータを 作るにはどうしたらよいでしょうか? 列挙するだけであれば、点を列挙して .x をとればいいですが、 x だけを列挙するイテレータがほしいのです。 x_iterator it = ...; double x = *it; このようなイテレータを簡単に作ることはできるでしょか? イテレータ クラスを自分で書くしかないですか?
PointList::const_iterator it; ... it->x ...
boostのiterator_adaptorでも使えば?
ありがとうございます。やっぱり boost ですか。 これぐらいは C++ 標準で用意してほしいですよね。
>>133 文句はC++標準化委員会に言って下さい。
ここはお前の日記じゃねーんだ。
135 :
デフォルトの名無しさん :04/12/03 21:54:49
技術的に反論できねーカスがスレの存在意義を否定してるんじゃねえよ (プ
137 :
デフォルトの名無しさん :04/12/03 22:24:31
>>136 あ? 何だお前、それで勝負でもしてたつもりだったのか? (プゲラ
>>137 それで技術的な反論のつもりですか?
「はい」ならあなたは完璧に負け犬、「いいえ」なら頭の悪い厨確定ですね ;-)
冬厨が湧くにはまだ少し早いと思うのだが。
140 :
デフォルトの名無しさん :04/12/03 22:43:59
┌───────────────────┐ |致命的なエラー [×]| ├───────────────────┤ |質問者は致命的なエラーを抱えています。 | | .| |スルーしますか? | | [ はい(Y) ] [ いいえ(N) ] | └───────────────────┘
秋は唯一厨の沸かない季節だと誰が決めたんだろう
142 :
デフォルトの名無しさん :04/12/03 22:56:35
>>138 お前の脳内で確定されても痛くもかゆくもない
スコープの概念が見えてないアフォが煽ったつもりらしいがw
143 :
デフォルトの名無しさん :04/12/03 23:34:50
マジレスで失礼するが、 そう口論は感情を抑えて早く離れるべき。
144 :
デフォルトの名無しさん :04/12/04 11:32:33
void myStrcpy( char* a, char* b){ while (*a++ = *b++) ; } これで、++は、何を増加させてるのですか? a,bはCharだから、アスキーコードを考えて、アルファベットが一文字ずつ上がっていくってこと? この関数もBodyって、whileの部分だけだよね? ってことは、これ、いつこのループは、終わるんでしょう。。。
ポインタの勉強しろ。それで解決する。
>>144 ++はデリファレンスよりも優先順位が高いから、
*a++ は *(a++) と同じ。
ポインタをインクリメントしてから参照してる。
(後置だから参照してからインクリメントが正しいか)
文字列の終端に来たら *a == 0になってループを抜ける
>>144 Cスレ逝けよ。C厨の方がポインタをずっと親切に教えてくれるから。
だって a++,b++,!C++ だもんね!
149 :
デフォルトの名無しさん :04/12/04 14:42:17
>>147 唐突に別の言語の話をはじめて ( ゚д゚)ポカーン されるJ厨等と同類
>>149 ( ゚Д゚)ハァ?C++だから当然Cのポインタも含んでいるけど、
>>144 の質問はどう考えてもCのスレの方がお似合いだろ。
空気読め池沼。
151 :
デフォルトの名無しさん :04/12/04 15:18:04
>>150 思いこみの激しい人だな。
C は別の言語だ。 C++ じゃない。
似ていようがいまいが、それはあくまで与太話でしかない。
ここはム板だ。技術的な話はドライなスタンスが基本であることは言うまでもない。
>>151 じゃあCがC++と「別の」言語だと捉えている貴方に質問しますが、
>>144 の
質問はC++で常に答えてやった方がいいと思うのか?
>>146 ==
>>151 だと思うが、別に
>>146 を俺は叩いたつもりは無いはずだが、
もしかして被害妄想か?
153 :
デフォルトの名無しさん :04/12/04 15:42:48
>>152 俺は 151 だが 146 ではない。
いいもへったくれもない。
単に C++ の話であり、他のどの言語の話でもない。
>>153 は池沼。
単なるchar型へのポインタの話でさえCとC++は全く違っていて、互換性の
ある説明は出来ないと思いこんでいるバカ。
155 :
デフォルトの名無しさん :04/12/04 15:46:52
>>154 C++ のポインタについて聞いている人に C のポインタの答えをするトンマが泣いてるよ
もちろんCスレに行けば適切に答えてくれるだろうが、 正しいC++の質問をわざわざ誘導するのはどうかと思うぞ。
>>155 もういいよ。アホの相手をするのは疲れた。
>>156 そしたらCの質問をあたかもC++の質問のようにする厨が多量に流入しても
お前は答えてやるつもりなんだな!?そしたらもうC専用スレの存在意義が
(100%ではないが95%ほどは)なくなるね。
160 :
デフォルトの名無しさん :04/12/04 15:53:39
>>160 釣りなら海に行ってしてくれ。今日は天気が悪いから釣れないだろうがな
>>158 最初にそう断ってからから誘導すれば、荒れずにすんだと思われることが多々ある。
>>158 >そしたらCの質問をあたかもC++の質問のようにする厨が多量に流入しても
>お前は答えてやるつもりなんだな!?
Cの質問かC++の質問か区別できない場合には、そうする。
>そしたらもうC専用スレの存在意義が
>(100%ではないが95%ほどは)なくなるね。
そうか?いずれC++を学ぶにしてもCから始める
学習者は多いと思うが。
本人がC++を学んでいるつもりであれば、C++スレに質問するだろう。
そういう場合に、内容がCと重複しているからといって、Cスレに誘導するのは、
独立した言語のスレとしてどうなんだろう、といいたい。
>>163 >そうか?いずれC++を学ぶにしてもCから始める
>学習者は多いと思うが。
だったらなおさらの事、CとC++で重複している質問はCスレへ誘導してやれよ。
このスレの過密化を防ぐためにわざわざ独立スレとして立ててるんだろ。
>>162 それぐらいは空気読んでわからんか?頭が悪いね。
>>144 当分の間はこれと同じことをしていると思えばいい。
void myStrcpy(char* a, char* b) {
while (1) {
*a = *b;
if (*a == '\0')
return;
a++;
b++;
}
}
>>144 void myStrcpy( char* a, char* b){ while (*a++ = *b++) ; }
↓
void myStrcpy( char* a, char* b){ do { *a = *b; a++; b++; } while (*a) ; }
このスレは池沼の住処だから、これ以上のことはCスレで訊きんしゃい。
ちなみにこのコードは空文字が与えられた時の挙動がダメダメってことと
>>144 もすぐに挙動が分からなかったように可読性も悪いコードとして
有名だから真似はせんようにね。
>>167 >このコードは空文字が与えられた時の挙動がダメダメ
下のほうのことだよね?
169 :
デフォルトの名無しさん :04/12/04 16:52:09
この++って、*aと*bが格納されてる場所のアドレスが増えてるってことだよね? つまり、Bodyにカウントをつけたとしたら、 最初与えられたアドレスから連続していくつ、そのメモリが使われてるか分かるってこと?
>>169 そうじゃなくて*a = *b;を行っているから文字列のコピーだよ。関数名見ろ。
このスレには
>>167 みたいな低脳しかいないのですか?
174 :
デフォルトの名無しさん :04/12/04 17:11:51
167はいつもCスレを荒らしているC++厨
>>167 めっちゃ恥ずかしいなお前。人の事を池沼呼ばわりしておいて、
自分が池沼と言われても仕方ないようなレス書いて。
>175 >めっちゃ恥ずかしいなお前。人の事を池沼呼ばわりしておいて、 >自分が池沼と言われても仕方ないようなレス書いて。 池沼の住処とは自分の事を指していたのでは?
池沼って誰のことですか。
178 :
デフォルトの名無しさん :04/12/04 17:42:47
144=167のこと。
179 :
デフォルトの名無しさん :04/12/04 17:55:32
>このスレの過密化を防ぐためにわざわざ独立スレとして立ててるんだろ。 これは初耳
180 :
デフォルトの名無しさん :04/12/04 17:55:52
166さんありがとう。 当分の間はこれと同じことをしていると思えばいい。 void myStrcpy(char* a, char* b) { while (1) { *a = *b; if (*a == '\0') return; a++; b++; } } if (*a == '\0')って、if (*a == '\0'||*b == '\0')じゃなくて?
181 :
デフォルトの名無しさん :04/12/04 17:59:42
*b++は何を表してる?って聞かれたら。。。 低脳なの、承知です。 プログラム初めてなもので・・・。 すいません。
池沼・・・
>>181 *a に *b を代入しているので、片方を0と比較すればもう片方はその必要がない。
184 :
デフォルトの名無しさん :04/12/04 19:19:13
質問です。 arrayに入ってる中身の順序を逆さに並び替えたいんだけど、 追加のstrageなしでってことで、XORを使おうとしてるんだけど、 XORがいまいち、よく分からないのです。 reverseOrder(array[]);の定義なのですが・・・。
必殺!「いまいちよく分からない」!
186 :
デフォルトの名無しさん :04/12/04 19:23:36
184です。解決しました。
お前の言いたいことがよくわからんが、逆さはとりあえずこれで出来るぞ #include <algorithm> const int N = 10; int array[N]; std::reverse(&array[0],&array[N]);
「C++の前にCを学ぶべきか」っていうスレが必要だな
189 :
デフォルトの名無しさん :04/12/04 19:28:55
>>184 宿題スレで聞いたほうがいいと思う。
なぜなら質問点を明確にできていないから。
(xor について独り言)
神話に出てくる大先生の本にさえ「驚くべき」とか書いてあることを
ノーヒントで放り出す教授の意図はいったい・・・
大学の存在意義がここにあるわけだが
>>189 もったいつけずに言いたいことを言ってくれ。
どうせ「トリッキーなコード その2」の44だろ?
どうもです。
ズン!!
195 :
デフォルトの名無しさん :04/12/06 17:52:54
1 "hogehoge" "hage" 123 //int 文字列 文字列 int 2 "hige hige" 456 //int 文字列 int 3 "hegehege" "hage" 789 //int 文字列 文字列 int こういう既存のtxtファイルがあるのですが、1や3の様にhageてる場合と 2の様にhageが無い場合があるんです。 STLでこれを、区別して読むにはどうすれば良いのでしょうか。 またhige higeの様に間にスペースが入ってしまう時にも ""内を一息に読み込む方法はあるのでしょうか。 いまは終端の"が無ければ一回読み込み、結局strcatで連結しています。
書き忘れすいません hageは例でして、必ずhageという文字列とは限らないんです
197 :
デフォルトの名無しさん :04/12/06 18:02:12
>>195 それはSTLの問題ではないだろ。
読み込みパーザを書きなさい。
>>195 STL?std::ostream_iteratorでも使うって意味か?
std::ifstreamの間違いじゃないの?
しまったSTLは取り消します。仰るとおりstd::fstreamです。 あるいは読み込み区切り文字を変えたりして 簡単に出来ないかなと思ったのですが、やはりこの辺は細かくやらなきゃなんですか。 となるとあまり恩恵も感じられないし、、 fgetsに戻りたくなりますねぇ。レスサンクスでした。
std::getline()で一行をstd::stringに読み込み、それをstd::stringstreamに ぶち込んで、1や3を前提として読んで、エラーが起きればclear()して seekg()で先頭に戻し、2を前提で読み込む。
>>200 ありがとうございます。
そうかそこだけ別streamに取って無理矢理エラーを出させれば良いのか。
感謝です。
while(getline(ifs,line)){ escaped_list_separator<char> sep(''\\,' '); tokenizer<escaped_list_separator<char> > tok(line,sep); tokenizer<escaped_list_separator<char> >::iterator it = tok.begin(); ・・・ }
正規表現で一番速いライブラリはどれだと思う?
pcre
boost::regex は?
今読んでる本に組み込み型ってあったんですけど、 これって std::complex 等標準クラスも含まれるんですか? それとも int, char long 等だけですか?
C++の場合はPODと言った方がいいかもな。
質問ですunsorted list(ソートされないリスト)で ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┛ と配列が渡されたとき、「75」を挿入すると ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃75┃ ┃ ┗━┻━┻━┻━┻━┻━┛ となるので正しいですか?? また、 ┏━┳━┳━┳━┳━┳━┓ ┃10┃53┃24┃35┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┛ から53を削除した場合、リストはどの様に並びますか? よろしくおねがいしますm(_ _"m)
>>208 unsorted listでは何を指すかわからない。もっと具体的に書こう。
もし、std::listならば、
>>208 で正しい。
単に削除と書かず、具体的に実行した関数(erase()など)を添えよう。
>>206 std::complex<>は標準ライブラリによって定義されているので
組み込み型とは言わない。
組み込み型とは、言語によって定義されている、bool, int, char,...の事。
>>207 PODはまた別の概念。たとえば
struct point{int x,y;};
はPODだが組み込み型ではない。
PODって英語で言うと何の略だっけ? いや意味は分かるんだけど、英単語がどれか迷う ネタフリじゃないよ
Plain Old Dataじゃなかったか
>>213 おおサンクス!胸のつかえが取れたよ
よもやネタ無しでレス頂けるとは
上島竜平が「絶対に押すんじゃないぞ」と言っていたら、 本当に押されなかった様な哀愁を感じる
意地が悪いな(w
あるクラスのメンバ関数を(明示的に)インライン化しようと思って 定義をソースファイルからヘッダに移したのですが、 その関数の中で使われているクラスが"認識できない型"と言われ コンパイルできなくなってしまいました。 明示的インライン化を行うときは何か特別な手続きが必要なのでしょうか?
218 :
デフォルトの名無しさん :04/12/09 16:11:57
age
>>219 はい、さすがにincludeはしてます
>>220 あやしい…
ソースファイルでincludeしたもの全部インクルードしてもそうなる?
ソース見ないとワカラン
223 :
デフォルトの名無しさん :04/12/09 16:33:24
ソースはこんな感じです (改行が多いといわれたのでメンバ変数を省略しました) GetEdgeToのなかでEdgeクラスが見つからないと言われてしまいます #include "CommonInclude.h" #include <list> #include "boost/numeric/ublas/vector.hpp" #include "Edge.h" using namespace std; class Edge; class Vertex { public: Edge *GetEdgeTo(Vertex *vertex); protected: void SetPoint(vector<precision> *point) {this->point = point;} void SetEdgeList(list<Edge> *edgeList) {this->edgeList = edgeList;} private: list<Edge> *edgeList; }; inline Edge *Vertex::GetEdgeTo(Vertex *vertex) { for (list<Edge>::iterator itr = edgeList->begin(); itr != edgeList->end(); itr++) { Vertex *head = (*itr).GetHead(); if (head == vertex) return &*itr; } return NULL; }
>>223 Edge.hの中でEdgeクラスが定義されてるなら
class Edge; ←これを消してみれば
225 :
デフォルトの名無しさん :04/12/09 16:37:05
additional storage 使わないでスワップするときって、int型ならXOR使ってっていうのは、 分かったんだけど、doubleとか char の場合ってどうするか分かりますか?
>>224 Edge.hの中でVertexクラスを使っているので
それをとってしまうと循環参照がうまく解決されないのです
>>227 そういうものなんですか・・・
それってどの辺を調べれば出てきますか?
1クラス1ファイルという馬鹿げた習慣をやめる
>>223 // a.h
#ifndef A_H
#define A_H
class B;
class A {B *mv; void mf();};
#include "B.h"
inline void A::mf() {B b;}
#endif
//b.h
#ifndef B_H
#define B_H
class A;
class B {A *mv; void mf();};
#include "A.h"
inline void B::mf() {A a;}
#endif
>>226 >Edge.hの中でVertexクラスを使っているので
どういうコード書こうとしているのかによりますけれど,普通edgeにはvertexを
指す機能だけを持たせればよいのですから,Edgeが必要とするのは
Vertex *(またはそれと同等なもの)だけで,その場合Edgeから見えるべきなのは
Vertexの前方宣言だけで良いと思うのですが.
あと根本的な話として,Boostを使っているならBoost.Graphを見てみてはどうですか?
UNIXじゃC++はバッチ処理にしか使われてないって本当?
バッチ処理に使われているのはRuby C++なんて問題外^^;;;
そうですか、やっぱりRubyを勉強することにします。 ありがとうございました。
ちょっと待って! ソフトウェアの規模によって違うよ。 Ruby > Perl > awk かな??
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> awk >>>>>>>>>>>>>>>>>>>>> sed >>>>>Perl
何でそんなに比較したがるの?
Rubyが優れた言語であることは否定のしようがない事実。 そのことを皆が分かるまで続けます。
Pe = ぺ・ヨンジュン
>>237 どれもスクリプティング言語だから、それぞれの特徴にあった使い分けをする必要がある。
もし、それをしなかったら世の中に一つの言語しかなくなるよ。
そして、
>>235 は各言語に向いている開発規模を比較したものであり、言語の優劣を
比較したものではない。
Perlだけは許せない。
>>238 自己記述可能な処理系になってから言って下さい
最近のUNIXではPerlは入ってないよ。 既にRubyに完全に取って代わられました。
UNIX板にRubyのスレはありますがPerlのはありませんね。 それが全てを物語っています。 自分もPerlは削除しました。
Perlerはクズみたいな連中だからwebprogにでも行けばいいのに。 なに大きな顔してム板にいるのやら。 CGIと混同されるぐらいしか脳のないセンス0の糞言語が。
なぜLispと比較しないのか
Rubyの欠点は速度かな
Rubyの欠点は名前のせいでPerlと何か関係があるかのように信じている人が多いこと。 RubyはPerlより先に生まれ、独自に発展した言語。 Perlを参考にしたこともなければその格からして違う。
南京大虐殺なみの捏造ですね
たかが宣伝のためのリップサービスをまともに受け取っている馬鹿がいる。 RubyはPerlと全く関係がない。作者自身がそれを明言している。
ここが C++ スレだということを忘れそうになる惨状だな……
>>240 使い分ける必要はないな。
好きな言語を作る自由があるから沢山言語があるだけだ。
Rubyが大好きだということはわかったから、連投はやめれ
C++がRubyよりはるかに劣った存在であるということもご理解いただけましたか?
Ruby使ってるとキチガイになるということがよく分かった。
matz氏がイカレポンチであると再認識した
258 :
デフォルトの名無しさん :04/12/10 00:52:42
JISのPDFは画像データだから検索が出来ないんだよな…
>>260 できないね。糞だわ。でもタダだし一応取っておいて損はない鴨。
その点ドキュメントの充実しているRubyとは違うね。
質問です。 何らかのタイプ設定をenumでセットするクラスがあるとすると、通常はこういう構成になると思います。 class Hoge{ public: enum TYPE {A,B,C}; Set(TYPE type); private: TYPE type_; }; Hoge hoge; hoge.Set(Hoge::A); hoge.Set(Hoge::B); hoge.Set(Hoge::C); Setを呼び出すたびにHoge::という修飾が必要なのがわずらわしいので、 以下のように名前空間を利用できないだろうかと考えています。 なお、名前空間名は必ずクラス名をすべて大文字にしたもの、で統一するつもりです。 namespace HOGE { enum TYPE {A,B,C}; } class Hoge{ public: Set(HOGE::TYPE type); private: HOGE::TYPE type_; }; using namespace HOGE; Hoge hoge; hoge.Set(A); hoge.Set(B); hoge.Set(C); クラス利用者がusingディレクティブによって必要に応じて冗長な修飾を 削れるため、後者のほうが、優れた手法だと思っています。 なにか見落としている欠点などありますでしょうか?
>>263 他の同じようなクラスで、enum TYPE {A, B, C};のようなことができない。
例えば、class Hageでも同じようなenumがあったとして、
名前空間を使わなければhoge.Set(Hoge::A) と hage.Set(Hage::A) で使い分けられる。
名前がぶつからないようにHageの方ではAを使わないようにするくらいなら、
初めからenumをclass内に閉じ込める必要ないと思う。
class Hoge{ public: SetHogeA(); SetHogeB(); SetHogeC(); }; にしとけば利用者の手間は一番減る
>>264 >名前空間を使わなければhoge.Set(Hoge::A) と hage.Set(Hage::A) で使い分けられる。
名前空間を使っても使い分けられるよ
267 :
デフォルトの名無しさん :04/12/10 11:44:32
template<class Foo> class Hoge {...} という場合、Hoge は「テンプレート クラス」ですが、 Foo はなんと呼べばよいでしょうか?
>>267 テンプレート引数。
実際に渡される実引数と区別するなら仮引数。
intなどの非型引数と区別するなら型引数。
ちなみに、Hogeは規格中の言葉の「クラステンプレート」のほうをお勧めしたい。
>>264 すでに
>>266 さんが指摘されてますが、名前空間でもその点は問題ありません。
ちなみにEfffective C++の28項に解説してあります。
>>265 なるほど、つまりこうですね。
class Hoge{
public:
void SetTypeA(void){Set(A);}
void SetTypeB(void){Set(B);}
void SetTypeC(void){Set(C);}
protected:
enum TYPE {A,B,C};
Set(TYPE type);
private:
TYPE type_;
};
インラインだから余計なコストもおそらくないし、全部クラス内に収まってるし、
enumの範囲チェックも不要になるしで、どうもこれがベストの手法に思えます。
ありがとうございました。
>>267 ついでの横レスですが、
×テンプレートクラス
○クラステンプレート
だったはずですよ。
>>258 前まで売ってたやつですか?
次回からテンプレ追加ですね。しかし混んでいるのか落とせねぇ
常に定数しか引数にしないのか?
272 :
デフォルトの名無しさん :04/12/10 13:37:40
float型やdouble型に対する % 演算子的な標準関数または手法ってあるんでしょうか? なければ作るまでですが、自分で変なの拵えるよりはと。
fmod
>>273 即レスありがとうございました。助かりました。
275 :
267 :04/12/10 14:00:02
>>268 >>269 ありがとうございます。
クラス テンプレート、テンプレート引数、ですか。
あともう一つ呼び名が分からないのですが、
クラス テンプレートのテンプレート引数として指定するクラスの
シグニチャのことを何と呼ぶのでしょうか?
たとえば、
template<class Junk, class Food>
class JunkFood {...};
となっていて、Junk と Food には、
ある種のプロトタイプのメンバ関数が必ず必要とします。
このような場合、私はダミークラスを定義しているのですが、
// 実装のないシグニチャだけのクラス
class JunkTempl {
void Weight(void);
double Value(void);
};
このような JunkTempl を一般になんと呼ぶのでしょうか?
インターフェースクラス
クラスインターフェースか(´・ω・`) しかも微妙に違ってるorz
278 :
ネムー :04/12/10 15:36:26
forループの中に、計算データを保存するプログラムを書いて、 10ループ毎に計算データを保存するというような事はできるんでしょうか? ファイル名をループ毎に自動で指定させる事ができなくて困っています。 bccを使っています。 わかる方教えてください。よろしくお願いします。
>>278 単なる一例ですが。
#include <iostream>
#include <sstream>
#include <string>
int main()
{
for (int i = 0; i < 100; i++)
if ((i % 10) == 0) {
std::string s;
std::stringstream str(s);
str << "filename" << i / 10;
std::cout << str.str() << std::endl;
}
}
281 :
デフォルトの名無しさん :04/12/10 21:10:37
>>261 思いっきりナメられてるな
OCR 書ける香具師はこんなの見ねえってさw
282 :
デフォルトの名無しさん :04/12/11 00:53:02
ウインドウモードの時、指定した画面サイズ(W,H)から周りの枠線やタイトルバーを除いた幅と高さはどうやって求めればいいのですか?
スレ違い
ん?C++スレの質問ですよね? 間違っていないと思うんですが、一体どこで質問しろとorz
ウィンドウ(GUI)が出てくる時点で標準C++の規格外。 WindowsならAPIスレなりMFCスレに逝くべし。
>>284 このスレは機種に依存しない話題だけをメインに扱っている。
多分Win32APIかどこかで聞いた方がいい。
どこが適切な場所かわからないなら環境依存OKスレで聞いとけ。
288 :
デフォルトの名無しさん :04/12/11 02:11:44
そうなんですか、知らなかった・・・ソウイウダイジナコトハテンプレニイレテテクダサイヨorz
VBでは領域を調べることができるのでC(++)でもできるのかと思ってました。
>>288 なんかこれもスレ違いな気がするけど行ってきます(´`)>
290 :
デフォルトの名無しさん :04/12/11 02:20:27
iteratorを扱う関数って、NULLチェックとend()チェックしないとダメなの? void f(T::iterator i) { if (i && i->ptr) { x = i->ptr->data; } } もっと簡単にできる?
C++はマイクロソフトの商品名じゃねぇぞ。アフォ。
まちがえた。 void f(T::iterator i) { if (i && i != c.end() { x = i->data; } }
このスレでたまに初心者を煽ってる人いるんだが、
本来、C++プログラマってあんまり劣等感に満ち溢れた奴って少ないだろ?
会社などでも比較的優秀な人材をC/C++に配属するしさ。
でありながら、
>>291 のように誹謗の機会をうかがう哀れな負け組がこのスレにくるのは何故だろう・・・?
会社の研修でC/C++をやらされたが会社側に事実上のダメ出しされたために屈折してしまった馬鹿が
Cプログラマを装ってスレを荒らしているのではないか?
私の知ってるCプログラマは、皆、温厚で忍耐強いがなぁ。
私は、短気なCプログラマに出会ったことがない。
iteratorの有効性なんぞ呼び出し側に保証させとけ
Dプログラマだから
Dプログラマは所詮お遊び。仕事には使えない。
クッキー切ってたorz
GNU次第
>>293 >私の知ってるCプログラマは、皆、温厚で忍耐強いがなぁ。
お前はそいつらの何を知ってる?全部を知り尽くしてるのか?
表で温厚で忍耐強くがんばってる分、抑圧されたストレスも他の人より多いだろう。
つうかそもそも
>>282 のことぐらいググるなり、MSDN検索するなりして自分で調べろ、と思うんだが。
>>299 > 表で温厚で忍耐強くがんばってる分、抑圧されたストレスも他の人より多いだろう。
お前はそいつらの何を知ってる?全部を知り尽くしてるのか?
ostringstream o("aaa"); o << "bbb"; cout << o.str() << endl; これを実行するとbbbとしか表示されないのですが 正しい挙動ですか? aaabbbと表示されるのを期待していたのですが。
>>302 std::ostringstreamのコンストラクタは std:string を引数に取る。
従って、
std::ostringstrem o("aaa"); は、
std::ostingstream(std::string("ooo")); と同じ。
以降はこの一時stringオブジェクトに対して操作が行われる。
そして、最初の出力を実行した時、書き込みポインタはバッファの
先頭にあるため、"aaa"が"bbb"で上書きされる。
もし期待通りの結果を得たければ、先に o.seekp(3); としておかなければならない。
>>303 大きな声では言えないが、Temporary Internet Filesの中にあるはず。
これ以上は自分で考えろ。
>>304 ありがとうございました。
o.seekp(3);を挟んだらaaabbbと表示されました。
本にo << "aaa" << "bbb";を、
>>303 のように書くこともできる
と書いてあったので困惑してました。
>>304 std::stringstreamが取るのはconst std::string&だろ?
つか日本語訳なんていらんだろ
>>308 何章かな?
>>309 確かにそうだね。という事は バッファの中身をいじっても元の std::stringは
不変である事を保証しているのかな?謎だ・・・・
スマソ。
>>304 には間違いがありました。
std::stringstreamは独自の内部バッファを持ち、コンストラクタに取った
std::stringの中身は内部バッファにコピーされるんでした。だから
const std::string& なんだね。
しかし、書き込み/読み取りポインタがバッファの先頭にある事は変わり
ないので、書き込んだり読み取ったりすると、先頭から行われるのは
変わらない。
>>311 21.5.3の文字列ストリームの732ページ
>>280 で知って、使ってみようとちょっと読んだだけなので
自分が間違ってるかも。
>>313 今読んでみたが、
>>306 のような事は書いてない。
ま、文字列ストリームは普通のファイルストリームと似たような感覚で
扱えばいいんじゃない?
今日本語訳の方ではなく、元の方のerrataを見たら ostringstream o("aaa",ios_base::ate); こんな風に直されてました。
>>315 それなら分かる。std::ios_base::ateは、ファイルを開いた後にファイルの最後に
移動するオープンモードフラグだから。
>>299 ,301
Cプログラマに外向的な性格の人は少ないでしょ。
ストレスを他者への攻撃に転化するタイプは少ないように思う。
ただし、あくまで人数が多い少ないの話であって2chを訪れる人の中には、
Cプログラマの適性がないにもかかわらず、
Cをやってるorやらされてる、迷惑な人が少ないながらもいるんだろう。
C/C++は古い言語ということもあって新しい言語よりも理不尽。
その理不尽さに耐えるだけの適性がないと、辛いわな。
>>303 ,305
>大きな声では言えないが、Temporary Internet Filesの中にあるはず。
>これ以上は自分で考えろ。
大きな声で言えないも何もkonquerorだと開くか保存するかを聞いて来るのだけど
これってローカルに入れちゃダメなの?
言語で性格がくくれると思っている人は、星座占いとか好きそうだな
>>319 私は、星座占いや血液型占いは全く信じないし、
TVの朝のニュース番組で占いが出てくると即、チャンネルを変える。
朝のバタバタした時間帯に占いを流すTV局が増えたのは実に情けないことだと思っている。
非科学的な分野が市民権を得ていることが情けない。
公共の電波は落書き帖じゃねーんだ。そういうことは毒電波専門チャンネルで流せ、な?(AA略)
と、心の中でツッコミを入れている次第である。
このコードを強引にコンパイルする方法はありますか? struct Object {     static void static_hoge() {}; }; void Hoge() {    Object.static_hoge(); // この2行は、    Object object; // 一切変更できない } 例えば、 typedef Object* ObjectPtr; const Object& Object = *((ObjectPtr)0); をグローバル宣言することでstatic_funcの呼び出しは解決しますが、 型名と変数名が衝突してしまいます。 目的はパズル的な事なので意味はありません。
よくわからん。出直せ。
>>332 Object::static_hoge();
ではなく
Object.static_hoge();
でアクセスできないかという意味です
txtファイルに文字をうって そのあと、そのファイルに文字を追加入力するには どうすればいいのでしょう? 読み込んだ配列に配列を足すでは無理みたいで
>>323 staticメンバ変数はインスタンス無しで呼び出せるが、後者の書式は
インスタンスを必要とするので、何でもいいからObject型のオブジェクトを
作成すればいいのでは。
>>325 Object.static_hoge();の部分は変更できませんので、
インスタンス名がObjectでないといけません。
そうするとObject objectの部分で型名と衝突し、
通常はコンパイルエラーが出ると思います。
また、適当なインスタンスを作成するよりは、
325の通りNULL参照を使う方が低コストかと考えました。
つまり、JavaなりDelなりからC++に移って 記法が気に入らないから、合わせる方法はないか探しているということですね。
>>327 そんなところです。
気に入らないわけではありませんが
同じコードが動けば楽かと思いまして。
無理なものは無理
プリプロセッサでも通せ
namespaceで囲えばいいんでは? namespace Hoge { struct Object { static void func() { cout << "Nurupo" << endl; } }; } typedef Hoge::Object *ObjectPtr; const Hoge::Object& Object = *((ObjectPtr)0); Object.func();
>>331 この2行をクリアしたいのですが、無理ではないでしょうか
Object.func();
Object obj;
スレ違いな気もしますので、これ以上はやめておきます。
失礼しました。
郷に入れば郷に従え
>>332 cppで。
#define Object instance
Object.func();
#undef Object
#define Objec className
Object obj;
インデックス値が、小さい方から大きい方へ順番に入っている 配列やリストを指す言葉ってありますか?大きい方から小さい方でも構いません。
これじゃ意味不明だ。 ええとインデックス値というのは、ユーザ定義の序列みたいなものでお願いします。 どうでも良いといえば良いのですが、こういう概念を一言で表せると考えやすいので…。
もしかして昇順、降順のことか?
>>337 ありがとうございます
昇順リスト、昇順配列と呼ぶことにします
>>305 いや、ここで聞く前にそこ探したんだけど
イメージが見つからなかったのよ… とほほ
>>339 Cygwinでも入れてfindで探すとか。
Operaで開こうとすると「保存しますか?」と出て保存できるのは内緒だ
C99のときは再インストール後、Acrobat Readerをインストールする前にそこへ行ってきて、 お馴染み、ファイルのダウンロードのダイアログから堂々と保存しました。 今回はTemporary 〜 から引っぱってきたけどね。
>>339 画面にPDF開いた状態で探さないと閉じたら消されるとかかもしれん。
画面に出したまま探してみ。拡張子PDFで。
>>339 C:\Documents and Settings\XXXXXXX\Local Settings\Temp\
にPDFのtmpファイルがあったのでリネームでOKだったxp。
>>340-344 みんなアリガト
ExplorerだとTemporary Internet Filesの下のContent.IE5とかが見えなかったんだけど
Cygwinでfind . -name '*.pdf'したら一発で見つかったよ
これローカルに落としてもAcrobatのメニューが使えないのね…
>>345 画像データだから。
それからExplorerだと隠しフォルダ属性を取らないと見つからないかもね。
347 :
デフォルトの名無しさん :04/12/12 18:21:14
コンテナからeraseするときは、iteratorを後置インクリメントすると良いと習ったのですが for (iterator = container.begin(); it != container.end();){ if (条件が合えば){ container.erase( iterator++ ); // iterator = container.erase( iterator ); } else { ++iterator; } } これだとcontainerがvectorなどだと、最後尾のコンテナを削除したとき エラーが出てしまいます(コメントアウトした方のやり方だと大丈夫)。 私が習ったやり方はあまり良い物では無いのでしょうか。
>>347 Effective STL 嫁
削除系関数はイテレータを無効化するので
container.erase( iterator )
では iterator が無効化されてしまう
>>347 >私が習ったやり方はあまり良い物では無いのでしょうか。
その通り。
あ、スルーしてくり
351 :
デフォルトの名無しさん :04/12/12 18:29:28
>>347 オマエ、もしかして早合点のクセないか?
そんなことを教えるわけがなさそう
>>348-349 listとかだと上手くいくので、私が何か勘違いしているのかと不安でした。
今後はコメントアウトした方で行きます。Effective STLも求めてみます。
レスありがとうございました。
>>352 「習った」とあるが、本当にそう教わったのなら教えた香具師が馬鹿。
教えた香具師が信頼できるのなら教わった藻前が早合点している。
標準シーケンスコンテナではeraseの戻り値、 標準連想コンテナではのようにするってことじゃないの?
355 :
デフォルトの名無しさん :04/12/12 22:02:51
基本的なことなんですけど、文字色はどうやったらかえれますか、 できたら教えてください。
できないので教えられない
358 :
デフォルトの名無しさん :04/12/12 22:04:52
なるほど、ありがとうございます
359 :
デフォルトの名無しさん :04/12/13 00:03:23
wmpの視覚エフェクトを自分で作っているのですが、 現在再生中のファイル名と 再生した経過時間を取得するにはどうすればいいでしょうか。。 板違いだと思うのですが、どこで聞いてよいか分からなくて、、、 どなたかご教授ください。
誘導ありがとうございます。
以下のようなコード(ただしhoge_tはPODではない)で、クラスA,Bの コンストラクタ起動時は変数a,bのコンストラクタ起動前なのに a,bへのポインタを使っていますが、これはC++の規格的にOKですか? #include<iostream> class Base { protected: hoge_t a b, *ptr; Base( hoge_t *p ) : a(), b(), ptr( p ) { a= ...; b= ...; } //aとbの初期化処理 public: const hoge_t get(void) { return *ptr; } }; class A : public Base { public: A(void) : Base( &a ) {} }; class B : public Base { public: B(void) : Base( &b ) {} }; int main(void){ A a; B b; std::cout<< a.get()<< "\n"; std::cout<< b.get()<< "\n"; return 0; }
フラグを使うときにintなら int f_hoge=0; f_hoge = 1 - f_hoge; みたいに出来ますが、 このフラグをboolでやるとすると どのようになりますか?
>>363 bool fHoge = false;
fHoge = !fHoge;
>>362 それは結局「以下が可能か?」という問いに帰着されるような気がする
struct hoge_t {};
struct Base {
hoge_t a, *ptr;
Base() : ptr( &a ), a() {}
};
gccだと362は(typoを適当に直して)-Wallでも警告なしでコンパイルされるのに対して
上の例は警告が出る
規格だとどうなんでしょうね?
>>362 struct hoge_t {};
class Base {
protected:
hoge_t a, b, *ptr;
Base() : a(), b(), ptr(0) {}
};
class A : public Base {
public:
A(void) : Base() {ptr = &a;}
};
class B : public Base {
public:
B(void) : Base() {ptr = &b;}
};
だと規格上確実だと思うけどダメかい?
>>366 派生クラスの構築は、基底クラスのコンストラクタが呼び出されてから
メンバ、派生クラスの順に初期化されるから大丈夫じゃね?
gcc3.4.2で-Wallにしてみたが警告は出ない。
>>367 あーそっか。aとbがまだ初期化されてないうちに使うとまずいね。
皆さん回答ありがとうございます。 >365氏 hoge_tは実際にはテンプレートを使ったクラスです。 >366氏 そのコードでは、aへのポインタを得るタイミングが>362より若干遅い気がします。 >367氏 最初はそのコードと同様にしてたのですが、それだと ・ptrをNULLで初期化してから派生クラスでもう一度設定しなおすという回りく どい処理になる ・派生クラスでptrの設定をしなくてもコンパイルできてしまう(実行時まで派生 クラスでのptr設定忘れに気が付けない) ので>362でコードを書いて、Win2KPro,cygwin1.5.9,gcc3.3.1という環境でコン パイルは通るのですが、未初期化の変数へのポインタを使うことがC++の規格と して正しいのか気になって質問しました。 私はなんとなくCの不完全型へのポインタと似た感じを受けるので規格違反して いないと思っています。
失礼しました。>370は私の書き込みです。
>>370 未初期化の変数へのポインタが使えないと、自己参照型クラスは
作れなくなるぞ。
>>370 もし hoge_t::operator&() があると、ctor の前にこれ呼ばれる?
>373 それは完全にundefined behavior
C++はC99と後方互換が無いんですか?
>>375 後方互換の話ならC99スレを立ててそこで議論してくれ。
もちろん後方互換ではないけど。
後方互換とはなんだと調べようとしたらIMEのやつ広報5巻って出してくる。 ワラッテサキヘススメン。
378 :
デフォルトの名無しさん :04/12/14 18:22:11
% [ttt.cpp] %%%%%%%%% #include <stdio.h> class SampClass { public: SampClass(); ~SampClass(); private: void memFunc000(void); }; typedef struct tagSampStruct { struct { SampClass aaa; }; } SampStruct; int main(int argc, char **argv) { printf("Hello\n"); } %%%%%%%%%% というコードをgccでコンパイルすると、 > ttt.cpp:14: error: member SampClass tagSampStruct::<anonymous struct>::aaa' > with constructor not allowed in anonymous aggregate > ttt.cpp:14: error: member SampClass tagSampStruct::<anonymous struct>::aaa' > with destructor not allowed in anonymous aggregate というエラーが発生しますが、VC++ではエラーが発生しません。 VC++でも同様のエラー(ワーニングでも可)を発生させたいのですが そのようなことは可能でしょうか? ご教示おねがいいたします。
379 :
デフォルトの名無しさん :04/12/14 20:06:08
教えて下さい! 参照って何 具体的な使用例とか、詳しいサンプルとかほしいなぁ お勧めのホームページとか、あったら教えて欲しいし お願いしますね
>>379 詳しくはC++Primerをお読みください。
>>378 警告レベルをW4にすると
warning C4201: 非標準の拡張機能が使用されています : 無名の構造体または共用体です。
と出てくれる
382 :
デフォルトの名無しさん :04/12/14 20:15:52
>>380 ありがとうございます。
でも ごめんなさい・・・C++Primerって何処にあるんですか???
本屋
384 :
デフォルトの名無しさん :04/12/14 20:18:49
本屋さんですか?(泣) C++Primerって本なんですか?困ったな
>>384 初心者にありがちなのですが、初心者だから初めはWEBページでちょっと勉強してから、
というような人が多いようです。
しかし、誰か得体もしれぬ人が作ったようなWEBページは多くの場合、説明が不適切・
不親切であったり、まとまりにかけていたり、そうでなかったとしてもごく一部の
話題しか取り扱わなかったりして、とても読みにくいものです。
また、解かりやすい解説を捜し当てるのにかかる手間がかかるでしょう。
もし、許されるならば書籍を購入された方がはるかに有意義だと思いますよ。
>>385 > また、解かりやすい解説を捜し当てるのにかかる手間がかかるでしょう。
訂正:また、解かりやすい解説を探し当てるのにわりと手間がかかるでしょう。
C++Primerってヘンーナ日本語訳しているよね。 デリファレンスとか、インデクスとか。
一見親切にも見えるWebページは情報が不正確だったり 最悪うその垂れ流しだったり、うのみにしてはいけない。 その判断が自分で出来ないなら書籍を買う方が良い。 ただし、書籍にも糞本はいっぱいあるから気を付けれ。
390 :
デフォルトの名無しさん :04/12/14 22:26:59
レビューがすごいな
391 :
デフォルトの名無しさん :04/12/14 22:28:53
>>379 まずは、禿本だな
それでわからんかったとこを方々調べて解読
俺自身、そうやって憶えた
当時の禿本は初版だったが・・・
395 :
デフォルトの名無しさん :04/12/14 23:40:21
立ち読みで判りそうなことばかり・・・ アフォかこいつら
>>395 買わなくてもコメント出来るから君もすれば?
構造体って必要ですか? 全部クラスに統一した方がスッキリすると思うんだけど。
>>397 そもそもC++の構造体はクラスと大差ない。
>>398 っていうかデフォルトの可視性以外全部一緒
つーか、classのデフォルトもpublicでいいだろ。特に基底クラス
>>399 機能としてはそうですよね。
言語仕様を無駄に煩雑にしてる気がするんですが、
クラスを使わず構造体を使う方が適切なケースってあります?
Cからの遺産
POD使いたい時
>>400 だよな。デフォルトがprivateだからついついメンバ変数を先に書いちゃったりする。
普通に考えたらインターフェースであるpublicメンバ変数が上に来てるほうが良いってことは明らかなのに。
>publicメンバ変数 publicメンバ関数
C++FAQには短いプログラムを書くときにこの方が便利だからと 書いてあったが、やっぱ public が上にある方がいいよな
>>406 その場合structで書けばいい。
関数オブジェクトはよくstructで書く。
408 :
デフォルトの名無しさん :04/12/15 01:03:11
>>406 class いらねーよな
テンプレには typename だし
C++自体がいらない
構造体がアラインされてないとパフォーマンスが大きく低下するって聞いたのですが、何故こうなるんですか?
>>411 CPUによる。CPUによってはアラインされていないとバスエラーを起こして
そもそも動かないものもある。
32bitのデータを32bit境界から開始しておけばそのまま32bitで取り出せるが 8bit境界で適当に開始されていると24bit+8bitとか16bit+16bitとか分離して 読み込んだあと結合しないといけないから。
>>413 器用で、寧ろ余計なお世話なCPUだな。普通のCPUはそんなことしない。
415 :
デフォルトの名無しさん :04/12/15 09:32:15
>>414 かつて "普通" だった CPU はしっかりやっていたが・・・
余計なお世話というより、互換性のためにしょうがなくやってるって感じか。
組込み系だといまだにそれが普通なんじゃないの?
alignmentがいい加減でもパフォーマンスが落ちるか落ちないか っていうのはRAM側の問題じゃないの?
>>418 DSPなんかだと、RAMというよりコアの問題だと思う。
C++の話題じゃないけど(w
>>418 dynamic phase alignment をサポートしてるかどうかってことでいいの?
スレ違いだけど
>>411 の疑問は解消しなければ
RAMとは関係ないんじゃないの? メモリ空間にマッピングされるのってRAMだけとは 限らないわけだし。(例えばレジスタとか)
構造体のメンバーへのアクセスってメモリの先頭からのオフセットだよね? mallocとかnewとかで確保した領域にアクセスする場合でも 最適化でレジスタに読まれてから処理されてるん? アセンブラ出力させて調べてみよう・・・orz
>>422 質問の意味がわからないけど、レジスタに入れないとなにもできないと思う……
アホなこと言った?だったらゴメン。 レジスタ使わないでできることと言ったら、DMAくらいしか思いつかない……。
x86系なら、一応メモリに直接演算出来るし 比較程度だったら、レジスタに読み出さないでやってるかも。 速度的には不利になる場合も多いけど。 でも、メモリに対して演算できても、 その結果を読み出して使う段では、普通はレジスタにロードするね。 関係ないけど、google翻訳(日→英)で、デストラクタを訳すと Death Tractor (死のトラクター)になるらしい。 D言語スレで見た。
むしろExcite翻訳がかなり正確にム用語を訳せて驚いた
>>422 アーキテクチャに夜。
32bitと64bitでも違うことあるし。
1+2+3,1+2-3,1-2-3,1*2-3,・・・・・・のように符号を変えていって値を 求めたいのですが、 char fugou[4]={'+','-','*','/'}; for(a=0; a<=2; a++){ cout<<1<<fugou[a]<<2<<fugou[a]<<3<<endl; } COUTからどのようにして答えを出せばいいのでしょうか?
431 :
デフォルトの名無しさん :04/12/15 19:33:53
すっごい初歩的な事かもしれないんですが、いくら書籍&サイトを 探しても載ってなかったので質問です。 メンバにint mIntを持つクラスAがあったとして A a; int n = a; //int n = a.mInt; というような代入をする演算子をオーバーロードする事は出来ますか? 既出だったらすみません。
>>430 その宿題は演算子の優先順位も考慮しないといけないんじゃないのかな?
>>431 intへのキャストをオーバーロードすればいいんでない?
434 :
デフォルトの名無しさん :04/12/15 20:00:01
>>433 なるほど!!!!!
ありがとうございます!!!!
あ、キャストをオーバーロードした時って何か弊害ありますかねぇ?
435 :
デフォルトの名無しさん :04/12/15 20:04:30
import java.awt.Graphics; import java.applet.*; import java.awt.Image; public class Test extends Applet { Image im[] = new Image[4]; public void init() { im[0] = getImage(getDocumentBase(), "a.gif"); im[1] = getImage(getDocumentBase(), "b.gif"); im[2] = getImage(getDocumentBase(), "c.gif"); im[3] = getImage(getDocumentBase(), "d.gif"); } public void paint(Graphics g) { double x = Math.PI * 0; double y = 200 - Math.sin(x); for (int i=0; i<4; i++){ g.drawImage(im[i], 100 * x, y, this); x += Math.PI * 1/4 ; } } } という画像をsinカーブ上に並べる プログラムを作成したのですが、コンパイルすると、
436 :
デフォルトの名無しさん :04/12/15 20:04:50
>>434 不用意にprivateメンバの保護を剥がすような(ポインタを返すような)事をしなければ大丈夫
439 :
デフォルトの名無しさん :04/12/15 20:09:35
標準偏差ってどう求めればいいの?
ぐぐれ
>>439 平均値を出して、各値と平均値の差を二乗し、その和を取り、要素数-1で割り、平方根を取る
443 :
デフォルトの名無しさん :04/12/15 20:25:39
>>437 ありがとうございました。早速使ってみます!
> 要素数-1で割り どっから出た
>>444 1/nでもいいんだけど、n-1にしておくと
無作為にm個選んだ場合の分散の期待値が
全体の分散と一致するんだよ
447 :
デフォルトの名無しさん :04/12/15 20:48:24
439です どうもありがとう エクセルのような関数ってないですか
>>447 stdev及びstdevp
helpをみると446の話が出てくるはず
>>447 >エクセルのような関数
なのね
間違ったorz
ていうかそれぐらい自作しる
453 :
デフォルトの名無しさん :04/12/16 12:34:05
447です。 gsl 英語が読めないので自作します ありがとうございます。
template <class T, int A> T aaa() { return A + aaa<T, A - 1>(); } template <class T> T aaa<T, 1>() { return 1; } エラーが出てコンパイル出来ないのですが どこが間違えているのでしょうか?
>>454 ModernC++Designにも書いてある通り、
関数テンプレートはメンバ/非メンバ問わず部分的な特殊化ができない。
(コンパイラはオーバーロードなのか特殊化なのか判別ができない)
オーバーロードを使って解決することも出来るけど、
その程度ならコンパイル時定数として保持するのが吉。
>>455 ありがとうございます。
これは試しに書いてみただけなので困ることはないんですけど
すっきりしました。
>>454 関数テンプレートの部分特殊化をエミュレートする方法として
クラステンプレート + 静的関数ってのがあるので,参考までに.
template<class T, int A>
class aaa
{
static T invoke(){ return A + aaa<T, A - 1>::invoke(); }
};
template<class T>
class aaa<T, 1>
{
static T invoke(){ return 1; }
};
aaa<int, 10>::invoke();
458 :
デフォルトの名無しさん :04/12/16 17:53:25
標準入力の入力バッファをクリアする方法ってあるでしょうか? scanf() するときに、以前に入力されたものが入力バッファに入っていると、 使いにくいプログラムになるので、 scanf() する前に入力バッファをクリアしたいのです。
>>458 std::cin.readsome()ってのがあったような。
OSのバッファには効かないけど。
>>458 while (getchar() != EOF); では駄目かな
それだと、入力にウェイトがかかって無限ループになるだけ。
462 :
デフォルトの名無しさん :04/12/16 19:36:33
直接のC++の相談じゃないんだけど、 C++でコンパイルして、MS−DOSで結果でた、そのウインドウを そのウインドウ自体のまま画像にするのってどうしたらいいんでしょう??
>>458 fgets()でめいっぱい読み込んでからsscanf()するのは、そういう問題が
起きないようにするためだ。
但しfgets()で指定した文字数よりも余計に入れられると、これもだめだ
けどね。
466 :
デフォルトの名無しさん :04/12/16 20:19:06
>>465 ありがとう。
でも、できないみたいけど・・・?
できてるとしたら、画像ってどこに配置されてる?
>466 板違い。PC初心者板へ池
468 :
デフォルトの名無しさん :04/12/16 20:23:25
>>462 foo.exe > foo.txt
これで済むんじゃないのん?
Javaできる、C#できるって人がC++始めたいのに最適な書籍はありませんか? その前にC覚えろって話しですか?
その前に先ず日本語だろ。
タスク教えて
ゲイは澪タスク
479 :
デフォルトの名無しさん :04/12/17 15:05:58
局所静的オブジェクトって最初に通る時に一度だけ初期化されるんですよね。これって どうやってるんですか? 素直に考えてフラグを持って通るたびに条件分岐? それとも最初に通った時に自分自身を書き換えるような事をしてるんでしょうか。
>>479 もちろん実装依存だが、普通は毎回テストしてるはず。
>>479-480 「最初に通る時に一度だけ初期化」っていうのはそういう意味じゃなくて、
「実行ファイルのロード時に局所変数領域にイミディエイト値もロードされる」
ってこと。
局所変数領域がなんで最初に確保されるんだ?っていう突っ込みもあろうが、 それはコンパイラが提供するスコープ範囲の機能を実現する都合だけであって、 静的である以上はいつ確保しても同じ。
>481-482 オブジェクトと変数は違うと思うけど・・・
当然だとは思うけど class Hage {・・・}; void hoge() { static Hage hage; } hogeを複数スレッドから同時に呼び出した場合、hogeの初期化を同期なんてしてくれませんよね?
hogeじゃなくてhageの初期化でした。
static だからインスタンスは1個 同期も糞もないと思うが
staticメンバはmain()関数の実行を開始する前に既に初期化を終えているんだっけ?
>>486 関数内のstatic変数は最初に実行されたときに初期化されると規格で決まってるらしい。
>>487 通常のローカル変数同様、変数宣言の字面上の位置で初期化される。
例えば int f(int a) { static b = a; return b; } があった場合、
b には初回呼び出し時の引数が代入され、以後ずっと変化しない。
>>486 一個だからこそ同期うんぬんという話が出てくるように思えるが・・・
int f(int a) { static const b = a; return b; } これなら大丈夫
もちろん実装依存だとは思うけど VC++,bcc,gccの3つは 初期化処理が必要な、関数内のstaticデータ int f() { static int n = atoi("123"); return n; } は、単純にフラグを使って 実行されるたびに初期化されたかを判定していて 同期処理は無しでした。
492 :
デフォルトの名無しさん :04/12/17 22:40:50
C++ で行列クラスを作っていて、転置行列を返す関数を実装したいと思っています。 その場合、 class Matrix { ... Matrix Transpose(void) const; }; のような設計で問題ないでしょうか? たとえば、 Matrix a; Matrix b = a.Transpose() とした場合、Matrix オブジェクトは一度しか生成されていない (それが b) ということが保証されるでしょうか?
いんにゃ 普通はコピーコンストラクタでコピーされる 設計は問題ないと思うけどね
敢えて言うなら返値はconst Matrixの方がいいと思う
>>493 そうですか。
やはり無駄なコピーを抑えたければ、
void Transpose(Matrix* m) const;
みたいにしないといけませんか。
>>494 え?その必要はないと思いますけど。。。
496 :
デフォルトの名無しさん :04/12/17 22:52:48
一時オブジェクトへの代入を禁止するため?
何も考えてないんじゃ?
499 :
デフォルトの名無しさん :04/12/17 22:58:35
C++ にこんな仕様があると便利かも。 仮にキーワード noncopy を導入して class Matrix { noncopy Matrix Transpose(void) { noncopy Matrix m; ... m を転置行列としてセットアップ ... return m; } }; と記述すると、戻り値の Matrix が引数の最後にポインタとして 渡されたかのように処理される。 そのポインタを受け取るのが、実装における noncopy 宣言された変数。
>>493 実際は大抵最適化でコピーしないようになるし、規格だってそういう動作にしても良いと書いてあるはず。
それ(戻り値最適化)が出来るのは 戻り値を return Matrix(...); と書ける場合のみ
ちょっと訂正 ×戻り値最適化が出来るのは ○戻り値最適化によって、コピー回数がゼロになるのは
>502 名前付き戻り値最適化っていうのも規格上は許されていますけれどね. 実際にコンパイラが最適化出来るかどうかはまた別の問題ですが.
504 :
デフォルトの名無しさん :04/12/18 07:29:39
505 :
デフォルトの名無しさん :04/12/18 07:30:22
>>501 オブジェクトを()ではなく=で初期化した場合は?
揚げ足取りうざい
507 :
デフォルトの名無しさん :04/12/18 08:02:28
>>506 ちょっとしたタイポ類ではなく
言ってる内容の本筋の誤りを指摘したわけだが
逆切れか・・・
ま、そういう手合いならこちらもそのつもりでいようか
509 :
504=505=507 ◆dGkqy8VIyg :04/12/18 09:05:50
すまんかった
510 :
デフォルトの名無しさん :04/12/18 09:24:35
509は俺じゃない ま、「そーゆー手合い」のすることですから (プ
(何一人で熱くなってるんだろ…)
ナニこのヒト? って感じ。
513 :
デフォルトの名無しさん :04/12/18 09:38:02
最適化の話はどうした? ぐうの音も出ないのか ま、そーだろな (プ
ぐぅ〜 ( -Д-)あ〜腹減った…
515 :
デフォルトの名無しさん :04/12/18 13:46:52
二次元配列を動的にメモリ確保するにはどうすればいいんでしょうか。 int xsize = 100; int ysize = 100; int ** array = new int[xsize][ysize]; では駄目でした。
>>515 こうすればいいけど、std::vectorを使うほうが楽。
int x = 100;
int y = 100;
int ** array = new int*[x];
array[0] = new int[x * y]
for (int i = 1; i < x; i++)
array[i] = array[0] + i * y;
delete[] array[0];
delete[] array;
518 :
デフォルトの名無しさん :04/12/18 15:12:29
>>517 は二次元配列とは呼ばない。ポインタの配列。
519 :
デフォルトの名無しさん :04/12/18 15:24:17
>>515 char (*p)[50];
p = new char[100][50];
MFCのダイアログベースアプリ作ってます。 CStringの変数の中に半角スペースが入っているか確かめるにはどうすればいいでしょうか。 全角スペースは関係なしです。 たとえば、CString AAA; の中身が "c:\\program files\\test\\test.exe" これならNG "c:\\testapp\\test\\test.exe" これならOK という具合にしたいです。
>>520 AAA.Find(' ')じゃだめか?
ついでにGetShortPathNameも調べてみな
どなたか
>>519 をかみ砕いて説明していただけないでしょうか…
char(*)[50]型のpを宣言しているのは何となく分かるのですが
>>523 char a[100][50]; は char b[50]; が100個繋がったもの。
つまりchar b[50]; がarray_50という型だとすると array_50 a[100]; という風に考えることができる。
>>519 に当てはめると
array_50 *p;
p = new array_50[100];
となるから俺もわかんなくなってきたから自分で考えてくれ。
new char[100] はcharが100個連続したものを返してくるから charへのポインタで受ける。 new char[100][50] はchar[50]が100個連続したものを返してくるから char[50]へのポインタで受ける。
>>524 ,525ありがとうございます。
やっていることはわかるのですがpの宣言の仕方にひっかかっています。
もっと調べてみます。
>>519 それだと
int x = 100, y = 100;
char (*p)[y];
p = new char [x][y];
これができないと思うんだけど
そもそもyの部分がコンパイル時に決まらないと2次元配列は無理だな。
530 :
& ◆QWv3R1XL8M :04/12/18 21:08:56
15日でC++をSTL、テンプレまで使えるようになる修行方法教えてください。
531 :
デフォルトの名無しさん :04/12/18 21:10:33
>>530 まずはペンキ塗りからだ。終わったら床掃除。
便所掃除も忘れるなよ
534 :
デフォルトの名無しさん :04/12/18 21:48:29
ある動的に生成されたクラスが、他のポインタに参照されている 、あるいはされていないということを実行中に知ることは出来ますか? class CA{...}: int main(void){ CA pca = new CA(); void* = pca; if(pca->参照されているか否か()) { cout<<"参照されてない"<<endl; } }
535 :
デフォルトの名無しさん :04/12/18 21:52:28
>>534 言わんとすることはわかるが、めちゃくちゃだな。
答えとしてはできない。
多分求めたいものはshared_ptr
shared_ptr<CA> pca(new CA); shared_ptr<CA> pca_p; pca_p = pca; if (pca.use_count() == 1) { cout << "参照されていない" << endl; }
>535 すまん、C++は余り知らんのだ。 C++でJAVAのGCみたいなことできないかなと思ったが、 やっぱ素直にスマートポインタ使えと言うことなのかな
>534 weak_ptr?
>538 Boehm GCはどうよ?
月狼タンハァハァ
うちの大学の講師が変数は全て関数の最初で宣言した方が わかりやすいって言っているんですが、これってどうなのでしょうか…?
ただ単にCに慣れてるだけだろ
544 :
デフォルトの名無しさん :04/12/19 07:58:31
>>542 (;´Д`)
わかりやすいかどうかは別にして、無駄にコンストラクタが呼ばれることが増えるな。
>>542 関数の最初ではなくスコープの最初というのなら、わからんでもない。
ソースをCに移植した時、泣きを見ずにすむのは確かだ。
546 :
デフォルトの名無しさん :04/12/19 08:45:57
>>545 >ソースをCに移植した時
そんなことするか?
するとしたらそれこそ変数の宣言位置の問題なんかかわいいもんだろう。
>>542 そのうち、
メンバ関数を使うと処理が分散してわかりにくくなるので禁止
アクセスしやすいようにメンバ変数はグローバルにする
#define TRUE 1
などと言い出すに違いない
548 :
デフォルトの名無しさん :04/12/19 10:13:30
>ソースをCに移植 extern "C"
>>545 現実問題としてC++で構築されたものをCしかない環境へ移植しなければならないって案件見たことないんだけど、なんか事例ある?
よほど小さい簡易なコードならわからんでもないんだけど。
Cocoaアプリへの移植とか? Mac使ったことないから良く知らないけど
552 :
デフォルトの名無しさん :04/12/19 13:22:33
>>547 > #define TRUE 1
これの笑いどころが理解出来ない。
553 :
デフォルトの名無しさん :04/12/19 13:28:31
if(strcmp(unko, geri) == TRUE) goto 552;
void func() { return void; } int main() { func(); } 結果:コンパイルエラー 結論:C++はvoidを返値として使えるというのは嘘です。
int func() { return int; } int main() { func(); } 結果:コンパイルエラー 結論:C++はintを返値として使えるというのは嘘です。
( ゚д゚)ポカーン
m9(^Д^)プギャー
563 :
デフォルトの名無しさん :04/12/19 20:09:10
なんとなくぬるp
565 :
デフォルトの名無しさん :04/12/19 20:24:09
main() { char a; (int)a = 0; } 結果: コンパイルOK 結論: 標準変換の結果は左辺値であるというのは本当です。
test.cpp(5) : error C2106: '=' : 左のオペランドが、左辺値になっていません。 test.cpp(6) : warning C4508: 'main' : 関数に戻り値の型が指定されていません。戻り 値を void 型と見なします。
リソースファイルの書き方が詳しく乗ってるサイト知りませんか? 検索したのに見つかりません
>>568 リソースファイルってもいろいろあるわけなんだが…
bcc + winAPI のです。 英語出来ないので日本語のページでお願いします
英語できないならプログラミングも止めたら?
>>517 ってdelete[]時にxが必要無いようにするアプローチだと思いますが
これって三次に拡張できますか?
>>575 そりゃできるけど、面倒くさい。vector使え。
boost::multi_arrayの方がいいかと メモリを連続領域に確保してくれるし
578 :
デフォルトの名無しさん :04/12/19 22:18:43
>>573 ・ ・ ・ ・ ・ ・
俺は人間をやめるぞぉぉ JoJoォォォ
>>576 ,577
どうもです。
vector使ってますが、517の手法は初めて見たもんでおもしろくて。
やれるのであれば、やってみます。
>>574 さん
ありがとうございます
調べるキーワードが、見当違いだったみたいです。
>>572 さん、落ち着いて
ISO/IEC 14882:1998とISO/IEC 14882:2003でどこが変わったのか書いてある資料ってありませんか?英語でもかまいません。 規格票には変更点は書いてないようなんですが、あの量を読み比べるのはさすがにつらいので。
C++でビットマップなどの画像表示とかってできるのでしょうか?
こりゃまた抽象的な質問ですね
585 :
デフォルトの名無しさん :04/12/21 11:16:18
質問させてください、仮想関数を持つクラスから菱形継承した場合、 普通のメンバの曖昧さの解決はできると思いますが、仮想関数は どうなるのでしょうか。試してみたのですが仮想関数の継承でエラー出ました。 以下のようなパターンです↓ class A { int i; virtual void Hoge(void){i = 0;} }; class B : virtual public A { void Hoge(void){i = 1;} }; class C : virtual public A { void Hoge(void){i = 2;} }; class D : public B, public C { }; この場合DにHogeを書けばコンパイルは通りますが、 例えばDでBのHogeを使いたいなんて思ったときどうすればよいのでしょうか? 「多重継承なんか使うな」とかは無しでお願いします
586 :
デフォルトの名無しさん :04/12/21 11:26:52
レスありがとうございます、すみません仮想継承だということを 書き忘れてました(´・ω・`) (i と Hoge()の実体を一つにしたいわけです DでHogeを実装しない場合(585のコードそのままだと) 「error C2385: 'C::Hoge' の派生があいまいです。 warning C4385: 可能性 : 'Hoge' がベース 'A' of class 'C' にあります。 warning C4385: または : 'Hoge' がベース 'B' of class 'C' にあります。」 と出ました(´・ω・`) (VC DにBと同じ内容のHogeを書けば済むのですが、 そんなことしなくても済む方法があればなぁと思いました。
class D : public B, public C { void Hoge(){ なんか } void Piyo(){ B::Hoge(); } } って意味じゃないの?
591 :
デフォルトの名無しさん :04/12/21 12:04:10
クラスの静的メンバ変数を、インラインで定義することはできないでしょうか? ↓こんな感じにやりたいのですが。 class Hoge { public: static const char* name = "ほげ太郎"; };
なるほど!理解力なくてすみませんでした_| ̄|○
コード量も無駄に増えなくて済みますね(菱形継承の時点でアレだけど)、
>>588 >>590 助かりました、どうもありがとうございました!
>>591 環境依存でいいのなら__declspec(selectany)
C++で自作した汎用的なソースが増えたので 自作ライブラリを構築しようかと思っておりますが 名前とか、ファイルのフォルダ分けとかの形式 悩んで作れません。 名前空間使うとdoxygenのhtmlヘルプファイルがわかりにくくなるし かといって無しだと、何かとぶつかる可能性もあるし(CThread等) クラス名のプリフィックスにライブラリ名(ここでは、GDKとする) GDKThreadとつけても、なんかしっくりこない。 3日後には、ププーGDKなんて何かっこつけてんですか? どうせラッパーでしょ。と自己嫌悪 あと、フォルダ分類。 Graphis/Sound/Input/Window/...等分類しようとしていますが 分類しづらいファイルタイプもあったりするし #include "Graphics/Texture.h"みたいにわざわざ改装指定めんどいし、 かと言って、全部同じフォルダだと150以上のファイルがごっちゃになるわけで。 自分の優柔不断さに呆れてきました。 ガツンと何か言ってくれ
>>595 公開するインクルードファイルが何でそんなにたくさんになるのやら。
必要最低限だけ公開するようにしたら?
#まさか1クラス1ファイル主義じゃあるまいし。
>>595 名前空間を使え
ディレクトリは細分しちゃえ
迷ったら「boost もそうしてるし」と念じる。
>>596 主義じゃないけどたまに1クラス1ファイルあるかも。
Graphics関連が
Mesh.Texture,Light,Fog,Camera,Sharder,...等たくさんあったり
ひとまとめにした方がいいですかね。
でも、モデルファイル(XFile)が複雑だ
あああ
>>597 boostの構造調べてみます。
みました。細分してみたー。
yaneSDK3みたいになってきた。(´・ω・`)これでいいのかな。
まあああ
整理整頓できない子ですみません。
とりあえず、名前空間は導入
名前空間使う言語って少数派じゃない?
きもいけど慣れたら大丈夫かな
こうなったら、たくさんC++機能利用してやるか。
古い人に教わってたから
変な呪いがかかってるんだ。
C依存考慮、固定少数の呪縛や、速度、容量(数KByte)気にしすぎたりとか。
Javaのパッケージは高度な名前空間と言えなくもない。
パッケージが羨ましい namespace MyName{ 伺か } ↑ 閉じるのめんどくさい。
伺かかよ
deleteすんのめんどくさい
そこでD言語ですよ
そこでBoehmですよ
j a v a
BCBからSQLiteを操作するのに参考になるサイトを教えてもらえませんか?
たぶんスレ違い Builderスレ
ひまわり言語
>>600 namespace MyName{
伺か
\e
C以外の何か with class \e
今初めてえんい〜の意味を知った そのままだったのね
C with classがあるのにD without classがないのはなぜだろう
>>614 みんな君ほど頭がヒマじゃないからだと思う。
617 :
デフォルトの名無しさん :04/12/22 20:12:09
>C with classがあるのに ねえよ、少なくとも C++ の系譜上にそんなのは 禿のサイトでも調べてからもの言えよまったく
STLのvectorコンテナについてわからないことがあるのですが int型を格納する場合は vector<int> array; int data; ary.push_back(data); のように単純ですが 自作のクラスを格納する場合は vector<JisakuClass> array; JisakuClass *aaaa = new JisakuClass; ary.push_back(*aaaa); この場合は2行目のnewで確保したメモリは ary.clear(); などしたときにSTL側で開放処理をしてくれるのでしょうか? それとも自分で開放しなければいけないのでしょうか?自分で開放するのでしたら どのタイミングで開放すればいいのでしょう・・・ vector<JisakuClass> array; JisakuClass data; ary.push_back(data); そしてこのようにした場合、dataがスコープ外にでて消滅した場合でもvector内のデータは大丈夫なのか その辺の関係がわかりません 簡単にでもいいので助言をくださいませ
>などしたときにSTL側で開放処理をしてくれるのでしょうか? いいえ。 >それとも自分で開放しなければいけないのでしょうか? はい。 newによって割り当てられたオブジェクトへのポインタがコンテナに格納されている場合は 自分で全部deleteしてまわる必要があります。 >自分で開放するのでしたら コンテナを破棄する前に自分で解放する必要があります。 >そしてこのようにした場合、dataがスコープ外にでて消滅した場合でもvector内のデータは大丈夫なのか 大丈夫じゃありません。 >簡単にでもいいので助言をくださいませ see also boost::shared_ptr
>>619 push_back()でpushされるJisakuClassのオブジェクトは、JisakuClassのコピーコンストラクタ
によって生成されたオブジェクトです。
これはstd::vectorのclear()時にJisakuClassのデストラクタを呼び出してくれますが、元々
newで確保した方のオブジェクトはそのままです。
push_back()でstd::vector()に入れられるオブジェクトと、newで生成したオブジェクトは別の
物である事を理解しましょう。
619です あくまでvectorコンテナに格納されるものはコピーコンストラクタによって 作成されたオブジェクトであって、コピー元のデータは自分で処理をする vectorにクラスを格納する場合、STLが開放処理をしてくれる vectorにクラスへのポインタを格納する場合、clearするまえに自分で開放する 要約するとこういうことになるのでしょうか もっと勉強しよう・・・( ´・ω・`)
お礼をわすれてました。 ありがとうございます
>>622 push_bnack()の実現方法によっては、コピーコンストラクタではなくて代入演算子
で書かれているかもしれないので、一応両方用意しておくのが鉄則。
と言っても、クラス内部でnew/deleteするようなクラスでないと必要ないがな。
>>619 オブジェクトの生成、解放はSTLコンテナにすべて一任するのが楽。
だから、newしたものを突っ込むんじゃなくて値をそのまま突っ込むべし。
>>620 の痛さが光るな。氏んでいいよw
>newによって割り当てられたオブジェクトへのポインタがコンテナに格納されている場合は
>自分で全部deleteしてまわる必要があります。
vector<JisakuClass> array;って明記してあるのに、
勝手にvector<JisakuClass*>の話に勘違いした挙句
>>そしてこのようにした場合、dataがスコープ外にでて消滅した場合でもvector内のデータは大丈夫なのか
>大丈夫じゃありません。
100%ウソ回答ww
vector<JisakuClass> array;
{
JisakuClass data;
array.push_back( data );//ここでdataのコピーがarrayに追加される
}//ここでdataが破棄される
arrayに入るのはdataのコピーなので、dataが破棄されても全然平気です。
変なのがいるな。
幸いnew/deleteは使っていない単純なクラスなので デフォルトのコピーコンストラクタ(というか無し)で 問題なさそうです もしクラス内部にまた別のvectorコンテナとmapコンテナが入っている場合は 特殊なことが必要なのでしょうか・・・?
何も必要ありません。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++ とか書いている馬鹿がいるスレはココですか?
rubyユーザって痛い人が多いの?
>>626 俺も
>>620 のような内容を書きかけて、
>>619 をよく読んで「オブジェクトへのポインタ」の問題じゃ
なかったから投稿やめたのに。
>>628 >>629 さんが答えているけど、コンテナがデータメンバなら必要ない。但し、コンテナへのポインタ
だと代入演算子とコピーコンストラクタが自前で必要になる。
619です。 コピーされると思っていなかったため最初の質問分が既にトンチンカンでした ごめんなさい 動的確保したメモリなどを使っていると、コピーしたときに コピー先とコピー元でポインタがかぶるためコピーコンストラクタで 自分で確保しなおしてあげることが必要ということでしょうかね 625さんがおっしゃられているように、クラスもクラスの内部も すべてnew/delete等を使わない設計のほうが楽チンなので そうすることにします。 教えてくださったみなさま助かりました(`・ω・´)
>>634 そそ。領域がかぶると、一つの動的に確保したデータメンバを書き換えただけですべてのその
クラスのデータメンバが書き換わってしまうだけでなく、多重deleteによりプログラムが不正終了
する原因になるからタブーなのね。
コピーコンストラクタと代入演算子で、動的なデータメンバの中身も自分でコピーしてやる事に
より、それぞれが別々の実体を持つようになり、そのような問題はなくなる。
STLコンテナにポインタを格納するのは主に継承によるポリモーフィズムを 使うときなど。
んで、ついつい面倒になるのでboost::shared_ptrを使いたくなるけど、そうするってえと std::mem_fun()が使えなくなるから、boost::bindやboost::mem_fnを使うようになり、 ますますboostにはまっていくという罠。
const_castの挙動が理解不能な件について #include <iostream> using namespace std; int main() { const int a=100; int *pa=(int *)&a; *pa=200; cout<<&a<<" "<<pa<<endl; cout<<a<<" "<<*pa<<endl; return 0; } 実行結果 0013FED4 0013FED4 100 200 なぜですか。
あ、const_cast使ってなかった。 int *pa=const_cast<int *>(&a); としても同様。 動作確認はVC++.net2003で。 アドレスが同じなのになぜ値が違うんだ……
>>636 継承によらないポリモーフィズムってあるんですか?
*((int *)&a) と *((const int *)&a) の値が違うらしい。ますます理解不能
const_castを嬉々として使う奴を初めて見た
>>640 テンプレートや関数オーバーロードだって広義のポリモーフィズム。
>638 ローカルなconst valueが定数に最適化されるからでしょ。 実体を伴う必要はないから。 *(int *)&a も、中身はただのaであることがコンパイラには分かるから。
const intの方は定数リテラル的に扱われてるのかもね。 だめじゃんw
ていうかconst_castっていつ使うの?元々constにしなかったら いいだけじゃないの?と燃料投下。
>>647 じゃなくて、static_cast、reinterpret_castと分類してしまったから、必然的にconst_cast
が必要になったんだろ。
dynamic_castはC++特有の物だから別格。
で、10種類はまだですか?
既存のCのキャストの代用として、static, reinterpret, dynamicを作ったけど、 これらのキャストのどれにもconst hoge => hoge の変換はしっくり来ない。 だからconst_castが導入された、と>649は言いたいのではないかと。
スレ違い
ごめん
mutable
なるほど、最適化されて実行時にはすでに定数、と…… 参考になったトンクス
いや、目の付け所は悪くないんだけどね・・・ ローカル変数なんだし、ポインタ参照されてる時点で 最適化をやめるぐらいのココロイキがほしいところだ
658 :
デフォルトの名無しさん :04/12/22 23:49:26
>>656 そしてまた、規格票を確認もせずに与太話を強固にプリンティングされたアフォが1匹増えたわけか
undefined hehavior
unspecified behavior
implementation defined behavior
well formed
ill formed
>>658 そういうチミは、今回のconst_castの件はセクションどこなのか即答できるのかね。
俺は探してる所だ。
>>652 C++になってconstポインタからポインタへの変換を廃止するか、
reinterpret_cast扱いにするかって選択肢もあったような気がするわけよ。
>>659 §5.2.11.7だと思うが。
undefined behavior。つまり未定義。
663 :
デフォルトの名無しさん :04/12/22 23:54:54
>>659 は? それは有料です
教えてくれそうな会社をディレクトリで探して聞いてみて下さい
もしかして、私が答えてるかも知れませんね
>>662 いや、君のような出来の悪い弟子は(゚听)イラネ。
で、プリンティングって何?
洋菓子の一種
私はライスプディングがどうしても食べられないんだ。
俺も…なんかぐちょぐちょして甘くて気持ち悪い
イギリス行ってM&Sあたりで適当なケーキ類買ってみれ。 日本で売ってるライスプディングなんてまだぬるかったと思い知らされるから。。
イギリスで食っていいのはフィッシュアンドチップスと中華とイタリアンとマクドナルドだけだ。
インド料理を忘れないでくれ
>>670 ちょっと用事でイギリス行った時にホテルで食べたんだけど、やっぱり日本人には
ミルクとご飯の組合せはダメだね。
サンドイッチと、コーンフレーク類(本格的なやつね)はかなり美味しい。 イギリス行くなら、朝コーンフレーク、昼サンドイッチ、夕中華orインド料理で耐えるといい。
日本人にとって、ミルクとご飯の組み合わせとは、給食の残りを 残飯として混ぜ込んでいたときの光景を想起させるものである。
676 :
デフォルトの名無しさん :04/12/24 23:31:30
鶏肉の中華粥、ミルク味すきだけど・・・
BSEパイってイギリスだっけ?
678 :
デフォルトの名無しさん :04/12/24 23:41:22
マイクロソフトのビルゲイツ(敬称略)が、「いいプログラマになるためには、天才プログラマが書いたプログラムを 読むのがよい」といったらしいのですが、 それを聞いて、自分も天才プログラマが書いたC++プログラムを読みたいと思ったのですが、 で、最近オープンソースが話題になっており、何か参考になるようなフリープログラムはないですかねぇ? 紹介していただくとうれしいです!
firefox
gcc linux
681 :
VC++です :04/12/25 00:39:16
#import "c:/Program Files/Microsoft Office/Office/MSO9.DLL" #import "C:/Program Files/Common Files/Microsoft Shared/VBA/VBA6/VBE6EXT.OLB" // windows.h に DialogBox などが定義されているため、リネームで回避する #import "c:/PROGRAM FILES/MICROSOFT OFFICE/OFFICE/EXCEL9.OLB" \ rename("RGB", "RBGXL") \ rename("ExitWindows", "WordExitWindows") \ rename("DialogBox", "DialogBoxXL") \ rename("DocumentProperties", "DocumentPropertiesXL") こういう感じでEXCELとワードのVBAをVC++からつかえるようにしたのですが、 BSCMAKE: warning BK4502 : 切り捨てられた .SBR ファイル '.\Debug\StdAfx.sbr' は Debug/EightAppSdi.bsc 内にありません。 というエラーが出て、クラスウィザードが使えなくなりました。 助けてください
スレ違い。
>>682 何でですか?
Visual 「C++」の話ですよ。
答えられないなら黙っていて下さい。
685 :
デフォルトの名無しさん :04/12/25 03:04:20
>何でですか? #import
686 :
デフォルトの名無しさん :04/12/25 03:10:34
Chest! A buttock of a very rare Japanese serow!
687 :
デフォルトの名無しさん :04/12/25 10:32:47
CppUnit って、使う価値あるものですか? 簡単に調査した限りでは、あまりテストコードを書く助けにならないような気がするのです。 ライブラリをビルドしたりする分だけ、逆に手間がかかるように思います。 みなさんの率直なご意見をお願い致します。
必要な人には必要とされる。 素人にはおすすめできない。
>>681 昨日は調べ方が甘かった・・・
stdafx.hに書けばいいらしい
690 :
デフォルトの名無しさん :04/12/25 16:36:49
new演算子をオーバーロードして、それを継承させることはできますか。 具体的には、親クラスでオリジナルなメモリ管理ライブラリをnew演算子にオーバーロード (ここまでは簡単)、さらに、そこから派生させた子クラスもやはりその独自ライブラリでnew する、 みたいなの。 さらに、子クラスがtemplete で勝手な型を作ったときも、やはり、親クラスが勝手に作った 独自メモリ管理ライブラリがその勝手な型の中で使われないとまずいんです。 以上、何とかしてください。
オーバーロードできるnewは、グローバルなoperator new一つだけじゃなかったでしたっけ。
>>690 >さらに、そこから派生させた子クラスもやはりその独自ライブラリでnew する、
>みたいなの。
これは普通に出来る。
>さらに、子クラスがtemplete で勝手な型を作ったときも、
どういう事?
>>690 Effective C++7項〜10項
More Effective C++項目8
templateについては俺も知らん。
694 :
デフォルトの名無しさん :04/12/26 17:40:10
別スレで聞いたのですが答えがなかったのでここで質問させて頂きます。 C++で、読み込みファイルのランダムアクセスをするような、 以下のコードを書きましたが、 ifstream fin; fin.open("data.txt",ios::in); n=fin.tellg();//→n=0 do{ ・・・ }while(fin.getline(buf,256)); n=fin.tellg();//→n=70000 ここでまたデータを最初から読み込むために fin.seekg(0,ios::beg); としたところ n=fin.tellg();//→n=-1 となってしまいうまく行きません。 ご教授いただけないでしょうか。
>>694 一度最後まで読み切ってしまうとEOFフラグが立って、
それ以降ストリームが無効になると思われ。
fin.clear(); してみては?
>>694 seekg() の直後にエラー判定して std::perror() でも出してみると、原因がわかるかもしれん。
697 :
694 :04/12/26 17:56:22
695さん、696さん、ありがとうございました!! fin.clear();で解決できました。 ただ、fin.seekg(0,ios::beg);の後に perror("perror says :" );としたところ、うまくできる時 (clesrしたとき)もうまくいかない時(clearしないとき)も 同じ値でした。エラーにはなってないのですかね。
>>697 clear() でいけたんなら、ストリームインスタンスだけの問題。
errno は関係ない。
perror(errno)は、単に、クリアされないまま 前回エラーが起きた時(読み込み時にEOF)の値が残っているのでは
>699さん 説明不足でしたが、clearした場合としない場合でそれぞれ実行した結果、 perror("perror says :" );で、perror says : No error と出ましたので、(よく知らないですが)stream instanceの問題のようです。
C++標準でのエラーとは「規格とは外れた動作」を指すんじゃないんでしょうか? EOFが返ってくるのは規格と適合しているからエラーではないのでは
エラーの意味の取り方の違いでしょ? 何を基準に考えてるかっていうかね、そんな感じ。
703 :
デフォルトの名無しさん :04/12/27 21:58:18
すみません、教えてください。 Cの構造体をC++でも使いたいのですが、どのようにすればいいのでしょうか? <test2.c> #include "test2.h" AAA aaa; <test2.h> extern struct AAA { int int1; char str[256]; } aaa; <test1.cpp> #include "test2.h" ??? ↑こんな感じで使いたいです。 また、構造体を使うほかにCとCPPで値を共有する方法などはあるでしょうか。 宜しくお願いします。
.cから.cppのhoge関数を使いたい場合は、 // hoge.cpp extern "C" { void hoge() {…} } あとCの構造体はそのままcppでも使えると思うけど
>>703 Cだとstruct AAA aaa;じゃないか?
706 :
703 :04/12/27 22:13:58
704さんありがとうございます。 Cの構造体は普通に使えるんですね。 includeして実際にやってみまして、コンパイルは通りました。 が、実態がないようで、値の代入が出来ません。 デバッガで値を見ると、アドレスはあるみたいなのですがポインタ参照みたいになっています。 aaa : struct AAA * aaa みたいな感じです。 Cで実態を持たせてるのですが、CPP側でもincludeのほかになにかやらなければいけないことがあるのでしょうか?
>>705 ,706
ああスマンコ
Cでは
struct AAA { ・・・ };
で使用は
struct AAA hoge;
だけど、C++ではstructはclassと同じ扱いだから
AAA hoge;
だけでいい
709 :
デフォルトの名無しさん :04/12/28 00:21:39
> 705さん、708さん ありがとうございました。 どうにかできているみたいです。 C++だとクラスと同じ扱いになるんですね。
>>709 C++でのclassとstructの違いは省略時にpublicになるかprivateになるかだけ。
newの戻り値がnullかどうかってチェックするべきなんでしょうか? 今までVC6を使ってたんで一応、 char* ptr = new char[5] if (!ptr) return; みたいにしてたんですが、 VC7.1ではnewが失敗したら例外をなげるから、 if (!ptr) return; は無意味になる。 nullチェックってもう忘れちゃってもいいんでしょうか?
例外を投げるのが標準だから、 VC6を今後使うつもりがないなら無視してOK。
一応、Mozillaのコーディングスタイルでは newの後のnullチェックを義務づけてるけどね
>>712 ありがとうございます。
VC7以降なら標準にしたがって堂々と無視してOKってことですよね。
VC7以降と6で大幅に違うのってこれくらいでしょうか?
今はまわりがVC6から7.1に移行してる段階なんでいろいろ混乱がありそうです。
>>713 それも気になっていました。
Mozillaの場合は例外自体を使えない(発生しない)ようにしてる、は間違いですか?
>>714 テンプレートの部分特殊化の有無は
newが例外投げるより大きいんじゃなかろうか…
>>716 テンプレートの部分特殊化・・・、えーと、勉強してきます・・・orz
<new>ヘッダをインクルードしてnewをnew(nothrow)に変更すれば、古いnewと同じ動作をする。 #include <new> char* ptr = new(nothrow) char[5] if (!ptr) return;
>>718 using書いていないからnew(std::nothrow)ってつっこみはおいといて、
俺んとこは<new>をインクルードしなくてもnew(std::nothrow)が使えるんだけど、
<new>をインクルードしたほうがいい?
>>714 for の初期化部で宣言した変数のスコープがfor内部のみになった。
#つまりISOに準じた。
STLを使っても識別子の長さオーバーの警告が出なくなった。
CStringがテンプレートクラスになった。
#おまけでエンバグしたり仕様が変わった。
>>719 std空間はいかにしてソースに組み込まれたのであろうか?
インクルードヘッダが一切ない状態で試してこそ、真の漢である。
>>720 使えちゃったり。(VC7.1)
for(int i = 0; i < 10; ++i){ /* 何か */ }
i += 10; // OK
for(int i = 0; i < 10; ++i){ /* 何れか */ }
i += 10; // OK
>>722 俺もそれ気になってた、vc6.0では無理とか言ってるやつがいたから試したけど.netでも普通に使えた
//map<wstring, wstring> mapss; //wstring tmp; tmp = _T("key"); tmp += _T(" ") + mapss[tmp]; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~のところの式は合っているんでしょうか?
>>722 VC6互換にすると二番目のforでエラーにならないか?
ISO準拠なら当然代入がエラーな訳だが。
#ディフォルトがVC6互換なのは困ったもんだが。
>>725 VC7.1ではエラーにならなかったりする。
ただ、VC6では
>>722 のコードはエラーになる。
(C2374 : i が2回宣言されているぞ)
つまり、VC7.1では、状況が悪化していると…
>>727 悪化はしてないと思うが、
forスコープの外でiが使えるのは気持ち悪いな
>>721 俺の負けだ。
何もインクルードしていないときはnothrowはstd::付ける付けない関係なしに無理だった。OTL
>>724 typedef basicstring<TCHAR> tstring; // _TCHARでも可
map<tstring, tstring> mapss;
tstring tmp;
tmp = _T("key");
tmp += _T(" ") + mapss[tmp];
上か下か好きな方を選べ。
map<wstring, wstring> mapss;
wstring tmp;
tmp = L"key";
tmp += L" " + mapss[tmp];
>>726 >>730 レスありがとうございます
「式が合っている」とは、tmp += _T(" ") + mapss[tmp];でtmpに代入しますよね
その時にmapssでがちゃんと[tmp]をキーとして使えるのかなと思っただけです、よく考えたら使えますよね orz
=の右辺は一回どこかのバッファにためられてから左辺に代入してるのかな(わからないです)
すみませんbasicstringってなんですか、下のでも似たようなことが出来そうですけど
#define UNICODE
typedef wstring tstring;
#else
typedef string tstring;
#endif
732 :
携帯 ◆QkYL666666 :04/12/29 12:37:07
どこにカキコすればいいのかわからないのでここにカキコします。 情報工学科の大学一年です。 学校でC言語の講義があってLinuxを使っています。 自分はすごく苦手で毎日空き時間は学校のパソコン使って練習しています。 課題はできるのですが試験が全く出来ません。 例えば課題の例を出しますと、 毎日の睡眠時間を読み込んでその最大値と最小値と何日目であるのかを示すプログラムをかけ。 というようなものでそのようなものならできますが、試験では データの数(これはなんとかできます)、データの合計を秒単位と時間分秒で表す、最大値を分単位で表す、最小値を秒単位で表す、日毎の変動時間の平均値を分単位で表す、変動時間が一時間以上である回数 を表させるようにもっと複雑になってしまい何も出来ないです。 いつも数式を立てるのは紙に書けばすぐできますしフローチャートも順調に書けます。 けどプログラムをパソコンで組むと作れないことが多いです(コンパイルでは異常ないけど実行すると目茶苦茶な結果が出て来る) どうすれば解決できるようになりますか。他の筆記科目(微積、線形代数、力学、電磁気、化学、英語、回路講義、計算機についての講義等パソコンではなくペーパー試験)はだいたい8割以上とれるけど、このプログラムだけは半分もとれません。 やっぱり基礎が出来ていないからですかね。一応家には学校で支給されたKNOPPIXというのがあるので実家に戻って使う予定です。
>>732 で、何が聴きたいんだ?
とりあえず普段頭と紙だけで考えて、実際に動かしてないだろ。
735 :
デフォルトの名無しさん :04/12/29 16:44:56
732 必要な道具(関数)を考えろ。外部設計の基礎だ。
736 :
デフォルトの名無しさん :04/12/29 21:01:29
>>732 あー、いるいる。そういう奴。
初めから大風呂敷ひろげすぎては自爆を繰り返す藁パターンな。
(何を隠そう若き日の俺だったりするが)
まずシンプルに徹したVer1を確実に押さえてから少しずつVer-upすれ。
もともと複雑怪奇な問題はより単純な問題に分解することを再帰的にやれ。
気長な話だが、短気な性格にも活かし方はある。
>>731 basic_stringはstringやwstringの実体。ここからtypedefされている。
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
お前の#ifdef UNICODE〜#endifとtypedef basic_string<TCHAR> tstring;は結果は同じ、好きな方を選べ。
TCHARが short だったりしてな。
>>738 せめてunsigned shortだろ。
templateなstaticメンバ変数だけヘッダで初期化できるのは不公平だと思います!
742 :
デフォルトの名無しさん :04/12/30 19:51:55
>>740 C++使いにはいくつかの禁句があることを知れ
<<で出力とかばっかじゃねぇの? とか?
>>743 それはむしろC++使いも同意だったりするんじゃないかと
データはストリームに流すんだ と心の中で100回唱えれば納得できる
746 :
デフォルトの名無しさん :04/12/30 22:51:03
ロシア語で考えるんだ! пиписка!!
ズドラーストヴィーチェ!
<<で出力ってそんなにまずいのか? bit shiftと似て左に流れる=出力って分かりやすい気がするが cout << 'string'; で標準出力に流れていくみたいな ただ、<<がC++の最高の応用例と書かれていたり 最悪の応用例と書かれていたりかなり両極端だよな
iostreamの演算子オーバーロードは間違いなく邪悪。 演算子の意味把握するのにいちいち連想ゲームさせるな
lhs = rhs で左辺に代入されるから cout << "string"; a_variable << cin; が自然だと思うんだけどな…
cout << "string" << cin; string foo; cout << foo << cin;
Rubyの方が100倍美しく10倍効率的。
<<,>>演算子は、可変引数をもつ関数解決のための別アプローチだろ。
cinってなんて読むのですか?
シーイン
input 〜 from console
昔、cout を コート と読んでいたのは秘密だ
759 :
デフォルトの名無しさん :05/01/01 14:09:39
こうとな・・・・・・質素で上品な。けばけばしくなく上品な。「若いのにえらいこうとなもん着たはりますなあ。」
>>754 OCamlだったらSTLばりばり使ったC++より速いよ
>>760 速度有利なものと速度不利なものを比較して何が言いたいんだ?
762 :
デフォルトの名無しさん :05/01/01 15:12:44
質問です。 classのメンバーに別のクラスを含んだんですが その別のクラスのメソッドを、包括するクラスのメソッドとしても 実行できるようにしたいんですが 別クラスhoge void test(void); 包括クラスage void (*test)(); test=this->test; としたのですが メンバー関数は呼び出すかそのアドレスをとらなければならないと言われます。 どうすればいいでしょう。
class hoge { public: void test() {} }; class age { hoge _hoge; public: void test() { _hoge.test(); } };
765 :
デフォルトの名無しさん :05/01/01 15:23:09
>>763 ,764
ありがとうございます。
勉強します。
>>760 そもそもC++で作ったプログラムの実行速度なんて同じハードウェア環境下でも
処理系やコンパイルオプションによって雲泥の差があるんだから
その手の情報のほとんどは全然あてにならん。
Java だと toString メソッドを出来るだけ書けっていわれますが、これってC++にも当てはまりますか?
>>767 当てはまらない。
JavaはObjectクラスがtoStringを持ってるからオーバーライドすべきなの。
C++ならシステムがクラス名を必要とするときだけ同等のことをすれば良い。
>>761 速度有利なものと速度不利なものを比較しないと勝てないくらい実行速度に差があるって事だろ?
そもそもRubyとC++では土俵が違うし、それを無理やり比較して勝とうとするのは・・人はそれを厨と呼b・・(ry
言語間の違いを理解して目的に応じて使い分けるのが賢いやり方だろう。
(勿論、それだけで全てをこなすエキスパートの技術は素晴らしいと思うがな)
まぁ、どの程度実行速度に差があるのかは検証した事ないし
>>766 の言う様に状況に寄って結果も変動するからねぇ
770 :
デフォルトの名無しさん :05/01/01 20:06:34
要求を聞いた時点から言語の選択を誤り更に修正できない香具師は痛い
>>757 cout は char* out じゃないか?
×cout/out ○cin/in
774 :
デフォルトの名無しさん :05/01/01 23:59:00
const_reverse_iterator を const_iterator に変換するにはどうすればいいの? とりあえずvectorの場合で。
.base()
advance と distance を使う
>>776 あぁ、そういうのもあったね。忘れてた...
iterator使い鳴れないもんで..
もひとつお願い。 vectorのある位置を指すiteratorってどうやって表すのがスマート? vector<int> v; const_iterator f(int idx) { return v.begin() + idx; } だとちょっとカッコ悪かなと...
>779 それでいいんでない? vectorのイテレータはランダムアクセスイテレータなんだから わざわざadvanceを使ったりすることもないべ。
&v[idx]から変換できないのかなと思って... だめ?
漏れは統一目的でadvance使った方がいいと思うけど
std::vector<T>(ただしT != bool)に限っては、その保持するデータのメモリ 上のレイアウトが配列と同じでなければならないという訂正が規格に入った から、v.begin() + (&v[idx] - &v[0])で間違いではないだろう。iteratorと ポインタの同一視は一般的にはあまりよくないだろうが。
ん?何か俺頓珍漢なことを言ってるな。忘れてくれ。
>>782 ちなみに、advance()使った場合はどう書けばいいの?
const_iterator i;
advance(i, idx);
return i;
とか?
return &v[idx];
くらいに簡単にしたいんだけど...
786 :
デフォルトの名無しさん :05/01/02 01:34:41
小数の下の0の除去。例えば 0.0012300 これを 0.00123 にする場合、みなさんならどういう方法でやりますか?
string str="0.0012300"; double num; num = lexical_cast<double>(str); str = lexical_cast<string>(num); cout << str << endl;
788 :
デフォルトの名無しさん :05/01/02 01:57:43
boostライブラリ?
boost::lexcal_cast<>が楽だろうねぇ。
790 :
デフォルトの名無しさん :05/01/02 03:00:35
boost知らなかった。 標準関数やsprintfでは0の除去は用意されていないんですね。
boost使うと「文字列の末尾から'0'を取り除く」と直接書くこともでける string s = "0.0012300"; trim_right_if(s, _1 == '0');
is_any_of("0")じゃないの?
is_any_ofの存在を忘れてマスタ orz
794 :
デフォルトの名無しさん :05/01/02 03:42:02
誰か知識を貸してください! #ifndef __INITIALIZATION #define __INITIALIZATION #include "main.h" void initialization(MAIN_DATA*data); #endif をコンパイルすると e:###initialization.h(6): error C2065: 'MAIN_DATA' : 定義されていない識別子です。 e:###initialization.h(6): error C2065: 'data' : 定義されていない識別子です。 e:###initialization.h(6): error C2182: 'initialization' : 'void' 型が不適切に使用されています。 となりました。 ソースの方は↓でコンパイルは通ります。 void initialization(MAIN_DATA*data) { ...... } main.hの中には typedef struct_MAIN_DATA { ...... }MAIN_DATA; としています。 助けてエロイ人。
struct_MAIN_DATA ↑なんだこの_は
なる
>>785 boost::prior(v.begin(),idx)
next じゃないの?
まちがえちゃった。
>>794 根本的な問題の解決方法じゃないが
void initialization(struct MAIN_DATA*data);
としてみそ。
802 :
デフォルトの名無しさん :05/01/02 06:01:25
>>801 やってみましたが再定義されていますとのことorz
レスさんくすです^^
803 :
デフォルトの名無しさん :05/01/02 09:37:57
>>794 main.h の最終行は改行しているか?
804 :
デフォルトの名無しさん :05/01/02 09:43:06
802 typedef int int;
typedef struct→糞 _MAIN_DATA MAIN_DATA
#ifdef __cplusplusplus #else #endpg
807 :
デフォルトの名無しさん :05/01/02 16:11:21
よくoperatorで戻り型にconstつけて、かつoperator関数にもconstつける けど、戻り型にconstつけるとoperator関数にconstつけなきゃいけないのは なぜなんでしょうか?
808 :
807 :05/01/02 16:15:11
operatorの呼び出し元のオブジェクトをconstな型として扱わないと constな戻り型で返せないからですかね?
>operatorの呼び出し元のオブジェクトをconstな型として扱わないと >constな戻り型で返せないからですかね? はい.ただしデータメンバへの参照を直接返す場合とかの話ですけどね.
810 :
デフォルトの名無しさん :05/01/02 17:09:35
struct{ static int a; int b; }xx; 本体はstaticではなく、一部のメンバだけstaticって有り?無し?
811 :
デフォルトの名無しさん :05/01/02 17:11:54
もちろん、あり。
812 :
807 :05/01/02 17:15:06
>809 なるほど!!ありがとうございます! const abcclass operator*(const abcclass &ob)const; ~~~~~ ~~~~~ (1) (2) (1):戻し型の指定であって、呼び出し元とは関係ない (2):呼び出し元のオブジェクトを(一時的に)const扱いにする っていうイメージですかね。
813 :
807 :05/01/02 17:16:16
あ、半角スペース無視されるんだった。 すいません、(1)ははじめのconstで、(2)は最後のconstです。
>>812 その通りですけれど,そのoperator*の戻り値は一時オブジェクトなので
(1)のconstはあっても無くてもコンパイルは通りますよ.
(このconstを付けるか付けないかはこれはこれでよく議論の火種になりますけど)
815 :
807 :05/01/02 18:17:02
>814 そうなんですかー。 gccではテンポラリなオブジェクトはなぜかconst扱いになってしまうので (VCは呼び出し元依存だった気がします)、あってもなくても同じかと 思っていたのですが、議論されるまでのものだったんですかー。
組込型同様左辺値にはならないように互換性をとる テンプレートの実体化を邪魔して冗長なのでやめれ こんなとこか
ってかoperatorをconstにするのは当たり前だろ
constテンポラリが呼び出すかもしれないし
>>807 は基本からやりなおせ
818 :
デフォルトの名無しさん :05/01/02 21:35:59
>>803 改行はしていますよ。
あぁぁぁぁぁ・・・全然すすまない〜><
typedef struct_MAIN_DATA ナニコレ?
てかそもそもC++ならtypedefいらないし。
入門書を買ったのですが、途中まで親切なのに AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ #pragma once が突然出てきて、解説が無くて困ってます 何か良い本ないですか?
その解説書はVC++の本なのでC++の本じゃ無いです。 違う本を買ってね。
まさか年賀状に、 「新年あけましておめでとうございます」 なんて書いちゃった人いませんよね。
重複表現ってやつ? 俺は「新年おめでとうございます」って書いたけど
「新年」がどうなってめでたいのか書かないとだめ。 「新年」つまり「新しい年」がめでたいのではなくて、「新年」が「あけた」事がめでたい。 「新年」自体は「あけた」という意味が付随していないから、 「新年あけましておめでとうございます。」 は全く問題ないと思う。
「新年」に「あけた」が付随してるんじゃなくて 「あけた」に「新年が」が付随してるからダメだ、と 年賀状の書き方とかに載ってるよ
gooの辞書によると あ・ける 0 【明ける/空ける/開ける】 (動カ下一)[文]カ下二 あ・く (2)時間が経過して次の新しい年・日や季節が始まる。主語を示すことはない。《明》 とのこと。主語を示しちゃいかんそうな。
placement-newじゃないですが void* buf = (void*)new char[sizeof(HOGE)]; Hoge* hoge = (HOGE*)buf; hoge->hoge(); // コンストラクタ呼び出し hoge->~hoge(); // デストラクタ呼び出し これって大丈夫ですか? delete hoge とかやるとデストラクタ呼び出してくれるんでしょうか。
そいつぁやばいでしょ
>>830 ちゃんと placement-new 使え。
謹賀新年 本年もご指導ご鞭撻のほどよろしくお願い申し上げます 2005年1月 ぬるぽ
ガっ
class NullPointerException : public std::logic_error {
ぬるぽってlogic_errorとは限らないんじゃ・・・
struct NullPointerException : public 2ch::nurupo { const char* what() { return "ガッ!"; } };
838 :
デフォルトの名無しさん :05/01/03 20:40:11
継承したときのコンストラクタの書き方で質問です。 親クラスParentと、そこから派生したChildがあったとして、 ChildのコンストラクタでParentのコンストラクタも呼びたい時、 Child::Child():Parent(){} と書くのと、 Child::Child(){ Parent::Parent(); } と書くのでは何が違うのでしょうか。
class NullPointerException : public ぬるぽ { NullPointerException(const std::string& what) throw(ぬるぽ) : ぬるぽ(0) {} }; なぜこれが標準でないのか小一時間問いつめたい
>>838 前者は親コンストラクタ->派生コンストラクタと呼ばれるが
後者は親デフォルトコンストラクタ->派生コンストラクタ->親コンストラクタと呼ばれる。
つーか後者みたいな呼び方っていいんだっけ?
コンストラクタ内でthisが絡む事はやっちゃいけないんじゃなかった?
>838 後者はコンパイラによって暗黙的に次のようなコードになる。
// 途中で送信しちまったorz Child::Child() : Parent() { Parent::Parent(); } だから、親クラスのコンストラクタを2回呼び出していることになる。
貴様らにイイ事を教えてやろう。いや、お前らにとってはバッドニュースになるかな?ククク…。 昨日の練習で俺はボクシングを完全に理解した。なにせボクシングビデオの技はもう全て使いこなせるからな。 ジャブからパリングまで完璧だ。 連れに受けてもらったが全然俺のパンチがかわせない。 スパーリングって奴だな。 もちろん連れの撃つ素人パンチは全然当たらない。 今の俺はプロレヴェルに達してる。
>>838 前者の形でしか呼べませんです。
後者は Parent クラスの一時オブジェクト(this の異なる他人)を作ってるだけだよ。
>>844 SUGEEEEEEEEEEEEWEWWEEEE!!!!!!!
>840-843 No ・・・って答えかかれちゃった
なるほど分かりました。 親クラスのコンストラクタは、普通の関数のように呼び出してはいけないんですね。 ありがとうございました。
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } } というマクロはもしinline関数に直すとすると inline void safe_delete(void* ptr) { delete ptr; ptr = NULL; } これでいいのでしょうか? NULLポインタはdeleteしても問題ないそうなのでif文は省略しました。
>>849 駄目。
駄目だからこそマクロが未だに存在する。
>>849 template <class T>
inline void safe_delete(T*& p)
{ delete p; p = 0; }
これで無問題
>>850 即答ありがとうございます。
素直にマクロ使うことにします。
>>851 テンプレートを使うことは考えましたが、ポインタへの参照を使うとは盲点でした。
修行が足りませんですね。回答ありがとうございました。
SAFE_DELETRマクロとの互換性を考えないなら template <class T> inline void safe_delete(T** p) { delete *p; *p = 0; } int* hoge = new int; safe_delete(&hoge); でもいいんだけどね あと >ptr = NULL; はローカル変数を変えてるだけだから意味ないよ
これは初歩的なミスを… 逝って来ます。
namespaceごとにフォルダを作ってそこにソースを格納した方がいいのでしょうか? 例えば namespace foo 内にかかれたライブラリ(のソース)は /foo に、 namespace bar 内にかかれたライブラリ(のソース)は /bar に配置、といった具合です。
type_infoのコピーコンストラクタや代入演算子が private属性に制限されている理由を教えてください。 よろしくお願いします。
>>858 代入などがしたければ type_info へのポインタを使えば十分だから。
> safe_delete std::auto_ptr 使え。
>>858 理由はない。設計者がヘボだっただけだ。
865 :
デフォルトの名無しさん :05/01/06 03:18:44
微妙に今更感も漂うけどね。
std::ofstream fd( "hoge" ); に文字列を書き出します。 fd << "hoge\n"と fd<< "hoge" << std::endl; を比較すると(試したのはもう少し複雑ですが\nをstd::endlに置き換えると) 1.6倍くらい遅くなりました。こういうものなのでしょうか?なんか対策はないですか? 環境は、IntelC++のver.8です。
>>867 それはendlにはバッファのフラッシュの機能が含まれているからです。
よって"hoge\n"だけでは表示されない場合があります。逆に言えば、
何度も改行を行う場合には'\n'の出力によって行い、最後にcout << flush;
とした方が、バッファのフラッシュを一度しか行わず、一般的に処理が
高速になります。
>>868 早速のお返事有難うございました。
しかし、cのFILEよりもc++のofstreamはかなり遅いですね。
test-cpp.cpp
#include <fstream>
int main( void ) {
std::ofstream fd( "hoge" );
for ( std::size_t i( 0 ); i < 10000000; ++i ) {
fd << "hoge\n";
}
return 0;
}
test-c.cpp
#include <stdio.h>
#include <stdlib.h>
int main( void ) {
FILE *fd( fopen( "hoge", "w" ) );
for ( unsigned int i( 0 ); i < 10000000; ++i ) {
fprintf(fd, "hoge\n" );
}
return 0;
}
をコンパイルして速度を比較してもFILE*の方が2倍近く速度が出ました…
まあ使い分けろってこった
>>869 STLportのファイル入出力はかなり速いぞ。
>>869 cygwin gcc 3.3.3 で /dev/null に対してテストしてみた。
c : cpp = 3 : 4
くらいだった。
2、3段関数呼び出しがはさまったていどじゃ、
こんなに差は出ないよな?
具体的なオーバーヘッドって、なんだろう。
拡張性、柔軟性を高めてるんだから、その分遅くなるのもしょうがない。 void load(FILE *fp); こんな関数ではファイル、stdinくらいしか渡せないが void load(istream &is); この関数にはファイルもstdinも文字列ストリームも(自作すれば)TCPストリームでも、 istreamを継承したものならなんでも渡せる。 柔軟性なんかいらない、スピードだけが欲しい、というのならfopen使っとけ。
>>872 最適化してその結果?
つーか、gccだと単純なfprintf()はfputs()呼ぶからなぁ。
std::cout << "hoge\n";でもいっぺんデバッガで追ってみれば遅くて当然と納得できるだろ。
Metrowerks CodeWarrior for Windows v8.3 c:cpp = 6453:7297
参考までに、 minGW, VC7で iostream VS FILE* 試してみたけど バイナリ入出力では誤差ぐらいしか違わんかった。
>>877 じゃあ、問題は iostream の方じゃなくて、string の側にあるってことか。
まあ、string は機能性重視のクラスだしね。
stringの実装は大きく違うからねぇ VC6と7.xでも確か変わらなかったっけ? 短文用のバッファが導入されたとか
std::string って copy-on-write?
実装次第。VC++7.1付属のものはCOWじゃない。
VC6 に string::clear がなかったのには驚いた おかげで全部 string::erase に書き換え…
VC6だったらstlport使うから無問題だろ
まあ、10年近く前のコンパイラだし。許したれ。 C++のISO標準もまだできてない頃だったと思うし。
ようするにC++じゃないってことだろ? さっさと2003に乗り換えなさい
とりあえずコンパイラをVCTKのに。
887 :
デフォルトの名無しさん :05/01/10 14:56:06
fstream にてファイルのステータス等を調べるにはどうしたらよいでしょうか? ちょっくら調べたのですが Cでいうところの fstatのようなのが見つからないです。
fstatって標準関数じゃないような…?
標準関数では _stat _stat64 _stati64 _wstat _wstat64 _wstati64 _fstat _fstat64 _fstati64 とかいっぱいあるのはわかっているのですが、あくまでもC標準関数なので・・ fstreamクラスのメソッドとしては実装されていないんでしょうか? こんな感じで使えないのかな、と思いまして・・・ fstream testfile(c:\hoge.data); stat_t file_info; testfile.stat(&file_info);
>fstream testfile(c:\hoge.data); × fstream testfile("c:\hoge.data"); ないのであればfstatにしておきます〜
Cの標準関数じゃないって
え?そうなんですか? よくわかってなくてすいません;;
Cの標準関数じゃないから、C++の標準関数にも入ってない
あ〜そういえばPOSIXでしたね・・・
「そういえば」って、おまえ・・・
久しぶりに痛い香具師を見たな。
897 :
デフォルトの名無しさん :05/01/10 17:32:00
900 :
デフォルトの名無しさん :05/01/10 20:49:32
<boost/regex.hpp> をインクルードした状態で fopen とか memset とか使うと 「オーバロード関数の呼び出しが解決できません」 と出るんだけど、回避策を知ってる人いませんか?
901 :
900 :05/01/10 20:51:57
ごめん、自己解決しました ::fopen とか書くと解決できるみたいです なんかめんどいけど・・・
>>901 × ::fopen
#include <cstdio>
#include <cstring>
std::fopen
std::memset
904 :
デフォルトの名無しさん :05/01/11 13:57:42
001.hに #define TATE 10があって、 int intarray[TATE];のような形で利用してるんですが、 001.cppにも #define TATE 10があってそれを使っているんですよ。 どちらか片方から 10 という定数を消す方法は無いですか? ちょっと変えたいときに*.cppと*.h両方変えるのが面倒なんです。 VC++6とBCCを使用してます。
>>904 001.cppで001.hを#includeしちゃだめなのか?
906 :
904 :05/01/11 15:00:22
>905 001.hを#includeすれば001.cppに書く必要は無いんですね。 目から鱗が垂直離陸。
途中で送信してしまいました。ありがとうございました。
垂直離陸いいなw
#ifndef TAKE #define TAKE 10 〜〜〜〜〜 #endif こんな方法もある
それを書くなら #ifndef TATE #define TATE 10 #endif だな。
>>909 っつーか、そもそも ANSI C++ の規格上、同じマクロを二回定義しても問題ないぞ。
値が違う (#define TATE 10 と #define TATE 5 とか) のはダメだが。
913 :
デフォルトの名無しさん :05/01/13 02:51:03
#define TATE だけでいいんじゃね?値なんてどうでも良いし。
ageちまった。スマソ
質問読めよ池沼
インクルガードじゃねーのか。スマソ
最近スレが閑散としてますね
下ネタかよ...orz
参照渡しって結局ポインタを渡すからコストはポインタ渡しと変わらないんでしょうか? それともインライン展開のことを考えるとポインタたどらなくていい参照渡しの方がいいんでしょうか?
参照もポインタ辿るよ
¬¬
スレ違いで申し訳ないのだが、お尋ねしたいことがあります。 一番初めに学ぶべき言語はなんですか?(HTML除く)
>>922 もう来なくて結構ですから。
すれ違いですから。
いけませんから。
最初に学ぶべきなのは日本語。 次は英語。
925 :
デフォルトの名無しさん :05/01/15 14:19:13
な、何だ!この青汁みたいな色のスレッドは!
>>922 俺はだまされないぞ。
お前は埋め厨だろう?そうだろう?そうだといえ!
ちょいと質問。 complexのようなtemplate classで、座標値をあらわすようなものはないだろか。 complexでも悪くないのだけれど、公開メンバx,yがあるようなのがいいなぁと。 いやまぁ、標準ならそれを使うし、boostならそれをパクるし、そうでないなら自作するのだけれど。
>>929 first, secondをx, yの代わりに使うのか?
>>928 boost::tuples::tuple
>>930 そういう事になるな。3次元への拡張性はないけれど。
>>929-932 レス感謝。
tupleを持ち出すのもpairを使うのもI/Fがオーバスペックな気がするので
complexの実装見ながらもう少し考えてみる。
>>932 pair<x, pair<y,z> >
要求仕様見ながら実装してたらなんだかMFCのCPointのようになって来た悪寒。 あっちは整数だったと思ったけど。
class TestA{ public: TestA() { a = new int; } ~TestA() { delete a; } int *a; }; class TestB : public TestA{ public: TestB() { b = new int; } TestB(const TestB& B) { b = new int; *b = *B.b; } ~TestB() { delete b; } int *b; }; main() { TestB a; TestB b = a; } というプログラムで何故コピーコンストラクタでTestAクラスのメンバのaに別のアドレスを割り当てなくても大丈夫なのでしょうか? C言語なら俺に聞け!スレでスレ違いと言われたのでこちらに来ました
大丈夫じゃないだろ main() { TestB *a = new TestB(); a->a = 100; TestB b = *a; delete a; cout << b.a << endl; } ってやってみ
>>937 TestB b = a;
ではTestAのデフォルトコンストラクタ->TestBのコピーコンストラクタと呼ばれるから
TestA::a自体は有効なアドレスを示してる。
アドレスが指してる先の値はコピーされてないけどな。
なるほど ありがとうございました
あるソフトのプラグイン用のDLLを作成しているのですが いままでC言語(C++ではない)形式で作っていました。 複雑になってきたので、処理の一部をC++で書き換えたところ うまく関数をエクスポートできなくなってしまいました。 インターフェイス部分のみCで、内部の処理をC++で書きたい場合は どのようにすればいいのでしょう?
extern "C"のことを聞いてるのか? それともどういったかんじで関数を処理すればいいのかという話か?
942です いままでaaa.cですべてまかなっている状態だったのを 内部の処理のほとんどの部分を新規にbbb.cppに作り直して aaa.cとbbb.cppの二つのファイルにし エクスポートする関数はいままでと同じ書式のままaaa.cに残したいのですが aaa.cからbbb.cppのクラスを呼ぶことができません C言語とC++との混在している状態でコンパイルするのは不可能ですか?
>>944 そりゃ、aaa.c はC言語だから、クラスは使えないね。
そんなときは extern "C" 使ってくっつける。
// bbb.h
#if !defined(__cpluplus)
extern "C" {
#endif
int bbb_xxxx( int a , int b );
#if !defined(__cpluplus)
}// extern "C"
#endif
// bbb.cpp
#include "bbb.h"
class bbb {...};
int xxxx( int a , int b )
{
bbb b( a );
return b.xxx( b );
}
// aaa.c
#include "bbb.h"
942です externで検索していろいろ調べてみました CとC++ではリンゲージというものが違うようですね extern "C"を指定してエクスポートすることで あえてaaa.cのほうは使う必要がなくなったので bbb.cppのほうからextern "C"にてエクスポートすることにしました。 大変参考になりました。ありがとうございます
ビャーン先生がD&Eの前書きでこてこてなjava批判してたねぇ
まだ読んでないんだけどどんな批判なの?
949 :
デフォルトの名無しさん :05/01/21 00:30:28
ツルピカ
C++にもスレッド入らないかな?
951 :
デフォルトの名無しさん :05/01/22 17:38:26
もしかしてタスクスケジューラを C++ で書いてる例か?
class BASE{ public: virtual void out(int n = 0){ 〜; } virtual void out(void){ 〜; } }; class A1 : public BASE{ public: void out(void){ 〜; } }; int main() { A1 a; a.out(); a.out(2); // ←コンパイルエラー return 0; } これってなんでコンパイル通んないんでしょう? MSVC .NET使ってます。
out(void)がBASE::(int)を隠しているから 隠すなら private に明示的に using する 隠したくないなら public に using する はっきり汁!
>>952 名前解決の順序が、引数型によらず
1. まず最も内側のスコープ内 (この場合だと A クラス内部) で探す
2. 見つからなかったら、一つ外のスコープ (この場合だと BASE) で探す
でリストアップしてきて、その中から引数型が合うものを選択するため。
そうなってる理由はともかく a.out(2) で BASE::out(int)を呼び出したければ
class A1 の定義中で using BASE::out; しとけば OK。
あと BASE::out() は BASE::out(int n = 0) と BASE::out(void) どちらを呼んで
欲しいのか意図が謎。なおした方が良いと思うぞ。
>あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。 エー
>>953-955 ほんとありがとうございます。よーく分かりました。
>デフォ引数
色々実験してる内に付けてしまったもので、投稿前に消し忘れてました。スマソ
あいまいになる!って突っ込まれるなあと思ってました。。。
何はともあれ、明快な解答ありがとうございました!
>>956 エー、じゃない。おまいはCプログラマか。
959 :
デフォルトの名無しさん :05/01/22 19:07:38
extern "C" のときは書いてる >(void)
>>950 そんなあなたにboost::thread
>>960 使ってるけど全然だめぽ
おとなしく言語仕様に取り入れてほしい
でも時期標準のリストにはスレッドのスの字も無かったっけ…orz
極力機種依存を避けてる以上無理だろねぇ
実装レベルをいくつかに分けるとか、 モジュールに分けたりとかして、 実装がサポートする範囲を選べるようにできないかなぁ…… やっぱ無理かなぁ……
せめて synchronized, wait, notify, notifyAll, join だけでもサポートして欲しい
おとなしくjava使えよハゲの下僕ども
>>961 無理だろうな。D&E でも Bjarne が「並列処理を必要とするアプリケーションは
多いが、そのための唯一の支配的な方式はない」と断言してる。
C++ の用途は数値計算からオフィススイート、データベースエンジン、OS、
ゲームまで幅広い。特定のプログラミングスタイルや、目的に特化した機能は
現状の C++ の利点を殺すことになるから、まず入らん。
>>963 実装レベルを分けるってのはいいね。
EC++の逆ね。やって欲しいな。
質問なんですけど、 class MyString { string *pstr; public: MyString(const MyString ©) { pstr = new string; *pstr = *copy.pstr; // ←この部分 } string *GetString() const { return pstr; } } *pstr = *copy.pstr; この記述はなんでコンパイルエラーにならないんですか? *pstr = *copy.GetString(); じゃなきゃだめだと思うんですが。 ちなみにコンパイラは BCC5.5 です。
>>969 クラスの定義内では自分自身と同じ型の変数はprivateでも丸見えだよ。
C++的にOKだからココンパイルエラーにならないんだよ坊や
落ち着け坊や
( ・∀・)つ〃∩ ヘェー どうもありがとうございました
privateの仕様: 「メンバへのアクセスが制限され、 そのクラスのメンバ関数とフレンド以外はアクセスできなくなる。」 【クラス】とは書かれているが、【インスタンス】とは書かれていない。 詐欺的表現にも見えるが、所詮、騙される方が悪い。
975 :
デフォルトの名無しさん :05/01/23 01:00:06
なぜ C++ は以下のように浮動乗数点数の定数を定義できない仕様にしたのでしょうか? struct X { static const int i = 100; // OK static const float pi = 3.1416f; // error };
むしろprotectedのときに引っかかるんだな。 基底クラスのprotectedメンバに触れるのは 自分自身と同じ型を参照しているときだけってのに 気が付かないで基底グラス型を参照しながら、 「protectedメンバに触れねぇぞ、なんじゃこらぁ!」
>>975 質問がおかしい。static constな整数型のみクラスボディで初期化可能なのであって、
それ以外の静的データメンバはクラスボディの外側で初期化しなければならない。
だからstatic const intが特別な例外なのだ。
978 :
デフォルトの名無しさん :05/01/23 01:17:50
>>975 「なぜ Bjarne は」もしくは「なぜ WG21 は」じゃないか?
昔はFPUがなかったりして浮動小数点の処理がいちいち関数だったりしたからじゃないか?
不動小数点数がコンパイル時定数である必要性が無いからかな struct X { static const int i = 100; // OK static const float pi; }; const float X::pi = 3.14f; //OK これでいいだろ。:
>>980 ヘッダで定義できないのは嫌じゃないか?
ヘッダとでバラバラに書くのが鬱陶しいよな C++ FAQ ではヘッダに書けるもんはヘッダに書けばいいって書いてたけど
float pi() {return 3.1416f;}
984 :
デフォルトの名無しさん :05/01/23 03:02:24
数値を見てそれと分かるんだから #define PI 3.1415f
986 :
デフォルトの名無しさん :05/01/23 03:06:54
>>985 float 限定やだ
それがたとえ long double 限定でも同じこと
987 :
sage :05/01/23 03:39:32
Task.hで class Task{ ... } Task.cppで定義する んでもって Enemy.hで #include "Task.h" class Enemy:public Task{←ここでエラー ... } "型名が必要" とエラーになってしまします。 どういうことでしょうか?ご助力お願いします。 BccとBccdev使ってます。
>>987 class Task {
...
}; ←このセミコロンを忘れているというオチじゃないよね?
そろそろ次スレの季節なの?
すいません、大丈夫です・・・ 書くの忘れてました
>>990 俺の所ではエラーでないぞ。ソース全部晒してみろ。
次スレのタイトルはスレが乱立しないように C++相談室(STL含む) part39 でよろしく
>>975 enumとの互換性を保つ為に、クラスボディで整数型のみ初期化可能にした
994 :
デフォルトの名無しさん :05/01/23 10:33:05
C++相談室(STL,template含む) part39
STLつかうと一気に実行ファイルサイズが10倍に?!
>>992 STL含むって言うけどさ
>>1 に
「テンプレートライブラリ(STL含む)に関する質問は専用の別スレにお願いッス。」
って書いてあるのはどうする?
templateスレの次スレのスレタイにSTLを入れてもらう方がいいんじゃないか?
997 :
デフォルトの名無しさん :05/01/23 11:05:55
そのうち関数スレとかクラススレとか・・・・ もうアフォかとヴァカかと
>>997 はぁ?お前が馬鹿でアホだろ。C++より長いCでもそんなスレできてねーだろタコ。
と煽ったからって自分で糞すれ立てたりするなよ。馬鹿は困るねぇ。
999
1000 :
デフォルトの名無しさん :05/01/23 13:19:12
rubyyyyyyyyyyyyyyyyyyyy!!!!!!!!!!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。