ページ 11

アサートが落ちる?

Posted: 2015年8月18日(火) 22:25
by Qloeh
毎度毎度すみません。テキストに従ってマップを読み込むプログラムを書いてみたのですが、fopenとfscanfでC4996エラーが出ます。fopen_sとfscanf_sにすると、Assertion Failed!という警告が出て、プログラムが終了されます。ただし、ビルドには成功しているようなのです。
ソースコードは下の通りです。

コード:

void fileload(void){
	int f, g, h;
	LoadDivGraph("マップチップ", 4, 4, 1, 32, 32, mapchip[0]);
	LoadDivGraph("マップチップその2",192,16,12,32,32,mapchip[1]);
	LoadDivGraph("CharaChip1", 12, 3, 4, 32, 32, charachip);
	LoadDivGraph("CharaChip2", 12, 3, 4, 32, 32, charachip2);
	FILE*fp;
	if ((fopen_s(&fp,"map.txt", "r")) == NULL)
		printf("ファイルをオープンできません\n");
	else{
		f = 0;
		g = 0; while (fscanf(fp, "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", &map[f][g][0], &map[f][g][1],
			&map[f][g][2], &map[f][g][3], &map[f][g][4], &map[f][g][5], &map[f][g][6], &map[f][g][7], &map[f][g][8],
			&map[f][g][9], &map[f][g][10], &map[f][g][11], &map[f][g][12], &map[f][g][13], &map[f][g][14], &map[f][g][15],
			&map[f][g][16], &map[f][g][17], &map[f][g][18], &map[f][g][19]) == 20){
			g++;
			if (g == 15){
				f = f + 1;
				g = 0;
			}
		}
		fclose(fp);
	}
fscanf_sを使用した場合のメッセージがこちらです。

Microsoft Visual C++ Runtime Library

Debug Assertion Failed!

Program:...cuments\VisualStudio2013\Project\DXAPPLY.exe
File:f\\dd\vctools\crt\crtw32\studio\fscanf.c
Line:52

Expression:(stream!=NULL)

For infomation on how your program can cause an assertion failure,
see the Visual C++ documentation on asserts.

因みに、私が使っているのは2013ですが、参考書は2010 のようです。
プログラムの破損とかでしたら怖いので、良ければ解答をお願いします

Re: アサートが落ちる?

Posted: 2015年8月18日(火) 23:35
by みけCAT
Qloeh さんが書きました:

コード:

	if ((fopen_s(&fp,"map.txt", "r")) == NULL)
		printf("ファイルをオープンできません\n");
	else{
この部分が間違っています。
fopen_sの戻り値は正常終了のとき0、エラーのときエラーコードのはずなので、
戻り値がNULL(多くの処理系で0に変換可能?)のときではなく、0ではない(=真)のとき、かつその時に限り「ファイルをオープンできません」という判定にしないといけません。

fopen_s、_wfopen_s
戻り値

正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。 これらのエラー コードの詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。

Re: アサートが落ちる?

Posted: 2015年8月18日(火) 23:57
by Qloeh
有難う御座います。条件を変えてビルドするとエラーがでなくなりましたが、
今度はプログラムが応答しなくなりましたね。C4996の警告を無効化していたので、何か不味かったでしょうか