2012-02-28 7 views
1

本当にシンプルに見えますが、char配列の一見無作為な場所が8で正しく埋められていません。コンパイラエラーもありません。私はこのようなノブの質問だと申し訳なく思っていますが、私は1ヶ月前にスドクソルバーを設計したとき、これとほぼ同じコードを実行するのに何の問題もありませんでした。このシンプルな文字フィラーは何が問題なのですか?

#include <iostream> 
using namespace std; 

int main() { 

//Initiates initial board. 
char board[30][27]; 

//Fills entire board with b's to represent the edges of the board where the pac-man cannot go. 
for (int control=0; control<31; control++) { 
    for (int control2=0; control2<28; control2++) { 
     board[control][control2]='8'; 
    } 
} 

//Code here filling the board with spaces representing where the pac-man can go. 

//Temporary render of board. 
for (int control=0; control<31; control++) { 
    for (int control2=0; control2<28; control2++) { 
     cout << board[control][control2]; 
    } 
    cout << endl; 
} 

return 0; 
} 

明らかにランダムなセグメント化エラーがあります。

答えて

5

セグメンテーションフォールトはほとんどランダムではありません。あなたはあなたの配列の範囲を超えています。 board[30]およびボード[] [28]はそれぞれ、それぞれの寸法の最後を過ぎています。この場合、復帰アドレスはおそらくmain()から上書きされているので、プログラムは雑草に入り、セグメンテーション違反で見られるような恐ろしい死を迎えます。あなたのループ条件を変更します。

control < 30 

control2 < 27 

そして、あなたは問題ないはずです。配列のサイズをboard[31][28]に変更することもできます。

最も重要なの、あなたも依頼することなく、あなたのためにこの問題を解決しているだろうあなたが障害の発生時にcontrolcontrol2変数の値を見つけるために使用できるデバッガを、使用することを学ばなければなりませんここに。

+0

私はデバッガを持っています。それは正常に終了しました。 –

+1

いいえ、そうではありませんでした。 –

+0

端末の中にありました。デバッガ自体は何も返しませんでした。実行時に、端末はセグメント化障害で停止しました。 –

3

配列の最大値を超えてインデックスを作成しています。

boardの最大インデックスはboard[29][26]です。これは、30と27の要素が要素の数であり、配列のインデックスがゼロであるためです。

+0

それは私の問題を解決しましたが、ボード上の数字を過去のものにするという私の推論は、それが<記号であれば27または30で終了してはいけませんか? –

+0

これは27で終了しますが、 'board [1] [27]'は範囲外です。索引付けが0から始まるためです。したがって、索引27を使用すると、実際に28番目の要素にアクセスしようとしています。 –

+0

何らかの理由で、私が0要素についてそれがまだ27で正しく終わると思っていたことさえ知っています。ありがとう。 –

3

マトリックスのサイズが超過しています。

char board[30][27]; 

をしかし、あなたのループは、次のとおりです:あなたは持っている

for (int control=0; control<31; control++) { 
    for (int control2=0; control2<28; control2++) { 

は、彼らがいずれか1

によって各次元をオーバーシュートにあなたの行列を変更します:char board[31][28];したり、ループのオフの繰り返しをカット。

関連する問題