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/
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 ] 仮想関数を利用する上での注意点があれば教えて下さい。
597 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:40:00 ] iccだとmovlにしてくれるのか VCだとmov,mov,...ってのにしかならない
598 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 15:44:40 ] >593以下速度の話題 C/C++スレか速度スレ、或いは最適化スレへどうぞ。 >>596 あんたもスレ違い。
599 名前:デフォルトの名無しさん [2007/11/22(木) 21:02:53 ] for(i=10;i>=0;i--)printf("%d\n"i); っていうコード unsigned にするとやばいね 全然気づかなかったよ
600 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:11:23 ] 処理系依存になるってこと?
601 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:17:31 ] unsigned int iに対してi>=0は常に真だべ
602 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 21:20:46 ] なるほど どうもありがとう
603 名前:デフォルトの名無しさん [2007/11/22(木) 22:37:22 ] ポインタが指してる内容を配列に入れたいのですがどうしたらいいですか? 例えば、 char *a="ABC"; char b[4]; このとき、 b[0]=A,b[1]=B,b[2]=C にしたいです。
604 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:39:15 ] strcpy(b,a);
605 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 22:41:18 ] memmove(b,a,3);
606 名前:603 mailto:sage [2007/11/22(木) 23:01:19 ] >>604 ,>>605 できました。 ありがとうございます。
607 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:01:27 ] for(i=0;b[i]=a[i];i++);
608 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:16:00 ] 昨日自己参照構造体でのリストについてかけねーって嘆いてた者だけど、 今日紙に書きつつ、これがこーなるから次はこうなるだろーってソース書いてったら無事動きました!
609 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:28:12 ] 二次方程式の解の公式を求めるプログラムを作れとの課題が出たので考えてみたのですが 思うようにうまくいきません。 #include <stdio.h> #include <math.h> int main() { double x1 ,x2, a, b, c; printf( "a = " ); scanf("%lf" , &a); printf( "b = " ); scanf("%lf" , &b); printf( "c = " ); scanf("%lf" , &c); x1 = -b+sqrt(b*b-4.0*a*c)/2.0*a; x2 = -b-sqrt(b*b-4.0*a*c)/2.0*a; printf("x1= %lf x2= %lf\n", x1, x2); } までできたのですが、 x1= -1.#IND00 x2= -1.#IND00 何を入力してもこの答えになってしまいます。 自分なりに見直してみたのですが間違いが分かりません。 どなたかご教示いただけたら幸いです。
610 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:32:03 ] そもそも式が違うじゃん
611 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:39:05 ] かけざんとわりざんはたしざんやひきざんよりもさきにけいさんします。
612 名前:609 mailto:sage [2007/11/22(木) 23:40:33 ] 式からして間違ってるのでしょうか? 今の式じゃ-bがが最後に計算されてしまうってことですかね?
613 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:43:51 ] >>609 あなたが書いている式は √(b^2 - 4ac) x1 = -b + ------------- * a 2 こんなだよ
614 名前:609 mailto:sage [2007/11/22(木) 23:44:12 ] x1 = (-b+sqrt(b*b-4.0*a*c))/2.0*a; x2 = (-b-sqrt(b*b-4.0*a*c))/2.0*a; こんな感じでいいんでしょうか?あと warning C4996: 'scanf' が古い形式として宣言されました。 というエラーが発生してるんですがこれが原因でしょうか? 習ったとおりに書いてみたのですが。
615 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:46:11 ] printfで%lfは標準じゃなかった気がする。 独自拡張とかC99とかならいけたかもしれんけど。
616 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:47:57 ] >>613 最後のaは分母にかかりますよね? >>615 そうなんですか・・・家と学校じゃ環境が違うのでそのせいかもしれません。 他に間違ってるところありますかね?
617 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:09 ] >>614 それは警告であってエラーじゃない
618 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:11 ] >>614 (...)/2*aじゃなくて(...)/(2*a)
619 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:15 ] それだと -b + √(b^2 - 4ac) x1 = ----------------- * a 2 だな >warning C4996: 'scanf' が古い形式として宣言されました。 warning C4996 でぐぐれ
620 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:48:46 ] >>616 かからねーよwww
621 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:51:39 ] >>618-620 なるほど・・・()付けない限り数字同士はくっ付かないんですか ご指摘ありがとうございます。修正してみましたが、相変わらず答えは変わりません。 他に間違っているところがないのであれば家の環境が悪いということで諦めます。
622 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:53:55 ] 入力してる値が悪いのでは?実数解を持つ値を入れてみ
623 名前:デフォルトの名無しさん mailto:sage [2007/11/22(木) 23:59:22 ] >>622 答えがでました。適当に値を入れていたのが原因でしたか・・・ こんな基礎の問題に答えてくれて助かりました。 もっと勉強しないと駄目なようです、ありがとうございました。
624 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:02:47 ] 適当にいれんなよwwwwwwwwwwww
625 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:05:03 ] Cに一番大事なのはとにかく基礎。 応用なんてものは後回しでとにかく基礎だぜ。
626 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:06:46 ] AもBもすっとばしていきなりCやるとはたかれるってことですよねー
627 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:11:14 ] たまにする背伸びは楽しいけどな 良い気分転換になる
628 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:12:09 ] fizzbuzzもかけない段階でchaos pp使ってメタプログラミングしたりな
629 名前:助けてBOYZ [2007/11/23(金) 02:27:55 ] 今日からの連休中に3つの課題を出されました。 ポインタ大嫌いです。 どなたか助けて下さい。 この問題が一つ目です。 【問】数字文字列を数値化する関数を作成して下さい。 <関数仕様> 書式 :short *AtoS(char *pStr, int *pRetCode); 戻り値:数字文字列のポインタ 引数 :char *pStr → 文字列の先頭アドレス :int *pRetCode → 動作の成否を返す (正常なら:0,エラー時は-1) ※但し、NULLの時は返さない 処理 :pStrで与えられた文字列をshort型の数値に変換する ※負数(マイナス)にも対応 <考慮必要事項> ・short型の範囲外の数値文字列 ・非数字文字列 ・数字文字列と非数字文字列の混在(先頭の'-')は除く ・空文字列 ・NULL 以上の5つはpRetCodeの示す領域にはエラーを返す、戻り値は0
630 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 02:28:53 ] >>629 いつまで逃げ続けられるの? 終わりはあるの?
631 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 02:40:04 ] >>629 自分で考える気がないなら宿題スレへ pc11.2ch.net/test/read.cgi/tech/1195668114/
632 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:03:04 ] >>609 printf("x1= %f x2= %f\n", x1, x2); で試したのか? どうみてこうだと思うんだが
633 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:05:05 ] >>632 そういう問題じゃないから
634 名前:助けてBOYZ [2007/11/23(金) 03:11:41 ] 何とか自分で作ってみました。 だけど戻り値?とか関数の意味がよく分からないし、何だかグダグダと 長いプログラムになってしまいました。 ポインタ&関数を理解するコツを教えて下さい。
635 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:15:18 ] 戻り値ってshort*なの?
636 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 03:15:18 ] そもそも問題がおかしいのにどうしろと 文字列を数値化するのに文字列へのポインタ返してどうしろと
637 名前:助けてBOYZ [2007/11/23(金) 03:22:30 ] 戻り値はshortみたいです。 一応表示はされたんですけど… ちょっとチェックして下さい。 おかしいところ教えて下さい。
638 名前:助けてBOYZ [2007/11/23(金) 03:26:42 ] #include <stdio.h> short AtoS(char *pStr, int *pRetCode); int main(void) { short val; int ret = 0; val = AtoS("1234", &ret); printf("%d\n", val); val = AtoS("-789", &ret); printf("%d\n", val); val = AtoS("atai", &ret); if (-1 == ret) { printf("数値文字列でないデータが渡されました。\n"); } return 0;
639 名前:助けてBOYZ [2007/11/23(金) 03:27:56 ] 改行が多くて入りませんでした。 間違ってるところあれば教えて下さい。 short AtoS(char *pStr, int *pRetCode) { int *p; int i; int sum; short goukei; goukei = 0; if (pStr[0] == '-') { for (i = 1; pStr[i] != '\0'; i++) { /* p[0]に'-'が入力された */ pStr[i] = pStr[i] - '0'; goukei = pStr[i] + (goukei * 10); } goukei = goukei - (goukei * 2); return goukei; } goukei = 0; for (i = 0; pStr[i] != '\0'; i++) { /* p[0]〜'\0'の中に数字だけが入力された */ if (pStr[i] > 48 && pStr[i] < 58) { pStr[i] = pStr[i] - '0'; goukei = pStr[i] + (goukei * 10); } else { *pRetCode = -1; return pRetCode[0]; } } return goukei;
640 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 05:10:13 ] >>629 次からは宿題スレへ #include <stdio.h> short AtoS(char *pStr, int *pRetCode) { int n,s; if(pRetCode == NULL) return 0; *pRetCode = -1; if(pStr == NULL || *pStr == '\0') return 0; for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9';pStr++) n=n*10+*pStr-'0'; n=s==1?-n:n; if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0; *pRetCode = 0; return n; } int main() { int i,s,r; char t[][8]={"","-","a","-a","a1","1a","1-", "-32769","-32768","-1","0","1","32767","32768","-000001","000001"}; printf("String\t: Value\t(RetCode)\n"); s = AtoS("1",NULL); printf("\"1\"\t: %d\t(NULL)\n",s); s = AtoS(NULL,&r); printf("(NULL)\t: %d\t(%d)\n",s,r); for(i=0; i<sizeof(t)/8; i++) { s = AtoS(t[i],&r); printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r); } return 0; }
641 名前:640 mailto:sage [2007/11/23(金) 06:31:08 ] 訂正 #include <stdio.h> short AtoS(char *pStr, int *pRetCode) { int n,s; if(pRetCode == NULL) return 0; *pRetCode = -1; if(pStr == NULL || *pStr == '\0') return 0; for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++) n=n*10-*pStr+'0'; n=s?n:-n; if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0; *pRetCode = 0; return n; } int main() { int i,s,r; char t[][16]={"","-","a","-a","a1","1a","1-", "-32769","-32768","-1","0","1","32767","32768","-000001","000001","4294967296"}; printf("String\t: Value\t(RetCode)\n"); s = AtoS("1",NULL); printf("\"1\"\t: %d\t(NULL)\n",s); s = AtoS(NULL,&r); printf("(NULL)\t: %d\t(%d)\n",s,r); for(i=0; i<sizeof(t)/16; i++) { s = AtoS(t[i],&r); printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r); } return 0; }
642 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:05:09 ] >>639 > pStr[i] = pStr[i] - '0'; 文字列へのポインタ貰った関数が、中身を書き換えちゃいけない。 呼び出し側が、 n=AtoS("12345", &x); とした場合、pStrの指す先は書き換えは不可能である処理系が多い。 普通、こういう文字列へのポインタを貰う関数は、 short AtoS(const char *pStr, int *pRetCode) のようにconstを付ける。
643 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:23:18 ] >641 for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++) n=n*10-*pStr+'0'; ↑こういう可読性の悪い書き方はやめようぜ…
644 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 09:24:47 ] わざとだろう
645 名前:デフォルトの名無しさん [2007/11/23(金) 10:41:36 ] x[n]とr=0.6に対して (x[0]-x[1])/x[1] + r * (x[1]-x[2])/x[2] + r^2 * (x[2]-x[3])/x[3] + ・・・ という計算を多くするとき計算が速く終わるコードって分かりますか? x[n]は変化します 厳密な値ではなくていいです
646 名前:デフォルトの名無しさん [2007/11/23(金) 10:42:45 ] あとx[n]の値は50%以内のずれしかありません
647 名前:デフォルトの名無しさん [2007/11/23(金) 10:54:43 ] x[n]の平均値hとその誤差をd[n]とすると (x[0]-x[1])/x[1] =d[0]-d[1]/x[1] =d[0]-d[1]/h =(d[0]-d[1])*k k=1/h とすれば速そうですね
648 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 11:57:13 ] (x[0]-x[1])/x[1] = x[0]/x[1]-1 でしょ。 -1の部分だけ分けて、 元の式=x[0]/x[1]+r*x[1]/x[2]+r^2*x[2]/x[3]....-(1+r+r^2+...) とすれば、 r=0.6固定なら後ろの部分は定数だから前もって計算しておけば早いのかも。 精度が無視できる項以降は計算しないって手もあるのかな。 有効数字2ケタでいいなら、0.6^10以降は計算しなくてもいいと思う。
649 名前:デフォルトの名無しさん [2007/11/23(金) 12:22:00 ] >>648 サンクス
650 名前:574 mailto:sage [2007/11/23(金) 13:43:42 ] >>576-579 ありがとうございました。 プロトタイプ宣言はやはり暗黙的にexternのですね。 社内のソースと合わせるため、一応これからはグローバルな関数はexternを付けて区別していこうと思います。
651 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:22:28 ] プロトタイプ宣言は厳密には暗黙的に extern なのではなくて、 それより前に static なプロトタイプ宣言や関数定義がなければ extern になり、 あれば static になる。
652 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:24:28 ] そういうときに「規定」って言葉を使うのかな。
653 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:26:23 ] ヘッダファイルで static な関数プロトタイプを書くことは無いし、 ヘッダファイルはファイルの先頭でインクルードするしで、 >>651 のような曖昧さがあっても実際の所これが問題になる事はない。 extern をつけるかどうかは好みの問題。
654 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:14:15 ] >>653 すまん。 前2行と後ろ2行の関係が分からん。 出来ればもうちょい詳しく頼む。
655 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:39:55 ] 別のスレに翻訳単位をよくわかってない奴がいたな。 ヘッダファイルは彼にとって何か特別なものなのかもしれないが。
656 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:52:05 ] >>654 前2行の理由により、普通はヘッダファイル内にあるプロトタイプ宣言より先に static なプロトタイプ宣言や関数定義が現れることはないから、 実質的には暗黙的に extern になると考えても問題ないという話。
657 名前:デフォルトの名無しさん [2007/11/23(金) 19:14:43 ] ここに来てるのってみんなプログラマーなの?
658 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:36:03 ] プログラムが出来るって意味ではみんなプログラマーだろうな
659 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 19:59:26 ] 職業=プログラマはあんまいないと思う 学生とSEばっか
660 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:09:55 ] いや、プログラマーって普通にいるだろ。
661 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:13:13 ] >>659 SEが居るならプログラマも居る事になるんだよ
662 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:19:42 ] SEと職業プログラマはちょっと違うけどな
663 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:21:40 ] あ、名刺はSEだけどプログラマって人はいっぱいいると思う 特に若い人。
664 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:35:16 ] 昔職業プログラマって優れたコードを書く人だと思ってたけど、 なってみたら優れたコードとかは二の次で動くコードを書く人だと知った。
665 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 20:40:15 ] 資格とかいらなくて、基本的にだれでもやれる職業だしな。
666 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:25:12 ] 頭使うドカタだしな。
667 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:44:55 ] 名刺もってるプログラマに出会ったことないんだけど
668 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:46:47 ] 名刺は持ってるぞ 渡す機会は無いけど
669 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:47:29 ] 名刺に「プログラマ」と書くとどうしても低く見られるから、 「システムエンジニア」と書くんだよ。
670 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:48:33 ] みんな普通にもってるでしょ? 自社以外の人にいっさい会わないで、こもって仕事してるならいらないけど。 名詞の肩書きに「プログラマー」とか入ってないって意味?
671 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:50:10 ] 所属とか役職は入ってるけど、プログラマーとかSEとかってのは書いてないよね。
672 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:50:43 ] いや、会社が名刺をつくってくれないらしいんだが……
673 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:54:02 ] たまにしか使わないのに何十枚も刷ると高いから、 使うときに1枚だけプリンタから出せってことだよ。
674 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 21:58:23 ] 数十枚刷れば数年もつ
675 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:03:15 ] プログラマが名刺出すような状況にならんだろ SEとして派遣されたら名刺だすけどさ
676 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:10:23 ] >672-673 どんだけ貧乏な会社なんだよ。 100枚1000円ぐらいなのに…
677 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:11:36 ] 使わないものを作ったってねぇ
678 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:15:03 ] あんま名刺出すとセールスの電話が増えて業務が滞る
679 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:19:51 ] >>678 わたくしどもはお客様の会社にプログラマを派遣いたしております わたくしどもは常に優秀な人材を取り揃えてございます おたくの会社にもおひとついかがでしょうか?
680 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:23:29 ] おもしろくないよ
681 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:32:04 ] そのとおり 笑えない話なのさ
682 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:47:54 ] Cでpow(5,i)の計算をした時のことでお聞きしたいことがあります。 最初はpow(5,0)=1,pow(5,1)=5,(5,2)=25....と順調です。 しかし、pow(5,23)の時に本来ならば11920928955078125のはずなのですが、 なぜか11920928955078124と1小さい数になってしまいます。 pow(5,24)以降も正しい数値が得られず誤差がどんどん大きくなっていってしまいます この原因が全く分からず途方にくれている状態です…よろしくお願いします。
683 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:50:40 ] >>682 ttp://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE#.E8.A8.88.E7.AE.97.E8.AA.A4.E5.B7.AE.E3.81.AE.E7.A8.AE.E9.A1.9E
684 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:51:45 ] >>682 doubleの有効桁数を超えてるとか。
685 名前:デフォルトの名無しさん [2007/11/23(金) 23:57:53 ] 多売長ライブラリ
686 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:15:23 ] >683 倍精度浮動小数点で普通使われるIEEE 754 形式だと仮数部52ビットだけど、 pow(5,23)で52bitを超えるから、以降は誤差が出る。 誤差を避けるためには自分で作るしかない。 でも多分そういうアルゴリズムは探せばあるよ。
687 名前:デフォルトの名無しさん [2007/11/24(土) 01:53:27 ] 0*0.003=0 をlog計算するためにプログラムでかくにはどうすればいいですかね? 0*確率なら0になるから処理の結果に影響ないんだけど logだと0にならないんで困るわ。
688 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:54:20 ] ?
689 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:09:44 ] わからないかな? たとえばこの図であらわすと kossie.net/up/src/kos1247.jpg startから1回目の移動で↑と↓に移動できるそのときの確率が0.5と0.5 start地点の状態確率が1とすると↑と↓に移動した段階の状態確率はそれぞれ0.5 0.5 プログラム的に1回の移動ごとに、すべての状態をまわって、 そのあとに2回目の移動をすることにしてます。そうじゃないと作れないので。 これを小数点でなら最初すべての状態の確率を 0にしておけば、それぞれの移動ごとに すべての状態をまわっても0*移動確率 =0になるので変な数値が値がでることはありません。 ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので Aが0であってもBが0でなければ数値は残ってしまういうわけ。 これでプログラムになやんでるんですよ。
690 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:13:56 ] そもそもlogxって定義域x>0だろが
691 名前:689 mailto:sage [2007/11/24(土) 02:35:46 ] まあ問題はこういう感じなんですけど、図は>>689 のとおりです いま、start,1,2,3,10,11,endという状態がありまして、 以下のような確率で移動することとします。 最初はstartで最後はendです。startの状態確率は1.0です。 1.0から移動する確率をかけると状態1のその時点での状態確率が0.5、状態2の状態確率が 0.5となります。 ただし状態1は入ってくる矢印が3つですので、その時点では0.5ですが 次の状態に状態1から状態1へ移動すると0.5X0.6の計算をして0.3となるわけで す。この(startから状態1への移動確率) (状態1の状態確率)X(状態1から状態1への移動確率)と、(状態11の状態確率)X(状態11 から状態1への移動確率)の和が状態1の状態確率となります。 startから状態10に移動したり、状態2に移動したりして計算をしていって endにきたときの最終状態確率を求めよ。っていうのが問題です。 これをlogで計算しないといけないっていう前提にプログラムを作るとしたら どうつくっていきますか?ただし状態に入ってくる3つの値は比較しながら 計算しないといけないんでね。logの計算なので。
692 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:39:14 ] >>689 なんだお前か 氏ね
693 名前:689 mailto:sage [2007/11/24(土) 02:46:15 ] どうせできないのにいばんな。
694 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 02:47:25 ] 非友好的な態度だな
695 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:40:22 ] 負の無限大?
696 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 03:57:50 ] >>691 人に説明する気はありますか? 宿題スレでも、簡単なことを訳の分からない説明してたし 考えていることを整理してみてはどうでしょう? エスパーしておくと、対数を使うのは外部データの入出力のときだけで 内部での計算は対数を使わなくていいんじゃないかと・・・ (どうせ浮動小数点だし)
697 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:14:10 ] 「 ̄ `ヽ、 ______ L -‐ '´  ̄ `ヽ- 、 〉 / ヽ\ / // / / ヽヽ ヽ〈 ヽ、レ! { ム-t ハ li 、 i i }ト、 ハN | lヽ八l ヽjハVヽ、i j/ l ! /ハ. l ヽk== , r= 、ノルl lL」 ヽN、ハ l ┌‐┐ ゙l ノl l ヽトjヽ、 ヽ_ノ ノ//レ′ r777777777tノ` ー r ´フ/′ j´ニゝ l|ヽ _/`\ 〈 ‐ 知ってるが lト、 / 〃ゝ、 〈、ネ.. .lF V=="/ イl. ト |お前の態度が とニヽ二/ l ヽ.|l 〈ー- ! `ヽ. l |l気に入らない lトニ、_ノ ヾ、! |l__________l| \ ソ
698 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:21:52 ] >>689 >ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので >Aが0であってもBが0でなければ数値は残ってしまういうわけ。 なんで、そんな偉そうにウソを語るんだ。
699 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 09:53:50 ] log0 は未定義だから log(A*B)=logA+logB で A が 0 の場合を考える事自体がナンセンス
700 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:03:19 ] >>689 よく分からんが、log0って出来ないんじゃないの?
701 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:06:58 ] エスパーすると、確率を log した値で保持しておいて、 確率変化を積じゃなく和で表現したいんだろうな。 log(0) は CPU によっては -inf (マイナス無限大) として扱われるから、 そういう CPU では特に問題は発生しないと思うんだけど。
702 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 10:45:05 ] >>683-686 レスサンクス! 結局、多倍長演算をするためにGMPとやらを入れてみました。 しかしGMPの関数を解説してるサイトの少ないこと… どんな関数があるのか、引数の意味は何かとかさっぱり分からないorz
703 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:32:52 ] 練習で、サーバーソケットとクライアントソケットを両方持つプログラムを作ってます。 サーバーはサーバーでリッスンさせといて、クライアントはメッセージを入力すると相手サーバーへ飛ぶ、 と考えたんだけど、先にサーバーソケットをaccept()でループさせとくと、後のクライアント処理に行けなくて困ってる。 スレッド使わないとムリ?
704 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:55:20 ] >>703 >スレッド使わないとムリ? 無理。素直にスレッド立てれ。
705 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 11:57:22 ] プロセスでもいいけどな
706 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 12:00:22 ] selectとその仲間 全然(標準)Cじゃねーじゃねーか
707 名前:デフォルトの名無しさん [2007/11/25(日) 00:04:32 ] for文とwhile文の使い分けがよく分かりません。 苦Cのサイトに、「for文はwhile文を拡張した文」と書いてあったのですが、 while文が先にできて後でfor文を追加したのでしょうか? while文でなければできないことや、while文でやった方がいいこと、またその逆など、 ありましたら教えてください。よろしくお願いいたします。
708 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:10:58 ] >>707 とりあえずループカウンタをつかってるループはfor()を使っておけばいいんじゃないの?
709 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:17:10 ] >>707 while文でできてfor文でできないことや、その逆のことは、ない。 i = 0; while (i < 10) { .... i++; } と for (i = 0; i < 10; i++) { ... } のどちらが読みやすいか? その程度の問題。
710 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:19:45 ] do{}while(); // 必ず一回は行う処理 for(;;) // ループ途中で continue を行っても for の第三項が実行される
711 名前:デフォルトの名無しさん [2007/11/25(日) 00:36:29 ] >>708-710 ありがとうございます。 文法的にwhile文の方が見やすいので、個人的にはそちらを使おうかと思っています。 一般的にはどういう使い分けがされてるとか、「慣習」や「常識」みたいのはありますでしょうか?
712 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:54:11 ] 文字列処理とか数値処理とかで使い分けるだろ。
713 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 01:03:14 ] ここでfor文の方が速いからfor文使え、とその後200レス程費やす無駄な議論を起こす為のネタ投下
714 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 01:04:49 ] 慣習とかは無いだろうけど, 回数が固定なら for,未定なら while が一般的だと思う たとえば,「荷物を10個選ぶ」なら for で,「荷物を10kg分選ぶ」なら while とか
715 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 01:07:00 ] そうだな 内容の容量の制限したいときにforではせんわな。 あープログラムつくらないといけないのに 作る気がしない。 作り始めたら5,6時間いけるのに そういうのが全然ない。
716 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 09:10:10 ] たしかに for でも while でもよいネ。 オイラは無限ループは while 使うようにしてるな。 do while は使わなくなった。
717 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 09:50:56 ] ループするごとに毎回行いたい処理があれば for を使うね。 continue しても実行されるから。
718 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 11:06:17 ] vcだとwhile(1)は警告レベル最大だと文句言われるのでfor(;;)を使うようになった この辺の習慣は環境で変わるんだろうね
719 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 11:08:38 ] 泣く泣く for (; ;) を使うように
720 名前:デフォルトの名無しさん [2007/11/25(日) 13:30:51 ] >>718 どういう警告?
721 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 13:42:40 ] >>720 C4127
722 名前:デフォルトの名無しさん [2007/11/25(日) 15:10:01 ] CとC++はもう仲良くできないの? C99すごすぎ。
723 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:28:24 ] 認識率1%とかの実験のプログラムを前の先輩をつくられて 再実験でそのプログラムを作ってるんだけど。 データ100でそのうちの何個かで認識率を出すって感じで 今ようやくデータ1つで数値を出せるようになった。 データ100個をプログラムで入力できるようにして自動でしたいんだけど 結構複雑。 データ1つ入力して値をだして100回するのも 認識率1%とかいうやって意味あるのか的な感じがして自重してる。 しかしプログラムの内容を率でだされるのっていやだね。
724 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 17:36:31 ] 日記帳にでも書いてろカス
725 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 18:57:23 ] www.nicovideo.jp/watch/sm1619083 これか
726 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 19:48:10 ] 文字列処理を極めたいのですが、何から手を付けたらいいですか?
727 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:01:28 ] 左から。
728 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:02:51 ] まずは文字列の表現方法を考えることから
729 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:03:10 ] 修辞的疑問文というやつだな
730 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:13:07 ] ファイルを読み取る時に一文字ずつ読み取る方法と 一行ずつ読み取る方法がありますが、 どういう場合に使い分けるんですか?
731 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:14:23 ] カンタンなことだ。 ファイルを1文字ずつ読み取りたい場合は1文字ずつ読み取る方法を使い、 1行ずつ読み取りたい場合は1行ずつ読み取る方法を使う。
732 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:16:09 ] その日の気分による
733 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:30:51 ] 一行ずつ、もしくは一文字ずつ読み取らなければいけない場合とは、 例えばどんな場合がありますか?
734 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:43:56 ] >>733 行に意味があるときには行単位で読んだほうが楽 行に意味がないときには文字単位で読んだほうが楽
735 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 22:13:40 ] バイナリファイルは1文字ずつ読んで、 テキストファイルは1行ずつ読む。
736 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 22:39:40 ] >>735 さらっと嘘教えるな
737 名前:デフォルトの名無しさん [2007/11/25(日) 23:10:37 ] 型変換しないのに型変換するとコストかかりますか? たとえばunsigned int型を同じ型でキャストした場合です
738 名前:737 [2007/11/25(日) 23:17:16 ] どうやらたいして差がないことが分かりました
739 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 23:39:11 ] まず間違いなく出力は1バイトもたがわないと思う。
740 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 00:22:38 ] ビルドしてfc /bで比べればいいんじゃね
741 名前:デフォルトの名無しさん [2007/11/26(月) 01:08:03 ] >>714 分かり易い説明をありがとうございます。 >>709 の例で言うと、for文を使う方が一般的、ということですね。 どちらも i を宣言しないといけないことに変わりはないんですね。
742 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 05:05:13 ] ループの終了条件がループカウンター以外の場合はwhileを使う。 ループごとにある関数を呼んで、その結果が真の時のみループを抜ける、とかな。 while (func() != 0) { 〜何かの処理〜 } まあforでも実現できるから、どっちでもいいんじゃない?
743 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:16:58 ] C言語の参考書Lvを卒業して、線形リストとかアルゴリズムみたいなのをある程度組んでみた。 30日位考えれば作れるようなプログラムとかどのような物があります? 大学にも行けなかったような頭なので、そこまで難しい物はまず出来ませんが。
744 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:31:01 ] >>743 トランプのポーカーを AI 付で
745 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:36:18 ] >>743 OS。本が売ってるからそれに従えばおk
746 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:55:58 ] >>744 色々ネットにソースありましたが、AIって部分が難しそうですね・・・ ゲーム作ってみたかったので参考にさせて頂きます。 >>745 アセンブラも使うそうですし、OSとなると自分には無理な気がしてならないですがw 30日でOSが出来るならとなると少し興味もありますね。 レビューのみでは分からなかったのでこれから本屋行って二つを見て周って来ます レス下さった方有難うございました
747 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 13:45:16 ] int a[256]={0} という配列を定義して 例えば1024をscanfでこの配列に a[0]=1024 , a[1]=0 ,a[2]=0,......,a[255]=0 ではなく a[0]=4 ,a[1]=2, a[2]=0, a[3]=1.a[4]=0,.....,a[255]=0 という風に格納したいのですが、どういう風にプログラムを書けばいいのか思いつきません よろしくお願いします。
748 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 13:48:11 ] int n, a[256] = {0}, i; scanf("%d", &n); for(i=0; n; i++, n/=10) a[i] = n % 10;
749 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:06:25 ] >>748 ありがとうございます! int型やdouble型以上の桁の数字を扱う方法として 一桁ずつ格納する方法ならば!と思ったのですが、 どちらにしろ一度int型の変数に代入しないといけないことにプログラム見て気付きましたorz char型の配列(例えばstr[256])に文字として数値を文字として格納した後に、 それをint型の配列(a[256])に入れなおすことって出来ませんよね…
750 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:19:16 ] >>749 こういうこと? char buf[] = "123456789"; int val[sizeof(buf)]; for (unsigned ic = 0; ic < sizeof(buf); ++ic) { val[ic] = buf[ic] == '\0' ? 0 : buf[ic] - '0'; }
751 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:20:01 ] int i, j=0, a[256]; char str[256]; scanf("%s", str); for(i=0; str[i]; i++); whil(i--) a[j++] = str[i] - '0';
752 名前:デフォルトの名無しさん [2007/11/26(月) 14:20:10 ] void array_double(int *a, int n) { int i; for(i=0;i<n-1;i++,n--) { a[i] = a[n-1]; }} 配列aとそのサイズnを受け取り、要素を逆順にするプログラムを考えているんですが、 うまくコンパイルすることができず、1,2,3,4,5と入力すると、5,4,3,4,5と出力されます。 どこがおかしいのでしょうか?
753 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:25:38 ] >>752 >どこがおかしいのでしょうか? 頭。 コードと結果が合致してさえいないぞ。自分のコードくらい間違うな。
754 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:29:45 ] >>752 ヒント: 上書きと交換は違う
755 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:31:48 ] >>753 ヒント: ピントが外れている
756 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:32:11 ] >>753 お前の頭もおかしいよ
757 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:36:06 ] >>752 自分の頭(紙と鉛筆でもいい)の中で実行して 1行ずつ変数の中身がどうなるか考えてみよう ループを展開するんだ。 a[0] = a[5-1]; a[1] = a[5-1]; ・ ・ ・
758 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:36:57 ] >>757 お前もちゃんとコード見ろ
759 名前:753 mailto:sage [2007/11/26(月) 14:40:36 ] とりあえず、>755のお蔭でn--を見落としていたのは判ったw >>757 同士よw
760 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:52:32 ] >>752 a[i] = a[n-1] を int temp = a[i]; a[i] = a[n-1]; a[n-1] = temp; にすればok
761 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:58:31 ] Cに交換演算子が欲しいと思う恭子の頃。
762 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:31:04 ] >>761 具体的にどう実装する?
763 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:33:38 ] >>762 >760の例なら a[i] <> a[n - 1]; とか。 評価の回数を減らせるし、swapマクロを作って自爆することもなくなるし、 CPUに交換ニモニックがあれば使えるべさ。
764 名前:デフォルトの名無しさん [2007/11/26(月) 16:08:54 ] 今大学でプログラミング授業を取ってるんだが、色々とワカンネorz 演習内容うpするので教えてくれませんか?
765 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:16:21 ] >>764 スレ違い
766 名前:デフォルトの名無しさん [2007/11/26(月) 16:18:44 ] >>765 キティーだから許して。スレ違いだったらスマン 板いろいろ探したんだが、何処で聞いたらいい? ググレ以外の回答を頼むw
767 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:26:09 ] C/C++の宿題を片付けます 100 pc11.2ch.net/test/read.cgi/tech/1195668114/l50
768 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:26:32 ] >>764 宿題スレも見つけられないなら大人しく首括っとけ。
769 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:57:03 ] Visual C++ 2005を使用しています。 文字列をLONGLONG型の整数値に変換したいんですが、atoll関数が見つかりません。 Visual C++ 2005の環境では、atoll関数は自作するしかないでしょうか。
770 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:58:25 ] >>769 つ[strtoll()]
771 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 18:42:36 ] _atoi64
772 名前:デフォルトの名無しさん [2007/11/26(月) 18:51:11 ] boost::lexical_cast
773 名前:769 mailto:sage [2007/11/26(月) 18:53:19 ] >>770-772 ありがとうございます。 _atoi64でいけました。
774 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 19:59:33 ] >>770 VC2005はC99に未対応じゃね?
775 名前:デフォルトの名無しさん [2007/11/26(月) 20:56:49 ] 変な質問ですが、C言語をマスターするのにだいたいどのくらいかかりますか?
776 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:01:58 ] オレにも教えて下さい。C言語って何が出来ますか? 入門書卒業後何をしたらいいのやら。 グラフィック系統の本みたけど、これを利用してぱらぱら漫画みたいなの作れないですか
777 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:05:11 ] Cでできないことはほとんどない
778 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:06:05 ] >>776 それだけなら画像表示ツール自身でできるからなぁ。 あんたの質問は、「英語で何ができますか?」と同じくらい無意味なんだよ。
779 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:40:46 ] #include <stdio.h> int main(void) { FILE *fp; int x; int y = 30; fp = fopen("test.txt","r"); fscanf(fp,"%d",&x); printf("%d",x); fclose(fp); fp = fopen("test.txt","w"); fprintf(fp,"%d",x); fscanf(fp,"%d",&x); printf("%d",x); fclose(fp); return(0); } ------test.txt----- 10 ----------------- 馬鹿な質問で申し訳ないです。 実行結果が107になるんですが、何か見落としてるのでしょうか。
780 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:47:04 ] "w" なのになんで fscanf を?
781 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:48:45 ] >>779 >何か見落としてるのでしょうか。 夢 冗談さておき、"w"でオープンしたストリームからは読み込めません。 まして、fprintf()で出力した先には何もありません。
782 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:49:26 ] あ、ホントだ。 ありがとうございます。 また"r"で開きなおさないとダメなんですね。 "r+"とか"w+"の使い方もいまいち不明だし。
783 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:58:29 ] ついでに質問です。 "r+"と"a+"の違いって何でしょう? 両方ともファイルに出力したら追記されますよね。 単純にファイルが新規に作成されるか否かですか?
784 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:01:41 ] r+ は途中にも書き込める。 a+ はファイルの終わりにしか書き込めない。
785 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:14:53 ] >>784 挿入可能って事ですか? それとも上書きが出来るって事でしょうか。 色々試してみてるけど思うように扱えないです。
786 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:23:12 ] r+ は上書き可能。こんな感じ。 ポップアップ用アンカー >>786 #include <stdio.h> #include <stdlib.h> int main() { static const char FILENAME[] = "test.txt"; FILE *fp; int x = 0; /* とりあえず 10 と書き込む */ fp = fopen(FILENAME, "w"); fprintf(fp, "%d", 10); fclose(fp); fp = fopen(FILENAME, "r+"); /* r+ で開く */ /* ファイルの先頭から数値を読み出す */ fscanf(fp, "%d", &x); printf("%d\n", x); /* 10 と出力されるはず */ /* ファイルの先頭に移動して 30 と書き込む */ fseek(fp, 0, SEEK_SET); fprintf(fp, "%d", 30); /* またファイルの先頭に移動して数値を読み出す */ fseek(fp, 0, SEEK_SET); fscanf(fp, "%d", &x); printf("%d\n", x); /* 30 と出力されるはず */ fclose(fp); return EXIT_SUCCESS; }
787 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:32:56 ] 分かり易い解説ありがとうございます。 上記の例で、"a+"だと、 10 1030 と出力されちゃうんですね。 fseek関数はまだ触った事ないので勉強してみようと思います。
788 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:07:17 ] /* fseekってイマイチよく分からん。 オフセットとかなんだか知らんが 読んだときか書き込んだときでかは忘れたけど、数字で int型の4バイトの時と、char型の1バイトの時があってイミフ。 チラシの裏で馬鹿なレスだからスルーしてね^^ */
789 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:43:55 ] >>788 それは恐らくfseek()が判らないのではなくて、fprintf()で書き込むのかfwrite()で書き込むのかの 違いがよく判っていないんジャマイカ。 >>787 書き込み後は、fseek()(或いはそのサブセットのrewind())をするか、明示的にfflush()しないと 書き込んだ結果が実際のストリームに出力される保障がないことに注意。 まぁ、ファイル先頭に移動するにはrewind()の方が判りやすいだろうね。
790 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:56:48 ] 条件によって01を記録し、 記録した情報を順番に読み取って01を判別し、 条件分けをしたいのですが思ったとおりになりません。。 具体的には、書き込み FILE *fp; char output = 0; int bit = 0; fp = fopen("bitstream","rb"); for(i=0; i...... ) { if(bit == 8) {bit = 0; fputc(output,fp);} if(条件) {手順1; output = ((output<<1) | 0x01); bit++;} else {手順2; output <<= 1; bit++;} } output = (output<<(7-bit)); fputc(output,fp); 読み込み char a; for(i=0; ){ if(bit == 8) {a = getc(fp); bit = 0;} if( ( a >> (7-bit) ) & 0x01 ) {手順1; } else {手順2; } bit++;} こんな感じで書いてるんですが、どこかおかしいところがあればご指摘ください。
791 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:13:53 ] float *a; a = new float(); *a = 120; float *temp = a; これはOKですよね float *temp = 120 これはなんでダメなんですか?
792 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:29:03 ] tempが格納するのはアドレスだから。 120を変数に格納して、その変数のアドレスをtempに渡すなどする必要がある。
793 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:30:17 ] newはC++なんだけど
794 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:30:49 ] セミコロンが無いから。
795 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:32:19 ] つまり float *tempは、ポインタとして宣言してる状態で、そこにaのアドレスが入って、 temp = a となっている、ということですか?上の例だと で、3行目の *a =120 は aのアドレスをもったところに120をぶち込んでる、ということで float *tempとは別ものなんですよね?
796 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:47:27 ] 564.1 451.6 154.1 [EOF] こういう風になってるテキストファイルがあるときに 「EOFまで数字をテキストファイルから読み込む」という作業をする場合はどうすればいいんでしょうか? i=0; while(1){ if(fread(&c,sizeof(char),1,fp)==EOF) break; else { data[i]=fscanf(fp,"%lf\n",&value); i++; } } こんな感じにかいたらdata[0][1][2]には564.1 451.6 154.1 が入っているんでしょうか? よくfreadとfscanfなどがわかっていないのでよろしくお願いします。
797 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:47:38 ] 別もの。 *a=120の*はデリファレンス、float *tempの*はポインタ宣言。
798 名前:ワカメ高専 mailto:sage [2007/11/27(火) 01:05:59 ] [-3,3] fx=1/(1+5x^2) 分点の数 10個(n=9) これをラグランジュで求めて結果を出力するプログラムを作れって(c or c++)言われたけどさっぱりでしゅ
799 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:44:24 ] >>798 課題丸投げは宿題スレへ pc11.2ch.net/test/read.cgi/tech/1195668114/
800 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:49:31 ] >>796 i=0; while(1){ if (fscanf(fp, "%lf", &data[i]) == EOF) { break; } i++; }
801 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:55:32 ] >>795 そう。上の例は float *a; a = new float(); *a = 120; float *temp; temp = a; に等しい。下の例は float *temp; temp = 120; ということになる。floatポインタに整数120は代入できない(型が異なる)のでエラー。
802 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:14:26 ] エラーにはならないだろボケ
803 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:16:13 ] >>791 別に駄目じゃねーよ。 期待してるのとは違う動作だろうけどな。
804 名前:801 mailto:sage [2007/11/27(火) 02:19:44 ] 本当だ、エラーにはならんね、すまそ