1 名前:デフォルトの名無しさん mailto:age [2007/07/24(火) 23:17:11 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 16 pc11.2ch.net/test/read.cgi/tech/1184003625/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 93代目 pc11.2ch.net/test/read.cgi/tech/1184506311/
309 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:50:37 ] Ctrl-F5で解決する例のあれか
310 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:29:44 ] 昨日のお子様哀れすぎワロタ
311 名前:初心者 [2007/08/01(水) 15:14:36 ] 構造体の数値データからcsv形式のファイルを作りたいのですが、どうすればいいでしょうか。教えていただけるとありがたいです。
312 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:24:33 ] 構造体のメンバをcsv形式でファイルに書き込め
313 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:56:39 ] C++なら簡単に出来るからC++スレで質問するといいよ^^
314 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 15:58:15 ] まだ全然初歩のプログラムなのですが、わからないので教えてください。 プログラムファイル 入力データファイル が用意されている。 問題 文字データ中に含まれる文字の種類を調べるプログラムを作成しなさい。 [仕様] ・入力データ件数10件 1件に最大100文字(半角とする) 入力データは、文字型1次元配列(サイズ:101)に格納 ・文字の種類は最大200種(文字型1次元配列使用) ただし、入力した文字中の改行(’¥n’)マークは処理対象外 とする ・文字コード順に並べ替えを行い出力する ・出力設計 1行に最大25文字(文字区切りに1カラム空白) 構成文字(並べ替え済み)を出力する 例 X X X X X X X〜〜X X X X X X X
315 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:08:34 ] >>314 自分がどこまでできてて、どこがわからないのか明確に 丸投げなら宿題スレに C/C++の宿題を片付けます 94代目 pc11.2ch.net/test/read.cgi/tech/1185452895/
316 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:11:26 ] プログラムは既に出来てるように思えた
317 名前:デフォルトの名無しさん [2007/08/01(水) 18:41:55 ] >>314 です。入力データ、文字種を入力するところまではわかるのですが、どういう処理をすれば入力データに文字データが含まれているのか、また、そのデータを文字コード順に並べる処理がわからないです。アルゴリズムが浮かばなくて悩んでいます。お願いします。
318 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 18:47:33 ] 文字の種類が200種なんだから、int の配列[200]を用意して 文字種ごとに足していけばよかろう。 まあ文字種そのものは256個あるから[256]作ったほうが楽ではあるが。
319 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 19:18:22 ] ちょっと今感動してる・・。 一ヶ月前の自分には解らなかった事が解るようになってる。 ニマニマしちゃうよ。
320 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:36:44 ] >>318 回答ありがとうございます。文字種類の配列を用意するのは理解できました。もし int i,n char moji[100],shu[200]で入力しおえて 文字種ごとに足していくにはどのように書けばよいのでしょうかか?
321 名前:デフォルトの名無しさん [2007/08/02(木) 00:03:16 ] >>320 char shu[256]={0} としたうえで for(i=0;i<100;i++) { shu[moji[i]]++; }
322 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 00:25:13 ] >>321 素早い回答ありがとうございます。その文字種に含まれた文字はどのようにしたら文字コード順に並び替えられるのですか?
323 名前:デフォルトの名無しさん [2007/08/02(木) 00:28:42 ] >>322 ちょっと根本的に分かってないみたいだけど 文字コードがインデックスになってるから for(i < 256) { for(j = 0 ; j < shu[i] ; j++){ putchar i } } でおk
324 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 06:46:03 ] 分布数えソートだな。
325 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 08:05:01 ] >>323 全然理解してなくて申し訳ないです。 回答ありがとうがざいました。これからプログラム書いてみようと思います。
326 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:39:43 ] プログラムファイルは用意されてたんじゃなかったのかよw sageは半角でな
327 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:45:47 ] 分布数えソート大好き
328 名前:デフォルトの名無しさん [2007/08/02(木) 09:59:24 ] 分布数えソートはもっと巧妙だけどな アイディアは同じ
329 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:08:09 ] Linux環境で半角の円マーク(\)打つのってどうやればいい?
330 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:08:49 ] 英字キーボードで、と言った方が良かったかも
331 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:17:11 ] バックスラッシュと円マークの文字コードは ASCII コードの範囲内でなら同一。 あとはフォントの問題。 どうしても混在させたいなら、ユニコードで何とかするしかない。 00A5 が円マークだ。 もちろん、エスケープ記号としては使えんがな。
332 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 13:38:15 ] Linuxでの最長パス名なのですが、#defineされているものに MAX_PATH とか MAXPATHLEN とかありますが どれを#includeしてどの#defineを使うのが一般的なのでしょうか。 なんかいろいろあってわからなくなった。 教えて下さい。
333 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:08:43 ] Linuxは知らないが、標準Cには<stdio.h>にFILENAME_MAXという定数がある。
334 名前:デフォルトの名無しさん [2007/08/03(金) 00:02:15 ] int a[3][4]; int b[4]; と宣言した際に a[0] = b; がNGなんですか? C言語の2次元配列は配列の配列と習ったんで aのゼロ番目に大きさ4の配列を入れれると思ったんです。
335 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:07:29 ] 配列の配列と2次元配列は別物だよ
336 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:17:43 ] というか、int a[3], b[3];だったとしても、 a = b; みたいな代入はできない。
337 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:15 ] >>336 みたいなのが何で出来ないんですか?って質問されたら 言語仕様です。としかいえないよな。 それでもなんで?って聞いてきたら教えるのをあきらめる。
338 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:31 ] Cを作った人や、後にコンパイラを実装した人達が できなくてよいという判断を下したから。
339 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:47:16 ] 配列の代入はできません。
340 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:01:38 ] >>335 規格票では全く同一のものとなっていますが何か?
341 名前:デフォルトの名無しさん [2007/08/03(金) 01:08:11 ] 配列の配列 配列へのポインタ ポインタの配列 などの細かなこと知らなくても問題ないよ
342 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:09:38 ] いや、それは問題ある。
343 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:17:23 ] 構文上は配列の配列と思っておくと都合がいいけど、 Cでは配列の配列とは別に2次元配列が存在するわけでもないので、 少なくともCでは両者の言葉が区別されることなく使われている。 こう言えばいいか?
344 名前:デフォルトの名無しさん [2007/08/03(金) 01:21:08 ] >>342 ないよ そんな細かなこと知っててもなんの役にもたたん
345 名前:デフォルトの名無しさん [2007/08/03(金) 01:24:34 ] int (*a)[10]; って大きさが10のintの配列へのポインタですよね これの配列(大きさ20)はどう宣言すればいいのですか?
346 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:26:09 ] そんなの自分で考えろよ int (*a)[10][20]; 死ねよ
347 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:28:43 ] >>344 int n[10][10]; を int** に渡せないとか言う人の相手をしなきゃいけない身になってみろ。
348 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:33:51 ] >>346 君が死んだほうがいいような・・・
349 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:42:50 ] 配列は 「変数名の直後に [サイズ] を書く」 ポインタは 「変数名の直前に * を書く」 括弧があろうがこれは変わらない。 それだけ覚えていれば何も迷うことは無い。
350 名前:デフォルトの名無しさん [2007/08/03(金) 02:28:56 ] >>346 最初の一行、このスレのタイトルからしてお前が来なきゃ良いんじゃね?って 周りに思われていることに気づいた方が良いんじゃね? 自分が嫌うものをわざと見つけて、勝手にその対象物を叩いてイラついている 基地外にしか見えない・・・
351 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:40:09 ] 配列へのポインタの配列が必要になる状況って考え付かないんだけど、どんなの?
352 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:44:52 ] double x y; scanf("%f%f",&x,&y); で 1.0 1.0 と取り込んだら printf("x y = %f %f\n",x,y); で x y = 0.000000 0.000000 と出力された。 なんで???
353 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:46:04 ] %lf
354 名前:352 mailto:sage [2007/08/03(金) 02:48:12 ] わいわ…アホや…
355 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:04:33 ] >>351 必要になるならないは問題ではない どう書けるかときいているのです。
356 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:08:06 ] そんなどうでもいいこと気にする前にもっと学ばなきゃいけないことがたくさんあると思うけど。
357 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:33:49 ] わからないならわからないっていえよ しったかぶってんなよw
358 名前:デフォルトの名無しさん [2007/08/03(金) 03:35:56 ] 教えられないくせに学べだの説教するやつは痛過ぎ・・・
359 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:36:37 ] >>351 回転行列へのポインタの配列とか。
360 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:37:26 ] あげくのはてには、必要ないだってw
361 名前:デフォルトの名無しさん [2007/08/03(金) 03:41:54 ] int (*(*(*p[1])[2])[3])(); を3秒以内に理解できるかい?
362 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:43:06 ] そこまですっきりしてると分かりやすい。
363 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:45:00 ] int (*(*p)(int (*)(int (*)[20])))[10];
364 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:49:20 ] それを有効に使ったコード書いてみてくれw
365 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:07:32 ] ごめん、無理。
366 名前:デフォルトの名無しさん [2007/08/03(金) 05:42:26 ] ・C言語の欠陥 関数アドレスを返す関数において、その関数と同じ型の関数アドレスを 返す型の循環構造を定義できない。 typedef func_t (*func_t)(); // エラー func_t f();
367 名前:デフォルトの名無しさん [2007/08/03(金) 05:58:18 ] こういう場合は構造体を定義するしかない。 struct _s_t; typedef struct _s_t (*func_t)(); typedef struct _s_t { func_t f; } s_t; s_t f() { s_t s = {f}; printf("f()"); return s; } main () { // f()()()()()(); 本来期待する呼び出し形式 f().f().f().f().f().f(); } 結果: f()f()f()f()f()f()
368 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 06:35:56 ] それ聞いたことはあるけど、どういう場合に使うの?
369 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 07:34:06 ] にわかプログラマーは心の狭いやつが多いねぇ おまけにちょっと噛み付かれたらギャーギャー喚き散らさないと気がすまないらしい
370 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:12:21 ] kmaebashi.com/programmer/pointer.html
371 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:39:05 ] / ̄ ̄\ / _ノ \ | ( ●)(●) < スレタイ読めないならどっか余所へ行けよ . | (__人__)____ | ` ⌒/ ─' 'ー\ . | /( ○) (○)\ . ヽ / ⌒(n_人__)⌒ \ ヽ |、 ( ヨ | ← にわかプログラマー / `ー─− 厂 / | 、 _ __,,/ \
372 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:57:59 ] >>370 他の解説読んでたけどif文にセミコロンいらないの知らなかった… でもコード見たらちゃんと書けてた (´・ω・`)?? とりあえず気付けてよかった
373 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 12:51:25 ] >>345 ヒント:a[20]と書くとaと[がとても強くくっつくので、「aは20個の要素を持つ配列です」ということになります。
374 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 14:58:37 ] ポインタについて質問なのですが、軽くググった感じではポインタとは ガーベッジコレクタを利用した変数という認識で良いのでしょうか
375 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:18 ] 全然違います。 アドレスを保持する変数です。
376 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:38 ] >>374 びっくりするぐらいダメ
377 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:06:54 ] >>374 ぜーーーんぜん違いますw ポインタ = 変数や関数のアドレスを格納した変数。値はつねにアドレスになる。
378 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:07:54 ] なにこの同時ダメだしw ワロタ
379 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:08:42 ] wwwwwwwwwwwwwwwwwwwwwwww
380 名前:374 mailto:sage [2007/08/03(金) 15:10:06 ] 私も吹きました。修行不足のようですね。出直してきます
381 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 15:45:39 ] そもそもCにガベコレなんて無いし
382 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:50:41 ] 軽くググってガベージクレクタにたどり着いた道程に興味があります。
383 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:33 ] 童貞に興味があります
384 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:51 ] >>383 いりますか?
385 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:10:59 ] 俺は無い
386 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 18:56:25 ] 質問です。 @wininetを使ってhtmファイルを読み込みtemp.htmで出力。 Aそのtemp.htmを読み込み、必要な部分をaaa.htmで出力。 ということをしたいのですが、1度ならできたのですが、 while文で2回以上ループさせると@のtemp.htmをwモードで fopenするとエラーが出てうまくいきません。 一応大まかなソースを書いておきます。よろしくお願いします。 void create_htm(int times){ FILE *wfp; FILE *rfp; if((wfp = fopen("temp.htm, "w")) == NULL){ ←2回目になるとここでエラーが発生し強制終了。しかしfprintfは実行されないまま。 fprintf(stderr, "--- wfp error"); exit(1); } get_htm(wfp, times); /*@の関数*/ fclose(wfp); if((rfp = fopen("temp.htm", "r")) == NULL){ fprintf(stderr, "--- rfp error times = %d", times); exit(2); } diet_htm(rfp, times); /*Aの関数*/ fclose(rfp); } main(){ int times; get_config(); /*gettimesをファイルから取得。gettimesはグローバル変数*/ for(times = 0; times < gettimes; times--){ create_htm(times); } }
387 名前:386 mailto:sage [2007/08/03(金) 18:59:51 ] すいません。while文ではなくfor文でループしてます。 mainのfor文はtimes--ではなくtimes++です。 よろしくおねがいします。
388 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 19:15:36 ] 問題の無い部分を手書きで書いて見せたって何にもならんと思うのだが。 せめてエラーのときはerrnoくらい出してよ。
389 名前:386 mailto:sage [2007/08/03(金) 19:35:44 ] 問題のある部分がcreate_htm関数のif((wfp = fopen("temp.htm, "w")) == NULL) の部分でエラーが出るのですが。すみません。errnoはどのように出すのでしょうか。 ネットで調べてみて、問題のある部分のあとに書いたのですが、強制終了されるので 出力されないのですが。
390 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 19:53:26 ] そもそもこれはファイル名の後に"が抜けててコンパイルもできないだろ 問題のあったソースをコピペすることもできんのか エラー処理もしないでそこで落ちるというのはどうやって判明したんだ?
391 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 19:55:41 ] 強制終了って、アクセス違反? どっかぜんぜん別のところでメモリ破壊を起こしてるのかもね。 get_htm や diet_htm の中身を見ないと解決できない気がする。 >>386 に載ってる部分では特に問題なさげ。
392 名前:386 mailto:sage [2007/08/03(金) 20:05:19 ] >>390 あ、すみません。抜けてました。 そこで落ちるというのは、一行ごとにprintfでどこがエラーかをみてみたら、 その部分でprintfがされなかったので判明しました。 >>391 メモリ破壊ですか。メモリ破壊を調べる方法とかないですか?
393 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:04:33 ] gdb使えよ
394 名前:386 mailto:sage [2007/08/03(金) 21:48:16 ] windowsでもgdbは使えますか? turbo debuggerというので動かしてみると、例外が出たと言われました。
395 名前:デフォルトの名無しさん [2007/08/03(金) 21:56:31 ] いまどきCなんて使う機会ってあるの? OSを書く 組み込み系 これくらいにしか使わないよね
396 名前:386 mailto:sage [2007/08/03(金) 21:56:57 ] 何度も失礼します。 gdbをするには、gcc -g program.cをすればいいですよね? でも、コンパイル時にwininet.hのInternetOpenなどでエラーが出るのですが どうしたらいいですか?
397 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:03:15 ] >>395 LinuxアプリとかR&Dとか
398 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:55:07 ] >>396 そもそも何使って開発してるのよ。VCのデバッガ使えば?
399 名前:386 mailto:sage [2007/08/04(土) 01:06:28 ] windows XP、bccを使っています。 すみません、自己解決できそうです。 メモリ破壊というものをネットで調べながらソースとにらめっこしてたら、 どうやら、Aの関数内でmallocでサイズを確保するときに、strlenではなく sizeofを使ってしまっていたのが原因のようでした。お騒がせしました。 また、新たなエラーが発生した際にはお邪魔させていただきます。
400 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:12:41 ] もう来るな
401 名前:デフォルトの名無しさん [2007/08/04(土) 01:13:26 ] >>400 お前みたいな奴に質問に答えてもらわんでも結構、お前が来るな
402 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:14:47 ] sizeofをどう使ってたんだ?
403 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:15:34 ] >>400-401 邪魔
404 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:18:15 ] >>402 ポインタに使ってばぐったんだろ。
405 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:19:16 ] だから他の関数も最初から晒(ry
406 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 01:20:40 ] >gdbをするには、gcc -g program.cをすればいいですよね? >windows XP、bccを使っています。 質問される方の身になってください。 類似例 www.nicovideo.jp/watch/sm8005
407 名前:デフォルトの名無しさん [2007/08/04(土) 06:45:47 ] >>403 お前も邪魔。いちいちうるせー
408 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:11:15 ] >>407-408 邪魔
409 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 16:56:50 ] 質問ですが、 int main() { int w; printf("0から6までの整数を入力してください!\n"); scanf("%d",&w); switch (w) { case 0: printf("日曜日です。\n"); break; case 1: printf("月曜日です。\n"); break; case 2: printf("火曜日です。\n"); break; case 3: printf("水曜日です。\n"); break; case 4: printf("木曜日です。\n"); break; case 5: printf("金曜日です。\n"); break; case 6: printf("土曜日です。\n"); break; default:printf("???\n"); } return 0; } の4行目のscanfで("%d\n",&w)と間違えて打ったら2度入力が求められ、 結果には、1回目の入力が反映されました。なぜでしょうか? 使っているコンパイラはborland c++ 5.5.1で、OSはビスタです。