ページ 11

<解決しました>「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月19日(金) 23:34
by 残念
残念と申します。エラーが出たので質問をさせていただきます。 
このようなコードを書いてみたところ、

Sourse.cpp

コード:

#include "DxLib.h"
#include "Ztaizen.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	//宣言
	int x, y;
	int MouseX, MouseY;
	int key;
	int handle, grhandle;
	int red[4][1920][1080];
	int green[4][1920][1080];
	int blue[4][1920][1080];
	int window;
	int mode[4] = { 0, 0, 0, 0 };




	if (DxLib_Init() == -1)        // DXライブラリ初期化処理
	{
		return -1;        // エラーが起きたら直ちに終了
	}


	//設定
	window = 0;
	handle = MakeARGB8ColorSoftImage(1920, 1080);
	SetDrawScreen(DX_SCREEN_BACK);
	SetMouseDispFlag(TRUE);

	//実行
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		ClearDrawScreen();
		GetMousePoint(&MouseX, &MouseY);
		windomode(window,mode[window],red,green,blue);
		for (x = 0; x < 1920; x++)
		{
			for (y = 0; y < 1080; y++)
			{
				DrawPixelSoftImage(handle,x,y,red[window][x][y],green[window][x][y],blue[window][x][y],0);
			}
		}
		grhandle = CreateGraphFromSoftImage(handle);
		DeleteSoftImage(handle);
		DrawGraph(0, 0, grhandle, TRUE);
		key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		if (CheckHitKey(KEY_INPUT_ESCAPE) == 1)
		{
			break;
		}
		if (CheckHitKey(KEY_INPUT_F1) == 1){
		
			window = 1;
		}
		if (CheckHitKey(KEY_INPUT_F2) == 1){

			window = 2;
		}
		if (CheckHitKey(KEY_INPUT_F3) == 1){

			window = 3;
		}
		if (CheckHitKey(KEY_INPUT_BACK) == 1){

			window = 0;
		}
		if (CheckHitKey(KEY_INPUT_LSHIFT) == 1){

			if (mode[window]>=4){

				mode[window] += 1;
			}
			else
			{
				mode[window] = 0;
			}
		}
	
		
		ScreenFlip();
		

	}
	
	DxLib_End();            // DXライブラリ使用の終了処理

	return 0;            // ソフトの終了
}
Ztaizen.cpp

コード:

#include"Ztaizen.h"
//関数の内容は適当です
static void window0(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window11(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window12(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window13(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window14(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window21(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window22(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window23(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window24(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window31(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window32(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window33(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void window34(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]){
	int x, y;
	for (x = 0; x < 1920; x++)
	{
		for (y = 0; y < 1080; y++)
		{
			r[3][x][y] = 1;
			b[3][x][y] = 1;
			g[3][x][y] = 1;
		}
	}
}
static void(*windows[][4])(int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]) =
{
	window0,window0,window0,window0,
	window11,window12,window13,window14,
	window21,window22,window23,window24,
	window31,window32,window33,window34
};
void windomode(int w, int m, int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080])
{
	windows[w][m](r, g, b);
}
Ztaizen.h

コード:

void windomode(int w, int m, int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080]);
「ハンドルされない例外が 0x0181F577 (Win32Project-test.exe) で発生しました: 0xC00000FD: Stack overflow (パラメーター: 0x00000000, 0x001B2000)。」
というようなエラー(警告?)がでました。
改善案を教えてください!お願いします。

Re: 「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月19日(金) 23:53
by Rittai_3D
先ほどと同様でスマホからなので勘ですが、範囲外アクセスしてませんか?
あのサンプルコードはエラーチェックはしていません。
windomode関数の引数が範囲外でないかのチェックをしてみて下さい。

Re: 「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月20日(土) 00:07
by 残念
3Dさん、返信有難うございます。
windomode関数の引数はそれぞれ
int wにSource.cppのint windowを
int mにSource.cppのint mode[window]を
int r[4][1920][1080]にSource.cppのint red[4][1920][1080]
同様にbにblue、gにgreenを指定しています。
そして、Z(ry).cppにおいて、

コード:

void windomode(int w, int m, int r[4][1920][1080], int g[4][1920][1080], int b[4][1920][1080])
{
    windows[w][m](r, g, b);
}
と定義しています。
windows[w][m](r, g, b);はこの前の

コード:

// sub.cpp
// printHoge() と printFoo() は隠ぺいする

static void printHoge()
{
	cout << "Hoge" << endl;
}

static void printFoo()
{
	cout << "Foo" << endl;
}

static void ( *funcPtr[3] )( void ) =
{
	printHoge, printFoo, NULL,
};

// 外部からアクセスできる唯一の関数
void print( int num )
{
	funcPtr[ num ]();
}

// main.cpp

int main()
{
	print(0);
	print(1);
	
	return 0;
}
における

コード:

void print( int num )
{
	funcPtr[ num ]();
}
の部分(のつもり)です。
範囲外アクセスは(このド素人からすると)ないんじゃないかな…とおもったのですが…。
どうでしょう…自信なくなってきた(恐らく仰る通り範囲外アクセスでしょう。ちょっと見直してきます)。

Re: 「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月20日(土) 00:26
by 残念
恐らく…引数の配列でむちゃくちゃになってるのではないか、と今気付き(?)ましたので、明日にも修正してみます

Re: 「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月20日(土) 00:26
by みけCAT
残念 さんが書きました:Sourse.cpp

コード:

#include "DxLib.h"
#include "Ztaizen.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	//宣言
	int x, y;
	int MouseX, MouseY;
	int key;
	int handle, grhandle;
	int red[4][1920][1080];
	int green[4][1920][1080];
	int blue[4][1920][1080];
	int window;
	int mode[4] = { 0, 0, 0, 0 };
こんな巨大な配列をローカルの自動変数に置いたら、スタックオーバーフローで死ぬリスクが大いに高まります。
例えば、

コード:

#include "DxLib.h"
#include "Ztaizen.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	//宣言
	int x, y;
	int MouseX, MouseY;
	int key;
	int handle, grhandle;
	static int red[4][1920][1080];
	static int green[4][1920][1080];
	static int blue[4][1920][1080];
	int window;
	int mode[4] = { 0, 0, 0, 0 };
としてみてください。

Re: 「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月20日(土) 00:40
by 残念
みけCAT さん、ご返答有難うございます。
動きました!
本当に有難うございました。
3Dさんも、ご指摘有難うございました(今回は範囲外アクセスではなかったようです)!


また質問することがあると思いますのでよろしければ、是非添削(?)してくださるとうれしいです。

Re: <解決しました>「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月20日(土) 10:04
by Rittai_3D
タイトルに「解決しました」ではなく、解決ボタンを押してくださいね。
解決ボタンは送信ボタンの隣にあります。

Re: 「ハンドルされない例外が 発生しました 」だそうです

Posted: 2015年6月20日(土) 11:35
by naohiro19
タイトルを変更しただけでは解決したとみなせません。
また、解決した時は、「解決しました」とだけ言って去らず、ソースコードや解決した方法を明記して下さい。
同じ事で困っている人の為に過去ログに有用な情報を残すようお願いします。