- 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/
- 381 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:18:31 ]
- ソートがわかるようでわからん・・・
配列に適当に数字おいて、一時的に保管しておく変数用意して、 ループの入れ子ループでカウントアップしつつ、 比較Aと比較Bで片方補完変数にいれてループ抜けて、 親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`
- 382 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:19:34 ]
- ソースうp
- 383 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:03:35 ]
- ダメだ。アスタリスクを見るとポインタに見えてfor無限ループ(;;)を見ると顔文字に見えてしまったり
俺の頭はどうにかしてしまったのだろうか
- 384 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:05:00 ]
- ->も然り
- 385 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:08:42 ]
- 頼むから俺に聞くとき、変数 i を使わないでくれ
印刷したソース逆から見る俺の身にもなってくれ なんでここで否定してんだって何度も思うじゃねえか
- 386 名前:デフォルトの名無しさん [2007/11/16(金) 00:12:28 ]
- プログラムの仕事につくには英語を最低限身につけないといけないんですか?
- 387 名前:デフォルトの名無しさん [2007/11/16(金) 00:15:37 ]
- >>386
最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。 ただ、技術文書は平易な英語で書かれているから、すぐなれると 思うよ。 出世して、英語の契約書読む羽目になるとまた別だが。
- 388 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:19:20 ]
- 完全に読めなくても、だいたいの意味はわからないか?
見たこと無い単語が出てきたら辞書引く程度で間に合うよ。
- 389 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:31:24 ]
- ときどき
printf("")のprintf文をいれなかったらセグメンテーションエラーでて printf文をいれたらセグメンテーションエラー消えることがあるんですけど これはどういうことなんでしょうか?
- 390 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:34:50 ]
- バグです(多分バッファオーバフローの)
- 391 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:47:38 ]
- >>381
ソートもアルゴリズムの分野だけど 理解できないんなら 有名どころのソート(6個くらい) 丸覚えしとけば良いじゃん。 まぁ、バブルソートぐらいは理解しといた ほうが良いとは思うけど。
- 392 名前:392 [2007/11/16(金) 00:49:25 ]
- ある処理の実行時間の測定を次のようにしました。
start = clock(); なんらかの処理 end = clock(); time = (float) (end - start) / CLOCKS_PAR_SEC; pirntf("実行時間%d\n", time); これでtimeを出力すると、 536870912, 2147483648, 1073741824, 1610612736, 0 のうちのどれかの値に-ついたりつかなかったりして、出力されます。 「なんらかの処理」を変えても 上記の値しかでません。 どうしてこうなるのか分かりません。教えてください。
- 393 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:55:20 ]
- >>392
time という変数名がマズイ time が実数型であるにもかかわらず %d で出力している typo がある の全てが原因でしょう
- 394 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 00:58:52 ]
- clock()が返すのはclock_tだが、startとendの型は?
- 395 名前:392 mailto:sage [2007/11/16(金) 01:04:08 ]
- >>393
timeという変数について調べてみます。 %fでしたね@@; ありがとうございました!! >>394 clock_tで宣言しています。 回答ありがとうございます!
- 396 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:18:02 ]
- しかし深夜にならないとプログラム作る気おきないのはなぜなんだろう
- 397 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:14:36 ]
- あるある
- 398 名前:デフォルトの名無しさん [2007/11/16(金) 16:49:36 ]
- 文字列を倍精度に変換する関数strtodにバグがあるようでうまく変換してくれません。
const char* pszInput = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999"; char* pszStop; double dOutput; dOutput = ::strtod(pszInput, &pszStop); ::printf("input:%s\noutput:%f\nstop:%s\n", pszInput, dOutput, pszStop); output:9999999999999999600000000000000000000000000000000000000000000000000000000 000000000.000000 となってしまいます。ERANGEも検出されません。 これはよく知られたバグなのでしょうか?また対策はあるのでしょうか? よろしくお願いします。
- 399 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 16:51:47 ]
- >>398
「有効桁数」でググってきな
- 400 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:12:46 ]
- 9999999999999999999999999999999999999999999999999999999999999999999999999999999999
約 10^83 有効桁数 83 桁の数値を扱うために最低限必要なビット数を x とすると 2^(x-1) < 10^83 < 2^x x = ceil( 83 / log2 ) x = ceil( 83 / 0.301 ) x = 276 1 バイトを 8 ビットとして最低 35 バイトは必要 >>398 が自分で実装するのは無理だろうからライブラリを探した方がいいでしょう
- 401 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:14:01 ]
- >>400 は83桁じゃなくて82桁だった
- 402 名前:デフォルトの名無しさん [2007/11/16(金) 19:18:42 ]
- 質問:C言語の「volatile」の名前の由来について
質問です。 C言語には「volatile」という記号が あります。 これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。 しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。 最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。 つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。 教えてください。よろしくお願い致します。
- 403 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 19:29:20 ]
- volatile 変数は移り気で勝手に変化するから、最適化せずに毎回ちゃんとメモリを読みにいかないと正しい結果を得られない、と考えてはいかが
- 404 名前:デフォルトの名無しさん [2007/11/16(金) 19:31:36 ]
- 快活に計算動作するから
最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い
- 405 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 20:57:33 ]
- 最初に名前を入力させ、5件分の入力が行われるか、endと入力されたら、その分だけ出力させる
ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください 名前は最大15文字入力とする これのやり方を教えてください
- 406 名前:デフォルトの名無しさん [2007/11/16(金) 21:10:12 ]
- 初歩的な質問スミマセン
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char *cp=NULL; void *ptr=NULL; if((ptr=(char*)calloc(10,sizeof(char)))==NULL){ printf("error\n"); exit(EXIT_FAILURE);} if((cp=strchr(fgets(ptr,100,stdin),'\n'))!=NULL){ *cp='\0';} printf("%s",ptr); return EXIT_SUCCESS; } 半角文字10文字分のメモリをcalloc関数で確保して fgets関数で10文字以上入力しましたが 普通10バイト分の配列を用意しfgets関数でそれ以上の文字を入力すると オーバーフローが起き、強制終了しますよね? ですがこれでは起きないんです、何故でしょうか
- 407 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:13:04 ]
- >>402
どっかで勝手に値が変えられる可能性があるから volatile だな。
- 408 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 21:56:34 ]
- >>406
ひーぷに余裕があるからじゃね?
- 409 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:10:54 ]
- >>405
丸投げは宿題スレへ pc11.2ch.net/test/read.cgi/tech/1194262698/l50
- 410 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:12:14 ]
- >>406
>オーバーフローが起き、強制終了しますよね? そうとは限らない 他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある
- 411 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:16:27 ]
- >>409
あっすいませんでした
- 412 名前:デフォルトの名無しさん [2007/11/16(金) 22:17:24 ]
- >>408
あ、そういうことか!! どうもありがとうございました
- 413 名前:デフォルトの名無しさん [2007/11/16(金) 22:37:56 ]
- >>402
「最適化しないだって?」 「ああ、今日はそんな気分なんだ」 「まったく気まぐれな奴だよ」
- 414 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:52:46 ]
- >>402
#define donotoptimize volatile
- 415 名前:デフォルトの名無しさん [2007/11/16(金) 22:56:56 ]
- 違うとおもいますよ。
綿密な計画と設計思想に基づいてボラタイルに したんです。 気まぐれで ボラッたわけでは ありません。
- 416 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:23:58 ]
- なぜmainはmainという名前にしたんだろう、startの方がよくない?と思ったことはあります
- 417 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:25:04 ]
- だったらstopも要ると思わないか
- 418 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:36:50 ]
- 多分main,subで分けて書いたからじゃないかな。
- 419 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 23:46:05 ]
- >>417
関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね >>418 ああなるほど 関係ないけどmain"メソッド"には今でも違和感がある…
- 420 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 01:36:08 ]
- mainメソッド……てJAVA?
- 421 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:07:26 ]
- Cから始めた自分には違和感なかったけど、よくよく考えたら不思議な名前のメソッドだな。
- 422 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:17:27 ]
- mainと言いつつ、主要な処理は他のところでやってるしね。
- 423 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 02:22:01 ]
- 主要な流れ、ということじゃないか?
主要な処理を他でやっていても、 全体通してのメインの流れを定めるのがmain関数 int main(){ first_step(); second_step(); third_step(); return 0; }
- 424 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:51:36 ]
- 構造体のメンバの数って制限あるのですか?
- 425 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:08:36 ]
- そりゃあるだろうが、限界まで使ったこと無いな。
- 426 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 09:18:17 ]
- ハード側の限界にぶつかったことならあるが、規格の限界は知らないな
- 427 名前:デフォルトの名無しさん [2007/11/17(土) 19:17:14 ]
- MFCって何?
- 428 名前:デフォルトの名無しさん [2007/11/17(土) 20:24:04 ]
- >>427
ググれ
- 429 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 20:33:33 ]
- HTMLのform解析をしたいのですが、
<form action="./int.php" method="post"> <input type="text" name="id" value="C"> <input type="submit" name="button" value="押す">actionは./int.php methodはPOST typeはtext、nameはbutton valueはC というように<>内をそれぞれ抽出したいのですが、どのようにしたら出来ますでしょうか?
- 430 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:36:57 ]
- オイラだったら perl でやる。rubyも好いらしい。
- 431 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 22:42:25 ]
- 字句解析はCよりPerlを勉強した方がはるかに楽だよ
- 432 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:01:25 ]
- >402
volatileは「最適化抑制」という意味じゃない。 「値が外的要因(ハードウェアなど)によって変化しうる」という意味。
- 433 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:05:27 ]
- >429
Win系だったらMFCや.NET Framework、UNIX系ならPerlを使ったほうがいいな。 Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。
- 434 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:08:04 ]
- >>429
どっかから正規表現のライブラリ持ってくるのが楽じゃない?
- 435 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:11:01 ]
- HTMLのライブラリだって、探せばありそう。
- 436 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:19:45 ]
- >>435
たとえばWindowsならMSHTMLとかだな。
- 437 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 23:34:44 ]
- レスありがとうございます。
まずはCだけで頑張ってみます。
- 438 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:04:55 ]
- >>と>=で処理する式が違うんですけど、
プログラムを作るとき、どう区別すべきですか?
- 439 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:08:11 ]
- 違うってわかってるんなら、区別できてるってことじゃないか
- 440 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:20:31 ]
- for(;i<10;)
か for(;i<=9;) の違いがわからんってこと?
- 441 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:23:01 ]
- >>は非常に左が大きいだけど
>=は以上ってことだし。
- 442 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:29:57 ]
- if(A>>B) C=A
elseif(B>>A) C=B elseif(A>=B) C=A+1; elseif(B>=A) C=B+1; の条件分岐を作りたいんだけど 区別どうすればいいのかってね。
- 443 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:33:32 ]
- >if(A>>B) C=A
AがBより非常に大きいってことを言いたいのなら、 コンピュータは 「非常に」 なんて曖昧な条件は理解できないので、 どのくらいかを具体的に指示してやらないとだめ。 if (A >= B + 1000) C = A; とか if (A >= B * 10000) C = A; とか。
- 444 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:34:25 ]
- >>>は非常に左が大きいだけど
C言語でそんな比較演算子は無い 単なる大小比較( > )にし問題を書き換えなさい
- 445 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 00:59:48 ]
- きっとビットシフトだ
- 446 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:12:45 ]
- 良くも悪くもコンピュータは正直だから、命令されたことしかやらない。
「〜よりは大きいが常識の範囲内で」とか言われても判断できるわけがない。
- 447 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:37:40 ]
- おれもビットシフトだと思って、何のことだか全然わからんかった。
「非常に左が大きい」て何だよw
- 448 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 07:38:50 ]
- 以前にも同じような質問してきた奴が居たから俺はわかった
- 449 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:23:39 ]
- unsigned A; の下位 B ビット以外が0であることを
判別する関数をつくりなさい。(10点)
- 450 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:30:08 ]
- int f(unsigned A, int B) { return !(A >> B); }
- 451 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:38:36 ]
- bool func(unsigned A, unsigned B) {return A >= (1 << B);}
- 452 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 08:44:45 ]
- 後出しなのに・・・
- 453 名前:デフォルトの名無しさん [2007/11/18(日) 09:15:50 ]
- すみません、まだC初めて一週間足らずの初心者ですが質問させてください。
課題で void printIPAddress( unsigned int address ) { printf("%d.%d.%d.%d", (address & 『 @ 』 ) >> 24, (address & 『 A 』 ) >> 16, (address & 『 B 』 ) >> 8, (address & 『 C 』 )); } ア.0x000000ff イ.0x0000ff00 ウ.0x00ff0000 エ.0xff000000 とありまして、@〜Cにア〜エから適切なものを選択して関数を完成させるというものです。 ネットなどで色々検索して、答はたぶん@:エ A:ウ B:イ C:アじゃないかと思ってるのですが どうしてそれが正解?なのかがわかりません。(そもそも正解かどうかすらわかりません) 考え方としては例えば@:エなら0xff000000は11111111 00000000 00000000 00000000で >>24というのが右に24bit(3byte)移動するという意味なんだろうか?と思ってるんですが 3byte移動したら11111111が一番→にきて後ろについてたたくさんの0は前に行くんでしょうか? それがどうして正解?なんでしょうか?他のもの(例えば0x000000ffとか)が入ってはいけないんでしょうか? &を使ってるという事は論理積を理解できてないとこの問題は理解できないんだと思うのですが 本や解説を見てる時はふんふんなるほどと思っても実際こうやって問題にされると全くわからなくてお手上げです… 長文すみませんがどなたかご教授お願いします。 もしスレチならどこか該当スレに誘導お願いします。 (最初ふらっとCスレに書き込もうとしたら1000スレ達成しちゃってました…)
- 454 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:27:51 ]
- >>453
論理演算とビットシフトでググればわかりそうなもんだが… &はand演算だから、左右どちらも1なら真=1になる。そうでなければ0になる。 例えば、11001100 & 11000000の結果は11000000になる。 これを右に6ビットシフトすれば00000011が得られる。
- 455 名前:デフォルトの名無しさん [2007/11/18(日) 09:38:37 ]
- アドレスは、
11100010 上位ビット 01100011 00100100 11011100 下位ビット のように格納されている 0ビットシフトさせてff = 11111111とand取れば下位ビットが出てくる 8ビットシフトさせてff = 11111111とand取れば下から二つ目が出てくる
- 456 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:42:04 ]
- >>452
インライン展開するときに、Bが定数なら>451の方が効率がよくなる。
- 457 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 09:49:08 ]
- 効率とか言うレベルじゃなくて、単純に間違ってるだけだろw
- 458 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 10:03:48 ]
- 11000000 10101000 00000001 00000001 (3232235777 = 192.168.101.1)
11111111 00000000 00000000 00000000 (4278190080 = 0xff000000) ---------------------------------- 11000000 00000000 00000000 00000000 (3221225472 = and後) 00000000 00000000 00000000 11000000 (192 = 24ビット右シフト後) ビットシフトした後には0が入る。つまり1ビットシフトはx2か/2と同等。 これで理解できなければ諦めてくれ。
- 459 名前:453 mailto:sage [2007/11/18(日) 11:44:35 ]
- なるほどっ!
すごくわかりやすい解説ありがとうございます。 ビットシフト自体は皆さんのご説明ですぐに理解できたのですが 「だからどうして@:エ、A:ウ・・・・・になるの?」というところが なかなか理解できずレスに時間かかりました>< ただ少しばかり>>458さんに確認も含めた質問があるのですが もしご覧になってたらお時間あればレスいただけませんか? 一行目の(192.168,101.1)というIPアドレスが最初はどこから出てきたのかさっぱり???だったのですが これはわかりやすく例をあげるために適当?に書いてくれたのかな?と解釈しました。それでよろしいでしょうか? あと、同じくカッコの中の3232235777や4278190080、3221225472という数字がイマイチピンとこないのですが これはそれぞれ110000001010100000000010000001という2進法の数値を10進法で現してるものでしょうか? (ググレ!でしたらすみません・・・ビット換算表はぐぐって今見てるのですが数字が大きすぎて・・・orz) 結局、最初の質問であった「どうして@:エA:ウ・・・になるのか?」という質問についてはやっと理解できました。 みなさんご親切にどうもありがとうございました^^
- 460 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:08:51 ]
- >>459
ああ、スマン間違ってる。458の2進数表記だと192.168.1.1になるね。 IPアドレス自体は例として適当に書いただけ。 数字の部分は1バイトずつにそれぞれ192、168、1、1と当てはめたものを 4バイトのunsigned int型変数addressの10進数として表現したもの。 ちなみにこの処理は欲しい部分を切り取るのによく使われる方法で「マスク」等と呼ばれたりする。 まあ頑張ってや〜。
- 461 名前:デフォルトの名無しさん [2007/11/18(日) 12:51:48 ]
- C言語によるリスト構造について質問させてください。
連結リストに末尾からデータを蓄えて指定した数字を削除し 削除後のリストを画面に表示するプログラムを作りたいのですが、 手元にある参考書を見たり、ネットで調べても分らなかったので どなたかご教授お願いします。
- 462 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:58:05 ]
- www.google.co.jp/search?q=%E3%81%94%E6%95%99%E6%8E%88
ネットで調べてわからなかったらここで聞いてもわからないんじゃない? まずは指定した数字が何番目にあるか判定するプログラムを作ってみて、 それができたら一つ前のデータと一つ後ろのデータを連結するように書いてみればいいんじゃない? 宿題スレにいって丸投げするのが一番早いと思うけど。
- 463 名前:デフォルトの名無しさん [2007/11/18(日) 13:04:03 ]
- >>462
ありがとうございます。宿題スレいってみます。
- 464 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:18:47 ]
- www.uploda.org/uporg1118116.txt.html
こういうプログラムを作ったのですが これに「平均点順に並び替えて表示する」という操作を加えたいのですがよくわかりません。 お願いします。
- 465 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 17:31:47 ]
- >>464
そのプログラムを自分で作れるなら出来ると思うけな
- 466 名前:459 mailto:sage [2007/11/18(日) 17:32:31 ]
- >>460さん、レスありがとうございました^^
マスクという処理方法については 名前だけ知ってたものの具体的にどういうものかまだ知りませんでした。 数字についてはまだピンときてないので引き続き2進数10進数16進数についても色々勉強してみます。 また何かわからない事ありましたら皆さんよろしくお願いします!
- 467 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:05:59 ]
- >>465
よくわからないでございます
- 468 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:10:51 ]
- >>467
普通のソートと同じ
- 469 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:12:50 ]
- そうなの?
ちょっとやってみる。thx
- 470 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:40:46 ]
- n番目のcellのポインタを呼び出す関数(*cell getcell(n)とか)でも作って、
バブルソートで比較しては入れ替えを繰り返せばいいんじゃないか。 for(i=0;i<MAX-1;i++)for(j=0;j<i;j++){ x=getcell(j); y=getcell(j+1); if(x->heikin > y->heikin){xとyの入れ替え} } cellごと入れ替えるにはもう一個前にもアクセスせんといかんから、 cell内の値だけ入れ替えるのが楽なのかなぁ。
- 471 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 18:46:08 ]
- その変数がnanかそうでないかを判断するにはどうすればいいですか?
- 472 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 19:24:18 ]
- 有名なイディオムx != x(IEEE 754なら確実;あほなコンパイラでない限り)
C99のisnan 一部の独自関数_isnan
- 473 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 21:18:54 ]
- NGワード:ご教授
- 474 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 16:36:19 ]
- ANSI-Cについて質問です。
#include <stdio.h> int main(int argc, char *argv[]) { int x = 10; printf("x=%d¥n", x); char *s = "foo"; /** should be error? **/ printf("s=%s¥n", s); return 0; } というコードを gcc -Wall -ansi hoge.c としてコンパイルすると何のエラーもなくコンパイルできてしまったんですけど、 Cでは文のあとに変数宣言できましたっけ?できなかったと思うのですが。 今までダミーのブロックを使ってたけど、いらないということでしょうか。 なおGCCは4.0.1です。
- 475 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 16:46:34 ]
- >>474
従来のCではダメ C99ならOK
- 476 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 17:21:09 ]
- >>475
なるほど!さんくす ちなみによく知られているコンパイラのうち、C99に対応していないものはありますか。 変数宣言が先頭じゃなくていいのは大変便利なのでぜひ使いたいんですけど、世の中の対応状況次第ではやめとこうと思います。 調べてみたらGCCはver3から対応しているみたいでした。今のGCCはver4が主流だと思うので、GCCは大丈夫ですね。
- 477 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:20:14 ]
- 途中宣言はキモイから使いたくないな。
- 478 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:24:47 ]
- 途中宣言ってわけわからなくなったりしないのかな?
- 479 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:32:23 ]
- >>476
Visual C++は対応していない。 世間一般ではGCCのようなC99に対応しているCコンパイラのほうが珍しい。 ブロック途中での変数宣言はC++だと当然の機能なんだけどね。
- 480 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:41:20 ]
- 自己参照構造体がイミフ
最初に用意したポインタの示す値をNULL(ストッパーの役割)にして んで次に用意したポインタの示す構造体の内部の自己参照ポインタには、その直前にあった構造体のアドレスを代入して。 繰り返すごとにどんどん構造体が繋がるってのはわかるんだけど、 例えば先頭から10個目の構造体内部を書き換えたい!って場合はどうすりゃいいの? 予め10個目ってわかるように変数で振っとけばいいの?
- 481 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 19:45:40 ]
- >>480
構造体を先頭から辿るときに、いま何個目かわかるように、その辿った回数を数えとけばいい
|

|