- 1 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:09:22 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.44【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1194016813/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 481 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:18:50 ]
- まともに仕事で使おうとすると、
boostなんてフリーのライブラリは、 使用許可がおりない件について 誰が責任もてるの、って怒られるぜよ
- 482 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:34:04 ]
- boostからポートした自作ライブラリを使うんだよ
- 483 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:36:43 ]
- それを言い出すと、gccや下手すればLinuxそのものも使えなくなる罠。
- 484 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:41:40 ]
- >>483
プロジェクトの種類や客の流儀とかなんとかで、 そのとおりな制約がつく仕事も実際、けっこうある。 ・・・いや、あった。もう地獄から永久に開放されて こんな時間に2chしてる俺にはどうでもいい話
- 485 名前:デフォルトの名無しさん [2007/12/18(火) 15:46:46 ]
- 参照のつかいかたがよくわからないので教えてください。POCO::Loggerというライブラリをつかっています。
hasがLoggerのポインタを返して、getが参照を返します。createで作ります。 POCO::Logger* buff = POCO::Logger::has("hoge"); if (buff == NULL) { // 無いから作る POCO::Logger& logger = POCO::Logger::create("hoge"); logger.information("@@@@@"); } else { // あるから使う POCO:Logger& logger = POCO::Logger:get("hoge"); logger.information("@@@@@"); } // @ほんとはここでlogger.information("@@@@@")にして、↑の@@@@@出力部分は消して共通化したい というコードは動くんですが、最終行で出力する処理を入れて 共通化したいんですけど、参照ってポインタみたいにいれないでおくとかができないと思っています。 このような実装はみなさんどのようにされていますか?
- 486 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:51:11 ]
- >>481
フリーとは言っても誰が作ってると思う? 使用許可を出さない奴本人に 『おまえが判断できる程のレベルかよ?』 って言い返す。
- 487 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 15:52:29 ]
- >>479
不完全型のチェックにしか使えないよね。 全く役に立たないとは思わないけど、あえて使う意味はあるのかと。
- 488 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 16:13:45 ]
- >>485
POCO::Logger & logger = buff == NULL ? POCO::Logger::create() : POCO::Logger::get(); logger.information();
- 489 名前:デフォルトの名無しさん [2007/12/18(火) 16:22:40 ]
- >>488
ぉぉすばらしい。ありがとうございます。そのような発想はありませんでした。 ちょっとトリッキーな気がするのですが、C++で参照を使うときは常識ですか?
- 490 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 16:45:28 ]
- C++と言わず参照と言わず、割と使うけど。
Cでもこんなのとか。 FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");
- 491 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 17:52:49 ]
- >>490 の
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r"); って どのように分解(解釈)されるの?
- 492 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 17:57:10 ]
- >>491
fileNameがNULLだったらstdin、そうでなければfileNameをfopen()した結果をfpに代入。
- 493 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:05:23 ]
- >>492
有難うございます。日本語ではそうなるのですか。 すみません、この1行をC言語に1行ごと(ステップ)に分解して書いたらどうなるのですか?
- 494 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:11:18 ]
- FILE *fp ;
if( fileName == NULL ) { fp = stdin ; } else { fp = fopen(fileName,"r"); }
- 495 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:12:19 ]
- まあ、参照は初期化必須だから、>>488を分割して書く事は出来ないがな。
- 496 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:12:26 ]
- FILE * fp =
fileName == NULL ? stdin : fopen(fileName, "r");
- 497 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:13:39 ]
- boost::optionalをパクればいい
- 498 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:23:44 ]
- >>494
有難うございました そうなるのですか、なんか>>490だと読みにくいですね >>495 となると、参照のときは読みにくい構文使うしかないということですね
- 499 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 18:56:32 ]
- >>498
俺が三項演算子を使うときは、条件部を必ず(単項式であっても)括弧で括ってる。 >>490の例の場合は、 FILE * fp = (fileName == NULL) ? stdin : fopen(fileName, "r"); まぁ、この辺は各々のスタイルの問題。 読みにくさについては内容の複雑さによりけりで、たとえば int n = (hoge) ? 10 : 20; 程度の内容をif-else文で書くと、俺の感覚だと「無駄に物々しい」感じがして、逆にわかりにくいかな。
- 500 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:12:34 ]
- 三項演算子は禁止、
って、けっこうコーディングルールにされることが多い
- 501 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:18:45 ]
- 生粋の三項演算子erな漏れには辛い職場だ
- 502 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:29:24 ]
- >>498
こんなんでもいんじゃね? POCO::Logger* buff = POCO::Logger::has("hoge"), *logger; if (buff == NULL) { // 無いから作る logger = &POCO::Logger::create("hoge"); } else { // あるから使う logger = &POCO::Logger:get("hoge"); } logger->information("@@@@@"); というかhas()が返すアドレスの実体はgetで得られるインスタンスとは別物なん? 同一ならそのまま使えるだろうけど
- 503 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:29:27 ]
- ff
- 504 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 19:36:13 ]
- 例外処理のthrowのメリットは?
普通に関数にとばすのはだめなのかい
- 505 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:21:22 ]
- 普通に関数に飛ばすとは、どういうやり方?
throwは関数の呼び出し元の呼び出し元の呼び出し元の・・・にずーっと遡っていけるところに意味がある
- 506 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:23:41 ]
- 昔のCのように、abort()を呼ぶとかそういう話?
- 507 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 20:53:58 ]
- >>504の考える例外的な事態というのは、その場でプログラムを終了するタイプ「のみ」なんじゃないかな。
確かに、すぐ終了するのであれば、例外処理の存在意義である「簡潔かつ強力に特定の段取りまで戻る」 能力は要らないからね。 >>504 でも、例外発生後もまだプログラムを続行させる場合、「関数に飛ばして」例外処理を実現しようとすると、 結構面倒というか、入り組んでしまうことがある。 f1()から呼んだf2()から呼んだf3()から呼んだf4()の中で何か「例外的な状態」になった場合、f4()内に if (失敗したという証拠) { 例外処理(); return 失敗したという合図; } を書くだけでなく、場合によってはf2()やf3()も、その「合図」がちゃんとf1()のもとへ帰っていけるよう、 バケツリレーのような構造の実現に協力しなくちゃならなくなったりするわけだ。 その例外は、自分とは直接関係ないことなのにね。
- 508 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:01:10 ]
- ただやっぱり、Joelもいってるように、例外はきちんと
ハンドリング出来ているかが、コード面を眺めたくらいでは すぐには判らないという弱点があるね。 戻り値ベース: fp = fopen(filename, "w"); fwrite( var, 1,len,fp ); //ププ。エラー処理忘れやがんの。 例外ベース: fs = new FileStream( filename, WRITE ); fs.Write( var ); //ファイル無かったら例外投げるから、 //呼ぶ側で対処しろと言うことかな〜?
- 509 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 21:07:30 ]
- >>420
インターフェースが結構違うのでわからないんです 参考に見た6.0の解説を上げてみると 〜〜〜 左フレームのFileメタブをクリックして、Source FileのGlSampleView.cppファイルを開く 右のフレームに現れるソースファイル上で、右クリック。表示メニューのClassWizardを選択する←この時点で分からない ここでViewクラスのメッセージ処理をカスタマイズする。 メッセージ欄から「WM_CREATE」を選択して関数追加ボタンをクリックする。 するとOnCreate()関数がGlSampleView.cppファイルに自動的に追加される。 〜〜〜 クラスウィザードのようなものは別の方法で見つけたんですがすると4行目のWM_CREATEが無い といったように前に進みません
- 510 名前:339 mailto:sage [2007/12/18(火) 22:32:05 ]
- 1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。 1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が 関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。 1>D:\ta\c\works\online\Debug\dos.exe : fatal error LNK1120: 外部参照 2 が未解決です。 ===index.cpp==== #include <iostream> int main() { std::cout << "Kitty on your lap"; return 0; } =============== /O2 /D "_MBCS" /FD /EHsc /MT /Fo"Debug\\" /Fd"Debug\vc80.pdb" /nologo /c /TP /errorReport:prompt /OUT:"D:\ta\c\works\online\Debug\dos.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\dos.exe.intermediate.manifest" /SUBSYSTEM:CONSOLE /ERRORREPORT:PROMPT kernel32.lib リンクがうまくいってないってことかな? ちゃんとライブラリフォルダをC:\Program Files\Microsoft Platform SDK\Libに設定しているのだが・・。
- 511 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:00:25 ]
- たまに見かけるけとKitty on your lapて何なん?
調べてみたらゲームみたいだけどあれが元ネタ?
- 512 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:35:44 ]
- >>510
iostreamってSDKじゃないだろ。
- 513 名前:デフォルトの名無しさん mailto:sage [2007/12/18(火) 23:36:20 ]
- 猫でも分かるの人がサンプル文字列に使ってたな。
さらなる元ネタはよくわからないが。
- 514 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 00:07:13 ]
- 古いギャルゲーのタイトル
- 515 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:29:06 ]
- 問題分が
以下の手順を従い、経路選択アルゴリズムを評価せよ。 通信の発生:ランダムに送受信ノードを決定する。 通信の確定:与えられた送受信ノードの経路を決定し、その経路上のリンクの空き容量を1Mbpsだけ減少させる。 ただし、空き容量のないリンクが存在する場合、この通信は確立しなかったものとして、何も行わない。 通信の終了:n回前に発生した通信の経路上の空き容量を1Mbpsだけ増加させる。ただし、その通信が確立していなかった場合には何も行わない。 評価:10000回の通信を発生させ、そのうちで確立できなかった通信の割合を求める。 試行の繰り返し:nの値を変えながら、上記の試行を繰り返す プログラム自体(kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5554.txt)は拾ってこれたのですが どこにグラフを入力していいのか分からなく困っています。 ちなみにグラフは以下に書きます kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5555.txt 左と中央がノードで右がそれをつなぐリンクの容量です。
- 516 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 01:38:58 ]
- 宿題スレへ
- 517 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 02:08:39 ]
- >>508
戻り値だってコード面見てエラー処理の抜けは気づきにくい。 Joel とかが言ってるのは、エラー処理に問題のあるコードと 適切なコードとの違いが微妙すぎるって言う問題。まぁこっちの問題も 一緒といえば一緒なんだけどな。処理の順番とか。
- 518 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 09:00:37 ]
- VC++ 2005での関数インライン化について教えてください。
通常、インライン関数は定義をヘッダに書かないとコンパイル できませんが、/LTCGオプションでリンク時のモジュール間 インラインを指定すると以下のようなコードがビルド可能 だと思ったのですが、実際はリンクエラーとなります。 もちろんinlineキーワードを外すとビルドできます。 /LTCGを指定してもinlineキーワードを付けるとインライン 対象関数の定義は呼び出しソースファイルから可視でなくて はいけないのでしょうか?/LTCGのリンク時モジュール間 インラインの正しい使用法を教えてください。 //aaa.hヘッダーファイル double MySquare(double); //aaa.cppソースファイル inline double MySquare(double d) { return d * d; } //bbb.cppソースファイル #include "aaa.h" int main() { double d = MySqiare(3.14); }
- 519 名前:デフォルトの名無しさん [2007/12/19(水) 09:15:43 ]
- よく空間的局所性の高いコードは速いとかいいますけど、最近のx86で
あるアドレスの値を読み込むと、その先何バイト位がキャッシュに載るんですか?
- 520 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 09:46:40 ]
- VC8(VC2005)で
template<class T> std::list<T>::iterator MoveListItr(std::list<T> *pLst) 〜略〜 というSTLのイテレータを返すテンプレートが、イテレータの記述部分 (std::list<T>::iterator)で「型ではない」とエラーが出ます。 VC7まではこれで通ったのですが、文法に問題があるのでしょうか? それともVCの問題なのでしょうか?
- 521 名前:デフォルトの名無しさん [2007/12/19(水) 09:53:01 ]
- template<class T>
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
- 522 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:00:51 ]
- >>520
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst) って書けばいいんじゃないかな。 いわゆる特殊化ってやつがあるせいで、classname<T>::hogeという記述だけでは、 hogeが値なのか型名なのか断定できない。 そういう場合、「これは型名ですよ」というのをコンパイラに教えるために、typenameを書く。 今回のVC7と8の違いは、「ここは関数の戻り値の型を書く場所だから、型名に決まってるよな」 とコンパイラが判断したか否か、の違いだと思うんだけど、 VC7の気が利いているのか、VC8が「VC7が無視した何らかの可能性」を見て断定を避けたのか、 どっちなのかは俺にはわからないや。
- 523 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:03:56 ]
- 単に規格に準拠するようにしただけじゃねえの?
- 524 名前:デフォルトの名無しさん [2007/12/19(水) 10:12:15 ]
- >いわゆる特殊化ってやつがあるせいで
特殊化は無関係
- 525 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 10:13:50 ]
- >>521-523
なるほど、そうだったんですか。 おかげで解決しました、ありがとうございます。
- 526 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 10:46:02 ]
- ループが止まりません><
#include<stdio.h> #define N 20 main(){ char ch[N],a,word='^'; int num,i,j; j=0; printf("Input your name.(When the input is finished,type ^.)\n"); for(num=0;ch[num]!=word;num++){ printf("ch[%d]=",num); scanf(" %s",&ch[num]); } printf("target:"); scanf(" %c",&a); for(i=0;i<num;i++){ if(ch[i]==a){ j++; } printf("%c=%d\n",a,j); } }
- 527 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:04:06 ]
- >>526
最初のループの終了条件がおかしい。
- 528 名前:りょう ◆RyOrlro88Q mailto:sage [2007/12/19(水) 11:09:43 ]
- ループは自己解決><
次は判定に問題が…><
- 529 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:30:49 ]
- jが増えない><
#include<stdio.h> #define N 20 main(){ char ch[N],a,word='^'; int num,i,j; j=0; printf("Input your name.(When the input is finished,type ^.)\n"); for(num=0;ch[num]!=word;num++){ printf("ch[%d]=",num); scanf(" %s",&ch[num]); if(ch[num]==word){ break; } } printf("target:"); scanf(" %c",&a); for(i=0;i<num;i++){ if(ch[i]==a){ j++; } } printf("%c=%d\n",a,j); }
- 530 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:34:56 ]
- ちったあ自分で考えないと成長しないぜ
- 531 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:40:58 ]
- 考えてるけどわからないんです><
- 532 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:43:39 ]
- >>528
他にも色色問題が。scanf()で一文字ずつ入力なんて阿呆なことしないで、 fgets()で1行分まるっと入力してしまえばいいじゃん。 あと、'^'による終了判定も無意味。
- 533 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:45:26 ]
- つーか、>529ではループの判定条件がバグったままじゃんw
- 534 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:46:26 ]
- 何故増えないんだと思う?
具体的な場所はともかく、どの辺が間違ってそうな気がする? 本当はデバッガを使うのが良いんだろうが、printfデバッグっていう手法だってある。 それっぽい箇所にprintfを挿入するだけで見えてくるかもよ。
- 535 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:47:57 ]
- ブロックの前後や中で満たすべき条件を式のかたちで書き出してみてはどうか
- 536 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:51:01 ]
- 紙と鉛筆使って机上でプログラムを実行してみるのもいい。
どこで意図しない動作になっているかすぐ分かる。
- 537 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 11:53:22 ]
- >>518について詳しい人いませんか?
- 538 名前:りょう ◆RyOrlro88Q [2007/12/19(水) 11:57:29 ]
- 解決できました><
ありがとうございましたm(__)m >>532 それが指定なんですよ>< >>534 そんな方法なんて知りませんでした><
- 539 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:01:09 ]
- ほほぉ。それじゃ、スレよごしの罰として完成したソースを貼ってもらおうか。
- 540 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:06:58 ]
- >>118
ttp://ml.tietew.jp/cppll/cppll/thread_articles/11083#ar11086
- 541 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:07:22 ]
- >>537
inline指定無しでも最適化でインライン展開してくれるんじゃないの? 明示的にinline指定したい積極的な理由でもあるなら兎も角、そうでないならコンパイラに任せたら? つーか、iccだとinline指定をつけると却ってコンパイラが混乱するみたいだ。
- 542 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:11:03 ]
- >>540
番号間違ってる。 しかし、そのリンク先のエピたんの弁によれば、 inline指定してある関数を別の翻訳単位から見つけてくるiccはおかしなことになるね。
- 543 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 12:22:09 ]
- 7.1.2.4を見てextern inlineにしたら通った
- 544 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:00:43 ]
- // aaa.h
extern inline double MySquare(double); // aaa.cpp double MySquare(double d){...} // main.cpp #include "aaa.h" int main() { double d = MySquare(3.14); } 一応gcc3.4とvc8でいけた external linkageなinline指定つきの関数宣言がどうたらこうたら書いてあるけど理屈はよくわかんね
- 545 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:28:11 ]
- >>540
>>541 >>542 >>543 ストラップ本にはinline定義とあるので、おそらく 無理なんでしょうね。 extern inline定義にしたらVC 2005では実行できましたが、 g++ v4では無理でした。移植性考えたらやはり素直にヘッダーに 定義を書いたほうが無難ですね。
- 546 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:30:36 ]
- >>544
extern inlineを宣言につけるんですか。 試して見ます。
- 547 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:37:55 ]
- >>544
g++ v4でもリンクできましたが、 定義にinlineつけないとインライン展開されて ないかもしれないですね。
- 548 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:55:07 ]
- VC++ 2008でもテンプレートのexport定義はサポート
されてないんだな
- 549 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 13:58:09 ]
- >>548
別に規格に違反してないからね
- 550 名前:デフォルトの名無しさん [2007/12/19(水) 14:35:53 ]
- kernel: pid xxxx (a.out), uid yyyy: exited on signal 11 (core dumped)
というメッセージがログに残っている場合は何を調べればいいのでしょうか?
- 551 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:38:34 ]
- VCEEにMFCついてないかー/(^o^)\
- 552 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:52:40 ]
- >>50
coreファイルを調べるのが王道
- 553 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 14:58:45 ]
- >>550
signal 11はSEGVだから、要はセグメンテーションフォルトを起こしたってこった。 まぁ、メモリアクセス周りでバグってるんだろ。
- 554 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:02:26 ]
- >>551
TurboC++ExpressだったらMFC付いてたかもしれん。
- 555 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:32:15 ]
- >>554
把握した、WinAPI直接とか死にそうだからVB.NETかC#いじってくる
- 556 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 15:36:26 ]
- どっちもとか正規表現あるから戻ってこれなくなりそう
- 557 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:20:06 ]
- bitsetよりvector<bool>のほうが性能が上のことが判明した
#include <iostream> #include <vector> #include <bitset> #include <time.h> using namespace std; main(){ #define N 8200000 int n,m,cl; cl=clock(); bitset<N> a; for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=1; cl=clock()-cl;cout<<cl<<endl; cl=clock(); vector<bool> b(N); for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=1; cl=clock()-cl;cout<<cl<<endl; }
- 558 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:30:20 ]
- 自前の関数のほうが断トツで早かった
#include <iostream> #include <vector> #include "crc.h" #include <bitset> #include <time.h> using namespace std; main(){ #define N 8200000 int n,m,cl; char *rnd =new char[N]; for(n=0;n<N;n++)rnd[n]=rand()&1; cl=clock(); bitset<N> a; for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=rnd[n]; cl=clock()-cl;cout<<cl<<endl; cl=clock(); vector<bool> b(N); for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=rnd[n]; cl=clock()-cl;cout<<cl<<endl; cl=clock(); unsigned int k,l, *c=new unsigned int [1+(N>>5)]; for(n=0;n<(N>>5);n++)c[0]=0; for(m=0;m<10;m++)for(n=0;n<N;n++){ k=n>>5; l=n&31; c[k] |= (rnd[n]<<l);} cl=clock()-cl;cout<<cl<<endl; }
- 559 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:30:52 ]
- >>557
うちの環境ではbitsetの方が5倍速いんだが bitset -> 143 vector -> 890 VC2005, C2D E6850
- 560 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:37:09 ]
- >>559
MinGWやVCCで計ってみたけど、環境によって変わるらしいね でも自前のビット演算が最速だった 558のcrc.hはいりません
- 561 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:41:06 ]
- >>560
gcc 3.4.4(cygming special)でもbitsetのほうが早かった bitset -> 171 vector -> 687 自作は知らん
- 562 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:42:41 ]
- >>558のほうでやってくれ 最適化されてループしていない可能性がある 初めのやつでは
- 563 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:45:57 ]
- VC2005
bitset -> 460 vector -> 1876 自前 -> 137 やはりbitsetaのが早い
- 564 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:49:50 ]
- でも、どの環境でも自前でビット演算するのが一番みたいだね
- 565 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:58:54 ]
- まあ問題領域によるだろう
早さだけを求めるならbitsetに限らず自分で書いた方がことが多いだろうね
- 566 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 16:59:00 ]
- >>557
./a.gcc.O3 220000 400000 ./a.gcc.O3.msse2 150000 390000 ./a.gcc.O3.msse2.funroll-loops 150000 420000 ./a.icc.xT.O3.ipo 140000 260000 ./a.icc.fast 140000 250000
- 567 名前:566 mailto:sage [2007/12/19(水) 17:03:18 ]
- おっと、書き忘れた。Xeon5160@3.00GHzね。
で、>558のほう。 -- ./a.gcc.O3 440000 1010000 120000 ./a.gcc.O3.msse2 410000 1010000 120000 ./a.gcc.O3.msse2.funroll-loops 400000 1010000 130000 ./a.icc.fast 420000 570000 130000 ./a.icc.xT.O3.ipo 420000 570000 130000
- 568 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:17:10 ]
- ポインタのアドレス計算について質問です。
#include <stdio.h> int main(int argc, char *argv[]){ int *ptr; int ary[] = {1, 2, 3, 4, 5, 0}; ptr = ary; while(*ptr != 0){ printf("%d address = %u\n", *ptr, ptr); ++ptr; } return 0; } 上記のプログラムを実行すると、アドレスは4番地ずつ進みます。 使っている参考書ではint型データは2番地ずつ進んでいますが、これは環境によって確保される記憶領域が違うということで宜しいでしょうか? またfloat型の場合、使っている参考書ではint型の2倍、4バイト長ですが当方の環境だとint型と同じ4バイト長でした。 これも環境によって違うのでしょうか?
- 569 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:21:58 ]
- ふつうはintは32bit 64bitパソコンは64鴨しれない
- 570 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:23:26 ]
- その昔の参考書を投げ捨てろ。
16ビット環境主流の時代に書かれた本じゃないかい? intのサイズは基本的に環境依存。16bitコンパイラは16bit、32bitコンパイラは32bit。
- 571 名前:568 mailto:sage [2007/12/19(水) 20:32:30 ]
- >>569-570
有り難うございます。 環境によって違うのですね。 今、使っている本は www.amazon.co.jp/dp/4756102700/ です。 難関と言われているポインタの説明がとてもわかりやすかったし、中盤まできたのでこのまま使っていきたいです。 さすがに捨てるのは勿体無いと思うので。
- 572 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:36:13 ]
- intはサイズが環境依存だから、longを使え、
・・・って、その昔、仕様をカン違いしてるヤツが偉そうに コーディングルールを決めることがよくあった。
- 573 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:37:32 ]
- 参考までにDOSコンパイラ(Turbo C++ 1.01)でのsizeof(int)とsizeof(long)実行結果
up.mugitya.com/img/Lv.1_up43982.png 32bitコンパイラだと両方とも4になる。
- 574 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 20:42:47 ]
- >>568
www.oklab.org/language_c/lp64.html
- 575 名前:デフォルトの名無しさん [2007/12/19(水) 22:09:32 ]
- IntelのCPU(x86)で、doubleとlong doubleはどうちがいますか?
- 576 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:47:06 ]
- doubleは64ビット(IEEE 754倍精度)、
long doubleは80ビット(IEEE 754拡張倍精度)のことが多い。 Visual C++ 32ビット(どっちも64ビット)のように例外もある。
- 577 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 22:51:46 ]
- 失礼します。
どこで質問していいか判らず、何でも知ってそうなここに来ました。 ブーンスタジオをインストールしようとすると DllRegisterServerへの呼び出しはエラーコード0x80070005により失敗しました。 と出るんですがどういう意味ですか? 当方PC歴1ヶ月で、全く解りません。 エラーコードググっても???です。 どうか、教えてください。
- 578 名前:デフォルトの名無しさん [2007/12/19(水) 22:58:12 ]
- >>576
ありがとうございます。拡張倍精度というのがあるんですね。
- 579 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:07:38 ]
-
以下のファイルを構造体の配列に取り込みたいです。 ------------- a_yumi, 9, f m_mana, 4, f h_ryohko, 10, f m_konomi, 12, f m_kana, 4, f 。。。 ------------- struct data{ char name[10]; char age[10]; char sex[10]; } g_data[NUM]; int main( void ){ 。。。 } ファイルは開いてみないと大きさが分からないものとします。 "NUM"を可変に(ファイルのデータ数ピッタリに)取り込むことはできないでしょうか? できればC++は使わずに、Cのみでやりたいです。お願いします。
- 580 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:10:37 ]
- >>577
PC初心者板かソフトウェア板へいけ
- 581 名前:デフォルトの名無しさん mailto:sage [2007/12/19(水) 23:14:12 ]
- >>580
すみませんでした。 行ってきます
|

|