1 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:14:52 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 14 pc11.2ch.net/test/read.cgi/tech/1181735298/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 91代目 pc11.2ch.net/test/read.cgi/tech/1182607405/
520 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:16:43 ] そもそも1バイト=8ビットと決まってるわけじゃねーし。 厳密に8ビットというなら1オクテットと表現すべき。
521 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:20:50 ] じゃ1バイト=9bitなんていういかれた環境があるのかよ! と思っていた時期が私にもありました 本当にあったんだね
522 名前:511 [2007/07/02(月) 21:21:02 ] サンクスです ですが、どうして128 * 8 して出すのかが 納得できません。。。
523 名前:511 [2007/07/02(月) 21:21:52 ] なんとなくわかりました サンクスでした
524 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:30:20 ] なんとなくかよw じゃあ君が大好きなタコを例にして分かりやすく解説しよう。 「タコには足が8本あります。ここにタコが128匹います。全部で足は何本でしょう?」 タコ→バイト、足→ビット、に置き換えるとあら不思議。
525 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:34:05 ] 128匹のタコ全部が足8本だとは限らないだろ
526 名前:390 mailto:sage [2007/07/02(月) 22:45:49 ] #include <stdio.h> main() { int a; float b; for(a=0; a<=100; a++) printf("セ氏温度:%d カ氏温度:%.2f\n",a ,fahrenheit(a,b)); } int fahrenheit(int x,int y) { y = (float)(9/5)*x+32; return y; } セ氏温度0〜100℃に対してカ氏温度を出したいのですが 出力の際、カ氏温度が0.00になってしまします。 間違っているところの指摘をお願いします。
527 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:46:43 ] 例の一匹の足の1本はすでに俺は食べた
528 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:50:20 ] >>526 fahrenheit()の第2引数はint型なのにfloat型のbを渡している fahrenheit()の戻り値の型はint型なのに%.2fを指定している
529 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:53:38 ] もうひとつ。どっちにしろint型で返すことになってるが、 y = (float)(9/5)*x+32; は意図したのと違くなっていると思う
530 名前:526 mailto:sage [2007/07/02(月) 23:04:50 ] >>fahrenheit()の戻り値の型はint型なのに この部分はどう直せばいいのですか?
531 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:08:52 ] 戻り値をfloatに変えるとか、%dに変えるとか
532 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:19:45 ] struct abc{ char a; } main() { char b, c; c = ((struct abc)b).a; c = ((struct abc *)b)->a; } c = ((struct abc)b).a;がダメで c = ((struct abc *)b)->a;が良い理屈を教えて下さい。
533 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:22:10 ] >>532 それって良いのか? コンパイルは通るだろうが、実行したら間違いなくSegmentFaultだぞ
534 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:22:17 ] ((struct abc *)b)->a; は偶然うまく動くかもしれないが、よくない。
535 名前:526 mailto:sage [2007/07/02(月) 23:23:06 ] エラーで「初期化されていないローカル変数"b"が使用されます」 と出るのですがこれが原因ですか?
536 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:24:31 ] >>533 aのoffsetが0ならうまく動くだろ。
537 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:25:19 ] >>532 (struct abc *)b はbで示される何らかの値をstruct abc のポインタに変換している で b の値はポインタか? どっちもよろしくない
538 名前:536 mailto:sage [2007/07/02(月) 23:29:11 ] てっきり、&bかと思ってたわ・・・
539 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:34:58 ] >>535 a はfor文で値が入るが b には初期かも代入もされていない b に値を入れろ
540 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:38:15 ] >>536 c = ((struct abc *)&b)->a; なら、aのoffsetが0ならうまく動くかも知れん。 が、>>532 はそうはなっていないので間違いなく保護違反
541 名前:532 mailto:sage [2007/07/02(月) 23:58:38 ] ほんと、すいません。 c = ((struct abc *)&b)->a; でした。
542 名前:535 mailto:sage [2007/07/02(月) 23:58:55 ] >>539 bに値を入れたら結果が変わりませんか?
543 名前:532 mailto:sage [2007/07/03(火) 00:04:41 ] 素人目にはc = ((struct abc)b).a;でも 問題ないように思えるのですが、 なにがダメなのでしょうか。
544 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:09:44 ] そう思えるから素人なんです。
545 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:52:50 ] すげえ正論だが質問の答えにはなってないな
546 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:55:00 ] >>543 何でって言われても、言語仕様でそのようなキャストは認められていないから、としか。
547 名前:511 [2007/07/03(火) 00:56:08 ] >>524 8~128でしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:13 ] タコ釣りか?
549 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:38 ] ~ ってなんだよ
550 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:59:48 ] ティルデ
551 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:03:41 ] ニョロ
552 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:05:08 ] 0 1ビット 01 2ビット 010 3ビット 0101 4ビット 01010 5ビット 010101 6ビット 0101010 7ビット 01010101 1バイト
553 名前:デフォルトの名無しさん [2007/07/03(火) 01:08:27 ] >>547 例題がタコだからといって、演算子までタコにするのはやめような。
554 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:10:35 ] いつか 1byte != 1octet の時代は来るのだろうかー・・・
555 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:11:49 ] ヽ (゚o゚)∫ ノ川ル
556 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:12:40 ] >>554 1byte == 1octet の時代なんて一度も来た事がないんだが。
557 名前:デフォルトの名無しさん [2007/07/03(火) 01:21:37 ] まだC言語とかやってたんだ。 懐かしいなー
558 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 02:01:19 ] 今でも、36ビットワードマシンとかでは1バイト=9ビットだね UTF−9とかもあるし
559 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 02:04:28 ] UTF-9 はエイプリルフールのネタじゃなかったっけ?
560 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 07:16:54 ] scanfやfgetsで文字を入れて 文字列を比較する場合、どうすればいいんでしょうか? char* str; fgets(str,100,stdin); if(str=="start"){ なんとかかんとか; } これ、うまく動かないんですが
561 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 07:18:20 ] strcmp
562 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 07:33:18 ] >>560 1. str の指す領域を確保する 2. 文字列の比較には strcmp を使う 3. 比較する文字列を "start\n" にする
563 名前:526 mailto:sage [2007/07/03(火) 08:27:43 ] #include <stdio.h> main() { int a; int b=0; for(a=0; a<=100; a++) printf("セ氏温度:%d カ氏温度:%d\n",a ,fahrenheit(a,b)); } int fahrenheit(int x, int y) { y = (9/5)*x+32; return y; } 誰かこのプログラムをカ氏温度が小数点まで 出力されるように改ざんしてください;
564 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:29:25 ] >>563 double型の変数でも使えばええやん・・・
565 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:48:21 ] #include <stdio.h> #include <stdlib.h> #include <string.h> struct list{ char *name; struct list* next; }; int main(void){ struct list *head,*ume; char *str; head=NULL; str=(char*)malloc(100*sizeof(char)); printf("名前を入力(endで終了)>"); fgets(str,100,stdin); while(strcmp(str,"end\n")!=0){ ume=(struct list*)malloc(sizeof(struct list)); ume->name=str; ume->next=head; head=ume; printf("名前を入力(endで終了)>"); fgets(str,100,stdin); } printf("%s%p\n",head->name,head); return 0; } リスト構造体のテストやってみたんですが これ実行して、taro、hanako、endと入力したら endが表示されるんだけどどこがおかしいんですかね? endと入力した時点でwhileから抜け出し、head->nameがendになると思えないんですが・・・
566 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:54:24 ] >>565 > head->nameがend ume->next=head; head=ume; ↑そりゃなるだろw
567 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:05:44 ] >>565 おかしいっていうのは、期待した動作と違うって事だろうけど 何をしたいのか分からんのに、答えられるわけ無いだろ
568 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:16:49 ] >>565 エスパー回答 #include <stdio.h> #include <stdlib.h> #include <string.h> struct list{ char *name; struct list *next; }; int main(void){ struct list *head, *ume; char *str; head = NULL; str = (char *) malloc(100 * sizeof(char)); for(;;){ printf("名前を入力(endで終了)>"); fgets(str, 100, stdin); if(strcmp(str, "end\n") == 0) break; ume = (struct list *) malloc(sizeof(struct list)); ume->name = strdup(str); ume->next = head; head = ume; } ume=head; while(ume!=NULL){ printf("%s", ume->name); ume=ume->next; } return 0; }
569 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:21:00 ] >565 ume->nameは常にstrを指していて、最後にendになってんだから当たり前だろ。
570 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:45:41 ] >>565 まあ大体察しはつくが・・・ 「おかしい」って言う以前に、どういう動作を期待しているのかちゃんと書こうな
571 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:54:45 ] どのくらいの変数が必要なのかよくわからないときは とりあえず多めに変数宣言用意しておいてもいい? int i,j,k,l; double a,b,c,d,e; char f[1000],g[1000],e[1000]; とか・・・ 変数○○は使われていませんって警告がでるけど 多くしたら実行速度下がるとかエラーでるとかこまったことがおきるとかありますか?
572 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 09:54:56 ] struct list{ char *name; < いっ、いいんかい? struct list *next; };
573 名前:デフォルトの名無しさん [2007/07/03(火) 09:59:25 ] 571 困ったことが起こるよ new だといい
574 名前:デフォルトの名無しさん [2007/07/03(火) 10:02:14 ] 571 使ったことないけど std::vector, std::string がいいみたいだよ
575 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:08:31 ] C++とSTLの世界へご招待〜
576 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:14:18 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。
577 名前:デフォルトの名無しさん [2007/07/03(火) 10:16:25 ] 576 C言語専用の環境使っているやつがいるか?
578 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:21:31 ] そりゃいるでしょ
579 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 10:25:00 ] >>571 一応ありはありだが ・万一配列のサイズを超えたときにそれをはじくようなチェックを入れておく。 ・スタックにあまり大きな配列を取らない(char *f, *g, *eにして領域をmallocする)。 あたりは注意しておいたほうがいい。 速度はメモリ浪費でスワップしない限りさほど落ちない。
580 名前:デフォルトの名無しさん [2007/07/03(火) 10:30:04 ] 今日はじめてSTLググってみたけど、これは使うべきだな 初心者こそ使うべきだな コーディングが楽になるな
581 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:45:36 ] charの配列の[0]から[3]の4バイトにデータがあります。 これを一つのintの変数に入れたいのですが、どうやればいいですか?
582 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:48:29 ] >>581 過去ログを読む気がないのなら、やりたいことを具体的に書け。 どんなデータをどう入れたいのか判らんことには答えようがない。
583 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:48:39 ] *(int*)配列名
584 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:49:50 ] >>583 バスエラーの可能性ががが
585 名前:デフォルトの名無しさん [2007/07/03(火) 11:55:18 ] c[0]+(c[1]<<8)+(c[2]<<16)+(c[3]<<24)
586 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:56:39 ] union使うとか
587 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 11:57:53 ] >584 配列の0から3でもバスエラーって発生するもんなの?
588 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:00:28 ] >>587 char配列がint安全な場所に作られる保証はない。 その点ではunionの方がまし。 しかし、unionには言語仕様的に実装依存の罠が。 そういう意味では>585でいいのだがエンディアンの問題が残る。 まぁ、最近のコンパイラならどれで書いても同じようなコードを吐くしね。
589 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:11:23 ] >>588 そういやこういう場合かもしれんしな。 #include <stdio.h> #include <stddef.h> int main() { struct A { char a; char b[4]; }; printf("%ld\n", offsetof(struct A, b)); }
590 名前:581 mailto:sage [2007/07/03(火) 12:30:43 ] >>583 一番簡潔なのですがかなり難解です。これから考えます。 >>585 一番分かり易いです。 unionの使い方に悩みましたがcharの配列と一つのintのメンバ変数を用意して charの配列にデータを入れてintのメンバ変数でアクセスすればいいのですね。面白い。
591 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 12:36:02 ] GCC で試した所、 -O (最適化レベル1か、それ以上) -funroll-loops (ループ展開最適化) フラグを立てると >>585 みたいなコードを吐いてくれるみたいだ。 int toInt(const char* ch) { union { char ch[sizeof (int)]; int i; } endian; int i; int shift, dshift; int n = 0; endian.i = 0; shift = *endian.ch ? 0 : (sizeof (int) - 1) * CHAR_BIT; dshift = *endian.ch ? CHAR_BIT : -CHAR_BIT; for(i = 0; i < sizeof (int); i++) { n |= ch[i] << shift; shift += dshift; } return n; }
592 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:59:59 ] 最近、関数のメモリの場所をポインタで取得できることを知ったのですが、 これを利用してデリゲートまがいなことってできませんかね?
593 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 15:00:37 ] qsort() とか使ったことない?
594 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 15:41:43 ] int a, b; があって両者の絶対値の大きさを比較したいとき 自乗した値を比較するのとabs()を使うのではどちらが速いのでしょう? 自乗してもintの範囲を超えないことは保証されているという前提で。 またこういったベンチマークテストはどうやって行うのでしょう?
595 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:02:53 ] 数百万回〜数億回くらい実行して、速度を比較する。
596 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:15:19 ] >>594 こんなコードを書いてみる。 #include <stdio.h> #include <stdlib.h> int main() { volatile int a; volatile int b; for (int ic = 0; ic < 100 * 1000 * 1000; ++ic) { #if 1 volatile int c = abs(a) > abs(b); #else volatile int c = a * a > b * b; #endif } return 0; } こいつをこんな感じで実行してみる。 $ gcc foo.c -std=c99 -O3 ; time ./a foo.c: In function `main': foo.c:11: warning: unused variable `c' real 0m0.734s user 0m0.687s sys 0m0.047s 意外にも、abs()の方が遅かった。
597 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:18:21 ] abs は条件判定が必要だからな。
598 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:34:10 ] あー、volatile宣言のお蔭で、参照回数の影響も出ちゃった。 よって一部訂正。 #if 0 int aa = a; int bb = b; volatile int c = abs(aa) > abs(bb); #else int aa = a; int bb = b; volatile int c = aa * aa > bb * bb; #endif 今回は大勢に影響はなかったけど。 で、ついでに-Sでアセンブリ出力を眺める。二乗版はこんだけ。 movl -4(%ebp), %eax movl -8(%ebp), %edx imull %eax, %eax imull %edx, %edx cmpl %edx, %eax setg %dl movb %dl, -9(%ebp) abs()版はどうしても条件分岐しないためにビット操作であれこれ捻り過ぎ。 movl -8(%ebp), %edx movl -12(%ebp), %eax movl %edx, %ecx sarl $31, %ecx xorl %ecx, %edx subl %ecx, %edx movl %eax, %ecx sarl $31, %ecx xorl %ecx, %eax subl %ecx, %eax cmpl %eax, %edx setg %dl movb %dl, -13(%ebp)
599 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:50:59 ] バイナリーサーチというものをやる場合 データが小さい順もしくは大きい順に並んでなかったらできない? つまりめちゃくちゃなデーターがあったら一旦それをバブルソートなどで整列させないとダメってことですか?
600 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:51:52 ] そう。
601 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:52:21 ] わざわざバブルソートを選択する理由も無いけどな
602 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:52:46 ] >>599 その通りです バブルソートである必要はありませんが…
603 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:00:04 ] バブルソート突っ込まれ過ぎワロタ
604 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 17:19:51 ] >>599 揃っているからこそのバイナリサーチじゃないか。 って、仕組み見たら一目瞭然だと思うが・・・・・ で、バブルソートである意味はない。 でも、ふと思ったのは、必要なものをすべて見つける必要はなくて 一つ見つければいいというのであれば、動的に必要な部分だけ ソートしながら利用するっていう使い方もあるのかな、と思った。 レイトバインディングのように、対象要素が大きくて ソートの初期化コストが大きかったり頻繁に要素が追加されるという状況で使えないかな? それともそういう場合はB-Treeとかを使っておくべき?(追加のコストによるのかな?)
605 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:08:21 ] #include いろいろ struct list{ int data; struct list *next; }; void showlist(); int main(void){ int indata,i,j; struct list *head,*test; head=NULL; while(1){ printf("数を入力(終了は0)>");scanf("%d",&indata); if(indata==0) break; test=(struct list*)malloc(sizeof(struct list)); test->data=indata; test->next=head; head=test; } showlist(); return 0; } void showlist(){ struct list *now; while (now!=NULL){ printf("%d ",now->data); now=now->next; } }; 構造ポインタで次々入力しshowlistで表示するというのを作ったんだけど これ実行したら、mainのreturn 0の上のshowlistがプロトタイプ宣言が無いと警告でるんですがどうしたらいいですか?
606 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:25:05 ] void showlist(void); ↑型を入れる
607 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:14:24 ] #include <stdio.h> void inputdata(int data[],int n); int main(void){ int x[10]; inputdata(x,10); return 0; } void inputdata(int data[],int n){//inputdata関数 int i; for(i=0;i<n;i++){ printf("Input data>"); scanf("%d",&data[i]); } for(i=0;i<n;i++){ printf("data[%d]=%d",i,*data[i]); } } C言語について質問です 配列x[0]〜x[9]のそれぞれに値を入れて表示するというinputdata関数を作ってみたいんですが これ動きません。どのように関数を直せばよいのでしょうか?
608 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:19:42 ] int *data[]
609 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:34:33 ] printf("data[%d]=%d",i,*data[i]); ↓ printf("data[%d]=%d",i,data[i]);
610 名前:デフォルトの名無しさん [2007/07/03(火) 20:55:02 ] 2^8は65,536でしょうか?
611 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:58:26 ] それくらいぐぐれよ www.google.co.jp/search?q=2%5E8
612 名前:デフォルトの名無しさん [2007/07/03(火) 21:09:46 ] さんkyさう
613 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:15:15 ] つーかプログラミング勉強してる奴が電卓の使い方も(その存在も?)和歌ランとは・・・
614 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:19:11 ] 小学生なんだろ。
615 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:47:58 ] 2^8 = 16^2 = 0xFF
616 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:52:29 ] 二次元配列で構造体を使って その中身の計算に 違う二次元配列の中身を用いないといけないんだけど すげーキレそう
617 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:57:59 ] ゆとりは相変わらずキレやすいな。
618 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:03:50 ] トイレに行くと血が・・・ orz
619 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:04:52 ] >>618 今日あの日だろ
620 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:14:14 ] >>618 肛門様を大事に