セグメンテーションエラーがでます
今、cでオセロゲームを作っています。
コンピュータと対戦できるようにしたいのですが、セグメンテーション違反になってしまいます。
p[LEN*LEN]を大域変数にするとうまく動きますが、以下のように局所変数にして関数で受け渡しをすると、
数回ループさせたところでエラーで強制終了します。
おそらく関数find_legal_moveへのp[]の渡し方が悪いのだと思いますが、なぜか分かりません。
以下にプログラムの一部を載せますので、お手数ですが原因を教えていただけないでしょうか。
よろしくお願いします。
#define LEN 10 /* ボードの1辺 */
#define opponent(player) (3-(player)) /* 1の相手は2, 2の相手は1 */
typedef struct {
int row; /* 行 */
int col; /* 列 */
int dr, dc; /* 行, 列の向き */
} Position;
// 裏返る石の個数
int count_turn_over(int board[][LEN], int player, Position p)
{
int i;
for (i=1; board[p.row+i*p.dr][p.col+i*p.dc]==opponent(player); i++);
if (board[p.row+i*p.dr][p.col+i*p.dc] == player)
return i - 1;
else
return 0;
}
// playerが(row, col)に石を置けるかどうかをチェック
int is_legal_move(int board[][LEN], int player, Position p)
{
if ((p.row < 1 || p.row > 8) || (p.col < 1 || p.col > 8))
return 0;
if (board[p.row][p.col] != 0) return 0;
for (p.dr = -1; p.dr <= 1; p.dr++)
for (p.dc = -1; p.dc <= 1; p.dc++)
if (count_turn_over(board, player, p) != 0)
return 1;
return 0;
}
// playerがどこに石を置けるか
int find_legal_move(int board[][LEN], int player, Position p[])
{
Position pos;
int i = 0;
for (pos.row = 1; pos.row < LEN - 1; pos.row++)
for (pos.col = 1; pos.col < LEN - 1; pos.col++)
if (is_legal_move(board, player, pos) != 0) {
p[i].row = pos.row;
p[i].col = pos.col;
i++;
}
return i;
}
// computerの入力
void computer(int board[][LEN], int player, Position *pos)
{
int i, num, max;
Position p[LEN * LEN];
printf("コンピュータの番です\n");
// 一番多く取れるところを取る
num = find_legal_move(board, player, p);
max = count_turn_over(board, player, p[0]);
pos->row = p[0].row;
pos->col = p[0].col;
for (i = 1; i < num; i++) {
int tmp = count_turn_over(board, player, p[i]);
if (max < tmp) {
pos->row = p[i].row;
pos->col = p[i].col;
}
}
}
お礼
ご回答ありがとうございます。 ご指摘の通り、for内にcreateを入れたらエラーはでなくなりました。 一度createしたらもうcreateする必要はないと思い込んでいました。。。 何でも試してみないといけないですね。 お時間いただきありがとうございました。