- 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/
- 348 名前:デフォルトの名無しさん [2007/12/29(土) 19:56:49 ]
- stdioも見るな
- 349 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 20:04:24 ]
- cstdioも見る。
- 350 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 20:58:54 ]
- >>345
お茶吹いたw
- 351 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 22:25:47 ]
- みんなどのくらいの年齢でC言語始めるんだろうか
もしかして今の商業高校とかでは教えられているのか?
- 352 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 22:40:37 ]
- >>351
商業の基本は情報処理だが、 俺のとこじゃ国家試験の勉強が中心 だが、商業でVBをやるところもあったし、JAVAをやるところもある。
- 353 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 23:19:04 ]
- oshiete1.goo.ne.jp/qa3021719.html
この中の lpPARAM lpParam = (lpPARAM)lpx; はどのような意味を持っているのですか?
- 354 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 23:26:40 ]
- >>353
元の関数仕様が void* だから 渡す側が lpPARAM をvoid*にいれて とりだす側がキャストで戻してる
- 355 名前:デフォルトの名無しさん [2007/12/30(日) 00:05:56 ]
- C言語ってポインタとか使うメリットあんの?って感じだけど
難しいから使わなくても大丈夫かな?
- 356 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:08:16 ]
- >>355
その内必要になる時がくる
- 357 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:15:13 ]
- >>355
ポインタのメリットをすぐに理解する必要はないが,必要になったときにすぐに(少し調べて)使える程度に覚えとけ
- 358 名前:デフォルトの名無しさん [2007/12/30(日) 00:17:59 ]
- ok
いま独習Cでポインタやってるんだが、まぁある程度理解してるんだが 少し、上に行くと難しいんだよな。 char *bokki ="ちんこが立つ"; printf(bokki); って場所やってるぜ、こういうのってプロでも使うのか?
- 359 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:19:36 ]
- >>255
使うメリットが無い内は使わなくていいと思うよ 便利だから使うのであって、かつC言語をやっていればそのうち「これはポインタを使った方が楽だ」って状況が出てくる その時に使えばいいだけの話 まあC++ならまだしも、C言語だと関数との配列の受け渡しとかで すぐにポインタが必要な状況になるよ
- 360 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:20:34 ]
- >>355
同じアドレスを共有したいときがあるのさ 夫婦だって別々のベッドじゃいやだろ?
- 361 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:22:17 ]
- >>358
まぁリテラル文字列はstaticでconstで領域もconstしちゃうけど
- 362 名前:デフォルトの名無しさん [2007/12/30(日) 00:22:19 ]
- Cは難しいなポインタが
もしかして359と360はバリバリ使えるんすか?
- 363 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:23:39 ]
- >>358
const char * str = "俺童貞"; printf("%s", str); まあdefineの代わりにconstポインタを使うことはあるかもね defineの代わりとしては const char* const str = "ヤリてー"; の方がいいかね
- 364 名前:デフォルトの名無しさん [2007/12/30(日) 00:25:40 ]
- すごいっすねみなさん
この頭の良さを駆使して、みなさんが作ったプログラムはどんなのありますか? 実用的で使えそうなやつっすよタブを消したり入力した文字をソートしてなんたらしたり
- 365 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:26:20 ]
- >>358
表示したい文字列に%があると見落とすかもよw
- 366 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:28:41 ]
- 宇宙に浮かんでるアレの制御プログラム、を作るための支援ツールとか監視システムとか
- 367 名前:デフォルトの名無しさん [2007/12/30(日) 00:29:31 ]
- ちなみに私が作ったのは
1,暗号化 2,解読 3,Quit というやつでシーザー暗号に似た奴ですね。 まだまだへたれですよ
- 368 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:29:59 ]
- 文字列のポインタは文字列の実装上使わざるを得ないのでメリットが分かりにくいと思う
- 369 名前:デフォルトの名無しさん [2007/12/30(日) 00:30:44 ]
- >>366
本気で言ってるんすか? 知人の凄い人でもATMなのに人工衛星とかの制御プログラムとか次元が違いすぎる
- 370 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:32:40 ]
- 最近、どっかの団体のコーディングルールとか見ると、ポインタの演算禁止とか、
ポインタのポインタらしい使いかたはしないって流れになってきてるな。 じゃPascalでも使ってればいいのにって気がするけど。
- 371 名前:デフォルトの名無しさん [2007/12/30(日) 00:32:54 ]
- ポインタがどうでも良くなってきたんで。
早くファイル操作などの場所をやりたいんですが、ページを飛ばすと複雑な気持ちになるので ポインタのページと関数のページを仕方なくやりますか
- 372 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:33:22 ]
- >>369
よく嫁 支援ツールだ つまりだたの社内ツール
- 373 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:34:43 ]
- 実用的なのは作ったこと無いな、所詮娯楽用品止まり。
- 374 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:23 ]
- 私の書いたコードなら、世に出回っているフラッシュメモリのシェアの多くを生み出す装置の検査に使われているぜw
- 375 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:35:35 ]
- まぁ日曜プログラマならそれでいいんじゃね?
自分の腕を仕事に活かしたいと思ったら、それはそれで地獄をみることになるし
- 376 名前:デフォルトの名無しさん [2007/12/30(日) 00:35:54 ]
- >>372
でもすごいっすよ C言語を始める時期が悪かったですかね ガキの頃に手をつけとけば良かったと後悔しますよ Cをマスターしたら次はperlかjavaやろうかと思ってるんすよ
- 377 名前:374 mailto:sage [2007/12/30(日) 00:36:39 ]
- もっと身近なところでは、某駅ビルの駐車券発行機に使われているとか(ぉぃ
- 378 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:35 ]
- 去年一年くらいCの仕事をやって、医療関係のシステムだったけど、ありえないくらいコードの質が
低かったから、そのシステムを導入してる病院には行かないことにしてる。怖い。
- 379 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:40:58 ]
- >>376
始めるのに早いも遅いもない 逆にガキのころはガキのころにすべき勉強なり体験なりをしなくちゃいけない Cなんてただの道具にすぎんのですよ、偉い人にはそれがわからんのです
- 380 名前:デフォルトの名無しさん [2007/12/30(日) 00:41:44 ]
- >>374
まじすか? 凄過ぎますよ、是非そういう人に基礎から教えてもらいたいんですが まぁ無理なんでしょう、自力でやらないと意味がないし そういうコードを書くにはCを学んでいたときに1日どのくらい書いてましたか? あとは1日3個適当にプログラムを作るとかそういう目標とかってありましたか? >>2373 私もそんな感じっすよ 暗号化できたーやーいって(自己満)すよね >>375 プログラマーになったら大変そうすよね それで食ってくのは難しいすよね
- 381 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:44:56 ]
- プログラミングの仕事は中国やらインド勢力に取られていくし、
自動生成の流れが盛んになってきているから、 プログラミングの仕事はどんどん減っていくだろうね 現に、カードにパンチしていた時代はコーディングが開発工程の8割を占めていたのに、今では2割程度
- 382 名前:374 mailto:sage [2007/12/30(日) 00:46:50 ]
- そう言えば某社のFAXに……あれはアセンブラだったな。
某社の検査装置に使われているのは……basicか。 てな具合にいろんな時期にいろんなことをやっていたから「Cを学んでいた(だけの)とき」なんてないよ。
- 383 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:47:00 ]
- 娯楽用品って言っても仕事なんだけどな (´・ω・`)
- 384 名前:デフォルトの名無しさん [2007/12/30(日) 00:48:11 ]
- >>381
今の日本は開発よりかも指示とかプロジェクトの提案とかそんな感じすかね? たしかにインドとか中国はすごいっすよね。 ロシアは凄いらしいですがどうなんでしょう。 生まれる場所を間違えたな・・・
- 385 名前:374 mailto:sage [2007/12/30(日) 00:48:52 ]
- >>381
あー確かに、カードパンチの時代は「完全なる机上コーディング」をしたものを「パンチするだけ」だったな。 # 流石に学校で体験しただけだが
- 386 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:50:47 ]
- NHKのワーキングプアの番組でやってたな。
アメリカで銀行のシステムをやって年収1000万のIT技術者が、インドに仕事とられてファーストフードの店でアルバイト。
- 387 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:53:08 ]
- 別にインドや中国が凄いってわけじゃなくて、単価が安いからそっちに簡単な仕事まわしてるだけだよ
難しい仕事は単価の高い日本で集中的にやる
- 388 名前:デフォルトの名無しさん [2007/12/30(日) 00:53:59 ]
- やっぱ裕福な国は、それ以上求める物が無くて開発するレベルが低いんですか?
日曜プログラマが良いかな、本職は他ので。 パソコン詳しいねすごいねおっちゃんって言われればそれでいいかな
- 389 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:57:27 ]
- >>387
これからはインド人や中国人の10倍の価値のある技術がないときびしいだろうね。
- 390 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:01:40 ]
- >>388
日本を舐めすぎw おまい、マスコミに変に影響されてるな プログラミング力のあるなし以前に、視野の狭さが心配だよ コーディングっていうのは単純作業なんだよ、単純作業 町工場で働く工員と同じ 指示されたものを淡々と作るだけ じゃあ、それ以前に何をどう作るか、ってのを考えなきゃいけないよね それを考えるのが日本の仕事 もちろん、今後すぐにプログラミングの仕事が無くなるわけじゃない やっぱり言語や文化の壁があって、オフショア開発の管理って難しいくて、 リスクを極力避けるために、 現状は、仕様変更の激しい部分とか、重要な部分ってのは日本でコーディングしてる
- 391 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:03:10 ]
- C/C++でポインタを使わないプログラミングが想像できない
>>380 1日3個も作れるならそいつは天才か、作ったものがゴミ箱行きのカスか
- 392 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:06:13 ]
- とりあえずLinux上の適当なコマンドのソースでも読んでろ
- 393 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:08:05 ]
- UNIXコマンドのソースは俺も読んだなあ。
- 394 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:10:12 ]
- おまいはいいよ
- 395 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:14:42 ]
- ライブラリの○○.aっていうファイルから
収録してある関数名を取り出すことって可能ですかね? あったら教えてください
- 396 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 01:22:21 ]
- >>395
nmコマンドでぐぐれ
- 397 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 02:32:38 ]
- >>391
C++ならiteratorは別とすればポインタつかわないこと多くね?
- 398 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 04:17:57 ]
- Java厨です。
Include文とかヘッダファイルの自動生成って出来ないもの?
- 399 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 05:06:09 ]
- 条件にもよるが不可能では無い
頑張って作ってみれば?
- 400 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 07:46:20 ]
- >>396
どうもありがとうございました。
- 401 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:24:40 ]
- #define DATA "data"
と、例えば定義してexeを作ったときバイナリエディタでみても"data"を文字列として見つけられません これはどういう形で格納されていのでしようか?
- 402 名前:デフォルトの名無しさん [2007/12/30(日) 08:26:04 ]
- たとえば、
#define SRAM_A (volatile unsigned char *)0x200000 こんなのもポインタを使っているといっていいですか? SRAM.Hの中身は、こんなのだらけなんですけど。
- 403 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:33:50 ]
- >>401
DATAを作っていなければコンパイラはobjに"data"を出力しない。 当然、出力されるEXEにも存在しない。
- 404 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:54:40 ]
- >>402
それだと「アドレス」と言いたくなるけど、まぁポインタだね。
- 405 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 08:58:09 ]
- >>402
組み込みなら普通は #pragma で section 名指定して、 リンカーで配置する。処理系によって違うけど 似たようなコードがあるはず。 絶対アドレスにポインタ使う必要なし。
- 406 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 13:24:24 ]
- 趣味でGBAやったときも402みたいなことばかりやったな。
- 407 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:42:25 ]
- こんなマクロ定義してたな俺。
#define Acc08(Adr) (*(volatile unsigned char *)Adr) #define Acc16(Adr) (*(volatile unsigned short *)Adr) #define Acc32(Adr) (*(volatile unsigned int *)Adr)
- 408 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 14:50:02 ]
- DOS 時代も VRAM 使う時にそういう事してたな。
- 409 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 17:04:38 ]
- >>401
そもそも使ってなければプリプロセッサはコンパイラに"data"を出力しない
- 410 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:17:27 ]
- void *myMalloc(int size)
{ void *p; p = malloc(sizeof(double) * size); if (p == NULL) ...エラー処理; return p; } と言うような関数を作ったのですが、 これに、double **a の奴と、 double *b に a = (double **)myMalloc(size); b = (double *)myMalloc(size); と、つなぎ合わせる事をするのですが、 特にこれで問題は起こらないものでしょうか?
- 411 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:32:56 ]
- >>410
何かメモリがもったいないな
- 412 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:48:21 ]
- a = (double **)myMalloc(size);
のあとは、for文回して a[i] = (double *)myMalloc(size); と言うふうに、2次元配列を作る予定なんですが・・・
- 413 名前:デフォルトの名無しさん [2007/12/30(日) 21:51:23 ]
- すみません、質問させてください。
テキストファイルを作ると同時にそのファイルから文字を読み込んで出力する・・というのをやりたいのですが、なぜか開こうとしてもすぐ画面が消えます。なにがいけないんでしょうか? 別に読み込むだけでもいいのでアドバイスお願いします。コンパイラは「Bloodshed Deb-C++」です。
- 414 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:52:39 ]
- 改行が多すぎると言われたのでいくつかに分けて書きます。
#include <stdio.h> #include <stdlib.h> void kaku(int,int*,char*); int main(int argc, char *argv[]) { int ten=0; char kekka[]="NG"; kaku(1,NULL,NULL); kaku(2,&ten,kekka); kaku(3,NULL,NULL);
- 415 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:53:27 ]
-
FILE *fp; char data[256]; fp=fopen("test,txt","r"); fscanf(fp,"%s",data); fclose(fp); printf("%s\n",data); system("PAUSE"); return 0; } void kaku(int fg,int *ten,char *kekka) { static FILE*f; switch(fg){ case 1: f=fopen("test.txt","w"); break; case 2: fprintf(f,"%d点,",*ten); fprintf(f,"%s\n",kekka); break; case 3: fclose(f); break; } } です。長々とすみません
- 416 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:59:38 ]
- >>412
pointer to pointerを作るなら a = (double**)malloc(size*sizeof(double*)); じゃないの? まあ、メモリは余分に確保されてるからコーディング間違えなければちゃんと動くだろうけど。 >>413 意味が分からない
- 417 名前:416 mailto:sage [2007/12/30(日) 22:01:23 ]
- ああ、>>413は>>414-415か
- 418 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:06:43 ]
- >>416
printf("%d\n", sizeof(double)); printf("%d\n", sizeof(double *)); で確認した所、 double型が8で、double *型が4でした。 ポインタだと値が違うんですね。 始めて知りましたorz 通りで動かなかったのかと・・・ ありがとうございました。 頑張ってみます
- 419 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:16:23 ]
- >>413-415
13行目はtest,txtじゃなくてtest.txtだろう。 fopenしたならfpがNULLかどうか必ず確認すべきだ。 system("PAUSE")というのは俺の環境にはなかったから外したら多分期待通り動いた。
- 420 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 22:37:38 ]
- >>419
できました!ありがとうございます!!
- 421 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:54:34 ]
- >>418
ついでにcharとchar *、shortとshort *とかもsizeofして見比べて見ると良いよ ポインタがちょっと見えて来る
- 422 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:55:08 ]
- テキストファイルからある文字列を検索し、ヒットした文字列の直後にある数値を抜き出すコードを考えています
例えば X= 630.20 Y= 220.20 Z= 33.25 A= 30.25 のような感じです。このうちプログラム内で定数として用いたいのが630.20や220.20、33.25に30.25です まず1行目をfgets()でポインタ*fpに読み込んで、"X="をstrstr()で探します その辺りまでしかぱっと思いつきません ここから630.20を読み込もうと思うと、どのような方法があるでしょうか 宜しくお願いします
- 423 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 01:56:18 ]
- scanf
- 424 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:01:46 ]
- >>423
ありがとうございます ですが、scanfはキーボードから入力したデータを読み込む奴ですよね? テキストファイルに書いてあるものを読み込みたいのですが…
- 425 名前:デフォルトの名無しさん [2007/12/31(月) 02:15:45 ]
- isdigit() 一文字ずつで調べて配列に格納して、atof() とか
トークンがスペースなら、そこまで読み込むようにして、 atof() とか トークンをもう少し考えなおすのがいいかも、セミコロン、カンマとかにする。 strtokn()とかあった気がするが、それは調べてくれ。
- 426 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:22:41 ]
- >>424
fscanf
- 427 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:24:37 ]
- >>425
変なこと教えるなよ。 atofは数字以外に当たったら解析を終了するから、 > 一文字ずつで調べて とかは不必要だろ。
- 428 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:29:10 ]
- >>425
ありがとうございます。isdigitでチェックして配列に格納が簡単そうですね strtokn()もありますけど、元ファイルを変換する(というより、別ファイルを作ってそこに数値同士をカンマ等で区切るようにする?)ので、あまり使いたくないところです 最悪、strtokn()で別ファイルを一時ファイルとして作成してやるという方法がありますが… ちょっと考えてみます。ありがとうございました >>426 fscanfにそんな機能があったのですか、もう一回調べてきます ありがとうございました
- 429 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 02:54:39 ]
- >>428
scanfはfscanfのラッパー関数みたいなもん。 scanf内でfscanfをstdinに対して処理している。 scanfでもstdinをfreopenすればファイルからの入力にできる。
- 430 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:13:36 ]
- 普通strtol(), strtod()
- 431 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:43:21 ]
- #include<stdio.h>
int main () { int a,b,c,i,f,d[50]; scanf("%d %d",&a,b); switch(a*b){ case 0: return 0; defalt: c=a/b; printf("%d",c); /*19*/ break; } i=1; while(i<=50){ c=a%b; d[i]=c/b; c=c%b; printf("%d",d[i]); if(d[i]==0) f++; else f=0; if(f>=2) break; i++; } return 0; } スミマセン!なんでコレダメなのデスカ?オシエテクダサイ!!!
- 432 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 09:45:12 ]
- >>431
scanf("%d %d",&a,&b); 反射神経が書いてるので違うかもシレン。
- 433 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:26:48 ]
- >>431
defalt: ↑これがだめだ。 ラベルとして認識しているはず。 default: な。
- 434 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 10:28:32 ]
- >>431
ちょっとずれるが、 switch(a*b){ case 0: ↑0かどうか判断したいだけなら、if文を使うべきだ。 switchにする必要なし。
- 435 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 12:42:18 ]
- スミマセンちなみにエラーの内容ハ”Ifに(がナイ”デス。
修正しまシタがダメデス。 書き方ノドンクササとかよりそっち教えてホシイデス。
- 436 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:03:01 ]
- >>431に「エラー」は見当たらないような・・・
- 437 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:18:59 ]
- >>435
もう一回、ifの入ってるバージョンのソース見せてくれたらなにかコメントできるかも
- 438 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 13:22:45 ]
- >>431
>d[50]; >i=1; >while(i<=50){ これも駄目だな
- 439 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 14:25:34 ]
- 437
このトウリデス ナオラネエ!ウガァァァァァ
- 440 名前:デフォルトの名無しさん [2007/12/31(月) 17:09:50 ]
- #include <stdio.h>
void test(int i); itn main(void) { test(0); return 0; } void test(int i) { if(i<10){ test(i+1); printf("%d",i); } } 再帰なんですが これ難しくて理解できないんすよ。 みなさん詳しく説明してくださいお願いします。
- 441 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:41:00 ]
- test関数は引数が10未満ならもう一度test関数を引数+1の値を使って呼び出したあと引数を出力する。
出力は「9876543210」ってなるだけかな? 10を3とかにして流れをゆっくり追って行けばわかるよ。
- 442 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 17:42:04 ]
- itnってなんだろうってのは置いといて、
test(0)は0+1でtest(1)を呼ぶ test(1)は1+1でtest(2)を呼ぶ 最終的にtest(9)が9+1でtest(10)を呼ぶが、i<10じゃなくなるので何もしない その後printfで9が印字され、8が印字され・・・最初の0が印字されて終了と 処理が戻っていく感じだな
- 443 名前:440 [2007/12/31(月) 18:03:00 ]
- >>441 >>442
やっぱ再帰できたほうがいいすか? ポインタよりも再帰の方が難しい・・・
- 444 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:04:52 ]
- 何が難しいのかさっぱり理解できない
- 445 名前:440 [2007/12/31(月) 18:11:48 ]
- 何故、0123456789じゃなくて
逆になるのかが、難しい
- 446 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:13:21 ]
- >>443
感覚的に理解できないだけだと思うけど、 デバッガでステップ実行して追っていけばわかると思うよ。 ちなみに、再帰はめったに使わない。 11年ぐらい仕事でCプログラミングやってるが、 再帰を使ったのは1,2回。
- 447 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:23:52 ]
- >>445
printfを実行するのはtestを実行した後だから ディレクトリの走査とかそれに類似したものは再帰使うなぁ 定番というか
- 448 名前:デフォルトの名無しさん mailto:sage [2007/12/31(月) 18:30:32 ]
- デバッグ中に無限に再帰してスタック食いつぶしてデバッガがフリーズするのも良い思い出。
|

|