1 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 06:24:18 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 20 pc11.2ch.net/test/read.cgi/tech/1192455273/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 99代目 pc11.2ch.net/test/read.cgi/tech/1194262698/
496 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:26:48 ] >>474 今更っぽいけど、ちょい補足。 -ansiはc89相当だけど、gcc拡張機能として途中の宣言が出来るので何も言われない。 厳密にc89を適応したければ-pedanticか-pedantic-errorsを-ansiと一緒に指定する。 でもコレやると//でのコメントとかですら怒られるけどな。
497 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 00:32:57 ] >>495 いつもならこういう煽りは見ていて腹立たしくなるが今回は同意してしまった。
498 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 08:15:27 ] >>494 >どこがおかしいのか教えて下さい strcmp の 1 番目の引数がおかしいって書いてあるじゃん
499 名前:デフォルトの名無しさん [2007/11/20(火) 15:25:31 ] bool 型同士の比較演算の結果はどうなるのでしょうか? true / false それぞれが何らかの整数に変換されてから 比較されるのでしょうか?
500 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:09:59 ] >>499 trueは非0、falseは0としてコンパイラが評価する。
501 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:14:20 ] >>499 C言語にbool型なんて無い。
502 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:40:31 ] >>501 c99はcではないとでも?
503 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 16:50:14 ] それ_Boolのtypedef。 1と0を保持する整数型で、比較演算では結局int型に格上げされるはず。
504 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:25:48 ] 文字列0.051/0.056/0.095/0.010 msから 2番目の要素、上の文字列だと0.056を文字列検索かけてうまくとる方法教えてください
505 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:28:52 ] >>504 これでいいのかな? #include <stdio.h> int main(void){ char str[]="文字列0.051/0.056/0.095/0.010 msから"; char second_value[100]; sscanf(str, "%*[^/]/%[^/]", second_value); puts(second_value); return 0; }
506 名前:デフォルトの名無しさん mailto:sage [2007/11/20(火) 17:41:44 ] >>505 ありがとう、うまくいきました。 私が書いた正規表現が間違ってたみたいです。
507 名前:476 mailto:sage [2007/11/20(火) 21:55:54 ] >>479 遅れましたが、情報サンクスです。 VisualC++が対応していないというのは驚きですね。C++とみなしてコンパイルすればいいんだろうけど。 >>496 細かい情報ありがとう。-ansiで厳密なANSI準拠にならないというのはなんか間違ってる気がする。UIとして。
508 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 01:12:45 ] >厳密なANSI準拠 ここに矛盾を感じない人には丁度いいのでは?
509 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:18:11 ] もうテンプレに、このスレはC89用って書いとけよ
510 名前:デフォルトの名無しさん [2007/11/21(水) 10:26:43 ] C90 じゃなくて?
511 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:30:37 ] うん
512 名前:デフォルトの名無しさん [2007/11/21(水) 10:38:37 ] 1年は365日ですけど、それを1月は31日、2月は28日、3月は31日・・・・12月は31日っいう感じに書き換えるプログラムを作りたいんですがどうすればいいでしょうか?
513 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:42:06 ] お前にはまだ早い
514 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:44:07 ] >>512 書き換えるの意味がわからん。 122日 -> 5月2日 という感じ?
515 名前:デフォルトの名無しさん [2007/11/21(水) 10:45:02 ] >>514 そうです。
516 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:47:46 ] 年はどうするの? うるう年を考慮するのか、とか
517 名前:デフォルトの名無しさん [2007/11/21(水) 10:50:25 ] 今年の月日です。
518 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 10:59:47 ] >>517 自分で月数の配列作って計算してもいいけど、 標準関数使うなら、mktime で 2007年1月122日を設定(122はtm_mdayに入れる))すれば tm_mon に0から始まる月、tm_mdayに1から始まる日が入るはず。
519 名前:デフォルトの名無しさん [2007/11/21(水) 11:20:43 ] >>518 ありがとうございます! …が、初心者の俺には難しいようでした。まったくわかりません。 お手数おかけしてすみませんでした。
520 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:27:40 ] void calendar(int day){ if(day > 0 && day <= 365){ int data[] = {31,28,31,30,31,30,31,31,30,31,30,31}; for(int i=0;i<12;i++){ if((day-=data[i])<= 0){ printf("%d月%d日\n",i+1,day+data[i]); return; } } } else printf("1〜365の間で入力してください。\n"); }
521 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 11:32:06 ] >>519 struct tm tm = {0}; tm.tm_year = 2007 - 1900; tm.tm_mday = 122; time_t t = mktime(&tm); printf("%d月%d日", tm_mon + 1, tm.tm_mday);
522 名前:デフォルトの名無しさん [2007/11/21(水) 12:38:46 ] #include <stdio.h> int main(void) { char str[256]; char s[] = "This is a pen. That is an apple."; int i,j,k,checker; printf("This is a pen. That is an apple.\n\n"); gets(str); for(j=0;j<256;j++) {for(i=j,k=0;str[k]!='\0';k++,i++) {if(str[k]==s[i]) {checker=1; break;} else {checker=0;}}} if(checker==1) {printf("OK!その文字列は含まれています。。\n");} else { printf("NG!その文字列は含まれていません。\n");}} 初期化した文字列(This is~)と, キーボードから入力した文字列 str に対し, 文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、 なかなかうまくいきません。最初のifelse文においてのreturnが変だと思うのですが。 例えば This→OK That→OK is→OK apple→OK pple→OK…
523 名前:デフォルトの名無しさん [2007/11/21(水) 12:43:41 ] >>522 #include <string.h> char *strstr(const char *s1, const char *s2); www9.plala.or.jp/sgwr-t/lib/strstr.html これじゃ駄目なの?
524 名前:デフォルトの名無しさん [2007/11/21(水) 12:45:39 ] >>523 申し訳ないです。 stiring.hを使わず、for文でループして検索するっていう条件付です;
525 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 12:51:49 ] >>522 この前同じようなの見かけた pc11.2ch.net/test/read.cgi/tech/1194016813/389-
526 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 12:54:12 ] >>522 ×s[] について検索開始位置 (j=0 ; j<256; j++)とあるが、s[j] != '\0'でで辞めるべき ×1文字でも一致していると、処理を抜けてしまう →1文字でも不一致で処理を抜けるべき
527 名前:526 mailto:sage [2007/11/21(水) 13:01:08 ] あと、2段目のforループで一致判定出たら、1段目のforループ抜けるのも 忘れずに
528 名前:デフォルトの名無しさん [2007/11/21(水) 13:04:16 ] >>526 ってことは根本的には間違ってるんですかね? 数文でもいいので例をあげてもらえればうれしいです。
529 名前:デフォルトの名無しさん [2007/11/21(水) 13:07:14 ] >>527 あっ、なるほど! サンクスです。
530 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:08:29 ] >>522 なるべく原型を留めたつもり。 char *sp,*strp,*bsp; for(sp = s; *sp!='\0';sp++){ for(strp = str, bsp=sp; *strp!='\0' && bsp != '\0';strp++,bsp++){ if(*strp == *bsp) checker = 1; else{ checker = 0; break; } } if(checker) break; }
531 名前:デフォルトの名無しさん [2007/11/21(水) 13:12:26 ] やばいw 少しわかったつもりですが、forで混乱してるかも… >>527 のヒントがすごいわかり易いんですけど、こっからつまってます。
532 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:21:12 ] つーかchekerは0で初期化しといて、elseで代入はやめなよ
533 名前:デフォルトの名無しさん [2007/11/21(水) 13:25:37 ] >>532 なるほど 教えてくんでごめんなさい
534 名前:デフォルトの名無しさん [2007/11/21(水) 15:07:20 ] 整数型の数字を一文字ごとに分割したいので sprintf(b,"%x",a); としたのですが printf("%s",b[0]); としてみたところセグメントエラーが出てしまいます どうしてでしょうか? aはint型変数です
535 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 15:11:50 ] bの型は? あと%xは16進数、%sは文字列だがいいのか? b[0]がchar型なら、%cだろ?
536 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 15:12:17 ] bがchar*として考えると,printf("%s",b[0]);はprintf("%c",b[0]);
537 名前:デフォルトの名無しさん [2007/11/21(水) 15:29:47 ] >>535 >>536 sとcは違うんですねw ありがとうございました
538 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:36:35 ] 同じだと思ってたのか
539 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 16:56:03 ] >>536 ウソツケ printf("%s",b[0]) はb[0]の値をアドレスとする番地から始まるゼロ終端文字列を表示し printf("%c",b[0]) はb[0]の値を文字コードとする文字を表示する
540 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:07:12 ] 質問から読んで書いてるのだろうか。
541 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:08:37 ] >>539 後者に直せって意味で書いた
542 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:13:21 ] 何コイツ
543 名前:539 mailto:sage [2007/11/21(水) 17:40:45 ] >>541 スマン イコールの意味だと勘違いしてた
544 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 17:53:09 ] m9(^Д
545 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 18:49:06 ] borlandからVisualStudio2005に変えたんですが、 VSだとexeファイルってできないんですかね
546 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 18:51:05 ] なぜそう思った?
547 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 19:24:48 ] debug フォルダの中にできてるよ。
548 名前:デフォルトの名無しさん [2007/11/21(水) 21:23:29 ] 初心者です。 return 0 がどういう意味なのかがどうしても分かりません。 return 0 があると、コンピュータは何をするのでしょうか?
549 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:28:57 ] まずmain内に記述してると思うけど、main関数(mainという小さなプログラム)があるんだ。 int main(void)って書いてるでしょ? return 0;ってのは、OSに 正常終了しましたよ〜って知らせるための記述。 でなぜ0なのかってのはint main(void)ってコトからわかるように、 main関数には整数を返しますよってコトです。 まぁ余談になったけど、 正常終了 ってコトです。
550 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:31:20 ] >main関数には整数を返しますよってコトです。 「には」じゃなくて「は」だろ。
551 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:32:29 ] んじゃreturn 1だとしたらどうなるんです?
552 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:35:19 ] 光あれと1と戻すだけ。 受け取る者がいなければ、 次のクロックで虚無に消える。
553 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:35:20 ] return 1って異常終了じゃないっけか? exit(1)と同じだと認識してる・・・
554 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 21:39:37 ] 受け取る側で判断するから異常とは限らないな
555 名前:デフォルトの名無しさん [2007/11/21(水) 22:01:01 ] >>549 そうです。それがよく分からないんです。 正常終了したかどうかはコンピュータが判断することでは? 「これは正常終了したことにします」って人間が決めちゃうんですか? 「正常終了」の意味が分かってないんだと思います。 main()関数は引数として0か1を渡してあげないといけないということでしょうか? 1を渡した場合、どうなるのでしょうか?
556 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:03:03 ] 2とか3とかも渡せるぞ
557 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:09:00 ] >>555 OSが何なのか分かってないのでは?
558 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:13:03 ] >>555 別にプログラムから1が返ってきたからってコンピュータはどうもしないけど、 シェルスクリプトやバッチファイルでコマンドの終了状態で処理を分岐したりだとか、 make中にコンパイルが失敗した時に処理を中断したりだとか、 そういう場面で使う。 俺的には「1つのプログラムで処理が完結する場合ばっかりじゃないので、 一応お約束が決まってます」ってぐらいだと思ってるけど。
559 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:14:25 ] >>555 コンピュータがどうやって「正常終了」の判断をするのかkwsk
560 名前:555 mailto:sage [2007/11/21(水) 22:19:56 ] スマン適当に言っただけだ。流してくれ。
561 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:21:03 ] >>555 main関数からどんな値を返そうと、WindowsやUnixなど大抵のOSは何も行わない。 ただ、その値を「欲しがっているところ」に引き渡すだけ。 「欲しがっているところ」とは、単に別のプログラム、大抵はバッチファイルやシェルスクリプト。 0が正常終了というのは、シェルスクリプトらとプログラムとの間の暗黙の了解。 当時の資料を探せば何か根拠が出てくるかもしれない。 Cはそれを標準規格へ取り込んだ。
562 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:32:10 ] 正しいか正しくないかは人間がきめること。 CPUはただクロックを数えるのみ。
563 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:40:55 ] 自己参照構造体のポインタの動きで頭がこんがらがりまくる・・・ 繋ぎなおして先頭アドレスをmainに返すってのはわかるんだけど、 か、書けねえ・・・ なんかコツとかありますか('A`)
564 名前:デフォルトの名無しさん [2007/11/21(水) 22:44:19 ] >>557-558 、>>561 ありがとうございます。 どうやら return 0; が何かを理解するのに必要な知識がだいぶ不足しているようです。 OSが何なのかや「make中」などが分かりません。 あてどもなくググってみたところ、 www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html の下の方の記述を見つけ、ようやっと、「一応お約束」や「暗黙の了解」 という意味が分かりました。 ただ、 return 0; を書いた段階でプログラムが終わってしまうのは知りませんでしたが、 引数を返した時点で関数というのはそれ以上見なくなってしまうものなんですね。 もう少し勉強が必要です。少し知識を身につけてから、また皆さんの書き込み を見たら意味が理解できるのかもしれません。ありがとうございました。
565 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:44:37 ] 紙に書いて考えれば?
566 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 22:45:22 ] >>563 構造体を四角、ポインタの指す方向を線で、紙に書いてやってみそ。 慣れたら、頭の中でできるようになる。
567 名前:デフォルトの名無しさん [2007/11/21(水) 22:52:16 ] www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html の下の方のところ、貼っておきます。 ------------------------------------ return 0 とは,プログラムの正常終了を意味している.とはいえ,これは UNIX 上でないとほとんど意味をなさないかもしれない. UNIXでは,シェル(shell)と呼ばれるインタフェースプログラムを介してプログラムの実行が行われる. return 0 はこのシェルに よってプログラムの終了状態に合わせた処理を行わせることができる.たとえば,Bash(Linux の標準シェル)の場合, if program; then echo "OK"; else echo "ERROR"; fi と記述することによって, program という名前のプログラムを実行し,もしそのプログラムが正常に終了した場合は OK を表示し, 正常に終了しなかった場合には ERROR を表示するようにすることができる. 正常に終了しなかった場合を表すには,たとえば次のよう記述する. #include <stdio.h> int main() { int a, b, c; if (c != 0) { a = b / 0; } else { printf("c = 0 なので割れません\n"); exit(1); /* 異常終了として1を返してプログラムを終了する */ } return 0; } このプログラムでは, 0で割算を行わないように,まず変数 c がゼロでないかチェックし,もし変数 c がゼロのときには異常を 示してプログラムを終了する. exit() はプログラムを終了させるための関数で,引数の値が返される.一般的には,正常に終了 した場合には 0 を返すことにし,正常に終了しなかった場合には他の値を返すことになっている.だから,return 0 は プログラムの正常終了を示すために必要なのである.また,main() の前の int は 0 や 異常終了の値の型を表している.
568 名前:デフォルトの名無しさん [2007/11/21(水) 23:11:09 ] おそらく>>297 は皆を困らせようとして書いただけだよ
569 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 23:50:47 ] xor eax, eax ret
570 名前:デフォルトの名無しさん [2007/11/21(水) 23:59:44 ] >>564 process.h のsystem関数で外部exeを実行できるんだけど、 system関数の戻り値がintでそのプログラムが返した値を返す。 最後にreturn 0;だったら0。return 10;だったら10。 void main()だと不定っぽい。
571 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 00:04:12 ] //child.c #include <stdio.h> int main(){ printf("hogeeeeeeee!!\n"); return 10; } //parent.c #include <stdio.h> #include <process.h> int main(){ printf("system::%d", system("child")); return 0; } 二つをコンパイルしてparentを実行した結果 >hogeeeeeeee!! >system::10 と出るはず。
572 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:13:16 ] プログラムの正常終了は0だが、各関数の正常終了も0を返すようにしてる? if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね? みんなは省略形は使わずに、必ず==で何かと比較してますか?
573 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 01:16:40 ] 俺はmain以外の関数の場合、<ctype.h>のisナントカに合わせて0以外を真と見做すことにしている。 ほかの言語 (C++, Java, C#)でもtrueは1で、falseは0に相当するし。
574 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 02:05:04 ] 自分はファイル分割をする際、main.hなどと命名したヘッダファイル にプロジェクトで使う全ての関数をプロトタイプ宣言しています。 例えば、 <<main.hの中身>> #include "proj1.h" extern void test1(void); extern int test2(int); : // 以下色々な宣言等を列挙 といった具合です。 今までプロトタイプ宣言している関数の頭にはとりあえずexternを 書く必要があるのだろうと思っていました。 しかし、このexternを書かなくても正常にビルド出来てしまいます。 環境がVisualStudioだからでしょうか? このextern宣言は邪魔くさいのでこれからは外して記述しようと思う のですが、externが無い場合困るケースとしてどのような事が考えられますか?
575 名前:デフォルトの名無しさん [2007/11/22(木) 02:50:24 ] ヤメレ
576 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 04:51:07 ] 関数の宣言は暗黙にexternだから別に構わないけど、 変数は定義になるから、extern必須。 普通は両方つけて揃えるはず。
577 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 05:19:54 ] 関数にexternをつけてるソースは、殆ど見た事が無いなぁ。
578 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 07:20:44 ] >574 直接関係無いけど、なんでもかんでもグローバル関数にしないこと。
579 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 11:05:55 ] static でプロトタイプ宣言するのと区別するのに、 外部参照なんだから extern つければ?
580 名前:デフォルトの名無しさん [2007/11/22(木) 11:53:53 ] ビットマップの画像を平行移動させるプログラムを作っているのですが、 出力が真っ黒になってしまい、うまく動作しません。 単純なバグだと思うのですが、教えていただけると大変助かります。よろしくお願いします。 /* 画像の平行移動 */ void image_shift( unsigned char out2[Y_SIZE][X_SIZE][3], unsigned char out[Y_SIZE][X_SIZE][3] ) { unsigned int i,j,sx,sy,x,y; sx=148; // X方向のシフト量 sy=128; // Y方向のシフト量 for(i=0;i<biHeight;i++){ for(j=0;j<biWidth;j++){ y=i+sy; x=j+sx; out2[y][x][0]=out[i][j][0]; out2[y][x][1]=out[i][j][1]; out2[y][x][2]=out[i][j][2]; } } }
581 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:43:27 ] OPENGLを使えばいいと思うよ>< あとBMPがちゃんと確保されてるか確認した?
582 名前:デフォルトの名無しさん [2007/11/22(木) 13:50:06 ] 回答ありがとうございます! BMPはちゃんと確保されてます。そのまま出力もできますし・・・ OpenGLも考えてみます。
583 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 13:51:19 ] >>580 取り敢えずシフト量を0にして試してみたら?
584 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:04:32 ] シフト量を0 そのあと1とか小さい値にして デバッグモードで確認して
585 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:07:41 ] シフトした分だけあふれてるような気がするんだけど。
586 名前:デフォルトの名無しさん [2007/11/22(木) 14:11:17 ] みなさんのおっしゃるとおりです。 シフト量を0にすると、ちゃんと元の画像が出るんです。 ずらすと真っ黒になったりするんです。マイナス方向にずらすとエラーで止まってしまいますし・・・。
587 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:15:36 ] >>マイナス方向にずらすとエラーで止まってしまいますし・・・。 それout2の領域外に書き込んでないか? つまり配列の添え字がマイナスになったりX_SIZEやY_SIZEをオーバーしたり…
588 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:19:34 ] for(i=0; i<biHeight; i++) { for(j=0; j<biWidth; j++) { y = (i+sy) % biHeight; x = (i+sx) % biWidth; ってしてみれば?
589 名前:デフォルトの名無しさん [2007/11/22(木) 14:19:53 ] ありがとうございます! やっと解決しました。 大きな理由はビットマップのビット深さを間違えてました。 どうもお手数おかけしてすいません。ありがとうございました!
590 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:38:34 ] アチャー
591 名前:デフォルトの名無しさん [2007/11/22(木) 14:47:41 ] なんかC言語の配列って何度も呼び出すと鈍くならない? なんで a = x[y[z[n]]]; みたいな感じ a=z[n];a=y[a];a=x[a]; のほうが速くない?
592 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 14:56:24 ] 計ってみれば?
593 名前:デフォルトの名無しさん [2007/11/22(木) 15:05:40 ] 計ってみたよ 配列に何度も入れた方がわずかに速いようだ #include <iostream> #include <time.h> #define N 900000 using namespace std; main(){ unsigned int n,k,c,sum; unsigned int *x,*y,*z,*v,*w; x=new unsigned int [N]; y=new unsigned int [N]; z=new unsigned int [N]; v=new unsigned int [N]; w=new unsigned int [N]; for(n=0;n<N;n++){x[n]=rand()%10;y[n]=rand()%N;z[n]=rand()%N;v[n]=rand()%N;w[n]=rand()%N;} sum=0; c=clock(); for(n=0;n<N;n++){k=w[n];k=v[k];k=z[k];k=y[k];sum+=x[k];} c=clock()-c; cout<<c<<" clock "<<sum<<endl; sum=0; c=clock(); for(n=0;n<N;n++)sum+=x[y[z[v[w[n]]]]]; c=clock()-c; cout<<c<<" clock "<<sum<<endl; }
594 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:30:37 ] >>593 手元のiccでは全く同じコードにコンパイルされたよ。 -- movl (%rbx,%rcx,4), %ecx #15.20 movl (%rbp,%rcx,4), %edi #15.27 movl (%r12,%rdi,4), %r8d #15.34 movl (%r13,%r8,4), %r9d #15.41 addl $1, %edx #15.13 movl %edx, %ecx #15.13 addl (%r10,%r9,4), %r15d #15.46 movl %ecx, %edx #15.1 cmpl $900000, %edx #15.1 jb ..B1.15 # Prob 99% #15.1 -- movl (%rbx,%rcx,4), %ecx #19.30 movl (%rbp,%rcx,4), %esi #19.28 movl (%r12,%rsi,4), %edi #19.26 movl (%r13,%rdi,4), %r8d #19.24 addl $1, %edx #19.13 movl %edx, %ecx #19.13 addl (%r9,%r8,4), %r15d #19.17 movl %ecx, %edx #19.1 cmpl $900000, %edx #19.1 jb ..B1.23 # Prob 99% #19.1 --
595 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:31:30 ] 処で、>593はなんでC++でコンパイルしているんだ?
596 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:34:55 ] 仮想関数を利用する上での注意点があれば教えて下さい。