- 1 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:15:31 ]
- C言語の入門者向け解説スレです。
教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 117代目 pc11.2ch.net/test/read.cgi/tech/1225320579/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 37 pc11.2ch.net/test/read.cgi/tech/1224000127/ 過去スレ 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
- 369 名前:デフォルトの名無しさん [2008/11/05(水) 22:23:38 ]
- >>368
甘いんだよ、後出し設定なんか聞いてやらん
- 370 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:40:38 ]
- >>369
お前教科書って聞いて何思い浮かべたの?
- 371 名前:368 mailto:sage [2008/11/05(水) 22:42:33 ]
- 後出しも何も俺>>356じゃねえよ?
寒くなってきたんだから布団にすっこんでぽかぽかになっとけよ
- 372 名前:デフォルトの名無しさん [2008/11/05(水) 22:45:49 ]
- で、別人のふりくらいしかすることなくなったわけか
- 373 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:48:16 ]
- このスレには極端にレベルの低い小学生が二人いるのかな
- 374 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:49:49 ]
- よそでやれ
- 375 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 22:58:36 ]
- 次の方どうぞ〜♪
- 376 名前:デフォルトの名無しさん [2008/11/05(水) 23:53:51 ]
- >>316
それ好きな人が身近にいる。else ifだとデコボコになるからこれが好きとのこだ。 そいつは、構造対のメンバ名が長い時も、最初にそのメンバのアドレスを短くて意味のわかるポインタに移す。 最初は何でいちいちそんな事すんだよとか思ってたが、正直、そいつのソースは読みやすい。 好みだな
- 377 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:17 ]
- 確かに、構造体ん中に構造体ある時とか、長くなるね。
- 378 名前:デフォルトの名無しさん [2008/11/05(水) 23:59:33 ]
- 複数ソースファイルがあるとき
ソースファイルその絡みがあるじゃないですか 例えばその値がどこから来たかを見つけたいとき どうやればいいのですか。 1.c から 10000000000000.c くらいまであるとして そのうちの23460001.cにある関数から 5986293.cに渡されたとしたら わからないじゃ ないですか 5986293.cのincludeには782365.cと23435.cしかない というように、「渡りに渡って行き着いた」やつは非常に見つけにくい。
- 379 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:30 ]
- >>378
それは設計が悪くないか?
- 380 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:01:38 ]
- __FILE__
- 381 名前:デフォルトの名無しさん [2008/11/06(木) 00:01:42 ]
-
ゲームに限らず、携帯電話やATMなど 「仕事」のソースは例外なく大量のファイルに分かれているのに 「この値はどこから来たのか」 「それをはじき出すものはどこにあるのか」 っていうコメントがないことがほとんどです!!!!!!!!!!!!!!!!!!!!!!!!!!
- 382 名前:デフォルトの名無しさん [2008/11/06(木) 00:04:02 ]
- >>378
Java見たら泣くよ
- 383 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:04:39 ]
- 今時デバッガ使えば、その時点でどの関数がどの関数を呼び出しているかなんてすぐ分かる。
それとは別に、プログラムを実行させなくても静的に解析するツールだってちらほら存在する。
- 384 名前:デフォルトの名無しさん [2008/11/06(木) 00:06:47 ]
- 研修期間中に読んだものの中で最長の渡りが
30ファイル先 まず先に値を出す1.c -> それを利用する2.c -> 2.cで出た値を利用する3.c ................................................. 30.cだけ見ると、「この値はどこから来たの」ってことしか分からず、 includeを見て追っていくと何十も何百も元のファイルから来てたとわかるのみです。 しかもそのincludeも、標準ライブラリ除いて20くらいincludeされていることもザラで それら全部調べるとなるとたいへんな時間がかかります!!!!!!!!!!! 今仕事でバリバリやってる人らはどうやって調べているの と
- 385 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:07:21 ]
- >>378
1.関数呼び出しの構造図を書く func_a func_b func_c func_d 2.データフローを書く func_a - x ->func_b
- 386 名前:デフォルトの名無しさん [2008/11/06(木) 00:08:38 ]
- 関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ→さらに中で関数呼ぶ・・・・
きつい時あるね
- 387 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:09:43 ]
- >>386
でも昔のDOSのころのようなミニマムな開発じゃなければ そういうのはざらでしょ。
- 388 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:10:14 ]
- 保守って点から見りゃ、およそ最悪だろ。
- 389 名前:デフォルトの名無しさん [2008/11/06(木) 00:14:51 ]
- >>386
みたいなのをどうしても調べにゃならん時に、たどり着いたソースが新規1985年だったのがある。俺産まれた年(笑) 昔の人は英語好きだよね〜JISに対応してなかったのかね〜
- 390 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:18:22 ]
- >>389
時代的にはこんな感じだよ。 マシンによるんじゃないかな? www.eonet.ne.jp/~building-pc/pc/pc1985.htm
- 391 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:22:45 ]
- とりあえずincludeで追いかけるってのはありえない
ライブラリならドキュメントがあるはずだし ソースがあるならgrepかければ済む
- 392 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:05 ]
- for(;;)
{ int d = 0; (dを用いた適当な処理) } と int d; for(;;) { d = 0; (dを用いた適当な処理) } を比べると上のほうがオーバヘッドが大きいでしょうか? dはfor文内でしか利用しませんのでスコープを限定したいのですが.
- 393 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:32:14 ]
- 以前、関数から参照する外部変数や値の影響についてなどを関数仕様書に書いた。
すると技術の若造が「そういう事は止めてくれ。」と言われた。 「どうして?」の問いに、「そんな事を書いたら分かっちゃうだろ。」の回答。 C言語好きでNE○の系列会社に入社する奴はヲタクなお山の大将が多かった。
- 394 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:34:30 ]
- >>393
ドキュメントとソースの乖離が発生することを懸念して、じゃなくて、分かっちゃうからってところがwww
- 395 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:35:35 ]
- >>393
日本語でおk
- 396 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:38:36 ]
- >>392
{ int d; for(;;) { d = 0; (dを用いた適当な処理) } } とかは? これってgccしかできなかったっけ? >>393-394 意味がわからねえw
- 397 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:40:28 ]
- メーカー製の場合、見えてはいけないものが多い。
特に地上デジタル放送関連は、結局はドライバで制御している以上、 「バレるとB-CASなしでも見られてコピーし放題」って芸当も出来るようになる。
- 398 名前:デフォルトの名無しさん [2008/11/06(木) 00:50:07 ]
- コメントなしね〜HTMLならしかたないとこあるけどね〜
- 399 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:52:21 ]
- >>397
外に見せる?資料と内部では違うだろ・・ 内部のものまで「書かない」が徹底されてるのか?
- 400 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:56:22 ]
- >396
VC6なんで出来るけどステートメントが深くなるからあんまりやりたくないです. それよりfor文の中に入れたときに何度もdが宣言されるけどそのときのオーバヘッドが気になります.
- 401 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:57:17 ]
- >>393 ソフトさんですか。
- 402 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:12 ]
- オーバーヘッド気になるなら実測なりアセンブリ見るなりすればいいだろ。
- 403 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 00:59:44 ]
- for(ここにおけば?;;)
vc6だとグローバルスコープだったような気がするけど でもそれはc++だったような期もするけど
- 404 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:03:51 ]
- >>400
宣言文は実行ステートメントではないから、 実行時のオーバヘッドにはならないだろ。
- 405 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:06:48 ]
- ____
.ni 7 /ノ ヽ\ 内部にも見せないよ l^l | | l ,/) / /゚ヽ /゚ヾ\ .n 以前、それで営業がポカやらかしたし ', U ! レ' / / ⌒ ⌒ \ l^l.| | /) 絶対に流出させられないから / 〈 | (____人__) | | U レ'//) ヽ\ |lr┬-l| / ノ / /´ ̄ ̄ノ ゙=ニ二" \rニ | `ヽ l
- 406 名前:デフォルトの名無しさん [2008/11/06(木) 01:41:40 ]
- B-CAS廃止されたんじゃなかったか?
- 407 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:48:54 ]
- まだよ
- 408 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:51:04 ]
- >>401
妙に納得した。 >>392 そのケースなら、コンパイラはどちらも同じようにコンパイルしてしまう。 スコープを限定してくれた方が読むにも判り易いからどんどん限定してくれたまえ。 # それこそ某N∈Sみたいな所の仕事だと全て関数の先頭で宣言しろとか言われかねないけど。
- 409 名前:393 mailto:sage [2008/11/06(木) 02:10:15 ]
- >>397
そういうカッコいい理由ならまだいいんだがw NE○の通信系には変な田舎者の高専や専卒出身の奴が多いのは確かだよ。 カモフラージュ気取りのアメージングコード、騙しの#includeなどは当たり前。 例えば、ANSIの定数をコソーリとトリッキーなビットシフトで何重にも再定義してたりで デバッガで動かすと、EOFが5に見えたりするんだが、奴らはその自分達の技術に対する 他人の反応を見て楽しんでたんだよ。(家で人知れず独りでオナニーしてろってwww) >>401 昔はT芝相手で設計部門向けのCADなどのソフトもやってましたよ。その他にも監査に 似た評価・検証系もしてたので、よく使うコンパイラ数本のC標準ライブラリのヘッダやソースまで ほぼ暗記してました。
- 410 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:19 ]
- >>352
遅レスだけど、エラーの指摘はTURBO C1.0対MS-C3.0の頃からborlandの方が出来が良い。 使いやすさじゃ勝負にならないけど、学習用途なら色々動かして、気に入った物を使うといいよ。
- 411 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:12:56 ]
- 悪いがマ板でやってくれ
- 412 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 15:14:28 ]
- >>378
やっぱ一回実行して呼び出しスタック覗くのが一番早い気が。 gdbにもあったはずなんで、大抵の環境で可能だと思う。
- 413 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:19:50 ]
- fnameに/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data
とかはいってたとして、次のファイル操作 printf("%s",fname); if((fp = fopen(fname, "rb")) == NULL ) { fprintf(stderr,"ERR;入力ファイル error;read_inputfile\n"); exit(EXIT_FAILURE); } これをかいて実行すると開けないってエラーがでるんですけども。なぜだと 考えられますか?ちなみに、emacsから/home/usr01/c_nara_orenikike/1th/2th/3th/4th/5th/6th/7th/8th/3.data だと開けます。開けるからわからないんですけど。ファイルネームにラストに改行はいってるみたいで。 ただそれでエラーがくるのかと。3.dataはバイナリのデータです。
- 414 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 17:26:44 ]
- 改行入ってたら、実際のファイルの名前にも改行入ってないと開けないぞ
- 415 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:13:23 ]
- >ただそれでエラーがくるのかと
ファイルを指す文字列をどう解決するかは当然OSに依存する あいにく君の使っている環境は、末尾の\nを排除してファイルを探すことができなかった それだけのことであって、そもそもCの話ではない
- 416 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:14:42 ]
- C言語を志すならばやはりK&Rは買わないとダメでしょうか?
- 417 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:17:30 ]
- 別になくても困りはしないよ
- 418 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:19:39 ]
- もちろんあったほうがいいけど必須ではないよ
CFAQを読んだ上で、規格合致ギリギリのラインを攻め込んだりしない限り問題ないと俺は思う
- 419 名前:デフォルトの名無しさん [2008/11/06(木) 18:20:37 ]
- >>416
K&R自体は買わなくても他に手はいくらでもあるが たかが3千円弱の自己投資をためらうようならお先真っ暗だ
- 420 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:22:34 ]
- 買ったけど内容は入門書と変わらない
正直要らないよ
- 421 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:24:44 ]
- K&Rってのは、C言語をマスターしている人間が買う入門書。
マスターしてるなら買うわけないじゃん、と思うだろうが まさにその通り。 あの本は、読んでる人間はC言語を完全にマスターしてること前提で書いている。 辞書で言うならこんな感じだな レバレッジ 株用語のひとつ。 リスクヘッジ リスクをヘッジすること。 ってな
- 422 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:56:30 ]
- >>416
優れた医者は毒を薬とするという例えがあるようにその本を毒とするか薬とするかは自分次第 他人の評価を聞いて悩むより本屋でちょっと覗いてみて興味を持ったら買うのが一番 図書館で借りたって良いんだしさ 百聞は一見に如かずだよ
- 423 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:50:09 ]
- >>416
そうそう、積読の価値はあると思います。いつか、ふとしたときに手にとって、おもわず読みふけってしまう、ということがあると思います。
- 424 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:41:57 ]
- >>421
そんなことはない。 Prefaceに書いてあるとおり、他の言語は知ってるけど、C言語は 知らないって人向け Cの文法は知ってるけど、書き方を知らないような人にも向いてると思う
- 425 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:44:04 ]
- でも本に書いてあるものは全部よい書き方だと思っちゃうようなひとには向いていない
- 426 名前:デフォルトの名無しさん [2008/11/06(木) 22:04:00 ]
- 「よい書き方」について論じている本ではないことくらいわかれ・・・・無理なのか?
- 427 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:00:10 ]
- 趣味でプログラムを覚えようと思うのですが、最初はC言語でいいんですよね?
おすすめの入門書、サイトがありましたら教えて下さい。
- 428 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:04:30 ]
- >>427
いきなりCだなんて。えっち。 それはともかく、おすすめしない。
- 429 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:12:41 ]
-
time_t tp; time(&tp); sprintf(buf,sizeof(buf),"%Y%m%d",localtime(&tp)); ↑こんな感じのを sprintf(buf,sizeof(buf),"%Y%m%d",localtime(time(&tp)); ↑こんな感じで一行で書きたいんだけど。 もちろん、この書き方が駄目なのは分かるんだけど。 関数の戻り値のアドレスを渡したいんだよねー
- 430 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:13:07 ]
- はじめてのC
- 431 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:14:31 ]
- >>429 上のもダメですが
- 432 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:16:55 ]
- >>429
なんでこだわるの?
- 433 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:18:29 ]
- つーか、それstrftime()の間違いだろ。
- 434 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:51:25 ]
- >>427
C言語に興味があるのならC言語にすればよい。 入門書は、本屋に置いてあるのでいいと思うよ。 例えば、ポニョのとかLepton先生のとかカニハンのおっちゃんのとか。 ああ、でも『はじめての~』は買わない方がいいと思う。 厨房のとき読んでコードギアスの2ndOPになった。 あまり評価高くないけど、河西本とかもオヌヌメ。もう記述が古いけど厨房でも理解できた。 ウェブサイトは、使わない方がいいよ。コピー&ペーストで終わらせようとする衝動に負けるだろうから。 手で打って覚えるんだよ。目でコードの美しさに感動するんだよ。体でプログラミングの楽しさを感じるんだよ。 本気でC言語を使って思い通りにプログラミングできるようになりたければ、 他人の評価は気にせずに自分の直観を信じて本を読んでいった方がいいよ。 そのレビューをした人と自分の言語理解度が必ずしも同じであるわけではないのだから。 1冊読んでいい気になるなよ、そこの自称中級者。 うわっキモ。米大統領選:オバマ氏、共和党地盤・インディアナ州奪取 まで読んだ。
- 435 名前:デフォルトの名無しさん [2008/11/07(金) 00:15:14 ]
- 猫Cのこのページ
ttp://www.kumei.ne.jp/c_lang/intro/no_13.htm のPGMをコーディングして実行したんだけど 結果が 「time1=1225984391 time2=0」となってしまう。 printf ("time2=%ld\n",t2) と単独で出力すればちゃんと「time2=1225984392」になる。 何が間違ってるんでしょうか
- 436 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:16:03 ]
- 実行環境はMicrosoft Visual C++ 2008 Express Editionの
Win32 コンソールアプリケーションです
- 437 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:35:33 ]
- TCP/IPのソケットを使って互いに通信するプログラムを作りたいのですが、正直さっぱりわかりません
どこか詳しい説明とサンプルプログラムがあるサイトはないでしょうか?
- 438 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:38:07 ]
- ほれ
x68000.q-e-d.net/~68user/net/
- 439 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:21:40 ]
- >>435
%ld に対応するのは long 型であって、time_t 型ではありません。 long 型と time_t 型のサイズが等しい環境では上手くいくかもしれませんが、 あらゆる環境で常にそれが成立するわけではありません。
- 440 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:57:52 ]
- ネコなんかで勉強しようなんてするから嵌まるんだ。
long(t1)とでもすれば"%ld"で出力されるだろ。
- 441 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:14:22 ]
- >>440
やってみたけどダメです。。。 じっさい、t1のほうは「%ld」でちゃんと出力されてるんですが。 ブレイクポイント設定して見てみるとちゃんと変数の中身は変わってます。 なのに「"\ntime1=%ld time2=%ld\n"」で標準出力するとtime2=0 になっちゃう
- 442 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:41:07 ]
- >>441
64bit環境? %ld のかわりに、%I64d でやるとどうなる?
- 443 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:54:50 ]
- って環境は>>436か
time_tは typedef __int64 __time64_t; /* 64-bit time value */ typedef __time64_t time_t; /* time value */ だから64bit整数だな。%I64dか%lldで。
- 444 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 09:57:58 ]
- つーか、longが64bitじゃないんだから、>>440でいいはずだな。
>>441はなにをやってみたんだ? printf("\ntime1=%ld time2=%ld\n", long(t1), long(t2));だぞ?
- 445 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:07:02 ]
- >>444
その通りやってみたんですがダメですね・・・ printf ("time2=%ld\n",t2) だと正常に出力されるので%ldの型指定に問題があるとは思えないのです。 なんで0が出力されるのか、全く見当が付きません・・・
- 446 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:12:17 ]
- 本についてるプログラム(C言語を習得する類の本ではありません)で
ただのint型変数にファイルから100000という値を読み込んでる ものがあったんですが、一般的に見てこのコードは正しいんでしょうか?
- 447 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:13:42 ]
- >>446
どのあたりが疑問なんだ?
- 448 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:21:58 ]
- >>447
int型で表せる値の範囲についてです。 環境によるかもしれませんが 参考書には-32767〜32767と載っていたもので
- 449 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:23:22 ]
- >>445
えーとだな、まず64ビット整数はたとえば0x0000000012345678 という数値なわけだ。 これをスタックに積んで、32ビットで取り出すと、0x12345678 と 0x00000000の2つの数字がとれるわけ。 なんで2番目が0になるかわかったろ?
- 450 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:17 ]
- >>445
>printf ("time2=%ld\n",t2) この場合も、0x0000000012345678を積んで、0x12345678だけ取り出したから たまたまうまくいってるように見えるだけで、上位32ビットは切り捨てられている。
- 451 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:44 ]
- >>448
それは少し古い時代のint型だな 今は大抵4バイトなんで-2147483648 to 2147483647 を表せることが多い
- 452 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:26:45 ]
- intが16ビットなんて8ビットパソコンの時代じゃないか(80年代)
参考書が古すぎ
- 453 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:35:38 ]
- >>451
そうですか、分かりました。 どうもありがとうございます。
- 454 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:52:02 ]
- >>449-450
ありがとうございます。上手くいきました。 t1-long(t2) ってやってました。>>445を読むまで理屈が判りませんでした。 VC6とかだと上手くいってたのかな?サンプルコードも油断ならないですね
- 455 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:56:54 ]
- × >>445を読むまで理屈が判りませんでした。
○ >>449を読むまで理屈が判りませんでした。 安価間違えたorz
- 456 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:00:00 ]
- >>454
long(t1)は、time_t型のt1の値を、long型にキャストすると言うことだ。 t1 - long(t2)では、time_t型のt1からlong型にキャストされたt2の値を引こうとしてしまうので、 time_t型の実態であるlong long型にキャストして引き算を行なってしまうので結果はlong long型のまま。 引き算する場合はlong(t1 - t2)としなくては意味がない。 そもそもtime_t型は実態が32ビット整数だった時代が長いから無理もないとは思うが、 32ビット整数である保証がないのでちゃんとキャストするべき。それをしていないサンプルは、当てにならないと言うこと。 尚、time_t型同士の引き算は本来なら、difftime()を使うべき。
- 457 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:09:00 ]
- >>456
結局のところ、printf("%g\n", difftime(t1, t2))ってことね。 # だからといって、printf("%g\n", difftime(t1, 0))する奴ぁいねぇと思うが。
- 458 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 11:34:56 ]
- 対角要素に0があっても正しく動く逆行列を求めるソースおちてないですかね?
- 459 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:48:52 ]
- 同じx86-64bitでも、Windows系の64と、Unix/BSD/Linux系の64アーキテクチャの違いも・・・
- 460 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:07:30 ]
- >>427
自分もプログラミング入門者なんだが、苦しんで覚えるC言語ってサイトがわかりやすいと思う お互い頑張りましょう。
- 461 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:13:02 ]
- >>446
コードそのものは正しい 16bit環境には対応していないというだけ
- 462 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:23:20 ]
- >>460
俺も昔、苦しんで覚えたなw 血便、下血、終電、睡眠デバッグ・・・
- 463 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:32:19 ]
- >>460
「苦しんで覚えるC言語」リンク先のsetjump/longjump >プログラムの流れをグチャグチャにする凶悪な関数であり、よほどの事情でもない限り使用してはいけない。 ワラタ 後に例外処理 try 〜 chatch に衣替えして支持を得る、元祖例外処理サポート関数のデビュー作なのに、 誰も正しい使い方を広められず、gotoと併せて鵜呑み受け売りで語り継がれて忌み嫌われたんだよね。
- 464 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:39:18 ]
- longjumpが悪だとは決して思わないけれど
忌み嫌われる程度には危険で使いにくいと思う
- 465 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:41:11 ]
- 海の怖さを知って初めて一人前の猟師
そういうことさ
- 466 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:44:09 ]
- コードの海は俺の海
- 467 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:51:00 ]
- そして怖い膿を知った
- 468 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 13:57:00 ]
- まあデストラクタが呼ばれないから実際使えなかったわな。
- 469 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:26:41 ]
-
「今は大抵○バイト」 一番ダメな考え方 こうやって決め打ちすると、そこから変わった場合に一切対処できずに泣いて誰かに助けを頼むことになる 「ママが○バイトだって言ってたから○バイトじゃなきゃダメなんだあああウワアアアアン!」
- 470 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:30:46 ]
- 分かったからお前が解説してやってくれ
- 471 名前:デフォルトの名無しさん [2008/11/07(金) 18:47:01 ]
- >>468
おまえC使いのくせにスタックの巻き戻し程度のものが自分で実装できんのか?
- 472 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:17:37 ]
- 関数にn次の2次元配列を渡す場合はどう書けばいいですか?
double data[n][n]とかいう配列です
- 473 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:31:08 ]
- void func(double **data)
- 474 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:32:14 ]
- >>472
void hoge(double *pData) とか void hoge(double Data[n][n]) じゃだめ?
- 475 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:35:34 ]
- >>473
渡すときは func(data)ですか?
- 476 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:38:37 ]
- ああ間違えた。>>473が正しい。
ポインタじゃなくて実体そのものをコピーしていいなら俺のでもいい・・・はず・・・ pc11.2ch.net/test/read.cgi/tech/1225320579/ の379の質問か。
- 477 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:15 ]
- >>475
そう >>476 間違っています 勉強しなおしましょう
- 478 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:40:44 ]
- >>476
>>475+>>473だとコンパイルがとおらないんです
- 479 名前:デフォルトの名無しさん [2008/11/07(金) 19:43:19 ]
- >>473 であるべき、と強硬に言い張る奴が昔いた
一生懸命 malloc してたw
- 480 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:44:01 ]
- >>473は大嘘
普通は func(double data[][n])
- 481 名前:476 mailto:sage [2008/11/07(金) 19:45:25 ]
- >>477
あ、下のほうって意味だったんですが、VC++で動くけど問題なんでしょうか? 以下のソースで動きました。 void test(int data[2][2]) { printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); }
- 482 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:48:29 ]
- void test(int data[][2])
{ printf("%d\n", data[0][0]); printf("%d\n", data[0][1]); printf("%d\n", data[1][0]); printf("%d\n", data[1][1]); } int main(int argc, char *argv[]) { int data[2][2] = {0,1,2,3}; test(data); return(0); } これでいい
- 483 名前:476 [2008/11/07(金) 19:50:57 ]
- >>482
関数で一次限の配列の要素数を書かない理由はポインタ渡しにしたいからですか? それとも別の理由?
- 484 名前:デフォルトの名無しさん [2008/11/07(金) 19:50:58 ]
- K&R で書くなら ANSI 混ぜるなよ
- 485 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:56:33 ]
- >>472
関数に配列を渡すことはできない。渡されるのは常に配列の戦闘要素へのポインタである。 double data[X][Y] という配列があるとき、data は double の配列の配列であり、 これを関数呼び出しの引数に書くと、それは double の配列へのポインタに変換される。 実際に関数にわたるのはこのポインタで、その型は double (*)[Y] である。 だから関数の仮引数の宣言は以下のようになる。 int func(double (*data)[Y]) …@ ただし、これは次のように書いてもいい。 int func(double data[X][Y]) …A int func(double data[][Y]) …B Aは配列そのものを表しているが、既に述べたように関数が配列そのものを受け取ることはない。 そこで、関数の仮引数に配列が書かれたときには、配列がその先頭要素へのポインタに置き換わるのと同様に、 その配列要素へのポインタを宣言したのと同じに扱われることになっている。だからAの持つ意味は@と同じである。 ここでAがポインタに置き換わるとき、当然最初の添字Xは無視されることとなる。つまりBのように省略が可能である。
- 486 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 19:59:26 ]
- >>483
最初の添字が無意味だから したかろうがしたくなかろうが配列を引数に書いたら 絶 対 に ポインタ渡しになる
- 487 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:02:33 ]
- 配列を値渡ししようとしてもポインタの値渡しになるから
値そのものは渡せない
- 488 名前:476 [2008/11/07(金) 20:09:51 ]
- >>485-487
丁寧な説明ありがとうございます。 おかげでポインタの理解が深まりました。 人の質問に答えて見るもんですね。 同様に構造体の配列も要素数書いてもポインタになるのを始めて知りました。 試してみたらアドレス一緒でビックリ! でも、なんでdata[0]->data1じゃなくてdata[0].data1なんでしょうか? typedef struct{ int data1; int data2; }TEST_TABLE; void test(TEST_TABLE data[2]) { printf("%d\n", data[0].data1); printf("%d\n", data[0].data2); printf("%d\n", data[1].data1); printf("%d\n", data[1].data2); } int main(int argc, char *argv[]) { TEST_TABLE data[2] = {0,1,2,3}; test(data); return(0); }
- 489 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:23:24 ]
- まったく理解できてねぇwwwwwww
- 490 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:40:40 ]
- >>429
これでいいじゃない。 struct tm *v_localtime(time_t t) { return localtime(&t); } strftime(buf, sizeof buf, "%Y%m%d", v_localtime(time(0));
- 491 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:41:33 ]
- >>488
dataがポインタだから data[0]は構造体自体
- 492 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:42:27 ]
- >>488
[]演算子に*の意味が入っているから。
- 493 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:03:43 ]
- 1 TEST_TABLE data[10]; TEST_TABLEを要素とする配列。
2 data[0] 先頭要素。 3 &data[0] 先頭要素のポインタ。 4 data だけ書いたら↑3と同じ。 5 TEST_TABLE *p = &data[0]; 配列先頭要素へのポインタで変数 p を初期化。 6 TEST_TABLE *p = data; ↑5 と同じ。 7 p->data1 ポインタを使って要素へアクセス。 8 data->data1 ↑6,7 から、これは 7 と等価。 9 data と p は等価だから、data[0] は p[0] と等価。 10 つまり *p は p[0]。 11 (*p).data1 *演算子はポインタから実体を返す。だから要素アクセスはドット。 12 (*data).data1 上と同じ。 13 data[0].data1 ↑2で書いたように要素なのでアクセスはドット。 14 data[1] 二番目の要素。 15 &data[1] 二番目の要素のポインタ 16 以下 data[0] と同じ。 17 data[2] 三番目の要素。 18 以下↑と同じ。 19 p = dataのとき、 data[1] は *(p + 1) と同じ。 20 つまり、&data[1] は p + 1 21 data[1] は data[0] の後ろにくっついてるわけだから 22 &data[1] と &data[0] の間のアドレス距離は data[0] の大きさ分ある。 23 つまり、 p+1 と p では data[0] の大きさだけ移動してる。 24 等価等価言ってきたけど、 p++ はできて、data++ はできない。 25 以上とは関係なく、関数の仮引数では data[] は配列じゃなくポインタ。
- 494 名前:476 mailto:sage [2008/11/07(金) 21:11:52 ]
- >>491-493
またまた詳しい説明、ありがとうございました。 ポインタに関して理解していないところの多さを感じました。 まだまだ勉強不足ですね。 さて、名無しに戻って元々したかった質問をします。
- 495 名前:デフォルトの名無しさん [2008/11/07(金) 21:16:40 ]
- VC++でファイルからデータを読み込み分解するプログラムを作りたいです。
ファイルには hoge:aaa\r\n hage:bbb\r\n のように記述されていて、 hoge:に対する記述は hoge:aaa\r\n hoge:bbbb;012\r\n と";"の後にもデータが続いている場合があります。 aaaやbbbbの文字数は一定ではないです。 これを読み出すときに、 sscanf(bBuf,"hoge: %s",&data[HOGE][0]); としているのですが、";"以降がdataに入りません。 どうしたらいいでしょうか?
- 496 名前:デフォルトの名無しさん [2008/11/07(金) 21:33:13 ]
- >>493
> 3 &data[0] 先頭要素のポインタ。 > 4 data だけ書いたら↑3と同じ。 ダウト sizeof &data[0] != sizeof data
- 497 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:46:16 ]
- >>496
それは例外事項 data だけなら先頭要素のアドレスで正しい
- 498 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:49:47 ]
- ん?
- 499 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:52:25 ]
- 不毛だ
- 500 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 21:58:46 ]
- うるせーな
気にしてんだよ
- 501 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:18:19 ]
- data と p が等価で、 sizeof data が例外なのか。
p = data ができるのが例外なのか。
|

|