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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
残念
記事: 36
登録日時: 5年前

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

#1

投稿記事 by 残念 » 5年前

残念と申します。エラーが出たので質問をさせていただきます。 
このようなコードを書いてみたところ、

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)。」
というようなエラー(警告?)がでました。
改善案を教えてください!お願いします。
最後に編集したユーザー 残念 on 2015年6月20日(土) 08:55 [ 編集 1 回目 ]

Rittai_3D
記事: 525
登録日時: 7年前

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

#2

投稿記事 by Rittai_3D » 5年前

先ほどと同様でスマホからなので勘ですが、範囲外アクセスしてませんか?
あのサンプルコードはエラーチェックはしていません。
windomode関数の引数が範囲外でないかのチェックをしてみて下さい。
初心者です

残念
記事: 36
登録日時: 5年前

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

#3

投稿記事 by 残念 » 5年前

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 ]();
}
の部分(のつもり)です。
範囲外アクセスは(このド素人からすると)ないんじゃないかな…とおもったのですが…。
どうでしょう…自信なくなってきた(恐らく仰る通り範囲外アクセスでしょう。ちょっと見直してきます)。

残念
記事: 36
登録日時: 5年前

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

#4

投稿記事 by 残念 » 5年前

恐らく…引数の配列でむちゃくちゃになってるのではないか、と今気付き(?)ましたので、明日にも修正してみます

アバター
みけCAT
記事: 6274
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 5年前

残念 さんが書きました: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 };
としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

残念
記事: 36
登録日時: 5年前

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

#6

投稿記事 by 残念 » 5年前

みけCAT さん、ご返答有難うございます。
動きました!
本当に有難うございました。
3Dさんも、ご指摘有難うございました(今回は範囲外アクセスではなかったようです)!


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

Rittai_3D
記事: 525
登録日時: 7年前

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

#7

投稿記事 by Rittai_3D » 5年前

タイトルに「解決しました」ではなく、解決ボタンを押してくださいね。
解決ボタンは送信ボタンの隣にあります。
初心者です

naohiro19
記事: 256
登録日時: 9年前
住所: 愛知県

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

#8

投稿記事 by naohiro19 » 5年前

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

閉鎖

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