「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」となります

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

「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」となります

#1

投稿記事 by Jimmy » 13年前

最近、開発環境をVisual C++ 2005に変えたばかりです。OSはXPを使用しています。

C言語で迷路の自動作成を「棒倒し法」を使って作ろうとしています。
ですが、作成したコードがいろいろと問題を抱えているようなので質問させていただきました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int *maze, width, height, i, dir[4]={1,-1}, put;
	FILE *fp;

	width = 21;
	height = 21;
	dir[2] = width;
	dir[3] = -width;
	
	maze = (int *)malloc((int)width*height);
	srand((unsigned)time(NULL));

	for(i=0; i<width*height; i++){
		if(i<width || i>=width*height-width|| !(i%width) || i%width==width-1){
			maze[i]=1;
		} else {
			if(!(i%width%2)&&!(i/width%2)) {
				maze[i] = 1;
				while(maze[put=i+dir[rand()%4]]);
				maze[put]=1;
			} else {
				maze[i]=0;
			}
		}
	}
	
	// 配列表示
	for(i=0; i<width*height; i++){
		printf("%d ",maze[i]);
		if(i%width == width-1) printf("\n");
	}
	
	// ファイル書き出し
	fp = fopen("test.txt","w");
	for(i=0; i<width*height; i++){
		fprintf(fp,"%d ",maze[i]);
		if(i%width == width-1) fprintf(fp,"\n");
	}
	fclose(fp); 
	free(maze);
	return 0;
}
maze[]に迷路のデータが入ります。通れるところは0、通れない所は1が入ります。
widthとheightはそれぞれ、迷路の横幅と高さです。
dir[]は四方向を記録しています。
 dir[0]: 右
 dir[1]: 左
 dir[2]: 下
 dir[3]: 上

実行すると次のようなメッセージがでます。
'迷路作成.exe': 'C:(省略)\Visual Studio 2005\Projects\迷路作成\debug\迷路作成.exe' を読み込みました。シンボルが読み込まれました。
'迷路作成.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。シンボルが読み込まれていません。
'迷路作成.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。シンボルが読み込まれていません。
'迷路作成.exe': 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_f75eb16c\msvcr80d.dll' を読み込みました。シンボルが読み込まれていません。
'迷路作成.exe': 'C:\WINDOWS\system32\msvcrt.dll' を読み込みました。シンボルが読み込まれていません。
'迷路作成.exe': 'C:\WINDOWS\system32\shimeng.dll' を読み込みました。シンボルが読み込まれていません。
'迷路作成.exe': 'C:\WINDOWS\system32\shimeng.dll' をアンロード
迷路作成.exe の 0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 を読み込み中にアクセス違反が発生しました。
迷路作成.exe の 0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 を読み込み中にアクセス違反が発生しました。
迷路作成.exe の 0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 を読み込み中にアクセス違反が発生しました。
(省略)
迷路作成.exe の 0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 を読み込み中にアクセス違反が発生しました。
迷路作成.exe の 0x7c943258 で初回の例外が発生しました: 0xC0000005: 場所 0x00d00ffc に書き込み中にアクセス違反が発生しました。
迷路作成.exe の 0x7c943258 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00d00ffc に書き込み中にアクセス違反が発生しました。
プログラム '[2308] 迷路作成.exe: ネイティブ' はコード 0 (0x0) で終了しました。
黒い画面はでますが、エラー音がなり、キー待ち状態みたいになるので[☓]で閉じるとエラーのダイアログ(?)がでてきます。

変数を表示したり、プログラムの一部をコメントアウトしたりしてみましたが、結局上手くいきませんでした。
ですので、お力を貸してください!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」と

#2

投稿記事 by softya(ソフト屋) » 13年前

malloc((int)width*height);に問題があります。
これがどういう事を意図しているか説明してみてください。
正解を示すのは簡単ですが、何処まで理解ているのか整理するのが大切だと思いました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Jimmy

Re: 「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」と

#3

投稿記事 by Jimmy » 13年前

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

えーとですね・・・・コピペして利用しているような感じですが、やりたいことは・・・
width*heightで迷路のサイズをint型のバイト分メモリを確保したかったです。

mallocの使い方を覚えたサイトに言ってみると、原因が分かりました。
malloc(sizeof(int)*width*height);
これで正常に動きました。ありがとうございます。

他にもバグがあって、0~3の乱数を発生させたいのですが、1と3しか発生してないようです。
24行目のrand()%4です。良ければ、考えられる原因を教えて下さい!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」と

#4

投稿記事 by softya(ソフト屋) » 13年前

そのまま理解せずに使うのは危険だと思うわけですが、大丈夫ですか?

それと乱数の件は、maze[put=i+dir[rand()%4]]が不慣れなのにまとめすぎだと複数の文に分解してみてください。
分解すればデバッガで値を確認できるようになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Jimmy

Re: 「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」と

#5

投稿記事 by Jimmy » 13年前

乱数の件は解決できそうです。ありがとうございました!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」と

#6

投稿記事 by softya(ソフト屋) » 13年前

Jimmy さんが書きました:乱数の件は解決できそうです。ありがとうございました!
フォーラムルールでは質問の正解まで書いて頂くことになっていますのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Jimmy

Re: 「0x7c95839e で初回の例外が発生しました: 0xC0000005: 場所 0xfffffff8 …」と

#7

投稿記事 by Jimmy » 13年前

わかりました。フォーラムルール通り従いますね。

原因は初期化されていないmaze[]配列でした。
左上から右下に向かって0と1の値を代入していきます。(18~30行目)
1を代入作業は乱数が0~3(四方向)にすべて起こっていますが、いままで代入した左(1)上(3)しか(それ以外は不定値)0が入っていないため、乱数は1,3しか発生してないように見えていました。

すみません。説明が意味不明ですが、初期化されていないmaze[]が原因です。
17と18行目の間にmaze[]の要素にすべて0を代入すれば大丈夫です。

今回softya(ソフト屋)さんにはお世話になりました。
答えをすぐに出さずに、原因の場所だけ(ヒント)を教えて下さったので、勉強になりました。
これでもう覚えました。ありがとうございました。

閉鎖

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