1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
448 名前:439 mailto:sage [2008/01/24(木) 23:40:37 ] みんなThx!ふと気になってレス見ないで書いちゃった、スマソ。。
449 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:42:03 ] #include <vector> using namespace std; main(){ vector < int > a(100); a[0]=1; a[1]=2; }
450 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:43:36 ] main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type main.cpp:4: error: ISO C++ forbids declaration of ‘main’ with no type lipo: can't figure out the architecture type of: /var/tmp//ccLa7Foj.out make: *** [debug/main.o] Error 1
451 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:48:58 ] 今年のカレンダー表示ってどうやるんですか?
452 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:52:00 ] 作って表示すれば?
453 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:58:43 ] エンディアンの勉強をしてまして、色々ググってみると、例えばリトルエンディアンの場合、 0x1234abcd の値をメモリーに格納する際、下位アドレスから順に、cd ab 34 12 と入りますが、 ここで疑問なのが、1バイトの中身のビット列はどのように扱われているのか?という点です。 1バイト8bit分のデータは、エンディアンにかかわらず常に、例えば 0x12 は、00010010 のビット列 が保たれているのでしょうか?
454 名前:405 [2008/01/25(金) 00:03:17 ] 405ですが 筆算の問題、 >>421 みたいに全部かけた後にまとめて足すってできるんですか? それとも2桁ずつ掛け算して足してかないとむり? 例えば123*123だったら 123*3=369 123*2=246 →369+2460=2829 123*1=123 →2829+12300=15129
455 名前:デフォルトの名無しさん [2008/01/25(金) 00:07:35 ] >>454 421のやりかたでできるだろ 下のだとめんどくさくないか? よくわからんのだが
456 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:21:15 ] >>453 エンディアンは多バイトデータの配置の種類 1バイトは関係ない(同じ内容になる)
457 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:29:57 ] >>453 1バイトがどのように格納されていようが、 どうせ1バイト単位でしかメモリアクセスできないのだから、 違いは観測できないだろ。
458 名前:457 mailto:sage [2008/01/25(金) 00:34:10 ] そういえば、ビットアクセス命令のあるCPUもあるか・・・
459 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:40:27 ] 1byteが12bitの環境もあるわけで
460 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:41:05 ] 環境がBCCDeveloperというものです。 hoge.txtという名前のテキストファイルを作るプログラムで 同じフォルダの中にすでにhoge.txtという名前のテキストファイルがあったら もともとあったテキストファイルの名前をhoge1.txtとして変えて新しく作るテキストファイルを hoge.txtとすることはできるでしょうか。 できる場合はどうしたらいいでしょうか。
461 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:45:23 ] >>460 hoge.txtがあるかどうかを調べる あったらファイル名を変更する hoge.txtを作る System("if exist ren hoge.txt hoge1.txt");っていけるのかな?
462 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:51:48 ] >>461 すばやい回答ありがとうございました。 早速とりかかってみたいと思います。
463 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 00:54:52 ] >>454 とりあえず10桁で作ってやったぞ。わからんとこあったら聞いてくれ。 #define N 10 int main( void ) { int a[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210 int b[ N ] = {0,1,2,3,4,5,6,7,8,9};// 9876543210 int result[ N * 2 ] = { 0 }; // 9876543210*9876543210=97546105778997104100 for ( int i = 0; i < N; i++ ) { for ( int j = 0; j < N; j++ ) { result[ i + j ] += ( a[ i ] * b[ j ] ); for ( int k = i + j; k < N * 2 - 1; k++ ) { if ( result[ k ] < 10 ) break; result[ k + 1 ] += result[ k ] / 10; result[ k ] %= 10; } } } for ( int i = N * 2 - 1; i >= 0; i-- ) { printf( "%d", result[ i ] ); } return 0; }
464 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:30:19 ] こんなかんじか #define kosu 4 add(unsigned int *a, unsigned int *b, unsigned int *c){ int ketaagari=0; for(int n=0; n<kosu; n++){ c[n]=a[n]+b[n]+ketaagari; ketaagari=a[n]>UINT_MAX-b[n]; }} seki(unsigned int *a, unsigned int *b, unsigned int *c){ }
465 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:34:37 ] 50桁までカウントさせるのが面倒で積は諦めた
466 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:44:04 ] 500メガ程度の複数のテキスト文書があるとします これから単語の頻度を求めたいとします どのようにしたらいいでしょうか? 単語は最低4バイトのものを言います 配列でカウントできないし良い方法ありますか
467 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:46:06 ] 3バイトの頻度なら、int
468 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:49:00 ] >>466 最低4バイトということは200Kバイトの単語がある可能性も考慮しないとだめですか?w
469 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:56:06 ] >>468 厳密に求めなくて良いです 高頻度の単語が抽出出来ればいいです 1単語しかなければもとめなくていいです
470 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 05:01:15 ] 一回目で24bit列を配列でカウントして、 2回目でたとえば100回以上出現したものの後ろ10バイトずつファイルに切り出して そのファイルごとにしらべればいいか
471 名前:デフォルトの名無しさん [2008/01/25(金) 07:23:25 ] >>420 ありがとうございます。なので、 0.55, 1.55, 8.55 =>切り上げなので、上記現象なし 2.55 〜 7.55 =>切り下げなので、上記現象あり なのですね。 ところで、上記質問をしてから色々調べたのですが、浮動小数点(例えばC言語のdouble)の 仮数部の丸めについて、丁度中間の場合は偶数になるように丸める、というルールが あるらしいのですが、これは小数点の場合にどういう風に当てはまるのかわかりません。 これって二進数だと全部あてはまってしまうような気が、、、 どうなっているのでせうか
472 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 07:36:58 ] >なのですね。 いいえ。
473 名前:デフォルトの名無しさん [2008/01/25(金) 11:27:52 ] #include <stdio.h> #include <stdlib.h> #include <string.h> void fileread(int,char * []); int main(int argc ,char *argv[]) { if(argc!=3){printf("次回から引数を入力してください\n"); return 0; } if(!strcmp(argv[2],"r")){ fileread(argc,argv); } return 0;} void fileread(int argc,char *argv[]){ FILE *fp; char *buffer,*str,*n,*s; fpos_t start_fpos; int filesize,count=0; fp=fopen(argv[1],"r"); fgetpos(fp,&start_fpos); fseek(fp,0,SEEK_END); filesize=ftell(fp); fsetpos(fp,&start_fpos); buffer=(char *)malloc(sizeof(char)*filesize); str=(char *)malloc(sizeof(char)*1000); printf("検索する文字列を入力してください\n"); scanf("%s",str); while(s=fgets(buffer,filesize,fp)){ count++; n=strstr(buffer,str); if(n){printf("%d行目 %s",count,s) }; } free(buffer); fclose(fp); }
474 名前:473 [2008/01/25(金) 11:30:38 ] >473 csvファイル検索プログラムを作ったのですが、ファイル名にワイルドカードが使えないので 実用性にかけます。上記のプログラムにワイルドカードの組み込むにはどうすればいいでしょうか? ただし、ファイル名はmain関数の引数で取得いたします。_findfirst,_findnextを使うところまでは なんとなく理解しました。
475 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:34:25 ] >>474 環境は? 場合によっては wildargs とか使える場合もある
476 名前:473 [2008/01/25(金) 11:41:30 ] OSはCENTOS 5です。コンパイラにはgccを使っております。
477 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:56:10 ] ワイルドカードはどんなのを? そのままだとシェルが勝手に展開しない?
478 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 11:57:55 ] >>473 またお前か。あちこちおかしなプログラムなのは相変わらずだな。 最低でも、バッファオーバフローの可能性は排除しておけよ。
479 名前:473 [2008/01/25(金) 12:20:12 ] >>477 *.csvとかですね。 そのままでは無理でした。 >>478 その件については、なんか知らんけどプログラムができあがりました。 あらかじめ指定されている仕様でしか作ったらいけないことになっておりまして、 どのようにすればそのようにできあがるのか悩まされている次第です。 一応さきほどのプログラムは作りましたが、io.hは無いそうで、_findnextも使えないですね。 こういうときそのヘッダファイルをダウンロードしてヘッダファイルがたくさんあるところに放りこめばいけますか
480 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 12:37:23 ] ヘッダだけ持ってきたって実装したライブラリが無きゃ無理だろ。 通常は、シェルが展開するんだが、、、opendir、readdir使って 正規表現で検索するとかしてみては
481 名前:473 [2008/01/25(金) 12:49:24 ] >>480 ありがとうございます。 階層を一段間違えておりました。 普通に通りますね。よかった・・・
482 名前:デフォルトの名無しさん [2008/01/25(金) 13:31:29 ] >>472 int main() { double d = 3.55; // ここの数字を変更する int n = d * 100; cout << n << endl; return 0; } でも上記プログラムでは、浮動小数点の規格上、 d = 0.55, 1.55, 8.55 =>それぞれ0.5500000....1, 1.55000...1, 8.55000...1 とかになるので、100倍しても減ったように見えたりしない。 d = 2.55, 3.55, 4.55, 5.55, 6.55, 7.55 =>それぞれ2.5499999...などとなるので、 100倍すると、(double)254.99999==>(int)254などとなってしまう。 と理解していたのですが、他の方も書いてくれてたように、Visual C++ 2008でやると d=3.55の時、355と表示されました。(gccは354)
483 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 17:29:42 ] VC++がx86の80ビット浮動小数点数レジスタを使い回すからかと思ったけど、 一旦64ビットでメモリに書きだすように仕向けてもやっぱり355になるな。
484 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:42:42 ] 関数に配列へのポインタへ渡してデータょ書いてもらう場合 std::vector buffer(1024); hogefunc(&buffer[0]); とかくのは違法ですか?
485 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:47:47 ] 確保したバッファサイズをはみ出さないのなら問題ない
486 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:08:51 ] private:な物の位置調べて無理やり書き込むわけだが。
487 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:19:56 ] そういうことができるように、 vectorは生の配列同様、要素の連続性が保証されている。
488 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:41:51 ] ぬるぽ渡せば書かずに文字数返すくらいしてくれてもいいよな。 これみたいに。 ttp://msdn2.microsoft.com/ja-jp/library/k1f9b8cy(VS.80).aspx
489 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:07:37 ] >>488 Win32APIスレの誤爆か?
490 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:51:13 ] inline int nazo(void) { return __LINE__; } 呼び出すと戻ってくるのはどこのあれですか?
491 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:52:04 ] そこ
492 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:59:02 ] たぶん3
493 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:01:39 ] __LINE__やら__FILE__やら__func__はコンパイル時に埋め込まれる
494 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:02:18 ] __func__ マクロじゃなくて定数だったはず。
495 名前:デフォルトの名無しさん [2008/01/25(金) 21:09:16 ] ik88 ectuo\ }{([8 ]\@p : dcdc dcdcdcfvfv7qa11111111111111111111111111111111 mnbcadcfvghujk,ol9iikurf4ed333333333333333331W2E3TR4G56
496 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:38:01 ] きーけぼーどのいちばんうきえらをうつと 12w3e4rgt5h6789o0:^\ !"#$G%H&'()~*=~| とにゅうりょくされます。 こしょうですか?
497 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:41:14 ] pepper
498 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 21:55:26 ] スキンラインの短絡
499 名前:デフォルトの名無しさん [2008/01/26(土) 03:17:03 ] APIについての質問です。 Visual C++ Express 2008で英単語印刷ソフトを作っているのですが、 ウインドウに、ネットの検索欄のような入力欄を作ることは可能でしょうか? それを使って単語の検索機能などを追加したいのですが・・・。 もしよろしければ教授ください。
500 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 03:55:07 ] VCスレかAPIスレ池。
501 名前:デフォルトの名無しさん [2008/01/26(土) 09:28:53 ] >>482 gccでも、-msse2オプションをつけてコンパイルすると、355を返すバイナリを作れました。 でも、80ビットでも、52ビットでも、切り捨てになるから、どちらでも同じと思うんですが。 なんでだろう。
502 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 11:06:09 ] >>501 >482のコードだけなら、最適化で定数は事前(≒コンパイル時)計算されるから不思議ではない。
503 名前:デフォルトの名無しさん [2008/01/26(土) 20:29:17 ] >>502 以下のコードでも、dに3.55を入力すると、表示は354になりますが、 -msse2でコンパイルすると355になりました。 int main(int ac, char **av) { double d; cin >> d; int n = d * 100; cout << n << endl; return 0; }
504 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:23:27 ] 確認のために聞きたいんです 関数テンプレートについてなんですが。 template<typename T> void func(){ hoge = new T(); } func<HogeClass>(); つう書き方に、何か問題はありますか? 一応BCCでは動いてるようなんですが、 検索しても基本的に引数のために使われていて、 こういう書き方を見つけられなかったので不安なんですが。
505 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:31:16 ] >>504 全然問題ない。それができないならテンプレートの魅力が半減ですよ。
506 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:48:00 ] >>505 どうもです。こういう使い方はやっぱり便利なんですね。 でも、混乱もしそう。使いこなせるよう精進します。
507 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:59:43 ] >>503 手元のgccだとそのコードでも355になるよ。354になるときの値をprintf("%.20g", d * 100)で出してみて。
508 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 03:55:57 ] C++ で、perl の Data::Dumper みたいなことするのがあれば 教えてください。
509 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:19:52 ] テキストファイルをchar型に読み込んだ場合って改行があったら\nもちゃんと格納されるの?
510 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:20:23 ] 読み込みかたによる。
511 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:34:30 ] ありがとう。読み方によるのね できれば\nが格納される読み方の例教えていただきたい
512 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:35:07 ] fgets
513 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:38:01 ] ファイルの開き方も重要じゃないか
514 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:42:08 ] >>512 ありがとうございます。 fgetsって\nの手前までしか格納されないかと思ってたけど\nもちゃんと入るんですね とりあえず色々試してみることにします
515 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 04:44:40 ] gets以外なら大体¥nもコピーする。fgets、fgetln、テキスト指向ですらないfreadも勿論。というかgetsは絶対使わない方が良い。 C++は…誰かお願い。
516 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 07:26:38 ] C++でWindowsでのDLL作成に関して質問です。 C++のクラスをエクスポートする場合、純粋仮想クラスを利用するようですが、この際、 多重継承は可能なのでしょうか。具体的には以下のようなことをしたいのです。 class IFoo{ public: virtual void fooFunc() = 0; }; class IBar: public IFoo{ public: virtual void barFunc() = 0; } class CFooFunc{ public: virtual void fooFunc(){ /*...*/ } }; class CBarFunc{ public: virtual void barFunc(){ /*...*/ } }; class CExport: public IBar, CFooFunc, CBarFunc{ }; __declspec(dllexport) IBar* createIBar(){ return new CExport(); } __declspec(dllexport) IBar* deleteIBar( IBar* p ){ delete p; }
517 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:21:25 ] >>511 istream& istream::get(char& c) istreambuf_iterator unsetf ios::skipws and istream_iterator
518 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:55:57 ] >>516 DLL でクラスを公開したいなら COM
519 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 12:57:31 ] COM なんて使いにくいもんじゃなくて __declspec(dllexport) と __declspec(dllimport) を使おうぜ。 DLL と EXE で自動的に切り替えるマクロもあったけど忘れた。
520 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:30:07 ] C++の初心者向けサイトを教えてください
521 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 14:33:05 ] #ifdef PROJECTNAME_EXPORTS # define DLL_EXPORT __declspec(dllexport) #else # define DLL_EXPORT __declspec(dllimport) #endif
522 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 15:45:56 ] そういうやつ、自分で作らなくてもあったと思うけど、 自分で作った方が細かい制御ができていいかもしれん。
523 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 17:48:38 ] dllexportは所詮同じヴァージョンのコンパイラ相手でしか使えないからね。
524 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:11:43 ] しかし、COM は COM で色々と不便だからなあ・・・。 IA ← A の機能強化版として IB と B を別途作るとして、 IA ↑ ↑ IB A ↑ ↑ B こういう継承したいけど無理っしょ? 仮想継承がないから・・・。
525 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:27:47 ] ATLみたいに実装をテンプレートに分離すれば解決しない?
526 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:15:08 ] wchar_t(unsigned char) に入ったUTF16の日本語を ShiftJISに変換してxharに突っ込む処理を STLだけで書くにはどう書けばいいですか?
527 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:26:27 ] std::codecvt使う例が hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp にあるけど、UTF16、ShiftJISと指定した std::codecvtをどう取得するのかは知らない
528 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:48:39 ] >>525 テンプレートは解決策の1つだとは思うけど、 ヘッダファイルに実装するのはどうもね・・・。 コードいじったときのコンパイル範囲が広くなると困るし。
529 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:07:40 ] OSに頼ったほうが安全
530 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:09:31 ] >>524 そのIAをIUnknown、Aを適当なインタフェースに置き換えれば、そんな例は山ほどある。 Aの実装をソースコードの形で手に入れられるなら、 普通にIBとAを多重継承して、細かいところを整えればいける。
531 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:28:36 ] >>530 むむっ。詳しくお願いします。
532 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:31:57 ] >>530 要は、本来Bでオーバーライドする必要のない関数も、B内から手動でAの実装を呼ぶようにすればいい。 インタフェースはメンバ変数ないから、キャスト関係くらいしか仮想継承の有無の違いはないといっても過言ではない。 struct IA : IUnknown {virtual HRESULT STDMETHODCALLTYPE FnA() = 0;}; struct A : IA { virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**) {/*実装*/} virtual ULONG STDMETHODCALLTYPE AddRef() {/*実装*/} virtual ULONG STDMETHODCALLTYPE Release() {/*実装*/} virtual HRESULT STDMETHODCALLTYPE FnA() {/*実装*/} }; struct IB : IA {virtual HRESULT STDMETHODCALLTYPE FnB() = 0;}; struct B : A, IB { virtual HRESULT STDMETHODCALLTYPE QueryInterface(IID&, void**); virtual ULONG STDMETHODCALLTYPE AddRef() {return A::AddRef();} virtual ULONG STDMETHODCALLTYPE Release() {return A::Release();} virtual HRESULT STDMETHODCALLTYPE FnA() {return A::FnA();} //オーバーライドしない気なら virtual HRESULT STDMETHODCALLTYPE FnB() {/*実装*/} }; HRESULT STDMETHODCALLTYPE B::QueryInterface(IID& riid, void** ppv) { if (ppv == 0) { return E_POINTER; } else if (riid == IID_B) { *ppv = static_cast<IB*>(this); AddRef(); //直接A::AddRef()でも可 return S_OK; } else { return A::QueryInterface(riid, ppv); } } Javaのインタフェースの仕様だとBでのAddRef以下のようなことを書く必要がなかった気がする、ちょっとうらやましい。
533 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:34:43 ] 委譲するわけですか。 うーん。委譲のコストが少し気になってしまいますね。 そんなもんなんでしょうか。
534 名前:デフォルトの名無しさん [2008/01/28(月) 13:31:23 ] 自分クラスに大小比較の演算子を定義して、<=を使おうと思ったら、 <と==の2つを定義するのではなく、<=を定義しないとだめだったのですが、 そういうものなのですか?
535 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 13:33:46 ] そういうものです。 そもそも、'<='が「小なりイコール」であると言う意味から再定義するわけですから。
536 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 13:35:16 ] >>534 つ[boost::operators]
537 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 14:14:23 ] >>534 以下は違う関数だからねえ operator<() operator=() operator<=() <=を使うということはoperator<=()をコールするわけで。
538 名前:デフォルトの名無しさん [2008/01/28(月) 16:23:28 ] >>535-537 ありがとうございます。じゃあ自分クラスについては、なるべく「<=」は使わずに <と==でなんとかするようにします。 boost::operatorsは、<と==をconst関数で定義して、publicでboost::operatorsを 継承すれば動きました。かなり便利そう。 ありがとうございました。
539 名前:デフォルトの名無しさん [2008/01/28(月) 18:45:01 ] typedef struct { .... } hoge_struct; #define TARGET_STRUCT hoge_struct #define TARGET_STRUCT_STR ???????????? printf("type: %s\n", TARGET_STRUCT_STR ); printf("size: %d\n", sizeof(TARGET_STRUCT) ); 表示 type: hoge_struct size: 40 TARGET_STRUCTにあるhoge_struct部分は、任意の構造体名です。(色々変化します) TARGET_STRUCT_STRが "hoge_struct" に(文字列)なるようにしたいのですが、 どんなマクロにすればいいのでしょうか?
540 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:52:07 ] 言葉足らずでした。 型名であるTARGET_STRUCTを元に、文字列なTARGET_STRUCT_STRを作りたいという意味です。
541 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 18:58:47 ] # TARGET_STRUCT
542 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:11:51 ] >>541 ありがとうございました。
543 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 19:28:58 ] >>538 なんとかするとかじゃなくて「<」と「==」から「<=」を作ればいいじゃんか。 「<」と「==」が定義されてるならば「<=」は↓のようになる。 return A < B || A == B; boost::operatorsは内部でそういうことをやってるだけ。
544 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:53:36 ] よろしくお願いします。 項書き換えを行うシステムを作るにあたって、今式の構造を木構造で表すことを考えています。 式は中値記法で書かれているので、基本的には一般的な構文木のように作ろうと思っています。 具体的には、ある内部ノードには演算子を格納し、その左と右の子供に項を格納するような2分木です。 2項演算を表現するのにはこれで十分なのですが、 (X, Y, Z) のような三つ組みも表現しなければならないのです。 子供を3つ持つような木を作って、三つ組みを表現するときだけ3つ目の子供に項を格納すれば表現は可能になるのですが、 頻繁に三つ組みが現れるわけではないので、余分な子供はあまり持たせたくないと思っています。 2分木で三つ組みを表現するうまい方法はないでしょうか。
545 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 21:56:16 ] 演算子 A を考える場合に A1 ∧ X A2 ∧ Y Z みたいにすればいいんじゃない?
546 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:00:04 ] 単項演算子で無駄なノードが発生するのは別に構わんのん?
547 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:01:13 ] 各ノードはふたつのポインタをもち、 それぞれは、 ・自分の子供のひとつ(長男) ・自分のすぐ下の弟 を指すようにすれば2分木でいくらでも子供を持てる。 これは木構造を作るのに定番の方法なので覚えておくといいよ。
548 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 22:44:46 ] Visual Studio 2005なんですが、vector型の変数で名前をarrayにしたら、変数名が青くなってました。 intみたいに予約語なのかなとも思ったんだけど、特に問題なく動くんですが、青くなるのはなんでなんでしょう?