1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ] C言語の入門者向け解説スレです。 教えて欲しいのではなく宿題を丸投げしたいだけなら ↓宿題スレ↓へ行ってください。 C/C++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/ ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること # サイズが大きい場合は宿題スレのアップローダ等を利用してください ・開発環境や動作環境も晒すと答えが早いかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 35 pc11.2ch.net/test/read.cgi/tech/1219761846/ 過去スレ 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
304 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 04:54:50 ] BCC DeveloperでDXライブラリ使ってます 構造体は struct STATUS_D{ int w_x; int w_y; int pc_x; int pc_y; int pc_sx; int pc_sy; int menu_x; int menu_y; int data_x; int data_y; int time_x; int time_y; int m_x; int m_y; int c_size_x; int c_size_y; char menustr[5][STR_MAX]; int menu_num; int w_handle; int wb_handle; int c_handle[5]; int c_handle_num; }; です この一番上のint w_x;の値が変わってしまいます
305 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:13:31 ] >>304 構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。
306 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:45:18 ] メモリ破壊してる所見つけるコツみたいなのあります? 全然わかんないです・・・
307 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:48:35 ] >>306 前後に文字配列を定義してないですか?
308 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:51:55 ] >>307 それよりこの構造体をどういう風にメモリに確保するか でも変わるしなあ。 たとえば構造体を配列にしてるとなると構造体内部の配列の 最大値をちゃんと管理してなくてメモリ破壊してるとか。 ただ構造体に情報をセットするのは構造体の先頭の領域から なら見かけ上正常に動いてるようにも見える。
309 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 05:55:22 ] 目視デバッグ
310 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 06:08:33 ] デバッガーでトレース 構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる
311 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 10:38:33 ] その構造体すでにfreeしてしまっているとか
312 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/24(水) 12:54:50 BE:1465733467-2BP(0)] char型の配列周りが基本的に怪しいよね。 ちゃんとヌルターミネートされてるか、 配列のサイズよりも大きいものを入れる可能性がある場所はないか。 デバッガあるなら>>310 の方法で探すのが早いかな
313 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:34:37 ] #ifdef _DEBUG #include <stdio.h> //for sprintf #endif _DEBUGってなんですか?
314 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:39:57 ] ttp://www.wakhok.ac.jp/~kanayama/C/03/node112.html
315 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 20:47:47 ] >>313 VCではデバッグモードでコンパイルすると _DEBUGが暗黙のうちにdefineされる。
316 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:48:54 ] fgets(str, BUFSIZE, stdin); len = strlen(str); if(str[len - 1] != '\n') { printf("input line may be imcomplete\n"); while(str[len - 1] != '\n') { fgets(str, BUFSIZE, stdin); len = strlen(str); } } whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。 fgetsで読み捨てるって、具体的にどういう処理だ?><
317 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:53:57 ] >>316 モードが何かは知らんけど、読み捨てるって一定条件に達したら その後データが存在してても読まないだけじゃないの?
318 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:54:24 ] サイズをオーバーしたとき でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする
319 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:55:02 ] 316のはよくない例だな
320 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:01:28 ] すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w 実際は char str[BUFSIZE]; char dummy[4]; int a = 0, b, len; while(a >= 0) { printf("a, b = ? "); fgets(str, BUFSIZE, stdin); len = strlen(str); if(str[len - 1] != '\n') { printf("input line may be imcomplete\n"); while(str[len - 1] != '\n') { fgets(str, BUFSIZE, stdin); len = strlen(str); } continue; } if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) { printf("input format may be imcomplete\n"); continue; } printf("a = %d, b = %d\n", a, b); } こんななってる。安全な入力方法の一つだそうで。 オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、 fgetsでどうクリアするのかがよくわからん><
321 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:04:18 ] BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、 かなり頭の悪いやり方。
322 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:11:01 ] continueがあるから違うだろ。 while(getchar()!='\n')で十分な気はするが。
323 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:17:36 ] >>322 そうそう、それでもいいって書いてあった。 あれか、未処理だった部分がstrに入ってくるんかね? んで、未処理だった値も処理されてクリアってこと?><
324 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:21:37 ] もし想定してるよりも長い文字列が入力されてれば 読み込みきれなかった分までstrに上書きしながら 順次読み込んでいって、以降するはずだった処理は 全部ぶっ飛ばしてまた最初からと言う方法を取ってる
325 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:26:05 ] ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。 こういうときこそdo{}while使ってやれよw
326 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:28:40 ] >>324 ありがとうございます、なんとなく解りました。
327 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:32:44 ] >>325 ちゃんとみろ、それは的外れだ
328 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:35:20 ] >>327 if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?
329 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:42:13 ] >>328 お前continueが見えてないの?
330 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:43:26 ] >>329 この話にcontinue関係ないw
331 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:48:29 ] >if(str[len - 1] != '\n') { これと >while(str[len - 1] != '\n') { これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?
332 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:52:17 ] まあ、こう言うときはこう直せば良いんじゃね? とソースを書けば一番手っ取り早いよねと横レス if(str[len - 1] != '\n') { printf("input line may be imcomplete\n"); do { fgets(str, BUFSIZE, stdin); len = strlen(str); } while(str[len - 1] != '\n'); continue; }
333 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:30:55 ] 自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?
334 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:33:02 ] 上司になっていいように使う。
335 名前:デフォルトの名無しさん [2008/09/25(木) 04:16:05 ] すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。 超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか? しばらくC言語やってないもんで。。 よろしく。
336 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 07:39:47 ] 別に好きなとこで代入とかして初期化すればいいだろう それとも初期化子の使用のことか?それなら、宣言時にしか使えないな
337 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:34:04 ] strcpyとかstrcatとかsprintfとか使いまくってるんですけど やっぱバグおきますかね? 参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが 私BCC使ってるので使えないんです(たぶん)
338 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:36:50 ] >>337 sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。 例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。
339 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 10:27:10 ] >>337 _sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても セキュリティホールになりにくいだけで。 C++のstringやらCStringを使うほうがいいです。
340 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 11:48:17 ] CのスレでC++の話をする奴って何なの?
341 名前:335 mailto:sage [2008/09/25(木) 13:37:47 ] >>336 そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><; 宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。 Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;
342 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 13:42:52 ] Cも一応高級言語なんですけぉ
343 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/25(木) 22:29:03 BE:488578627-2BP(100)] >>337 バグ起きるかどうかは自分のコーディング次第じゃない? strcpy_sはBCCじゃ使えないけど、自分で作ればおk
344 名前:デフォルトの名無しさん [2008/09/26(金) 07:51:18 ] CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要
345 名前:デフォルトの名無しさん [2008/09/26(金) 08:08:07 ] おれ=くさかべ先生
346 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 08:11:17 ] BUGなのに、偶然としてそれが表にでてこない。 そんなのがバグ。 人は間違えるもの、間違えた時の危機管理が問題であって、 完璧に間違えないように作るという方向では、危機を避けることができない 君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。 それが致命傷になる。
347 名前:デフォルトの名無しさん [2008/09/26(金) 12:39:51 ] 保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな 事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理 どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で > 自分のコーディング次第 に賛成
348 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:17:35 ] サイバーノーガード戦法?
349 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:38:21 ] 大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか? 基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/
350 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:38:57 ] if ( 条件1 ) { 処理1; if ( 条件2 ) { 処理2; } else { 処理3; } } else { 処理3; } 処理4; 処理3を1箇所にする書き方を教えてください。
351 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:01:43 ] if ( 条件1 ) { 処理1; if ( 条件2 ) { 処理2; } else { goto label; } } else { label: 処理3; } 処理4;
352 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:02:33 ] if (条件1 && (処理1, 条件2)) { 処理2; } else { 処理3; } 処理4;
353 名前:デフォルトの名無しさん [2008/09/27(土) 14:04:29 ] >>351 それはアウトだろボケ
354 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:10:57 ] switch (条件1) { default: 処理1; if (条件2) { 処理2; break; } case 0: 処理3; } 処理4;
355 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:12:03 ] >>351 goto使うならこうだな。 if ( 条件1 ) { 処理1; if ( 条件2 ) { 処理2; goto label; } } 処理3; label: 処理4;
356 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:18:15 ] >>355 goto入れる場所違わね?
357 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:24:28 ] 正しいと思う場所に入れてみたら?
358 名前:350 mailto:sage [2008/09/27(土) 14:38:05 ] 勉強になりました。ありがとうございます。
359 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:44:27 ] >>349 そのていどwebで十分
360 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 15:46:20 ] >>355-357 goto入れる場所変えたらどうにかなるもんでもないでそ。 >>355 のgoto文以外の並びじゃどうあがいても無理。
361 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 17:27:47 ] 皮肉もわからないのかお前は
362 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 20:19:29 ] か・・皮肉?
363 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 21:35:05 ] kuma-
364 名前:デフォルトの名無しさん [2008/09/27(土) 21:44:46 ] goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり
365 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:12:52 ] switch( !条件1 ){ case 0: 処理1; if( 条件2 ){ 処理2; break; } case 1: 処理3; }
366 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:17:12 ] しつこい
367 名前:デフォルトの名無しさん [2008/09/27(土) 22:57:13 ] Cに限らないかもしれないけど 0 < hoge みたいに比較演算子使うときに定数を左辺に持ってくる書き方は どのようなメリットがあるのですか?
368 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:09 ] 見た目が分かりやすくなるという人も居る
369 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:50 ] >>367 イメージとして数直線があるとき
370 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:01:03 ] 0 < hoge && hoge < 10 なんかだと数学の書き方にちょっと似る
371 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:08:13 ] もう何年も>演算子を使っていない
372 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:09:49 ] >>370 0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。
373 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:10:10 ] >>371 よう俺
374 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:12:44 ] >>368 自分は代入演算子と間違えないためかと思ってました >>369 なるほど〜 数直線なんて単語すっかり忘れてました >>370 そういう使い方もあるのですね とても参考になりました ありがとうございます
375 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:25:39 ] int配列で hoge[] = {1,2,3,4} みたいな物を 1234と連結させたint型に直したい時に なにか賢い方法ありますか?
376 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:27:34 ] >>375 1234と連結させたint型とはなんですか? 10進数の1234ですか。
377 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:28:14 ] ごめんなさい、そうです
378 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:34:06 ] for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];
379 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:17:06 ] 標準ライブラリの関数ってどのぐらい早いの?
380 名前:デフォルトの名無しさん [2008/09/28(日) 08:47:23 ] Windowsで、system("test.exe")と実行ファイルを呼び出したとき、 test.exeはどのパスにあるか調べる方法はありますか?
381 名前:デフォルトの名無しさん [2008/09/28(日) 08:50:53 ] もしくは、test.exeが利用可能か調べる方法でも良いです。
382 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:58:32 ] >>380 つmain
383 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:01:41 ] >>379 例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い
384 名前:デフォルトの名無しさん [2008/09/28(日) 09:02:59 ] >>382 もうちょい教えてください。やり方判りません
385 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:40:52 ] >>382 じゃないけどargc、argvを貰えと言ってるんだと思う
386 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:43:21 ] 二次元配列を別の関数へ渡す時 なぜこの方法で渡せるのかわかりません。 [2][2]で受け渡したいです。 void func(int array[][2]); //関数宣言 void mainf(){ int array[2][2]={1,2, 3,4}; func(array) } void func(int array[][2]){ }
387 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:01:23 ] [2][2]でも渡せる。 なぜ[][2]で渡せるかは配列の構造を調べてみるべし
388 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:05:12 ] >>387 配列は 最初のアドレスとデータ型さえわかれば 次の番地がわかるってことですか? そんでNULLまでが範囲ってことですか? 2次元だと添字情報がないと 次の番地がわからないので 書かなきゃいけないってことですね? 日本語でちゃんと説明できませんが なんとなくわかりました。
389 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:11:02 ] >>388 ただし、範囲のチェックはやってない。
390 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 11:49:54 BE:418780962-2BP(100)] >>380 環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ? なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。
391 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 11:57:31 ] >>390 カレントディレクトリは一番最初でしょう。
392 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 12:34:20 BE:1710022177-2BP(100)] 内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ の順番か。ごめんなさい><
393 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:42:25 ] 違うだろ
394 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:19:25 ] 環境による
395 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:21:16 ] windowsの話してるんだろ
396 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:44:40 ] というかC関係ないね
397 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:12:09 ] だよな
398 名前:くさかべ様 [2008/09/28(日) 16:44:19 ] まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。
399 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 16:48:57 ] 豆でも食ってろ
400 名前:デフォルトの名無しさん [2008/09/28(日) 18:18:09 ] すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても 使えるときいたのですが、本当ですか? 以前、ボーランドという会社のコンパイラを使おうと思ったのですが うまくいかなかったので。。 もし、なにも設定しなくてもいいなら、つかってみたいんですが。 よろしくお願いします。
401 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:21:46 ] Eclipseはコンパイラじゃないよ
402 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:23:06 ] >>400 なにも設定したくないならvisualstudioおすすめ
403 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:26:45 ] PCの基礎知識が無いのにプログラミングは早すぎる
404 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:38:19 ] パスも通せないでプログラムですか