ページ 11

c言語 動作しない理由がわかりません。

Posted: 2012年6月06日(水) 19:45
by fwLight
初心者です。
C言語でLifeGameを作ろうと思い、テストとしてこのプログラムを作成したのですが、なぜ正常に動かないのか理由がわかりません。

環境はWin7 U 64bit,Microsoft VisualC++です。

よろしくお願いします。

Lifegameというのは下記のルールで成り立つ人工生命のシュミレーションです
1つのセルはその周囲に8つのセルと接している。

A:あるセルがチェス盤上で生きているとき

1:周囲の8セルの内、2または3個生きている場合、次の時間ステップ(世代)で生き残る。
2:周囲の8セルの内、4つ以上生きている場合、人口過剰で死ぐ。
3:周囲の8セルの内、生きているのが1つ以下では、露出しすぎで死ぐ。

B:あるセルがチェス盤上で死んでいるとき

1:周囲の8セルの内、ちょうど生きたセルが3つの時誕生するが、そのほかの場合は死んだまま。

コード:

int a[8][8] = {	
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,0},
		{0,0,0,1,1,0,0,0},
		{0,0,0,1,0,0,0,0},
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0}
	};
int b[8][8];

int cheak(int x, int y)
{
	if (a[x+1][y+1] + a[x+1][y] + a[x+11][y-1]
	+ a[x][y+1] + a[x][y-1]
	+ a[x-1][y+1] + a[x-1][y] + a[x-1][y-1]
	== 3){
		return 1;
	}

	else if (a[x+1][y+1] + a[x+1][y] + a[x+11][y-1]
	+ a[x][y+1] + a[x][y-1]
	+ a[x-1][y+1] + a[x-1][y] + a[x-1][y-1]
	== 2){
		return a[x][y];
	}

	else{
		return 0;
	}
}

int main(void)
{
	int x;
	int y;
	int c;

	for(c = 0; c <= 2; c++){

		for (x = 0; x <= 7; x++){
			for (y = 0; y <= 7; y++){
				printf("%d ",a[x][y]);
			}
			printf("\n");
		}

		for (x = 1; x <= 6; x++){
			for (y = 1; y <= 6; y++){
				b[x][y] = cheak(x,y);
			}
		}

		for (x = 0; x <= 7; x++){
			for (y = 0; y <= 7; y++){
				a[x][y] = b[x][y];
			}
		}

		printf("\n");

	}

	return 0;
}

Re: c言語 動作しない理由がわかりません。

Posted: 2012年6月06日(水) 20:06
by beatle
正常に動かないとおっしゃいますが、正常に動かないのにもいくつか種類があります。
  • そもそもコンパイル(ビルド)が完了しない
  • ビルドは成功するが、アプリを起動させると強制終了する
  • 強制終了はしないが、期待した動作をしてくれない
もし、「正常に動かない」ときに何かエラーメッセージのようなものが出ているのであれば、それを貼り付けて下さい。

Re: c言語 動作しない理由がわかりません。

Posted: 2012年6月06日(水) 20:42
by box
ぱっと見ですけど、
fwLight さんが書きました:

コード:

	if (a[x+1][y+1] + a[x+1][y] + a[x+11][y-1]
	else if (a[x+1][y+1] + a[x+1][y] + a[x+11][y-1]
1)[x+11]というのは、配列の定義範囲外の領域ではないかと思います。
2)printf()を使っているので、stdio.hをインクルードする必要があるのではないかと思います。

Re: c言語 動作しない理由がわかりません。

Posted: 2012年6月09日(土) 10:19
by fwLight
>boxさん
1)打ち間違いでした。ご指摘ありがとうございます。
2)コピー・ペーストの範囲を誤っておりました。
>beatleさん
すみません言葉足らずでした。
ビルドも成功し、起動はするのですが、思った通りに動作してくれません。

下記のものがBoxさんに指摘を受け直したコードと実行結果です。

