1 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 20:41:54 ] C言語の*入門者*向け解説スレッドです。 初心者、初級者の方は他の質問スレのほうが良いかもしれません。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 130代目 pc12.2ch.net/test/read.cgi/tech/1250204272/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 53 pc12.2ch.net/test/read.cgi/tech/1253110182/ 過去スレ 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
655 名前:デフォルトの名無しさん [2009/10/21(水) 16:35:17 ] 分かったようで分からないようではっきりしませんが、つまり int *ip = &i; は置き換えると int *ip ip = &i; ですか。
656 名前:デフォルトの名無しさん [2009/10/21(水) 16:36:36 ] もしかしたらスレ違いかもしれませんが質問させてください。 C言語を始めたばかりの初心者です。 LSI C-86 Ver3.30c 試食版というものを使っています。 コンパイルをして、コードをコマンドプロンプトで表示させると、 日本語が文字化けしてしまいます。 コンパイルもできているし、アルファベットや数字はきちんと出るのですが……。 どうすれば日本語が表示できるようになるのでしょうか? ぐぐってもよく判らなかったため、質問させていただきました。 どうかよろしくお願いします。
657 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:37:32 ] >>656 悪いことは言わないから、そのコンパイラは捨てなさい。 それはもう、10年以上も前のパソコン通信時代の代物だ。
658 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:43:00 ] >>655 です。
659 名前:デフォルトの名無しさん [2009/10/21(水) 16:48:58 ] >>658 ありがとう。あやうく誤解するところでした。。
660 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:50:22 ] >>656 文字コード体系が違う。 以前の Windows では CP-932 が使われていたが、 最近は UTF-16LE に変わってきている。 古いソフトなどを使うと、それらが混在するので文字化けすることがある。 ソースコードと表示系の文字コードを同じものに揃えれば問題ない。
661 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 16:57:50 ] 個人的には Turbo-C 2.01 がオススメ。 軽量・高速で使いやすく、変な制限もない。
662 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:01:08 ] >>657 >10年以上も前のパソコン通信時代 20年前ですw
663 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:04:55 ] 16ビットのコンパイラはおすすめ出来ません。 32ビットよりも難しいです。
664 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:16:27 ] selectでSleepの代わりに出来ない?
665 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:30:56 ] >>664 できなくはありませんが、厳密には違う動作です。POSIXならusleep()という選択肢もありますが。
666 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:41:34 ] UTF16でもコンパイラ通るの? エラー出るだろ?
667 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 17:42:13 ] そりゃ環境による
668 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:10:15 ] 文字列をセットする関数を作りたいのですが、どうすればいいですか? 下のソースは間違ってますが、 やりたいことは、値によって、aaa、bbbを出力したいのです。 コンパイラに依存しない?標準のC言語の範囲でお願いします。 void hoge(){ char s[256]; setText(0,s); printf("%s\n",s); // aaa を出力したい settext(1,s); printf("%s\n",s); // bbb を出力したい } void setText(int n , char *str){ if (n == 0) { strcpy(str,"aaa"); }else{ strcpy(str,"bbb"); } }
669 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:13:39 ] それで良いじゃん。
670 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:14:37 ] >>668 setTextがsettextになってる以外は別に間違ってないぞ 先頭に #include <stdio.h> void hoge(); void setText(int n , char *str); int main(){ hoge(); return 0; } を付ければ問題なく動く
671 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 20:32:14 ] >>669-670 これでよかったんですね。 どうもありがとう。
672 名前:656 [2009/10/21(水) 22:15:16 ] みなさま本当にありがとうございます……。 コンパイラが古いのですね。 Turbo-C 2.01というものをダウンロードしてみることにします。 本当にありがとうございました。
673 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 22:31:22 ] せっかくMicrosoftがVisualStudioを無料で配布してるのに、なんで初心者は使わないんだ? BCCとかLSI-Cよりよっぽど使いやすいのに。 どうしてもコマンドラインがいいっていうんならLinux入れてgcc使うべき。
674 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 22:33:58 ] mingwでいいよ.古いけど
675 名前:デフォルトの名無しさん mailto:sage [2009/10/21(水) 23:55:53 ] Cマシンとかいう奴を使え。
676 名前:デフォルトの名無しさん [2009/10/22(木) 00:02:31 ] つーマシン作れよ
677 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:03:34 ] VisualStudioはごちゃごちゃしてるからだよ 分厚い、単なる取扱説明書みたいなものが本屋に溢れてる
678 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:12:01 ] VCはC++標準への準拠度は低いし Cライブラリがグローバル名前空間を汚染してるし 勉強には向いてないよ。
679 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:12:33 ] つーか、学習段階なら日本語周りは後回しにしたほうが良いんじゃね。 とりあえず ASCII 文字だけで一通りやってみたら?
680 名前:デフォルトの名無しさん [2009/10/22(木) 00:14:55 ] C言語の学習にはBCC+cpadが理想的
681 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 00:19:08 ] お手軽ではあるが、理想的ではない
682 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:15:22 ] 関数の引数に構造体を渡す場合に値を書き換えない場合は値渡しにするのが一般的ですか。ポインタ渡しの方がデータのコピー量が少ないのでどっちがいいのか悩みます。
683 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:22:26 ] ポインタ渡ししましょう。
684 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:34:44 ] 好きな方にすれば良いよ。
685 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 01:43:45 ] >682 foo_t foo(const struct foo *foo); 最後のfooは、foo()の名前(シンボルへのポインタ)を関数のスコープで別の型のシンボルfooで上書きしているから、barの方がいいか。 まぁ、なんだ、const修飾しとけと言いたかったんだ。
686 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 02:59:51 ] >>685 つまりなんだ、関数名と構造体名と変数名は同時におなじものを使えるが、いまいちよくないということか
687 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:14:28 ] 構造体のタグは名前空間が違うからどうでもいいよ
688 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:20:18 ] >687 そんなことはわかっているんだよ 関数名と変数が同じ名前だから、再帰呼び出しや関数ポインタが使えないと言っているわけで。
689 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:22:01 ] >>688 おまえへのレスじゃねえよアホが
690 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 03:25:10 ] 粘着するつもりは無いが、 >688の変数というと語弊があるので、s/変数/仮引数/としておく。 まぁ、そうはいっても関数スコープのちょっと上で宣言された変数なんだけどね。 スタックですね、わかります。
691 名前:686 mailto:sage [2009/10/22(木) 03:29:00 ] >>687 なるほど。ありがとう ちなみにtypedefしちゃうとだめだよね? >>688 あぁー、そういう弊害が出てくるんですね。為になります。
692 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 04:39:15 ] func(&kouzoutai); const付けたとしてもこの関数呼び出しの後でkouzoutaiのメンバが書き換わるのかどうかわからないすよね。 func(kouzoutai); だったら書き換わらないことがわかるけど。 キャストすればいいのかな。。
693 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 06:26:12 ] funcのシグネチャによるだろ
694 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:31:59 ] >const付けたとしてもこの関数呼び出しの後でkouzoutaiのメンバが書き換わるのかどうかわからないすよね。 「呼び出しの後」が呼び出した関数内の話なら自己責任だろ。 「呼び出しの後」が呼び出した先の呼ばれた関数内の話ならその関数の宣言でconstポインタなら書き換わらないだろ。
695 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 10:48:08 ] あえてconstをはがさない限りは変えられないんじゃないの?
696 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:13:14 ] func() { Kouzoutai kouzoutai; kouzoutai.member = 100; //func()では書き換えたい func2(&kouzoutai); //func2()では書き換えたくない。関数呼び出しからそれを明記できないか。 }
697 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:18:59 ] >>696 void func2(const Kouzoutai * parameter); func2()自体が書き換え可能なのだとしたら、呼び出すこと自体が無茶。
698 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:23:49 ] func() { Kouzoutai kouzoutai; const Kouzoutai *kouzoutai_constptr = &kouzoutai; kouzoutai.member = 100; func2(kouzoutai_constptr); }
699 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 12:38:38 ] C++でも func(const T &in, const T &in2, T *out) //定義 func(in, in2, &out) //呼び出し みたいにして、呼び出しの記述を見て関数内で変更されうることが類推しやすくしたりするね そういう意味では func2((const Kouzoutai *)&kouzoutai) でいいのかも知れんが、全部それやらないと本末転倒
700 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:11:12 ] 値渡しでいいだろ。速度も落ちねえよ。
701 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 13:38:47 ] なんでそんな無茶を言い出すの
702 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 15:14:48 ] 無茶ではない。 値渡しこそ正義。
703 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 17:42:25 ] 参照渡しがいいの!
704 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 17:54:44 ] 値渡しだろ
705 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 18:01:02 ] 間を取って、コピーしたもののアドレスを渡す、でどうか
706 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 18:08:33 ] とるなし
707 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 21:47:21 ] fuck()
708 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 21:52:38 ] >>698 なるほど。天才ですね。
709 名前:デフォルトの名無しさん mailto:sage [2009/10/22(木) 22:09:02 ] よく言われる
710 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 01:34:00 ] いつも神様って呼ばれてる。天才と言われることは滅多にない
711 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 10:56:55 ] いつも旧神って呼ばれてる。ノーデンスと言われることは滅多にない
712 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 12:15:02 ] 神様にもいろいろいるしね 貧乏神や疫病神でないことを祈る
713 名前:デフォルトの名無しさん mailto:sage [2009/10/23(金) 12:30:38 ] 死神だろ。
714 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 10:26:40 ] func() { Kouzoutai kouzoutai; kouzoutai.member = 100; //func()では書き換えたい func2(&kouzoutai); //func2()では書き換えたくない。関数呼び出しからそれを明記できないか。 kouzoutai.member = 100; //func()では書き換えたいんだってば }
715 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 10:40:45 ] func2(kouzoutai); //func2()で書き換えても平気。値渡しだから。call by valueだから。
716 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 13:21:32 ] return fuck(you);
717 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 15:36:03 ] メイン関数でポインタを宣言し、関数Aに引数でポインタを渡し動的にメモリを確保するとともにデータをセット 次に関数Bでそのデータを処理、みたいな事をしたいのですがうまくいきません。 どうも関数Aで確保したメモリがmainに戻ってくると解放されているようす・・・なにか方法はないですか? void main(void) { char *p; 関数A(p); 関数B(p); } void 関数A(char *p) { //ここで*pに動的メモリを割り当て&データセット } void 関数B(char *p) { //*pのデータを処理 }
718 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 15:39:29 ] 動的にメモリを割り当てられてないんでしょ。
719 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 15:41:22 ] >>717 void 関数A(char **p) じゃないと p@main が書き換わらないよ
720 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 15:45:57 ] そしてmain内では 関数A(&p); にする 普通の変数を関数内で書き換えるときと同じ。
721 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 16:05:42 ] こうしろ。 void main(void) { char *p; p = 関数A(); 関数B(p); } char *関数A(void) { //ここで動的メモリを割り当て&データセット } void 関数B(char *p) { //*pのデータを処理 }
722 名前:717 mailto:sage [2009/10/24(土) 16:14:34 ] ありがと書き換えてみるわ
723 名前:toya mailto:age [2009/10/24(土) 17:01:57 ] >>503 よろしくおねがいいたします。
724 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 17:28:44 ] >>723 インデントを説明するための例なので、内容については説明しません int foo(){return 0;} int bar(){return 0;} int main(){int a,b;for(a=0;a!=5;a++){b=((b+a)*b+a)/a;foo();bar();}return 0;} せめてバグがない物を提示しないか
725 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 17:29:59 ] 上のプログラムはコンパイラに掛けると、エラーはなく実行できるコードを返してくれます。 と続いてるわけだし。
726 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 18:07:45 ] >723 多くの人によって編集されていくと、スタイルがバラバラになる可能性があるので、 最低限は決めておいた方がいいと思う。 また、説明などに使う用語やどの規格に準拠して書くかなども。 これ以上はスレチなので、新しくスレを立ててからお願いします。
727 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 04:03:48 ] free() や fclose() に NULL を渡したらどうなりますか?
728 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 04:18:37 ] どうもならない。
729 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 04:30:29 ] >>727 fclose に NULL を渡すのはダメ
730 名前:デフォルトの名無しさん [2009/10/25(日) 14:55:59 ] 「車輪の再発明はするな」という言葉で車輪の再実装を阻む行為は、 「車輪を実装した」という経験をもたせないようにして、先行者利益を確保するという、孔明の罠なのです。
731 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 15:05:44 ] 車輪の調子が悪い時にメンテナンスできないしな
732 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 15:40:14 ] 実装の仕方がまちがっているのに得意げな車輪の再実装は 止めてやるべき
733 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 15:44:35 ] 自作の暗号アルゴリズムほど恐ろしいものはない
734 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 15:47:33 ] 実験を一人でやれない奴は発明するな
735 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 15:52:50 ] 日本に航空機製造をさせない某国のような
736 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 16:17:07 ] 再発明と再開発・再生産とは違う。 発明するのが無駄ってことだろ。
737 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 16:19:56 ] 孔明の罠??
738 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 16:45:53 ] やらない言い訳に使うなってことでもあるな。 ありもしないライブラリを再発明になるといけないので探してます、とかな。
739 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:24:10 ] >>737 巧妙なトリック
740 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 17:39:11 ] 光明の罠
741 名前:デフォルトの名無しさん [2009/10/25(日) 18:13:11 ] あなたに自分の好きなことをする自由な時間を取り戻す20の方法 gigazine.net/index.php?/news/comments/20080802_find_free_time/ 10.「それは受けられません」と言うことを学びなさい 12.最も大きなタスクを一番最初に処理しなさい 13.人に任せる 14.気を散らすあらゆるものを視界から取り除きなさい 15.インターネットから切断する 16.外部委託する
742 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 18:50:31 ] >>737 げぇ!
743 名前:デフォルトの名無しさん mailto:sage [2009/10/25(日) 19:55:57 ] 1. その本を閉じる 2. 2chviewer をアンインストールする
744 名前:デフォルトの名無しさん [2009/10/26(月) 02:48:27 ] 方向キー押すと1づつ大きくなるカウンタってどうやって作りますか? 押している間じゃないです お願いします
745 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 03:03:15 ] 処理系依存
746 名前:toya mailto:age [2009/10/26(月) 06:15:16 ] >>726 準拠する規格は『JISX3010:2003 プログラム言語C』で 「www.jisc.go.jp/ 」→「JIS検索」→ 「JIS規格番号からJISを検索」で「X3010」と入力し 「一覧表示」→「JISX3010」→「規格の閲覧」で閲覧できます
747 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 06:27:28 ] c99かよ
748 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 11:04:50 ] int func(){ for(;;){ } return 0; } こういうスタイルって、紙の本で行数が間延びしないためのものだろ。 実機での記述でこのスタイルにしてる奴って、それを理解してないんじゃないのか?
749 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 11:14:43 ] 昔の画面全体で25行しか無い時も有効だったかもな。
750 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 11:18:30 ] FDD全盛のころは改行コードすらもったいなかったんだよ
751 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 11:53:35 ] >>748 ディスプレイで見たときにも間延びするとかっこわるい。
752 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:03:07 ] 詰まってる方がかっこわるいだろ
753 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:34:43 ] int foo(int n, int m) { int i, j, k, something; for ( i = 0; i < n; ++i ) if ( i != m ) { (void)something; for ( j = 0; j < n; ++j ) for ( k = 0; k < n; ++k ) { (void)something; if ( k != m ) (void)something; { int a, b; (void)(something = a + b); (void)something; } } } else (void)something; (void)something; return 0; } 関数化しろとかインデントが2カラムと言うのは無しで、こういうソースはできれば見たくない
754 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:36:40 ] >>753 見なきゃいい エディタ起動時に必ず整形ツールを通すようにすればいいだけだ
755 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:38:01 ] この形に美しさを感じられない奴は コンピュータプログラミングには向いていないよ。