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
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 ] この形に美しさを感じられない奴は コンピュータプログラミングには向いていないよ。
756 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:43:13 ] >>753 別に悪くないと思うが。 じゃあどんなスタイルが良いんだ? 定番で悪いが Linux流プログラム書法 ttp://www.linux.or.jp/JF/JFdocs/kernel-docs-2.2/CodingStyle.html
757 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:51:07 ] プログラムの途中でコアを吐く?のだけど、そんなエラー見たことないし、 調べても何か特定の原因があるってわけでもなさそうなのでさっぱり意味がわかりません。 一つ一つの処理ごとにprintfを挟んでみたところ以下のようでした。 #define _XOPEN_SOURCE #include <stdio.h> #include <string.h> #include <unistd.h> main(void) { int i, j, len; unsigned char tripkey[11] = ""; unsigned char salt[3] = ""; unsigned char trip_f[256] = ""; unsigned char trip[11] = ""; printf("トリップキーを入力:"); scanf("%u", &tripkey); printf("トリップキー入力"); ←これが表示されずにコアを吐く
758 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:54:03 ] >>757 > scanf("%u", &tripkey); scanfの使い方調べろよ
759 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:54:36 ] >>753 Java見たいで嫌だ書き直す 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; } 漏れが許せる隙はこれが限界だ
760 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 12:54:48 ] 制御にくっつく単文でもブレースで括ってくれと言いたかったんだ ブレースだけの行があるのが嫌な人もいるんだろうけどね もう慣れているからどちらでもいいんだけど、修正時のエンバグ対策に{}付けていた体質を改めようかな、はっはっはぁ
761 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:00:43 ] >>753 インデントついてるからまだましだけど その書き方でインデントめちゃくちゃなやつもいた if(k != m) (void)something; { int a, b; (void)(something = a + b); (void)something; } とかもう
762 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:10:11 ] 関数は int foo(int n, int m) { } って書く方が好みだ。 関数名を検索するときに、/^foo\(/でジャンプできるからな。 '{'を独立した行に置くのは、K&R第1版の頃の foo(n, m) int n; int m; { } からの慣れかな。
763 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:13:37 ] >>753 他人が読むことを想定していないコードだな
764 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:14:21 ] >>763 具体的にどこがそうなのか挙げてみれ
765 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:16:07 ] スタイル議論してるスレがあるはず。
766 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:16:56 ] 関数は /*! * @brief fuga * * hoge * * @return piyo */ int foo( int n, /*!< [in] bar */ int m /*!< [in] baz */ ) { } って書く方が好みだ。 ただの似非Doxygenスタイルだけど。
767 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:17:47 ] >>764 わかってるくせに
768 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:18:59 ] >>759 Java みたいなのはお前の方だw
769 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:20:59 ] 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; }
770 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:23:52 ] >>767 >>753 は、非難されるほどひどいスタイルには見えん。 ひどい点があるなら、教えてくれないか
771 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:26:58 ] >>770 全角スペース
772 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:28:11 ] スタイルじゃなくて、これが紛らわしいってこと if ( k != m ) (void)something; { int a, b; (void)(something = a + b); (void)something; }
773 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:29:38 ] if ( k != m ){ (void)something; } { int a, b; (void)(something = a + b); (void)something; }
774 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:31:01 ] #define BEGIN do{ #define END }while(0) if ( k != m ){ (void)something; } BEGIN int a, b; (void)(something = a + b); (void)something; END;
775 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:32:17 ] >>771 htmlでインデントを表現するために、わざと全角空白をつかってるんじゃないか?
776 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:36:39 ] >>775 使え 受け取った方がコピペでコンパイル出来るようになる
777 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 13:54:13 ] >>775 使え 消えてたorz
778 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:02:01 ] &を忘れたのねw
779 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:10:58 ] >>776 一部の専ブラでは書き込まれた&nbspをコピペすると化ける。
780 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:12:27 ] >>758 なんだかよくわからなかったのでgetsを使ってみたけれどそれでもダメでした
781 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:13:57 ] なんだかよくわからないものをなんだかよくわからないまま使っても なんだかよくわからない結果にしかならないと思うんだ
782 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:23:26 ] >>780 scanfのフォーマット指定子とそれに対応する引数を考えてみて。 つかあまりにも適当に指定してるようにしか見えないから、 正解をズバリ書くのもはばかられるわ
783 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 14:47:18 ] >>782 %sと%cを試してみたけど変わりませんでした
784 名前:どちらが正統? mailto:sage [2009/10/26(月) 14:58:45 ] char s[6]="INTEL"; sは長さ6の文字列へのポインタで、その値は変更不能な文字列 (リテラル)"INTEL"を指すポインタ値 なのか sは長さ3の文字列へのポインタで、その値は変更可能な文字配列 を指すポインタ値で、変更可能な文字列配列はあらかじめ コンパイラによって変更不能な文字列"INTEL"を複製したもの が設定されている。
785 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 15:03:19 ] >>783 へぇ
786 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 15:19:05 ] >>784 どちらも間違い。 sはポインタではなく配列
787 名前:どちらが正統? mailto:sage [2009/10/26(月) 16:20:53 ] char s[7]="foobar"; sは長さ7の変更不能な文字配列である"foobar"の名前である のか sは長さ7の変更可能な文字配列で(コンパイラにより) 変更不能な文字配列(リテラル)"foobar"の複写で初期化された ものの名前である。
788 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:29:32 ] PHPをかなりやってきて、 プログラミングの基本とか だいたい理解したと思うので そろそろCをはじめようかと 思うのですが、Cをはじめる 前に、これを先にPHPで勉強 しておいたほうがいい、 っていうの、何かありますか? 一応、PHPで、 print文で画面に文字とかを出力、表示する ifでの分岐 switch文での分岐 for、while、foreachでのループ ユーザー定義関数 関数への値渡し、引数渡し includeで他のファイルを読み込んで使う 配列、連想配列(ハッシュ) ファイルへの読み書き OOP基礎 ---------------------------------------------- ↑こんくらいはマスターしました。 Cに移行する前に、何かもっと 勉強しておいたほうがいい知識はありますか?
789 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:30:35 ] 別に真っ白な状態からCを学んでも良いと思うけど。
790 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:34:11 ] >>788 PHP→Cは結構苦労するってなんかの本に書いてあったな 逆にC→PHPは3日で覚えられるって事も
791 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:37:48 ] PHPで、 セッションやら、 クッキーやら、 サニタイズやら、 BASIC認証やら、 やらされたので、Cだと そういうのないので、 かえって勉強しやすいかなー と思ってます。
792 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:40:33 ] >>787 後者。 でも「変更不能な文字配列(リテラル)"foobar"の複写で」がなんか違和感あり。 char s[6] = "INTEL"; は、 char s[6] = {'I', 'N', 'T', 'E', 'L', 0}; と全く同じよ。
793 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:51:19 ] リテラルの複写とは全く違うから後者も間違いだろw
794 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 16:54:29 ] >>783 引数もちゃんと考えようぜ。 例を見て&つけてるんだろうけど、何で&がついてるかわかるか? 配列の[]無しはどういうものかも。
795 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:06:55 ] >>791 C-CGI作るならもちろんその辺もやらないとだめだよ
796 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:09:37 ] CでCGIなんか作るわけねーだろ。あほか? USBで外部デバイスを接続して パソコンでプログラム組んで ROMライターで焼いて、、、 ってやるんだよ。 お掃除ロボットのルンバの プログラム組んだりとか ロボット作ったりとかしてーんだよ。 空気よめよwww
797 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:44:30 ] Cのコンパイラーは どっからダウンロードするんにゃ〜〜 おしえれ〜〜
798 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:45:57 ] 2chのread.cgiはcだそうだ
799 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 17:55:47 ] >798 どっかのFlashで見たなそういえば、 zlibとか使って圧縮して通信容量減らして危機を救ったとかなんとか 十分慎重に組めばセキュアなCGIも作れるわけだが CでCGI作るというウェブサイトや書籍にろくなものが無い気がしないでもない
800 名前:デフォルトの名無しさん mailto:sage [2009/10/26(月) 18:05:38 ] 文字解析以外はCもperlのようなものも一緒でしょ というか、2chのC化自体はあまり効果が無かったような