- 1 名前:デフォルトの名無しさん [2009/12/15(火) 23:42:55 ]
- C言語の*入門者*向け解説スレッドです。
★前スレ C言語なら俺に聞け(入門編)Part 57 pc12.2ch.net/test/read.cgi/tech/1260020924/ ★過去スレ 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++室 Ver.70【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1258873470/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 133代目 pc12.2ch.net/test/read.cgi/tech/1260532772/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
- 237 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 19:43:03 ]
- お、おれは分かってるよ。
キャッチコピーは「戦略的穴掘りゲーム」だろ?
- 238 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 19:50:19 ]
- ほとんど全てのレスに対して間違い探しゲームが成立してしまうのがこのスレッドの凄いところ
- 239 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 20:02:52 ]
- ライアーゲームは情報弱者には辛かろうな
- 240 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 22:49:36 ]
- ::
よくバイソンとかシーインクリメントとかで見るんだけど なんこれ。
- 241 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 23:27:25 ]
- >>237
戦略的穴掘りゲームおもしろそう
- 242 名前:デフォルトの名無しさん mailto:sage [2009/12/18(金) 23:29:49 ]
- アッー
- 243 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:05:15 ]
- int main(void)
{ int num = 567; num = num / 10; num = num % 10; printf( "%d\n", num ); return 0; } これを剰余演算を使わずに書きたいんですが、できますか?
- 244 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:10:37 ]
- dividend = quotient * divisor + remainder
remainder = dividend - quotient * divisor
- 245 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:13:09 ]
- num % 10
を num - (num / 10) * 10 にする。
- 246 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:19:58 ]
- >>243
int num = 6:
- 247 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:20:34 ]
- 以上です。
- 248 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:24:55 ]
- >>247
itoaを使う方法考えてたのに〜
- 249 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:26:13 ]
- That's all.
- 250 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 00:30:20 ]
- >>248
すまんな…
- 251 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 07:11:41 ]
- >240
シーインクリメントとは斬新な呼び方だね。 けどなぜCスレで聞く? もしかしてスルーが正解だったか?戦略的穴掘りに落ちちゃった?
- 252 名前:デフォルトの名無しさん [2009/12/19(土) 08:42:08 ]
- fread()とfwrite()の意味を教えてください!
- 253 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:00:32 ]
- #include<stdio.h>
int main(void) { int data1 , data2, total, average; printf("データ1? "); scanf("%d",&data1); printf("データ2? "); scanf("%d",&data2); total = data1 + data2; average = total / 2; printf("合計 : %d\n",total); printf("平均 : %d\n",average); return 0 ; } 何が間違っているか教えてくれないでしょうか?
- 254 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:11:20 ]
- 最初のscanfの前の全角スペース?
- 255 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:12:04 ]
- >>253
何を聞きたいのか書いてないから 質問の仕方が間違ってるんじゃないの?
- 256 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:29:38 ]
- ディグダグ?
- 257 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 09:54:57 ]
- double average;
average=total/2.0; もしかしてこれがしたいのでは無かろうか
- 258 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:00:03 ]
- >>257
言っておくがそれも間違いだからな average = (double)total / 2.0; じゃなきゃおかしなことになる
- 259 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:03:06 ]
- お前は何を言っているんだ
- 260 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:11:30 ]
- >>258
つられクマー。
- 261 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 10:59:48 ]
- また、scanfを連続させるときは
scanfが取ったバッファをクリアしてからでないとうまく取れない。 stdinから取ったら、stdinバッファをカラにしてから別のを取らないといけない scanfは対象の変数のアドレスに値を入れるのではなく stdinから取得バッファに入れてそこからアドレスに入れるのだ
- 262 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:10:03 ]
- >>258
何のための2.0だよ
- 263 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:26:31 ]
- malloc→freeと処理すると使っていたポインタはNULLポインタを指しますか?
それともmallocで確保したときのアドレスを保持したままですか? まったく別でしょうか?
- 264 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:30:03 ]
- mallocで確保したときのアドレスを保持したままです
NULLを指すようにしたければ自分でNULLを代入してください
- 265 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:31:34 ]
- ありがとうございます
- 266 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:32:12 ]
- いえいえ
- 267 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:37:44 ]
- なんかいでもfreeしてやる
- 268 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:52:06 ]
- ポインタをfreeとかで開放するのって
メモリが有限だから? 仮にメモリ領域が無限だったらfreeしなくていいの?
- 269 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:54:24 ]
- 駄目に決まってんだろカス
- 270 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 11:55:57 ]
- メモリが有限だからです
無限だったらしなくていいかもね
- 271 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:06:10 ]
- 無限のメモリ領域なんて実現不可能なんだからその仮定は無意味
- 272 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:09:36 ]
- アドレスが足りなくなるからアウトだろ雑魚が
- 273 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:10:25 ]
- 仮想メモリか。
- 274 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:50:23 ]
- 俺が気に入らないもの
シミカァロン(英語は発音大事)抜き ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING) if(ThisIsAPointerForMalloc == NULL) Fucking なんかムカつく 普通は if( (ThisIsAPointerForMalloc = Mr_malloc(FUCKINGTOSHINGBUFFERSIZETHATFUCKINGOSINGXING)) == NULL) だろ
- 275 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:52:19 ]
- 一生懸命長い綴り打ち込んでるのかと思うと目頭が熱くなる
- 276 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 12:53:28 ]
- また、defineは大文字で
っていう縛りもムカつく ネイティブから見ると、大文字ってのは大声で叫んでるようにしか見えない。 つまり FUCKINGOSINGXING ってのは FuckingOSingXing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! って怒りながら叫んでいるように見えるのだ。 それと自分で書いておいてなんだが is の i だけ大文字にするとすげえ不自然きわまる。
- 277 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:00:31 ]
- そうだねピカチュウだね
- 278 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:04:00 ]
- カビゴン♀って何かムラムラくるよね
- 279 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:42:47 ]
- 例えばこんなものがあるとしよう
free(void*) char *Memory_of_Love; Memory_of_Love = (char *)malloc(MemorySize512); ここで free((void *)Memory_of_Love) これも何だかなあと思う void * は別の型にキャストできても 他の型からvoid* にはできないはずである。 またvoid*は「何の型でもいい」から、そのまま渡せば何が来てもウェルカムだから キャストしても意味あらへん
- 280 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 13:45:21 ]
- 誰も聞いてないから、チラシの裏にでも書いといてくれる?
- 281 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:19:13 ]
- ヤキソバうまかったわ
満足です
- 282 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:24:02 ]
- 妄想上の相手とシャドーボクシングを始めたら、
林先生の出番だろw
- 283 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 14:26:50 ]
- 亀田が勝ってしまったねえ
- 284 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 15:51:01 ]
- >>240
シーインクリメントインクリメントのことなら、 俺はシーイクイクって略してる
- 285 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:26:15 ]
- ちょっと心温まる豆知識
インクリメント・デクリメント・サクラメント・ハラスメント Cだと++って書けば自動的に値が1増えるし --って書けば自動的に値が1減るが CPUの機能として、そのようなものを持っていないものが多い。 特にRISC。 これらのCPUではアセンブラになると逆にそういうことができない。 1命令で値を増減させることが出来ないだけで、ADDなどで増やしてやればいいだけだが。 残るサクラメントとハラスメントだが、CPUには何の関係もない。 単なる語呂合わせに過ぎん。
- 286 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:29:33 ]
- CISC はアセンブラで書くために命令が高級なんだよな。
今はもうアセンブラで書くやつはいないから CISC はレガシーだな。
- 287 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:31:20 ]
- >>285
いかにもわかったような口ぶりでウソ書いてるやつってちょくちょく 見るけど、どういうつもりなのかマジで疑問。
- 288 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:35:40 ]
- >>286
SSE3だのSSE4だのコンパイラが上手く扱えない妙な命令が次々に増えていく現状をどう見るかね
- 289 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:36:38 ]
- 俺の大好きなSHや、PowerPC、ARMはアセンブリ命令としてインクリメント・デクリメント命令がある。
が、いろんなところでよく使われるMIPSはそんな便利な命令はない。 むしろ、インクリメントなどの命令があるSHとかがRISC陣営では異端中の異端
- 290 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:39:46 ]
- >>286
それ、認識が十数年くらい遅れてる。
- 291 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 16:40:54 ]
- SPARCのinc %regは add %reg, 1, %reg のマクロだけど
結局1命令なので実質あるのと同じ
- 292 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:05:40 ]
- また湧いてきたか
- 293 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:20:40 ]
- インクリメントするやつはちゃんとCPUさんありがとうコンパイラさんありがとうって
感謝しながら使えよ あと風呂でションベンするときはお風呂の神様ごめんなさい だ
- 294 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 17:56:28 ]
- >>279
> void * は別の型にキャストできても > 他の型からvoid* にはできないはずである。 逆だ。
- 295 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 18:48:15 ]
- >>294
いやあってる。 char *p; if ((p = malloc(sizeof(struct hoge))) == NULL) とかけるのは >>279 があっている証拠
- 296 名前:デフォルトの名無しさん [2009/12/19(土) 19:14:04 ]
- できる/できない、で言えば間違いだろ
- 297 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 19:39:58 ]
- >>294-296
279は暗黙のキャストも知らないような 自称上級者なんだから触れんな。
- 298 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:11:55 ]
- >>297
あえて明示的にキャストすることでソースの可読性がうんたらかんたら とかゴチャゴチャ言い出すぞきっと
- 299 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:23:48 ]
- >>279の
>void * は別の型にキャストできても >他の型からvoid* にはできないはずである。 >他の型からvoid* にはできないはずである。 が、まさしく「自分は初心者です」ってアピールしてるんだよな。
- 300 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:33:43 ]
- 自分は初心者なはずである。
- 301 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:37:53 ]
- ポインタ変数なんてどんなものだろうが実態はただのINT型の整数なんだからキャストできないわけないじゃん。
12345678って書くか[12345678]って書くかの違いだけで。
- 302 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:49:04 ]
- >>301
ポインタが int という仮定は例外が多い。
- 303 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 20:54:54 ]
- >>301
ポインタは「整数型」への変換は保証されているが 「int」への変換は保証されていない。 (逆変換で戻したときに情報が失われる可能性がある)
- 304 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:17:28 ]
- 倍数判定機を作ろうと思ったのですが、エラーが出てうまくコンパイルできません
どこが間違っているのでしょうか #include<stdio.h> void baisuu(int y) { int b; for(b=2;b<=20;b++) { if(y%b) printf("%dの倍数です",b); } int main(void) { int x; printf("整数を入力してください\n小数点以下は切り捨てます\n"); scanf("%d",&x); baisuu(x); return 0; }
- 305 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:24:07 ]
- >>304
!
- 306 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:30:07 ]
- (無保証な)ヒント:
論理式に単項式だけを書くやり方 そう if( y % 3)とかwhile( !p )とか はかっこいい ように見えて実は 古くダサい し、下らないミスの温床 if( (y % 3) != 0)とか while( p != 0 )とか 書く癖のほうが類似書式のプログラミング言語(Javaとか) も使うようになった時を考えるといい
- 307 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:31:00 ]
- >>304
void baisuu(int y)にも}が足らん
- 308 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:37:54 ]
- とりあえず>>306 >>307の指摘部分を直したのですが
今度は「左辺値が必要」というエラーが出て うまく倍数判定もできません void baisuu(int y) { int b; for(b=1;b<=20;b++) { if((y%b)=0) printf("%dの倍数です\n",b); } }
- 309 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:42:51 ]
- int a,shidt;
ととして ((a-shift)?(a-shift):2) の演算でおかしな挙動するので調べてみたら a-shiftがマイナスでも真と判定されてた (((a-shift)>0)?(a-shift):2) としたらちゃんと動いた 真と偽の動作を勘違いしてました
- 310 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:43:31 ]
- >>308
それは代入だろ。 y % b == 0
- 311 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:45:36 ]
- >>310
おお、ちゃんと動きました =と==の違いを忘れてました
- 312 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 21:54:24 ]
- 意外と中級車も=と==を間違えるんだよなぁ
さすがに上級者はそんな間違いをする人はいなくなるが。
- 313 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:01:51 ]
- 代入演算子 = が悪い。
どうしてこうなったのか。 おかげで等価演算子は == という悲しさ。。
- 314 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:07:20 ]
- 比較式より代入式の方がソースコード中の出現確率が多いを思ったから代入を=にして比較を==にしたんだろ
面倒なことはできるだけしない、可能な限りシンプルにしたい、そう考えると納得がいく
- 315 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:22:54 ]
- 五目並べの盤面評価関数ってどんなふうに作ったらいいと思う?
- 316 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 22:49:47 ]
- >>314
pascal のように代入を := にし、比較は == にすれば公平でいいかも。
- 317 名前:デフォルトの名無しさん [2009/12/19(土) 23:02:43 ]
- pascal が嫌いな人が作った言語でか
- 318 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:08:46 ]
- =と==を間違えるなんて都市伝説だろ?
おれはめっちゃ初心者のときしか間違えてないよ。
- 319 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:19:27 ]
- 確かに、ほとんど間違えないんだが、コーディング規則がちゃんとしていないと、いったん間違えると発見困難になることがある。
20年前は、 char *p, *q; ... if (p = q) {...} で、この = は間違ってないというような書き方が普通に行われていた。
- 320 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:29:35 ]
- ソースは可能な限り短いほうがいい。
…みたいな考え方のアフォとは一緒に仕事したくないな。
- 321 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:33:07 ]
- >>319
それは、今は警告でるし。 >>320 そういうのは状況によるとしかいいようがない。 「冗長に書けば書くほどわかりやすい」とか思ってるやつも勘弁して欲しいし。
- 322 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:35:15 ]
- 変数は可能な限り少ない方が良い。
繰返し回数は可能な限り少ない方が良い。
- 323 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:40:12 ]
- >>319
30年前の間違いだろ。 20年前は既に警告出すコンパイラが主流だし わかりやすさを優先することが当然になっていたよ。 まあ類は友を呼ぶというから そういう人達の間ではそれが普通だったのかもしれんがね。
- 324 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:42:29 ]
- >>320そういうひとって
printfもpfとかに名前をかえて int a; void f(){ pf("asdf"); } こんなことしたがるような人?
- 325 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:43:27 ]
- いや、それは論外すぎるだろ…
- 326 名前:デフォルトの名無しさん [2009/12/19(土) 23:48:26 ]
- >>253です。
質問内容はコンパイルの出来ない理由を御聞きしました。 どうやら原因は全角スペースに問題があったみたいです。 回答してくれた方ありがとうございます。
- 327 名前:デフォルトの名無しさん mailto:sage [2009/12/19(土) 23:49:58 ]
- >>322
そういう考えでできたのが構造体やクラスや配列なんだろうな int Taro_age; int Taro_ID; char* Taro_Name; char* Taro_EmailAddress; int Hanako_age; int Hanako_ID; ・ ・ ・ みたいに一個一個作ってたら大変だし。
- 328 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:13:15 ]
- int x;
int* p; p=&x; printf("%d",p); この結果が毎回違うのはなぜ? アドレス固定することはできないの?
- 329 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:17:15 ]
- >>328
pに格納しているxのアドレスを表示している
- 330 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:20:13 ]
- 変数xが格納されているメモリの位置はOSが管理している
- 331 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:21:19 ]
- int x;
int* p; p=&x; printf("%d",p); int x; int* p; p=&x; printf("%d",&x); int x; int* p; p=&x; printf("%d",*p); int x; int* p; p=&x; printf("%d",x);
- 332 名前:319 mailto:sage [2009/12/20(日) 00:28:57 ]
- >>323
少々遅レスで悪いが、30年前だと、K&Rの出版年になっちゃいますね。 20年じゃなくてもう2,3年前かも知らんけど、warningがたくさん出るようになったのは ANSI-C普及と同時期だったような気がする。 前のは例が悪かったけど、少なくとも当時は、 while (!(p = p->next)) { ... } といった書き方はごく普通だったと思うし、悪いともされてなかったと思う。 このスレでもキャストうざい派がいるように、いまだに警告無視する人はいるみたいですよ。
- 333 名前:デフォルトの名無しさん [2009/12/20(日) 00:32:26 ]
- >>318
俺もそう思ってたが 先週 != を ! = と書いて すっげー落ち込んだ
- 334 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:34:54 ]
- 警告ってなんなん?問題があるならエラーにしろや
- 335 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:35:38 ]
- >>332
確かに、警告を出すのは比較的あたらしいコンパイラって印象がある。 そもそもこの警告って、C言語の文法に違反してるとかじゃなくて よくある間違いだから、って理由だしね
- 336 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:37:21 ]
- int main()は値を返すべき
- 337 名前:デフォルトの名無しさん mailto:sage [2009/12/20(日) 00:40:36 ]
- >>330
プゲラ トーシロは黙ってろよwww
|

|