1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ] 言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 26 pc11.2ch.net/test/read.cgi/tech/1206196600/ 過去スレ makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 105代目 pc11.2ch.net/test/read.cgi/tech/1208268461/
331 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:15:49 ] stdlib.hにあるsystem関数って、標準ですか? どの処理系でもまともな動作が期待できる?
332 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:04:12 ] >>331 プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。 質問がとんでもなく飛んでいる。 どの処理系・・・列記してみて まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)
333 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:19:24 ] >>331 標準じゃない
334 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:25:08 ] >>324 このソースって凄いね(大文字ばっかで・・・w) 関数のポインターについてだけど ポインターはアドレスを示すのは判りますね。 int body1(char* mes) { printf("body1 : %s¥n", mes); return 0; } int body2(char* mes) { printf("body2 : %s¥n", mes); return 0; } { int (*func)(char*); func = body1; func("message"); func = body2; func("message"); } みたいな。 lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。 あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。
335 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:57:10 ] >>331 関数そのものは標準であり、 どの処理系であろうと「処理系の考えるところのまともな動作」をする それが「プログラマの期待するところの動作」と一致するかはわからない
336 名前:デフォルトの名無しさん [2008/05/05(月) 16:02:52 ] ここのレス見ても何も分からないほどの初心者ですが教えてほしいことがあります。 課題でこのプログラムを組まないといけないのですが、全く分かりません。 問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。 ただし行列a,bは以下のものを使用する。 |0 1 2| |0 3 6| a=|3 4 5| b=|1 4 7| |6 7 8| |2 5 8| aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
337 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:12:06 ] >>336 >aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。 行列の積の定義から勉強しような。 行と列が逆だと思うぞ。
338 名前:デフォルトの名無しさん [2008/05/05(月) 16:23:36 ] >>337 すいません。丁寧に指摘してくださってありがたいです。 一応僕が作ったプログラムを載せておきます。 #include<stdio.h> main(){ int a[3][3]={{0,1,2},{3,4,5},{6,7,8}}; int b[3][3]={{0,3,6},{1,4,7},{2,5,8}}; int c[3][3]={0}; int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) c[i][j]=a[i][j]*b[i][j];} for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%d ",c[i][j]); printf("\n"); }} 足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、 どうすればよいのでしょうか、あつかましいですがよろしくお願いします。
339 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:28:36 ] (っ´▽`)っ #include <stdio.h> int main(void) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}}; int ab[3][3]; int i; int j; int k; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); } } } return 0; } 答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}
340 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:29:04 ] >>338 行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。
341 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:30:14 ] for(n = 0; n < 3; n++){ for(m = 0; m < 3; m++){ for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m]; } } こんな感じ?
342 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 16:33:49 ] >>338 (っ´▽`)っ x行n列の行列Aのi行j列成分をa(i, j)、 n行y列の行列Bのi行j列成分をb(i, j)、 ABのi行j列成分をab(i, j)と表示するとき、 ab(i, j) = Σ(k=1→n)a(i, k)b(k, j) 線形台数の教科書を見直せ☆
343 名前:デフォルトの名無しさん [2008/05/05(月) 16:51:00 ] >>339->>342 初歩的なことなのにわざわざ教えてくださってありがとうございます。 感謝しています。 あとほんとに初心者的なことなんですが、>>339 さんのプログラムで計算は出来ました。 しかし答えを表示させようと思ったら、なんか変な結果になりました。 以下プログラムと結果です。 (最初のほうは省略) for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); printf("%d ",ab[i][j]);} } } return 0; } 結果 0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149
344 名前:デフォルトの名無しさん [2008/05/05(月) 16:52:39 ] >>342 ゆとり乙 数学3cのレベルです
345 名前:344 [2008/05/05(月) 16:54:36 ] >>342 ごめんなさいゆとりは俺でした 数学3cじゃねええええええええええ あああああああああああああ何か勘違いしてたああああああああ
346 名前:344 [2008/05/05(月) 16:55:21 ] やべえ今までで一番恥ずかしい書き込みだ
347 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:55:51 ] 最近Cを始めた者なんですが CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? ポインタを使うような関数を自分で作る必要がありますか? 何かサンプルなどもありましたらお教えください。
348 名前:336 [2008/05/05(月) 16:55:51 ] 僕はちなみに本当のゆとりです。
349 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:56:55 ] 落ち着け 寿司食うか?
350 名前:344 [2008/05/05(月) 16:58:16 ] 大体3cとかあんまりやってねぇんだよ・・・ ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ? 行列式はなかったよな・・・あぁ・・・俺なにやってんだろう
351 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:58:59 ] > ab[i][j] += (a[i][k] * b[k][j]); > printf("%d ",ab[i][j]);} ~~~ 中括弧の位置
352 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:03:14 ] >>343 (っ´▽`)っ printfを最も内側のループの外に出せ☆ #include <stdio.h> int main(void) { int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}}; int ab[3][3]; int i; int j; int k; for(i = 0; i < 3; i++){ for(j = 0; j < 3; j++){ ab[i][j] = 0; for(k = 0; k < 3; k++){ ab[i][j] += (a[i][k] * b[k][j]); } printf("%d\t", ab[i][j]); } printf("\n"); } return 0; }
353 名前:344 [2008/05/05(月) 17:05:08 ] ああああああああああああああああああああああ
354 名前:344 [2008/05/05(月) 17:06:41 ] ダメだ・・・
355 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:08:02 ] 五月蝿い トイレでも篭ってろ
356 名前:344 [2008/05/05(月) 17:08:42 ] 線形台数の教科書読んできますノシ
357 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:10:23 ] >>347 >CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? ない >ポインタを使うような関数を自分で作る必要がありますか? ある 文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること まずCのやりかたというものを覚えるのが先
358 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:12:08 ] >>347 (っ´▽`)っ b = LEFT(a, n) は strncpy(b, a, n); b[n] = '\0'; b = MID(a, m, n) は strncpy(b, &a[m-1], n-m+1); b[n-m+1] = '\0' で。
359 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:13:30 ] (っ´▽`)っ 最後セミコロンが抜けたが気にしない☆
360 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:14:05 ] >>347 >CってVBにあったLEFTやMIDに当たる関数はないのでしょうか? どちらもsprintf()で代用可能。
361 名前:336 [2008/05/05(月) 17:14:14 ] >>351->>352 おかげさまでうまく答えも出ました。本当にありがとうございます。
362 名前:344 [2008/05/05(月) 17:14:54 ] >>361 俺と一緒に勉強しようぜ
363 名前:347 mailto:sage [2008/05/05(月) 17:17:36 ] >>357-360 ご回答ありがとうございました。 サンプルを参考にしながらC勉強をしていきます。
364 名前:側近中の側近 ◆0351148456 [2008/05/05(月) 17:23:39 ] (っ´▽`)っ 正確には (っ´▽`)っ b = LEFTB(a, n) は strncpy(b, a, n); b[n] = '\0'; b = MIDB(a, m, n) は strncpy(b, &a[m-1], n-m+1); b[n-m+1] = '\0'; だ。 strncpyの第3引数はバイト数。 LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。
365 名前:336 [2008/05/05(月) 17:35:16 ] >>362 共にがんばりましょう。
366 名前:デフォルトの名無しさん [2008/05/05(月) 17:44:26 ] unsigned __int32 hentai, doutei; hentai = 293317826; doutei = 899523; 仮に上のように hentai と doutei に格納された数値において、 hentai += doutei; // 293000000 + 899253 のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。 条件は if ( hentai > doutei && doutei >= 0 && doutei < 1000000) で、思いついたのが hentai = ((hentai / 1000000) * 1000000) + doutei; 納得がいかないのでスマートなやり方教えてくれ。
367 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:50:49 ] >>366 十分スマートと思うが、どういう点で納得がいかないんだ。 hentai += doutei - hentai % 1000000;
368 名前:デフォルトの名無しさん [2008/05/05(月) 17:58:57 ] >>367 おお、サンクス。 除算か乗算どちらかを一回でも削りたかったんだ。
369 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 21:57:45 ] >>363 Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな? >>360 参考までに書いてくれると周りも参考になるとおもう。 せいぜい数行だと思うから sprintf で書いてみてよ。
370 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 22:12:13 ] >>369 360じゃないが、こうじゃないかな。 char* left(char *dst, const char *src, int count) { sprintf(dst, "%.*s", count, src); return dst; } char* mid(char *dst, const char *src, int pos, int count) { return left(dst, src+pos, count); }
371 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:40:11 ] C言語用でお勧めのフリーコンパイラを教えてください
372 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:43:44 ] >>370 おお、%.*s ・・・しらなんだ。
373 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 23:47:34 ] >>371 ・ GCC (MinGW) ・ Microsoft Visual C++ Express Edition 2008 好きなの選べ
374 名前:デフォルトの名無しさん [2008/05/06(火) 00:05:01 ] >>373 その2つの違いがまったくわかりません… それとMSの方はC++となってますがC言語にも対応してるんですか??
375 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:08:44 ] おまえは紹介されたコンパイラについてちゃんと調べたのか?
376 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:09:31 ] >>374 MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。 gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。 まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。
377 名前:デフォルトの名無しさん [2008/05/06(火) 00:24:49 ] fputc( )の使い方の説明で int fputc(int 文字、FILE *ストリーム); fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。 とあるんですが、上位バイトはどうなるんですか?
378 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:25:59 ] 捨てられる
379 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:26:49 ] ttp://www.bohyoh.com/CandCPP/C/Library/fputc.html
380 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 08:01:36 ] vistaで動くコンパイラだったら何がいい? やっぱりbcc、gcc辺りかな
381 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:42:29 ] VC++ 2008 Express Edition
382 名前:デフォルトの名無しさん [2008/05/06(火) 09:53:56 ] uint16 とか uint8 とかは int とどう違うのですか? 使い方を教えてください。
383 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:54:04 ] Express Editionとgccの好きな方
384 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 09:56:25 ] uint16_t や uint8_t なら標準(C99)で用意されているが uint16 や uint8 は標準では用意されていない。
385 名前:382 [2008/05/06(火) 09:59:52 ] >>384 もう少し詳しくお願いします。
386 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:11:53 ] >>385 標準で用意されてない以上、 ヘッダファイル内にある定義を見てくださいとしか言いようが無い。
387 名前:382 [2008/05/06(火) 10:22:11 ] >>386 ということは・・・ uint16 uint8 はwindows.hとかでも定義されてる分ではなく、 自分の使っているライブラリかなにかで定義されているということですね。 わかりました。 調べてみます。
388 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:24:30 ] >>387 windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。 そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。
389 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:25:09 ] 処理系独自に定義されてるかもしれないが、 どの処理系使ってるかも知らんし、 結局自分で調べてくれ、というこった。
390 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:51:05 ] struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram hist); int main (void){ struct histgram hist; int z; hist.x = 0; for(z=0;z<100;z++){ hist.y[z]=0; } printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); one(hist); printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); for(z=0;z<9999999999;z++); return 0; } void one(hist){ two(hist); void two(hist){ int z; hist.x = 1; for(z=0;z<100;z++)hist.y[z]=1; } とするとtwo(hist)でエラーが起きます。なぜでしょうか?
391 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 13:57:38 ] すいません、解決しました。
392 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:00:16 ] INT_MAX 4bites = 2147483647 < 9999999999
393 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:02:26 ] やっぱうまくいきません。 struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram hist); int main (void){ struct histgram hist; int z; hist.x = 0; for(z=0;z<100;z++){ hist.y[z]=0; } printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); two(hist); printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]); for(z=0;z<9999999999;z++); return 0; } void two(struct histgram *hist) { int z; hist->x = 1; for(z=0;z<100;z++){ hist->y[z]=1; } } は何がいけないのでしょうか?
394 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:04:25 ] two()は構造体のポインタを受け取る関数 main()で呼んでるtwo()に渡されてるhistは構造体そのもの あと>392
395 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:06:22 ] bites …くそorz
396 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:11:21 ] Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい
397 名前:393 mailto:sage [2008/05/06(火) 14:11:59 ] www9.plala.or.jp/sgwr-t/c/sec15-4.html ここに、393のようにかけと書いてありました… 393を書き直した正解はどうなるのでしょうか? グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく 処理された任意の変数をn個、n-1個上の階層で使用したいのですが
398 名前:393 mailto:sage [2008/05/06(火) 14:12:39 ] >396 ありがとうございます。使ってみます。
399 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:24 ] #define ZETTAI(x) (x < 0) ? -(x) : x int x; x = ZETTAI(-9 - 50) + 5; これでxの中身が59になってしまうのですが、何故でしょうか? -59をZETTAIで59にした後、5を加算しているはずなのですが
400 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:17:47 ] >>.397 そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、 ポインタを引数としてとるseidesp2()にそのまま渡すことができる。 >>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。 >グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく >処理された任意の変数をn個、n-1個上の階層で使用したいのですが 言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。
401 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:21:07 ] コンパイラのエラーメッセージをちゃんと読め。 プロトタイプ宣言と定義が噛み合っていないぞ。 void two(struct histgram hist); void two(struct histgram *hist)...
402 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:09 ] >>399 x = ZETTAI(-9 - 50) + 5; ↑は↓のように展開されるから。 x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; これはもちろん x = (-59 < 0) ? 59 : -54; と解釈されて、xには59が代入される。 マクロZETTAIの正しい宣言は下のようになる。 #define ZETTAI(x) ((x < 0) ? -(x) : x) もちろん自作などせずにライブラリ関数を使うことが望ましい。
403 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:23:31 ] >>399 #define ZETTAI(x) (x < 0) ? -(x) : x を #define ZETTAI(x) (((x) < 0) ? -(x) : (x)) にしておてきなさい。
404 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:30:39 ] >>402-403 上手くいきました ありがとうございます ですが、 >x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; 同じxなのに何故一番右のxだけに+5がくっつくのですか?
405 名前:393 mailto:sage [2008/05/06(火) 14:30:43 ] すいません、結構理解に手こずってます。 配列でなく、実体を受け渡しする場合は、 struct histgram{ int x; int y[100]; }; void one(struct histgram hist); void two(struct histgram *hist); int main (void){ struct histgram hist; int z; hist.x = 0; printf("before***%d***%d***%d***",hist.x); one(&hist); printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]); return 0; } void one(struct histgram hist){ two(&hist); } void two(struct histgram *hist){ int z; hist->x = 1; } だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。 というエラーが出てしまいました。
406 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:01 ] >>404 元のx=の式の一番右の+5がそのまま残っているだけ。
407 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:36:58 ] >>405 構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。
408 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:42 ] >>406 つまり #define ZETTAI(x) (x < 0) ? -(x) : x を #define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね? #define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね! 理解できました 丁寧にありがとうございました
409 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:40:56 ] まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。
410 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:29:22 ] いいから黙ってstdlib.h::abs()を使え
411 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:49:43 ] やっぱ自作するより、ライブラリ探したほうがいいのかな
412 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:26 ] absはintだから・・・
413 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 16:56:59 ] そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。
414 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:00:03 ] >>399 悪いことはいわん。inline 使え。 #define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?
415 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:03:58 ] inline は C99 からだから
416 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:56:05 ] >>415 そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?
417 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:00:59 ] VC++ は C89 だ
418 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:03:14 ] まぁ、最適化を当てにして関数にしておけってのはありだがな。
419 名前:デフォルトの名無しさん [2008/05/07(水) 08:24:58 ] すみません質問させてください。 入門書見て書いてるんですが #include <stdio.h> int astoi(const char s[]) { int i; int number = 0; for(i = 0; s[i] >= '0' && s[i] <= '9'; i++) number = 10 * number + (s[i] - '0'); return(number); } int main(void) { char x[]= "1234"; printf("%d", astoi(x)); return(0); } という文字型を数値に変えるプログラムで、 number = 10 * number + (s[i] - '0'); のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか? この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。
420 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 09:07:44 ] >>419 文字を数値へ変換してる asciiコードとかがポイント
421 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:06:21 ] 誰か>>414 の >#define は C言語ではない の意味を説明してくれないか?
422 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 11:12:54 ] >>421 プリプロセッサの範疇だと言うことだろ。
423 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 12:12:00 ] >>419 s[i]というのは文字コードが格納されている '0'というのも、数値の0ではなくて文字0の文字コードが格納されている '1'は'0'より文字コードが一つ大きいんだ つまり'1'から'0'を引けば数値の1が返るという仕組み
424 名前:デフォルトの名無しさん [2008/05/07(水) 13:12:40 ] >>419 ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ! ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。
425 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 13:49:07 ] コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?
426 名前:419 mailto:sage [2008/05/07(水) 14:49:58 ] asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。 レスしてくれたみなさん、ありがとうございました!
427 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:49:27 ] プリプロセッサも、C標準に規定されている訳だし、 C言語の一部と考えてもいいんじゃないかな。 プリプロセッサがなきゃコメントすら書けん
428 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 15:50:27 ] >>426 せめてGoogleくらいは味方にしておこう。
429 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:00:13 ] プリプロセッサの問題点はC言語の一部かどうかじゃなくて コンパイラと完全に独立しているところ
430 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:11:51 ] 問題点ではないだろ
431 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 16:13:36 ] 問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。