///////////////////////////////実行結果///////////////
a[1][1]=0; a[1][2]=1; a[1][3]=0;
a[2][1]=0; a[2][2]=1; a[2][3]=0;
a[3][1]=0; a[3][2]=1; a[3][3]=0;

a[1][1]=0; a[1][2]=1; a[1][3]=0;
a[2][1]=0; a[2][2]=1; a[2][3]=0;
a[3][1]=0; a[3][2]=1; a[3][3]=0;

a[1][1]=0; a[1][2]=1; a[1][3]=0;
a[2][1]=0; a[2][2]=1; a[2][3]=0;
a[3][1]=0; a[3][2]=1; a[3][3]=0;

続行するには何かキーを押してください . . .
///////////////////実行結果//////////////////

コード:

#include<stdio.h>
int a[8][8] = {	
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0},
		{0,0,0,1,0,0,0,0},
		{0,0,0,1,1,0,0,0},
		{0,0,0,1,0,0,0,0},
		{0,0,0,0,0,0,0,0},
		{0,0,0,0,0,0,0,0}
	};
int b[8][8];

int cheak(int x, int y)
{
	if (a[x+1][y+1] + a[x+1][y] + a[x+1][y-1]
	+ a[x][y+1] + a[x][y-1]
	+ a[x-1][y+1] + a[x-1][y] + a[x-1][y-1]
	== 3){
		return 1;
	}

	else if (a[x+1][y+1] + a[x+1][y] + a[x+1][y-1]
	+ a[x][y+1] + a[x][y-1]
	+ a[x-1][y+1] + a[x-1][y] + a[x-1][y-1]
	== 2){
		return a[x][y];
	}

	else{
		return 0;
	}
}

int main(void)
{
	int x;
	int y;
	int c;

	for(c = 0; c <= 2; c++){

		for (x = 0; x <= 7; x++){
			for (y = 0; y <= 7; y++){
				printf("%d ",b[x][y]);
			}
			printf("\n");
		}

		for (x = 1; x <= 6; x++){
			for (y = 1; y <= 6; y++){
				b[x][y] = cheak(x,y);
			}
		}

		for (x = 0; x <= 7; x++){
			for (y = 0; y <= 7; y++){
				a[x][y] = b[x][y];
			}
		}

		printf("\n");

	}

	return 0;
}

Re: c言語 動作しない理由がわかりません。

Posted: 2012年6月09日(土) 10:30
by へにっくす
fwLight さんが書きました:///////////////////////////////実行結果///////////////
a[1][1]=0; a[1][2]=1; a[1][3]=0;
a[2][1]=0; a[2][2]=1; a[2][3]=0;
a[3][1]=0; a[3][2]=1; a[3][3]=0;

a[1][1]=0; a[1][2]=1; a[1][3]=0;
a[2][1]=0; a[2][2]=1; a[2][3]=0;
a[3][1]=0; a[3][2]=1; a[3][3]=0;

a[1][1]=0; a[1][2]=1; a[1][3]=0;
a[2][1]=0; a[2][2]=1; a[2][3]=0;
a[3][1]=0; a[3][2]=1; a[3][3]=0;

続行するには何かキーを押してください . . .
///////////////////実行結果//////////////////
コードは8x8なのに結果が3x3なのはなぜ?
コードはprintf( "%d " );だけしかないのに
配列の要素も出力している?

本当にそのコードで出力した結果ですか?
デバッグのウオッチでみる結果を載せても意味ないですよ

Re: c言語 動作しない理由がわかりません。

Posted: 2012年6月09日(土) 11:22
by fwLight
すいません他のコードを実行してました。
今、指摘されて、先ほどのコードを実行してましたところ、出来ました!
ありがとうございます!ほんとにありがとうございます1!

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0
0 0 1 1 1 0 0 0
0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 1 0 0 0
0 0 1 0 0 1 0 0
0 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0