- ベストアンサー
C言語のバグが分かりません。どうすれば修正できるのか教えてください
- C言語の初心者が数字当てゲームを作っている最中にバグが発生しました。rand関数を使ってランダムな値を生成するプログラムを作成したのですが、一部の値が重複して表示されてしまいます。どうすればバグを修正できるのでしょうか?
- プログラミング初心者がC言語の数字当てゲームを作っている最中にバグが発生しました。rand関数を利用してランダムな値を生成する部分で、一部の値が重複して表示されてしまいます。バグの原因と修正方法を教えてください。
- C言語の初心者が数字当てゲームを作っていますが、rand関数を使用した部分でバグが発生しています。一部の値が重複して表示される現象が起きており、どのようにすれば修正できるのか教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
MAX=4のとき > int buf[MAX-1]; で用意されるbuf[?]の?は、いくつからいくつでしょう? C言語の配列では、用意した範囲外の値を添字に使用しても、直接はエラーになりません。 例: buf[5] で宣言して、 buf[8] とする、等 しかし、その領域には別の変数が対応していたり、通常アクセスできない領域だったりすることもあり、結果として異常な状態になることがあります。 今回の場合、bufの宣言の直後に変数iの宣言があります。そのためbuf[X]が範囲を越えた場合、まず変数iが被害を受ける可能性があります。というか、実際に受けてます。
その他の回答 (2)
- nora1962
- ベストアンサー率60% (431/717)
「まだ教科書などに書いてあるようなホントに簡単なプログラムしか書いた事が無いのですが」 失礼な言い方になるかもしれませんが、配列の宣言と確保する領域のサイズを了解していないとすると、勉強の仕方か、参考にしている教科書の選択があまりよくない様な気がしてしまいます。 本気でC言語を身につけようとお考えでしたら、 ・教科書、参考書を吟味する。配列やポインタ、構造体、共用体についてもしっかり著述されているものを選ぶ。K&Rを買うなら、「アンサーブック」も購入するなどして、フォローできるようにしておく。 ・いきなりゲームプログラムに走るよりはアルゴリズムとデータ構造(探索、ソート、リスト(単方向・双方向)、トリー、平衡木)などをじっくりやったほうが後々為になると思います。その上で教科書のアルゴリズムの改善が出来ないかとかやってみたらいいのでは。 プログラムは作るのは簡単ですが、「正しく動いている」ことを挙証するのはかなり面倒です(ある入力データについては正しく動くが、特定の場合だけ誤った結果を返す、最悪クラッシュするなんてプログラム山ほどあります)。 小言のようですが、基本が大事です。少しずつでも積み重ねて立派なプログラマになってください。
お礼
>失礼な言い方になるかもしれませんが、配列の宣言と確保する領域のサイズを了解していないとすると、勉強の仕方か、参考にしている教科書の選択があまりよくない様な気がしてしまいます。 自分は今大学生で、情報系の授業を受けており、配列や構造体、ポインタ等は習っていたのですが、春休みで完全にボケていたようです。 「配列の宣言では個数を宣言するけど、実際に作られるのは0~宣言した個数-1になる」という所なのに、「配列は[0]から作られる」ことを意識しすぎていました。 >いきなりゲームプログラムに走るよりはアルゴリズムとデータ構造(探索、ソート、リスト(単方向・双方向)、トリー、平衡木)などをじっくりやったほうが後々為になると思います。 学校でリストについては習いましたが、他に関してはまだ勉強してないですね・・・ ちなみにアルゴリズムやデータ構造について書いてあるお勧めの本等はあるでしょうか? 丁寧に教えていただき、ありがとうございます。
- SpiralGalaxy
- ベストアンサー率39% (649/1654)
>一応無視して進んでも良いのですが 無視して進んでよいわけがありません。 プログラム完全に壊れちゃってます。 >int buf[MAX-1]; 4つのデータを格納するのに3つ分しかデータエリア定義してないからです。
お礼
>無視して進んでよいわけがありません。 >プログラム完全に壊れちゃってます。 はい。未熟な発言失礼しました。 >int buf[MAX-1]; >4つのデータを格納するのに3つ分しかデータエリア定義してないからです。 あ、なるほど・・・ 配列は[0]から始まるということに囚われていて、宣言では個数を定義する事をスッカリ失念していました。 的確なご指摘ありがとうございます。
お礼
>MAX=4のとき >> int buf[MAX-1]; >で用意されるbuf[?]の?は、いくつからいくつでしょう? あ、なるほど、そう言えばここでの宣言では配列の個数を宣言するんでしたね; 配列は[0]から始まるということを意識しすぎていました・・・ >今回の場合、bufの宣言の直後に変数iの宣言があります。そのためbuf[X]が範囲を越えた場合、まず変数iが被害を受ける可能性があります。というか、実際に受けてます。 こう言う時に宣言の順番等が関係してくるんですね。 分かりやすい解説ありがとうございます。