1 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:22 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 22 pc11.2ch.net/test/read.cgi/tech/1196489491/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 101 pc11.2ch.net/test/read.cgi/tech/1197132472/
2 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:52 ] Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/ Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/ Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/ Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/ Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/ Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/ Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/ Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/ Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/ Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/ Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/ Part 20 ttp://pc11.2ch.net/test/read.cgi/tech/1192455273/ Part 21 ttp://pc11.2ch.net/test/read.cgi/tech/1194384258/
3 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:52:23 ] printfで 0.1 0.2 ・ ・ ・ 9.9 10.0 10.1 10.2 みたいに右ぞろえで出力するにはどうすればいいですか?
4 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 13:58:08 ] 右揃えなってないけど
5 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:00:40 ] 投稿したらずれてしまいました 0.1 0.2 ・ ・ ・ 9.9 10.0 10.1 10.2
6 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:04:40 ] なってないじゃん
7 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:04:43 ] printf()の実数の書式なんて忘れてるな。 ググったらこんなページあったけど。 wisdom.sakura.ne.jp/programming/c/c57.html
8 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:05:33 ] %桁数.桁数f
9 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:09:05 ] >>7 >>8 うまくいかないです *0.1 *0.2 ・ ・ ・ *9.9 10.0 10.1 10.2 こうしたいんです。*は空白とかんがえてください
10 名前:デフォルトの名無しさん [2007/12/22(土) 14:12:45 ] 幅指定してやればいい 右左のそろえを変えたいならマイナスつければいいし
11 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:18:20 ] >>9 どうやったんだよ 何で自分がやったやりかたを隠すんだ?
12 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:24:09 ] >>11 %2.2fです
13 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:25:06 ] >>12 %ドットを含めた全体の桁数.小数点以下の桁数f
14 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:30:44 ] >>13 できました。どうもすいません
15 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 14:59:48 ] >>13 整数部分の桁数がわからない場合はどうすればいいですか? *******1.12100912 ******11.21890212 ******12.12109121 *****212.21029211 ***26575.12121111 みたいにしたいんですが
16 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 15:03:33 ] あらかじめ桁数大きくしておけば
17 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:55:14 ] >>15 * を使えば実行時に決定できる 数値はそのままで、空白を自分で追加してもいいし、どうにでなるでしょ。
18 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 18:55:29 ] >>前999 無理。 typedef は前処理(#ifdef とか #define とかの処理)が終了した後の コンパイル時に解析されるものであって、前処理ではその情報は使用できない。 bool を typedef するのと同時にマクロを別に定義するようにしておいて、 そのマクロが定義されているかどうかを #ifdef で判定するしかない。
19 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:14:31 ] すいません質問いいですか? 苦しんでのHPで書いてあったことなんですが・・・ 変数のところを勉強してるのですが そこに [ コンパイラの機能 ] 実は、このプログラムは多くのコンパイラでは動いてしまいます。 それは、C言語の拡張版である、C++(シープラプラ)では使えるからです。 また、近年決められたC言語の新規格であるC99でも使えます。 しかし、元々のC言語では使えないと覚えて下さい。 と書いてありましたが C言語のコンパイラでは変数は使えないと考えていいのでしょうか?
20 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:21:22 ] >>19 貴様は何を言っているのだ?
21 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:22:52 ] >>19 その一段前を読み直すんだ。 -- 変数の宣言は、基本的に、関数の先頭でしか行うことが出来ません。 例えば、次のように変数を宣言することは出来ません。 --
22 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:24:47 ] >>21 ありがとうございます ということはCでは変数の宣言を関数の先頭でしか行えない しかしほかのは先頭じゃなくても行えるということでしょうか?
23 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:24:57 ] ん? bccで.cをコンパイルすると通らないぜそれ
24 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:28:31 ] >>22 概ねその通り。厳密にはブロックの先頭だが。 従って、 -- int main(void) { printf("Hello\n"); int value; /* 変数宣言の部分 */ return 0; } -- の変数宣言をどうしてもprintf()の後で行ないたいならこうすればいい。 -- int main(void) { printf("Hello\n"); { int value; /* 変数宣言の部分 */ } return 0; } -- >>23 bccは、その筆者にとっては「多くのコンパイラ」に含まれないのだろ。 つーか、そのサイトは結構難有りだと思うがな。
25 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:31:49 ] そのサイトのダメダメな一例。 -- fpos_t fsize = 0; fpos_t fsizeb = fseek(fp,0,SEEK_END); fgetpos(fp,&fsize); fseek(fp,fsizeb,SEEK_SET); -- この突っ込みだらけのコードは一体なんなんだか。
26 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:39:08 ] >>24 みたいにするとvalueってすぐ見えなくなるんじゃね?
27 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:39:08 ] >>24 そうゆう書き方もありなのか・・・ もう2週間経つがまだ変数の宣言までしか覚えてない いつになればCが覚えられるのかな
28 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:42:28 ] >>27 日本語を覚えるのにどれだけ掛かったか、英語を覚えるのにどれだけ掛かったかを考えれば、 Cを覚えられるようになるのにどれだけ掛かるか判ろうものだ。 >>26 勿論int valueの宣言の後、そのブロックが閉じる前に使いたいだけ使えばいい。
29 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:48:00 ] >>27 自然言語と一緒で意味を考えながら書写すればいいよ。 音読するとご近所さんから奇人扱いされそうだけど
30 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 22:50:15 ] >>28-29 一応書きながらやっているから今までのことは覚えられているのだけれども・・・ 文字列リテラルとか必要な言葉かどうか疑問に思ってくる Cは覚えておいて損はないだろうから一応忘れないように がんばっているんだがこれは無駄ではないよね?
31 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:03:24 ] 知識は無駄ではないよ。知ってると知らないなら知ってるほうがよいに決まってる。 まあ、人間の脳なんて限界があるから、細かいことまで一生覚えてる必要はないよ。 それがどこに書いてあったかを覚えといて、必要なときにすぐに参照できるようにしておけばいい。 リテラルってのがソースコードに直に書いてある値のことだと知れば、 文字列リテラルだろうが整数リテラルだろうが、別に怖いことはないでしょ。 物の名前は他人に説明するときに絶対に必要だから、嫌でも覚えてしまうよ。
32 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:04:31 ] >>31 ありがとう やる気が出てきたよ
33 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:07:15 ] CってC++ってに比べて覚えること少なくね? 標準ライブラリの細かい使い方まで行くとまた別だが、 C自体の構文なんかは数日で覚えられるだろ
34 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:10:24 ] >>33 でもほら短時間で覚えると忘れちゃうじゃん だからゆっくり覚えてるのSA!! まだ変数のところだけどノートに26ページ書いてあるんだよ・・・
35 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 23:17:57 ] >>33 そりゃ、C++はCに++したものだからあたりまえ
36 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:33:27 ] Cから1しか増えてない割には結構な増強だな C+=2くらいじゃないのか
37 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:38:47 ] っ オペレーターオーバーローディング
38 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:46:38 ] くだらない質問なのですが CのDOS窓でprintfするときに、画面で ファイル ○を読み込みました 進行度 ○% 見たいのを表示してるのですが、1個ずつ改行されるので それを改行しないように画面更新するにはどうやればいいのですか? まったくやったこと無くて
39 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:47:54 ] >>38 \r
40 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:00:40 ] >>38 良く知らないけど、これを使えば何でもできるんじゃね? msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/Toppage_Console.asp
41 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:10:54 ] >>39 だめでした >>40 ナニが描いてるのかチンプンカンプンです
42 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 01:37:42 ] Cを先に覚えるとC++はクラスが難関かもしれんが、速攻覚えられるな。 C++から始めると、Cは速攻覚えられるな。 つまりそういうことだ
43 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 02:12:48 ] >>41 これでだめ? #include<stdio.h> int main(void){ int i; for(i = 0; i < 10; i++){ printf("%d", i); fflush(stdout); sleep(1); printf("\r"); } putchar('\n'); return 0; }
44 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 05:09:19 ] >>41 どう書いたらどうだめだったのか書けよ
45 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 17:03:45 ] // 俺漏れも書いてみたー。初めてWriteConsoleとか使ったけど、こんな感じで悪くないよね? #define STRICT #include <windows.h> #include <stdio.h> #define BUFFER_SIZE 64 int main(int argc, char *argv[]) { DWORD written = 0; BOOL alloced = AllocConsole(); HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE); char buffer[BUFFER_SIZE] = {0}; CONSOLE_SCREEN_BUFFER_INFO csbInfo = {0}; for (int i = 0; i <= 10; i++) { GetConsoleScreenBufferInfo(stdOut, &csbInfo); csbInfo.dwCursorPosition.X = 0; SetConsoleCursorPosition(stdOut, csbInfo.dwCursorPosition); int len = snprintf(buffer, BUFFER_SIZE - 1, "今 %d%% ですよ", i * 10); WriteConsole(stdOut, buffer, len, &written, NULL); Sleep(500); } if (alloced) FreeConsole(); }
46 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 17:45:52 ] キャラベースのプログラムで、プログレスバーの表示は\rを使うのが一般的? FORMATコマンドでFDフォーマットするときに出てくるようなやつ。もっと他の方法があるの?
47 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 17:48:17 ] エスケープシーケンスとかね
48 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:12:48 ] スケジューリングの勉強をしているのですが、 データフローグラフにはどのようなデータ構造が適していますか? また、リストスケジューリングの優先度リストに適したデータ構造についても 教えていただけないでしょうか?
49 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 01:21:13 ] 戻り値のついて誰か詳しく教えてくれ・・・orz 本読んだんだがいまいちピンとこない・・・
50 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:10:54 ] ピンとこないときには、本読んだり人に話聞いたりするよりも、 自分でコード書いてコンパイル・実行するほうが理解できると思うよ。 そのコードはとりあえず本・Webのコピペでいいから。
51 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:18:59 ] >>50 レスサンクス やってみるは
52 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 02:41:12 ] 戻り値がピンとこないってのが俺にはピンとこない。 はるかな高みからの質問かもシレンが。
53 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 05:14:58 ] C言語を触れたこともない者でも勉強できる お勧めの参考書教えてください
54 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:04:34 ] >>49 値を2倍する関数twiceがあったとする 例えば、printf("%d\n", twice(10)); のように使えば、20と表示されるとする この、twice(10)の計算結果である20を、twice(10)の戻り値という twice(15)の戻り値は30であるし、twice(-3)の戻り値は-6であろう
55 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:35:54 ] >>49 関数をジュースの自動販売機に例えると お金が引数(実引数)でジュースが戻値(返値)
56 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:50:10 ] 先生! お釣りが出てきません!
57 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 08:54:33 ] >>56 手数料としてイタダキマス
58 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 09:36:28 ] >>53 推薦図書/必読書のためのスレッド 38 pc11.2ch.net/test/read.cgi/tech/1198173179/
59 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 09:47:32 ] >>49 int f(int x) { return 2 * x + 1; } int main() { printf("%d\n", f(3) + 4); return 0; } とした場合、 int main() { int f3; f3 = 2 * 3 + 1; printf("%d\n", f3 + 4); return 0; } みたいな感じで処理される。 実際には、関数を呼ぶとその関数の中に処理が移動して、 関数の中の処理が終了すると関数を呼んだ位置に戻ってくるんだけどね。
60 名前:デフォルトの名無しさん [2007/12/24(月) 16:52:50 ] >>49 私も初心者ですが、、 自動販売機にお金とジュースの種類の情報を与えたら、 ジュースの実体が戻ってくる。 それが戻り値 で、 ジュールの種類やらお金が引数 と考えると分かり易い。
61 名前:デフォルトの名無しさん [2007/12/24(月) 16:53:22 ] >>55 で既に説明されていたorz すんません。
62 名前:デフォルトの名無しさん [2007/12/24(月) 17:01:48 ] struct S1 *S1 ; /* プロセス管理テーブル */ S1 = /* プロセス管理テーブルOPEN */ (struct S1 *)Open_Kansumei(... ,... ,... ,...) ; こんな感じのCソースがあったんですが、 (struct S1 *)Open_Kansumei(); の部分の文法がよく分かりません。プロセス管理テーブルをオープンした結果を、 S1 構造体のアドレスの先頭に入れてるのは分かるんですが・・・。 関数名の前に (struct S1 *) が付いてる・・・?
63 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:02:11 ] FORTRANだと、戻り値があるのがFUNCTION(関数)で戻り値がないのがPROCEDURE(手続き) 数学でいう y=f(x)が関数
64 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:02:57 ] Cだと戻り値がないものも関数と呼んでいる
65 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:14:29 ] >>62 構造体へのポインタを返す関数なんじゃないの?
66 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:15:10 ] っていうか、入門書に載ってる短いサンプルでも適当に動かせばわかるだろ。。。
67 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 17:24:06 ] >>62 関数 Open_Kansumei の戻り値を struct S1 * 型にキャストしている
68 名前:デフォルトの名無しさん [2007/12/24(月) 18:02:13 ] >>67 関数の戻り値をキャストするなら、 (struct S1 *)S1 = Open_Kansumei(); では駄目なんでしょうか? それとも関数自体をキャスト・・・? S1 自体がアドレスだから、(struct S1 *)関数名 とすると、(struct *S1)関数名 と同じ意味になるのかな・・・よく分からなくなってきました・・・
69 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:11:29 ] >>68 型キャストの構文をもっぺん見直してみろ。 int x; float y; という2つの変数 x と y があるとき、y を int 型にキャストして x に代入するには (int) x = y; ではなく x = (int) y; と書くのが正しい。おk?
70 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 18:31:18 ] >>68 型の名前と変数名が一緒だからごっちゃになってないか? struct S1 *p; p = (struct S1 *)Open_Kansumei(...);
71 名前:デフォルトの名無しさん [2007/12/24(月) 18:37:52 ] >>69 あ〜そうか〜そういえば! 関数の戻り値ってのは、=で受け取らないと扱えないと思ってたけど、 関数の中に関数を使ったりできますもんね。おk、おk! ということは、「関数の戻り値をキャストして、さらに S1 に代入している」 ということなんですね。 この場合、 S1 にはアドレスが入るから、 (struct S1 *)関数名 にキャストした結果は、アドレスになる(struct S1 * 型というのはアドレス) と考えていいんでしょうか?
72 名前:デフォルトの名無しさん [2007/12/24(月) 19:02:48 ] >>70 あ・・!そういう意味なんですか? と、、すると、 (struct S1 *) struct S1 * は同じ意味だから、 p = (struct S1 *)Open_Kansumei(...); の右辺と左辺は同じ型が入るということになるんですね! よく分かりますね!
73 名前:デフォルトの名無しさん [2007/12/24(月) 19:14:34 ] ちなみに、その関数 Open_Kansumei の引数はこんな感じ↓になってます。 int Open_Kansumei( ... , ... , ... , ... ) { char *adataadd; /* データアドレス */ ...処理... return( (int)adataadd ); } アドレス値を int型にして引渡し、もらい先で *型に変換する、なんてこともできるんですね。
74 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:36:26 ] >>73 できるかもしれんが、行儀の良くない例だ 真似しないように
75 名前:デフォルトの名無しさん [2007/12/24(月) 20:48:00 ] >>74 そうなんですね。読むだけにして、使わないようにします。 この場合、 return( adataadd ); ... p = Open_Kansumei(...); とするのが普通なんでしょうか?これでも同じ意味になります?
76 名前:デフォルトの名無しさん [2007/12/24(月) 20:50:06 ] なんで ? は、エスケープシーケンスで \? としなければいけないの? 何と区別がつかないのだ?
77 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:50:28 ] そもそもOpen_Kansumei関数の戻り値の型をstruct S1 *にしておく。
78 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:54:32 ] >>76 なんで ? を、エスケープシーケンスにしなければいけないの?
79 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 20:57:48 ] >>76 三項演算子とエスパーしてみる
80 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:08:23 ] >>76 「シェルが展開しようとするから」って回答がお望み?
81 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 21:16:04 ] >>76 >>78 3文字表記(トライグラフ)のため。 3文字表記は、Cが多用する記号を使えない文字コードのための代替表記を与えるもの。 まあ過去の遺物と言っていい。 ??=include <stdio.h> int main(int argc, char *argv??(??)) ??< printf("%d??/n", argc); ??>
82 名前:デフォルトの名無しさん [2007/12/24(月) 21:43:36 ] >>77 int Open_Kansumei( ... , ... , ... , ... ) { struct S1 *adataadd; /* データアドレス */ ...処理... return( adataadd ); } p = Open_Kansumei( ... , ... , ... , ... ); てな感じでしょうか。 この場合、 struct S1 *p; をグローバルで宣言しないといけない訳ですね。
83 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:01:29 ] いや,グローバルかどうかは関係ない. struct S1 * Open_Kansumei( ... , ... , ... , ... ) { struct S1 *adataadd; /* データアドレス */ ...処理... return adataadd; } とするのがベター.
84 名前:デフォルトの名無しさん [2007/12/24(月) 22:12:04 ] >>83 ああ、なるほど〜 関数の戻り値の型を変えるってのは、struct S1 * Open_Kansumei() の部分を 変えないと駄目ですよね。 あとは、Open_Kansumei()関数の定義側と、呼び出し側で、 struct S1 の中身が書いてある .h ファイルを include しとけばいいってことですね。 include が嫌だったから、 return( (int)adataadd ); ってしたのかもしれないな・・・
85 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:17:26 ] 今ぷよぷよを作ってて、4つ以上繋がっているか上下左右をチェックする再帰処理で スタックオーバーフローになってしまうのですが 11*20程度のフィールドでありえるんでしょうか 僕のプログラムがおかしいだけなんでしょうか
86 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:20:31 ] スタックオーバーフローってメモリ不足だろ? MSDOSでやってるならわからんでもないけど、Winでそれが出るならプログラムがおかしいかと
87 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:31:35 ] やっぱりそうですよね・・・ こことほとんど同じやり方してるんですけど駄目みたいです ttp://www13.plala.or.jp/kymats/study/game_other/TOKOPUYO/tokopuyo.html
88 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:34:46 ] >>85 メモリのオーバーフローかもしれないと思うなら、 試しにチェックする数を3とか2とか、もっと少ない再帰で終わるものにしてみるといい それでもプログラムが落ちるなら、無限再帰とかに陥っている可能性が高い
89 名前:87 mailto:sage [2007/12/24(月) 22:35:48 ] あれ、スタックオーバーフローってメモリ不足でいんだっけ? 用語分かんね
90 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:37:15 ] >>85 再帰だとありうるかも知れんが、まずは処理を見直したほうが良い。 再帰のネストが深すぎるかもしれない。 おかしくなさそうだったらmallocで。 >>86 スタックサイズはリンク時に決まる。 実メモリのサイズとは関係ない。 VisualC++の場合、デフォルトは1MBらしい。
91 名前:デフォルトの名無しさん [2007/12/24(月) 22:42:14 ] 動的メモリが動作中のプログラムと同じOS上で、デフラグをするとメモリの 内容が移動してしまったり、、、って事態は起こるんでしょうか? 他に、デフラグをするとおかしくなっちゃうような組み方ってどんなのがあります?
92 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 22:46:21 ] >>88 カウントが3900とかになってるので無限ループっぽいですw ちなみに右方向限定とかならエラーは出ないです ありがとうございました
93 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:06:38 ] >>91 デフラグ、ってHDDのデフラグだよね? いくらなんでもそんなへぼいメモリ管理をしてない。
94 名前:デフォルトの名無しさん [2007/12/24(月) 23:08:30 ] >>93 ですよね・・・。 デフラグでどうにかなっちゃうような実装があるとしたらC言語以外の何かなのか・・・。 とりあえず、C言語ではそういう実装はありえない、ってことでいいんですよね?
95 名前:デフォルトの名無しさん [2007/12/24(月) 23:11:56 ] C でよく、int argc; とか、char *argv; なんて名前の変数をみかけるんですが、 どんな役割を持つ変数なんでしょうか?一般的に・・・。たいていコメントがないので・・。
96 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:14:36 ] >>95 コマンドライン引数が格納される
97 名前:デフォルトの名無しさん [2007/12/24(月) 23:17:25 ] >>96 なるほど。ありがとうございました。
98 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:21:07 ] >>94 C言語は関係なく、OSの実装次第。 デフラグでおかしくなるとしたら、 デフラグツールがおかしいか、OSがおかしいかのどっちか。
99 名前:デフォルトの名無しさん [2007/12/24(月) 23:34:17 ] >>98 datファイルなんかを動的に持つってことは可能でしょうか? で、また読み込みに行ったときに、デフラグされてると、どこにあるか分からなくなる、、とか。。 基本的にファイルはHDDに保存するもので、「動的」って概念すらないんですよね・・・? あるいはファイル名を動的メモリに持つ・・・とか?う〜ん・・・ どう頑張っても、Cの実装次第で、デフラグされるとおかしくなるようなプログラムは作れない・・・ですよね?
100 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 23:46:02 ] OSのファイルシステムドライバを通さずにディスクを直に読み書きしてたりすると、 デフラグでおかしくなるようなことはあるだろう。