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/
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 ] 問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。
432 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 19:53:41 ] プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。 #include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・ ただ #define で色々マクロ組むのはどうかな。 美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。 #define CONSTANT_VAL 50 ではな const int CONSTANT_VAL = 50; こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。
433 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:00:28 ] それは別に警告出ないと思う。 マクロは使わなくていいなら使わない方がいいってのは賛成だが、 C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。
434 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:01:59 ] プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・ 引数の型気にしなくてもいいマクロとか素敵じゃない?
435 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:03:47 ] マクロはどう展開されてどう実行されるのかを理解して無いと バグを生むことがあるってのがアレなんだろうね
436 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:10:13 ] そんなとうにされつくしてる議論してんなよ・・・・・・・・
437 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:14:03 ] >>436 入門篇って書いてあるし、議論すればえ〜ねん
438 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:16:43 ] >>433 私はこのレベルの警告を出すようにしてる。 >>434 そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。 #defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど a = -3; k = abs(a++); 結果は悲惨になるけど気付きにくいでしょ? これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。
439 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:19:39 ] C++ だとそれを何とかするために関数テンプレートが導入されたが、 C だとやっぱどうしてもマクロになっちゃうんだよなあ。
440 名前:434 mailto:sage [2008/05/07(水) 20:24:50 ] >>438 マクロの怖さを頭ではなく心で理解したわ
441 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:26:02 ] ABSにすれば解決
442 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:52:15 ] 馬鹿が使えば包丁も自動車も凶器になる。
443 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:45:43 ] >>435 それを言ったら無知と無理解はなんだってバグのもとだろ
444 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 21:51:07 ] 所詮人間一人なんてちっぽけな存在さ。自分一人なんて この世の60億分の1に過ぎない存在。万能、全知全能、 絶対権力者の人間なんて存在しない。 人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。 そんなもん。だから、気ぃ張るなや、適当に生きろ。 どうせお前が強がっても、地球の運命までは変えられないから。 せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ 出来んやろ?なっ?俺はずっと共産党に投票してたけどな。
445 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:09:35 ] マクロを使うと一見上級者のようでかっこいいんだけどね 地道に関数でということかな
446 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:12:57 ] ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが 同じ道路交通法が適用されている道で守るべきルールは同じさ。 それよりも、ドライバーの運転技術はいかがなものか?他に、 アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が 加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。
447 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:15:20 ] ええいお前のたとえは分かりにくい
448 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 22:35:14 ] linuxのコンソール上でカーソルの処理を行いたいのですが、 カーソルの処理には何を使ったらいいのでしょうか? ncursesはできれば使いたくないです。 ttp://oshiete1.goo.ne.jp/qa3121681.html の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。 よろしくお願いします。
449 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:12:49 ] >434 型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。
450 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:21:56 ] >>434 昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・ 昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。
451 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:23:27 ] FORTRANなら普通の事です
452 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:25:14 ] >>445 マクロ使っても全然上級者には見えないから安心して関数を使おう
453 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:28:26 ] 可読性、保守性の高いソースを書く人のほうが上級者に見える。 まあマクロはその手段の一つなんだけれども。
454 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:31:13 ] 浮動小数点の定数って定義できるんだっけ? C++でも未だにマクロ使ってるんだけど
455 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:35:27 ] 別に定数を定義することくらいはできるけど。 ただ、初期化順でハマることはあるかもしれないね。
456 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:37:42 ] voidポインタの参照先はビットシフトできないのかな?
457 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:40:54 ] >>456 void*をint*にキャストしてシフトすれば?
458 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:43:20 ] >>456 何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。
459 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:57:36 ] キャストしたらできた! これって任意のバイト数を指定することはできないのかな? mallocで指定しても駄目だったし無理か・・・
460 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 23:59:21 ] >>459 > これって任意のバイト数を指定することはできないのかな? 意味不明
461 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:16:42 ] void*の参照先を任意のビット幅としてビットシフトしたいんです
462 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:18:04 ] 自分でそういうプログラム書け。
463 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:26:54 ] >>461 それ、何のデータ?
464 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:28:38 ] ビットシフトすりゃいいじゃん。
465 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:35:13 ] >>463 void*の参照先ですか? intとかcharとか不定です void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・
466 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:38:59 ] とりあえずバイトオーダをはっきりしておかないとな。 リトルエンディアン環境の場合、数十バイトだろうが その全体でリトルエンディアンになることを仮定していいのか、 それとも4バイト単位でリトルエンディアンになることを仮定するのか。
467 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:44:48 ] >>465 char*にキャストして一バイトごと表示しろよ
468 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:51:12 ] >>466 リトルエンディアンだとおもう よくわからないから続きはwebで勉強してくるわ >>467 おk試してみる
469 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:05:04 ] >>461 できない ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない どうしてもやりたいなら自力でそのような関数を作るしかない
470 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:11:23 ] キャストすればいくらでもできるだろ・・・。
471 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:16:35 ] >>470 んなアホな charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ
472 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:20:12 ] もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな それだったらlhaの解説書見れば早いと思う
473 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:27:33 ] >>471 結局できるんじゃないか
474 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:39:36 ] >>473 「ビットシフト」の言葉の食い違いだったようだ 俺が考えてたのは組み込みのビットシフトのことね そっちは概念としてのビットシフトだよな
475 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 01:41:10 ] > 組み込みのビットシフ なんじゃこれは?ト
476 名前:デフォルトの名無しさん [2008/05/08(木) 02:38:42 ] プロトタイプ static void mera(const char *); このとき 1) void mera(const char *merami) 2) void mera(const char* merazooma) 1だけのはずが 2のようなものも通ってしまうのはどうして? どちらでも良いという意味ならば、どちらが推奨なの? また、 static void bagi(const char ****); このとき 1) void bagi(const char ****bagima) 2) void bagi(const char**** begiragon) どちらも警告W8075程度で通してしまうのはどうなの? BCC5.5.1
477 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:57:27 ] >>476 > 1) void mera(const char *merami) > 2) void mera(const char* merazooma) 1) は C に多く、2) は C++ でみます。 どっちでも大差ないと思います。
478 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 02:59:49 ] スペースがあるかないかだけじゃん。何で違うものだと思うの?
479 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:00:44 ] >>477 おお、ありがとう。
480 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:20:48 ] >>476 char *p も char* p も意味は同じ スタイルについては、変数の宣言時にたとえば char* p, * q; などとするのが不自然という理由で char *p, *q; を推奨する人は多い
481 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:31:59 ] 追記 一方で char* p; を推奨する人は、変数名はあくまでpであるから それがchar*であることを示すためにそうすると主張することが多い ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名]; だから int const n, m; とは書けても char* p, q; とは書けない)ので、 構文的には変数名側に寄せることが正しい扱いであると言える
482 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 03:37:26 ] ×ただし*はcharやint、あるいは ○ただし*はcharやintのようなデータ型、あるいは
483 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:08:15 ] もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、 また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい
484 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 04:16:42 ] たくさんのレスありがとう、勉強になりなす。