1 名前:デフォルトの名無しさん [2010/04/10(土) 23:30:23 BE:454421186-S★(520172)] C言語の*入門者*向け解説スレッドです。 ★前スレ C言語なら俺に聞け(入門編)Part 62 pc12.2ch.net/test/read.cgi/tech/1269517734/ ★過去スレ 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.72【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1267775473/ とか ★教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題片付けます 135代目 pc12.2ch.net/test/read.cgi/tech/1269438098/ ★C++言語についてはなるべく聞かないでください。C++対応明記スレへどうぞ ★分からない事をなるべく詳しく書いて下さい。 ★ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ★開発環境や動作環境も晒すと答えが早いかもしれません。 ★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
152 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 17:53:40 ] 1 #include <stdio.h> 2 3 int main(void) 4 { 5 6 printf("%s\n", NULL); 7 8 return 0; 9 } このプログラムがセグメンテーションエラーになるんですけどなぜでしょうか
153 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 17:55:43 ] >>152 メモリの0番地をリードしようとするから
154 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 17:55:47 ] プログラミングはじめたいんだけどなにDLしたらいいの? やりたいのはCです。
155 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 17:58:17 ] 最終的に何が作りたいの?
156 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 17:59:15 ] >>154 Visual C++ 2008 Express Edition
157 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 18:00:33 ] 2010が旬だろw
158 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 18:01:09 ] VC勧める人よくいるけど、導入やコード作成の手間考えれば 初学者にはちょっと敷居が高いんじゃないか?
159 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 18:02:57 ] VC++も最初に落としたけど、 C言語を始めよう! からが初めやすかった 慣れればVC++で良いけど。エディタはサクラエディタに慣れると他のが使いにくくなった
160 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 18:04:44 ] >>153 NULLポインタを渡したら(null)みたいに表示されるものと勘違いしていました. 馬鹿でした
161 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 18:05:11 ] ありがとう、とりあえず挙がったの落としてみるよサンクス
162 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 18:38:08 ] >>157 まだ英語版しかない
163 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 20:02:52 ] ソース見てたんですけど GPIO.F5 = ~GPIO.F5;の「= ~」ってどうゆう意味ですか? よろしくお願いします
164 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 20:08:41 ] =は代入、~はビット反転
165 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 20:09:17 ] >>163 ~は論理否定の演算子なので、~GPIO.F5はF5ビットを反転した値になる。 それをGPIO.F5へ代入している。 つまり、F5ビットが今の状態から反転するってこと。
166 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 20:11:20 ] >>164 >>165 有難うございました
167 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 20:55:49 ] >>165 論理否定と言ったら「!」のことを指す 「~」はビット反転とかビット否定とか1の補数とか
168 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 21:04:30 ] パターンマッチ演算子のある言語から来るとぎょっとするかもねぇ
169 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 21:38:48 ] 配列の長さはどうやって求めるのですか?
170 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 21:46:09 ] sizeof
171 名前:169 mailto:sage [2010/04/15(木) 21:47:00 ] >>170 thx
172 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:04:54 ] 危険な予感
173 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:07:53 ] sizeof array / sizeof *array で配列の要素数が求められる
174 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:19:04 ] 1になるんですけど・・・と言ってくるのが目に見えるようだ
175 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:19:34 ] 0もありうる
176 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:21:23 ] mallocしたポインタで、ポインタのサイズが返ってくるに一票
177 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:28:46 ] 2や4もあるで
178 名前:デフォルトの名無しさん mailto:sage [2010/04/15(木) 22:34:39 ] 一つづつ数えろよ
179 名前:デフォルトの名無しさん [2010/04/16(金) 00:13:52 ] #define の ## って何ですか?
180 名前:デフォルトの名無しさん [2010/04/16(金) 00:16:00 ] 連接
181 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 00:18:54 ] 連接ってなんだろう・・・
182 名前:デフォルトの名無しさん [2010/04/16(金) 00:37:46 ] #define cat(a, b) a##b int func1(); int func2(); int main(){ cat(func, 1)(); // -> func1(); cat(func, 2)(); // -> func2(); return 0; }
183 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 08:07:21 ] >>68 「それ以外」というのは main() がint を返さない場合のことですよね。 すなわち main() の型が実装によっていろいろかわることも許容しているではないでしょうか?
184 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 08:12:22 ] >>183 main 関数の型を構成する要素(>>73 ,92参照)のうち、まず戻り値の型は int であるとし、 それ以外の要素について(つまり引数リストの型などについて)は実装依存であるということ。
185 名前:デフォルトの名無しさん [2010/04/16(金) 12:31:24 ] >>182 そうなんだ。 どうもありがとうございます。 では #defineの#は何ですか?
186 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 13:02:28 ] 学校卒業したけど、就職できなかったんだね。可哀想に。
187 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 18:50:00 ] >>185 #defineの#はディレクティブといふ。 C言語のソースファイルのコードはそのままコンパイラに食わせる訳じゃなくて、 プリプロセスという課程を経てプリプロセッサが吐き出したコードをコンパイラに食わせている。 プリプロセッサに命令を与える(認識させる)文字がディレクティブ(#)。 注意しなきゃいけないのは、マクロ中の#と先頭に付いている#は全く別であるということだ。 ディレクティブとしての#は先頭に付いている。 例えば一番簡単な例が #include"xxxx.h" #includeはプリプロセッサにxxxx.hっていうヘッダファイルを読み込んで、 それそのものをコピペする もし君がgccを使用しているならgcc -Eでコンパイルしてみるといい。 プリプロセス済みのソースコードが画面に吐き出されるハズだ。 命令には以下のようなものがある。 #include,#define,#if(#ifdef)+#else+#endif #ifの条件判定には式を、#ifdefの場合は予め定義の何かを使う場合が多い。 後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。
188 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 18:56:09 ] #define の右辺に登場する # 側を聞いているような気配 文字リテラル化する奴だな #define foo(arg) #arg foo(hogehoge) → "hogehoge"
189 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 19:01:34 ] >>187 コード、コンパイラ、プリプロセッサ、ヘンダファイルってなんですか? ディレクティブってエクスプローラーで見た時のフォルダのことですよね、それはわかります。 でもC言語との関係がわかりません。 gccでなくpcを使ってます、osはもちろんwindowsです。ですから試せません。 すみませんがよろしくお願いします。
190 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 19:03:21 ] >>188 ありがとうございます。
191 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 19:35:28 ] >>189 ,.――――-、 ヽ / ̄ ̄ ̄`ヽ、 勇者トンファーパーマン惨状 | | (・)。(・)| | |@_,.--、_,> 俺が着たからにはもう色々と駄目だ ヽヽ___ノ /:::::::::::::::::l /77 /::::::::::i:i:::::::i,../ / | l:::/::::::::i:i:::、:::/ / | l;;ノ:::::::::::::::l l;.,.,.! | /::::::::::::::::l/ / 冂 /:::::::;へ:::::::l~ |ヌ| /:::::/´ ヽ:::l .|ヌ| .〔:::::l l:::l 凵 ヽ;;;> \;;>
192 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 20:06:08 ] おもしろいネタだこと
193 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 20:29:35 ] #include <stdio.h> int main(void) { long i=0; for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){} return 0; } (8) : error C2143: 構文エラー : ';' が '型' の前にありません。 (9) : error C2065: 'i' : 定義されていない識別子です。 (9) : error C2065: 'i' : 定義されていない識別子です。 (9) : error C2065: 'i' : 定義されていない識別子です。 どこがおかしいのか分かりません たすけてくだしあ
194 名前:193 mailto:sage [2010/04/16(金) 20:33:11 ] ↑ (8)は4行目です
195 名前:デフォルトの名無しさん [2010/04/16(金) 20:55:01 ] >>193 普通に動いたよ。 long int じゃないとだめとかかな?
196 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 20:59:20 ] >>193 うちのGCCはWARNINGは出るがコンパイル自体は通ってる。 環境に何か問題あるんじゃまいか。 他にエラーとか、警告とか出てないのか?
197 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 21:17:41 ] >>193 うちのコンパイラでもエラーはでないな。 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. 06.c Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:06.exe 06.obj
198 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 21:19:18 ] >>184 otherwise を「引数リストの型などについて」の意味と解釈した理由を教えていただけませんか?
199 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 21:27:17 ] >>193 { /* 行番号から、ここに何かあると予想 */ long i=0;
200 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 21:43:23 ] (4) : error C3872: '0x3000': この文字を識別子で使用することはできません (5) : error C2143: 構文エラー : ';' が '型' の前にありません。 (6) : error C2065: 'i' : 定義されていない識別子です。 (6) : error C2065: 'i' : 定義されていない識別子です。 (6) : error C2065: 'i' : 定義されていない識別子です。 こうならできたけどなぁ
201 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 21:48:36 ] >>187 ほう、ディレクティブっていうのか。 10年C使ってて初めて知ったぜ
202 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 21:55:43 ] >>200 何で最初に (4) : error C3872: '0x3000': この文字を識別子で使用することはできません これを書かなかったんだ…… 何処かに全角文字使ってる。 多分long i=0;の辺り
203 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:03:40 ] >>200 4-7行目あたりに、他のコード(そこだけなら動く)があるんじゃないか? で、今度は、それを消した時に、全角文字が残って、 違うエラーがでたんじゃないのか?
204 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:06:28 ] あ、ちがうちがう。>>200 は>>193 じゃない。 まぎらわしくてすまん。 同じメッセージを出したくて、つい。
205 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:18:35 ] 可能性は∞。 全角文字がある可能性もあるし、人間には見えない文字が紛れ込んでいる可能性だってある。 或いはコンパイラが賢すぎてfor内の条件が1度も満たされない事に気付いてexeを生成するのを拒否してるのかもしれん。
206 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:22:09 ] >>204 同じメッセージを出したいなら、こんな感じ。 #include <stdio.h> int main(void) { char buf[] = "Hello, world!"; printf( "%s\n", buf ); long j=0; for (i=1;i>=0xFFFFFFFFFFFFFFF;i++){} return 0; }
207 名前:193 mailto:sage [2010/04/16(金) 22:22:49 ] すいません 再起動したら直りました
208 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:25:02 ] Hello worldに書き換えた時に、変な消し方をしてしまった…orz long j=0; // × long i=0; // ○
209 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:29:16 ] >>206 ああ、その手があったかw
210 名前:デフォルトの名無しさん mailto:sage [2010/04/16(金) 22:30:27 ] >>207 んなアホな…
211 名前:デフォルトの名無しさん [2010/04/17(土) 13:17:06 ] >>187 > 後他に#pragmaってのがあるがこれは俺は使ったことが無いので分からない。 これは何ですか?
212 名前:デフォルトの名無しさん mailto:sage [2010/04/17(土) 13:19:25 ] 処理系依存の命令用に用意してあるもの
213 名前:デフォルトの名無しさん [2010/04/17(土) 23:47:08 ] 6桁の数字を入力して、その数字の金額の金種を出力するプログラムを作っているのですがうまくいきません とりあえずここまで作ったのですが… #include <stdio.h> int main(void) { int x[9][2] = { { 10000, 0 },{ 5000, 0 },{ 1000, 0 },{ 500, 0 },{ 50, 0 },{ 10, 0 },{ 5, 0 },{ 1, 0 } } ; int n,k ; printf("6桁の数字を入力してください \n"); scanf("%d",&n); printf("%d円は \n",n); for( k=0 ; k<9 ; k++ ){ x[k][1] = n/x[k][0] ; n = n%x[k][0] ; } for( k=0 ; k<3 ; k++ ){ printf("%d円札は%d枚 \n", x[k][0],x[k][1] ); } for( k=3 ; k<9 ; k++ ){ printf("%d円玉は%d枚 \n", x[k][0],x[k][1] ); } return 0; }
214 名前:デフォルトの名無しさん mailto:sage [2010/04/17(土) 23:50:54 ] 2000円札はいつも忘れられる運命にあるな
215 名前:デフォルトの名無しさん mailto:sage [2010/04/17(土) 23:57:42 ] >>213 っ {100, 0},
216 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:02:44 ] >>213 つ k<8
217 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:07:22 ] 配列の大きさに対して、紙幣と効果の種類が足りない。 その結果0で割ってるためにエラー。
218 名前:デフォルトの名無しさん [2010/04/18(日) 00:12:54 ] Cってよく高速っていうけどアセンブリほど早いわけじゃないでしょ なんか中途半端なかんじなんだよね
219 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:14:15 ] int main(int argc, char **argv) { unsigned long num; unsigned char a, b, c, d, e, f, g, h, i; num = strtoul(argv[1], NULL, 0); a = num / 10000; num %= 10000; b = num / 5000; num %= 5000; c = num / 2000; num %= 2000; d = num / 1000; num %= 1000; e = num / 500; num %= 500; f = num / 100; num %= 100; g = num / 50; num %= 50; h = num / 10; num %= 10; i = num / 5; num %= 5; fprintf(stdout, "%2u%2u%2u%2u%2u%2u%2u%2u%2u%2u", a, b, c, d, e, f, g, h, i, num); return EXIT_SUCCESS; }
220 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:14:24 ] 最適化有効にしてアセンブリ出力させてみ? 侮れんものがあるぞ?
221 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:14:38 ] >>218 無理して使わなくてもいいのにw
222 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:14:49 ] じゃあアセンブラで全部作ってろよw
223 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:16:29 ] よっぽど注意して設計しないとコンパイラの最適化には勝てないよな。
224 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:19:58 ] ポータブルアセンブラだもん
225 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:20:31 ] アセンブラで思い出した MASMなんかの繰り返し展開マクロ同等の機能がプリプロセッサに欲しいことがある gcc はプリプロセッサ段で可変引数使えるんだっけ?
226 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:27:28 ] アセンブラより遅いCを使うくらいなら同じようにアセンブラより遅いJavaでやったほうがよくね?というJava脳の意見でした。
227 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:29:09 ] >>218 CRC32 を C からアセンブリ言語に直しても 20% くらいしか速度は改善されなかった記憶が。 昨今のハードの進展を考えるとアセンブリのソースは保守性が悪すぎる。 マジレス失礼。
228 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:29:36 ] >>223 それはCコンパイラに限ったこと? 他のコンパイラでも同じ事がいえるのなら特段Cのアドバンテージではないね
229 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:30:07 ] >>226 確かに C で書く必然性はないわけで、お好きなように。
230 名前:213 mailto:sage [2010/04/18(日) 00:30:46 ] みなさんありがとうございます まさか100円を忘れていたとは… もっと注意して確認したいと思います
231 名前:デフォルトの名無しさん [2010/04/18(日) 00:32:47 ] >>230 べっべつにあんたの為なんかじゃないんだからねっ
232 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:42:23 ] >>228 Cに限ったことじゃないが、Cは歴史が長いだけに最適化もすさまじい。
233 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 00:46:44 ] >>232 一番すごいの? それならちょっと嬉しい
234 名前:デフォルトの名無しさん [2010/04/18(日) 00:58:01 ] 最適化ならVerilogの方が遥かに凄い。全くレベルが違う。
235 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 01:30:00 ] 設計が古いんだから・・・
236 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 01:39:28 ] >>233 一番ってこたあないかもしれないけど、 現実をみて考えると相当なものがあるだろう。 C言語では微妙に不便を強いられる分、 ちゃんと見返りもあるんだねぇ
237 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 07:56:41 ] しかしqsortなどがinlineじゃないので ソートなどはC++に敵わない罠
238 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 07:59:27 ] 自前でソートすればCの方が速い可能性アリ。
239 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 11:04:46 ] C++すげぇじゃねぇか。 あの変態文法で涙出そうになったけど。 ただC言語でもコンパイラ拡張でinlineを受け付けるものも あるらしいから、それなら何とか・・・。
240 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 13:20:01 ] qsortと比較関数の両方がinlineならいいだろうけどねえ
241 名前:デフォルトの名無しさん [2010/04/18(日) 13:26:10 ] C1Xでも標準ライブラリ改良する気ないみたいだしな。 qsortがインライン化されていないこともあるが、基本的なデータ構造を扱う関数群がないとか欠陥が多すぎ。 俺queueとか、my_listとかどんだけ無駄に再生産されてるんだよ。 Cのコミュニティーは本当に無能しかいない。
242 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 13:41:47 ] 静的型の言語は、テンプレートとかジェネリックみたいのが ないとコレクション関係はつかえねーな。
243 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 13:56:20 ] マクロでごり押しできなくはないけどな まあ、普通は void* でなんとかするんだろうけど
244 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 15:40:04 ] >>243 void * で書くのは間接呼び出しが発生して効率が落ちる。
245 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 18:08:46 ] なら可変長構造体で
246 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 18:23:10 ] qsortをinlineにする 笑ってしまった
247 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 19:50:18 ] Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ
248 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 22:36:22 ] >>247 > Cの仕様の範囲内でqsortの比較の最適化を期待するにはinlineしかないだろ inlineはCの仕様じゃないって知らないのかお前はwwwwww
249 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 22:50:15 ] C言語5年やっててinlineって言葉初めて見たんですが、 これはなんですか?釣りでもなく本当にわかりません・・・。
250 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 23:05:09 ] >>249 「C99 inline」でググるんだ。
251 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 23:08:24 ] >>249 inlineってC++からの輸入じゃね?
252 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 23:11:41 ] >>249 インライン関数。 インライン関数とは、凄く簡単に説明すると void func(void){ printf("test\n"); } int main(int argc,char** argv){ func(); return 0; } ↑のようなフザケタコードをコンパイラが スマートに書き換える機能で、↑の糞コードのような場合 int main(int argc,char** argv){ printf("test\n"); return 0; } みたいな感じに書き直してくれる。