アプリケーションエラーになるのですが・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
雪中 蓮

アプリケーションエラーになるのですが・・・

#1

投稿記事 by 雪中 蓮 » 17年前

こんにちは。今、学校の課題で出されていたテトリスのAIを改造していたのですが
関数の最後のreturnでアプリケーションエラーがでてしまうのですが、
どうすればなおるのでしょうか?

その関数部分のみ貼っておきます。
int mitudo(const int field[FIELD_HEIGHT][FIELD_WIDTH], const int block[BLOCK_SIZE][BLOCK_SIZE], int posX, int xMin, int xMax){
	int sField[FIELD_HEIGHT][BLOCK_SIZE];
	int sBlock[BLOCK_SIZE][BLOCK_SIZE];
	int aki;

	for(int y = 0; y < FIELD_HEIGHT; y++){
		int x2;
		for(int x = 0, x2 = posX-BLOCK_SIZE/2; x < BLOCK_SIZE; x++,x2++){
			sField[y][x]=field[y][x2];
		}
	}

	for(int y = 0; y < BLOCK_SIZE; y++){
		int x2;
		for(int x = 0, x2 = xMin; x < BLOCK_SIZE; x++,x2++){
			sBlock[y][x]=block[y][x2];
		}
	}

	int Fitflg=0, posY=0;
	while(!Fitflg){
		for(int y=BLOCK_SIZE-1;y>=0&&!Fitflg;y--)
		{	for(int x=0;x<BLOCK_SIZE&&!Fitflg;x++)
			{	//ブロックが存在すれば
				if(sBlock[y][x]!=0)
				{//フィールド上の座標を取得
					int fy = posY + y;
					int fx = x;
					//縦幅チェック
					if(FIELD_HEIGHT < fy || sField[fy][fx]!=0)
					{
						posY--;
						for(int y2=0;y2<BLOCK_SIZE;y2++){
							for(int x2=0;x2<BLOCK_SIZE;x2++){
								sField[posY+y2][x2]=sBlock[y2][x2];
							}
						}
						Fitflg++;
					}
				}
			}
		}
		posY++;
	}

	int lastY;
	aki=0;
	for(int x=0;x<BLOCK_SIZE;x++){
		for(int	y=0; y<FIELD_HEIGHT; y++){
			if(sField[y][x]){
				lastY=y;
			}
		}

		for(int y=FIELD_HEIGHT-1;y>lastY;y--){
			if(!sField[y][x])	aki++;
		}
	}

	return aki; //←この部分でアプリケーションエラーと出る
}
よろしくお願いします。

Re:アプリケーションエラーになるのですが・・・

#2

投稿記事 by » 17年前

<pre>で囲んでください。
テトリスでAI?
>int Fitflg=0, posY=0;
はCでも認められてたっけ?
>int lastY;
これも。

とりあえず、最初に初期化してみたら?

雪中 蓮

Re:アプリケーションエラーになるのですが・・・

#3

投稿記事 by 雪中 蓮 » 17年前

回答ありがとうございます。

初期化を最初にしてみてもなりませんでした。
コンパイル自体はちゃんと通るのですが、
いざ実行させると小窓が出て、アプリケーションエラーと出て

"0x00000000"の命令が"0x00000000"のメモリを参照しました。メモリが"read"になることはできませんでした。

というメッセージが出るんです。

tk-xleader

Re:アプリケーションエラーになるのですが・・・

#4

投稿記事 by tk-xleader » 17年前

returnの前にストップさせる関数をいれるとどうなりますか。それぞれのストップ命令は以下です。

コンソールプログラム。→getchar()
Windows API→MessageBox(NULL,"","",MB_OK)
Dxライブラリ→WaitKey()

Justy

Re:アプリケーションエラーになるのですが・・・

#5

投稿記事 by Justy » 17年前

 スタック破壊していませんか?
 具体的に言うと mitudo()の最もネストが深い部分

  sField[posY+y2][x2]=sBlock[y2][x2]

 ここで sFieldへ書き込みを行っていますが、posY+y2や x2の値は
配列の範囲内に収まっていますか?

雪中 蓮

Re:アプリケーションエラーになるのですが・・・

#6

投稿記事 by 雪中 蓮 » 17年前

回答ありがとうございます。
そして遅くなって申し訳ありません。

デバックしてみたら、Justyさんの仰ってたように
スタック破壊をしてしまっていたようです。

回答してくれた皆さんどうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る