DXライブラリでウィンドウが表示しない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

DXライブラリでウィンドウが表示しない

#1

投稿記事 by rozeo » 11年前

こんにちは、rozeoです。

自分はDXライブラリを用いてこんな基礎プログラムを書きました。

コード:

//Main.cpp
#include "DxLib.h"
#include "GV.h"
#include "CheckKey.h"

extern void CheckKeyAll();

int ProcessLoop(){
	if(ProcessMessage() < 0){
		return -1;
	}
	if(SetDrawScreen(DX_SCREEN_BACK) == -1){
		return -1;
	}

	CheckKeyAll();
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	
	ChangeWindowMode(TRUE);
	SetGraphMode(300,500,32);

	if(DxLib_Init < 0){
		MessageBox(NULL,_T("DXライブラリの初期化に失敗"),_T("Error"),MB_OK);
		return -1;
	}

	while(ProcessLoop() != 0){

		if(CheckStateKey(KEY_INPUT_ESCAPE) != 0){
			break;
		}
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

コード:

//CheckKey.cpp
#include "DxLib.h"

int stateKey[256];

void CheckKeyAll(){
	char key[256];
	GetHitKeyStateAll(key);
	for(int i = 0;i < 256;i++){
		if(key[i] == 1) stateKey[i]++;
		else            stateKey[i] = 0;
	}
}

int CheckStateKey(unsigned char Handle){
	return stateKey[Handle];
}
※CheckKey.hにはCheckStateKey関数のプロトタイプ宣言が書いてあります。

そしてこのプログラムをデバッグしたときに、なぜかウィンドウが表示されませんでした。ブレークポイントを用いて確認しましたが、ちゃんとwhileの中までちゃんと実行されています。
コンパイル、リンクエラーもおきませんでした。

実行ログはこちらです。

コード:

'DestroyBlock.exe': 'C:\Documents and Settings\ken-dai\My Documents\Visual Studio 2010\Projects\DestroyBlock\Debug\DestroyBlock.exe' を読み込みました。シンボルが読み込まれました。
'DestroyBlock.exe': 'C:\WINDOWS\system32\ntdll.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\kernel32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\user32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\gdi32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\shell32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\advapi32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\rpcrt4.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\secur32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\msvcrt.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\shlwapi.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\imm32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\lpk.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\usp10.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\comctl32.dll' を読み込みました。Cannot find or open the PDB file
'DestroyBlock.exe': 'C:\WINDOWS\system32\comctl32.dll' を読み込みました。Cannot find or open the PDB file
プログラム '[2524] DestroyBlock.exe: ネイティブ' はコード 0 (0x0) で終了しました。
DestroyBlockはこのプロジェクトの名前です。

なにが原因と考えられるか、教えてください。お願いします。

rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: DXライブラリでウィンドウが表示しない

#2

投稿記事 by rozeo » 11年前

P.S.

DXライブラリで作ったほかのプログラムはちゃんと動きました。

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

Re: DXライブラリでウィンドウが表示しない

#3

投稿記事 by Rittai_3D » 11年前

SetDrawScreenは毎回呼び出すのではなくて、一度だけ呼び出すだけでいいのでは?
スマホからなので誤字や脱字がありましたらすいません。
rozeo さんが書きました:

コード:

//Main.cpp
#include "DxLib.h"
#include "GV.h"
#include "CheckKey.h"

extern void CheckKeyAll();

int ProcessLoop()
{
	if( ProcessMessage() != 0 ) { //自分はこう書きます
		return -1;
	}
	if( ClearDrawScreen() != 0 ) { //もしかして、これと間違えた?
		return -1;
	}

	CheckKeyAll();
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	
	ChangeWindowMode(TRUE);
	SetGraphMode(300,500,32);

	if(DxLib_Init !=  0){
		MessageBox(NULL,_T("DXライブラリの初期化に失敗"),_T("Error"),MB_OK);
		return -1;
	}

       SetDrawScreen( DX_SCREEN_BACK );//エラーチェックはしてません。スマホからだと地味に大変なので
	while(ProcessLoop() != 0){

		if(CheckStateKey(KEY_INPUT_ESCAPE) != 0){
			break;
		}
		ScreenFlip();
	}

	DxLib_End();
	return 0;
}

コード:

//CheckKey.cpp
#include "DxLib.h"

int stateKey[256];

void CheckKeyAll(){
	char key[256];
	GetHitKeyStateAll(key);
	for(int i = 0;i < 256;i++){
		if(key[i] == 1) stateKey[i]++;
		else            stateKey[i] = 0;
	}
}

int CheckStateKey(unsigned char Handle){
	return stateKey[Handle];
}
コードのコメントにも書きましたが、SetDrawScreen()とClearDrawScreen()を間違えたかもしれませんね。

インデントもずれてるかもしれませんが悪しからず。
初心者です

rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: DXライブラリでウィンドウが表示しない

#4

投稿記事 by rozeo » 11年前

ご指摘ありがとうございます。やはりまちがえていましたので
if(SetDrawScreen(DX_SCREEN_BACK) == -1){
の部分を
if(ClearDrawScreen() == -1){
にかえ、
WinMain関数の方に

コード:

if(SetDrawScreen(DX_SCREEN_BACK)  == -1){
    MessageBox(NULL,_T("裏画面の設定に失敗"),_T("Error"),MB_OK);
を追加しました。(SetDrawScreenを何回呼び出してもうごしましたがw)

するとやっと原因が発見できました。
SetDrawScreenの条件分岐内のMessageBox関数が実行され、プログラムが終了しました。
終了したと同時に
DestroyBlock.exe の 0x00628a46 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000014 を読み込み中にアクセス違反が発生しました。
というエラーが返されました。
このエラーがどういうものか教えてください。

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

Re: DXライブラリでウィンドウが表示しない

#5

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

このエラーはアクセス違反、いわゆるセグフォですね。

コード:

if(DxLib_Init !=  0){
という行を

コード:

if(DxLib_Init() !=  0){
としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

rozeo
記事: 86
登録日時: 12年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: DXライブラリでウィンドウが表示しない

#6

投稿記事 by rozeo » 11年前

ああ...なにが原因かわかりました。

DxLib_Init関数の()をかいていませんでした。
()ないと変数扱いされるのでコンパイルエラーがおきないわけだ...
でDxLib_Initって変数はないから例外が返されるわけだ...
()を書いたらうごきました。
おさわがせどうもすいませんでしたm(__)m

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

Re: DXライブラリでウィンドウが表示しない

#7

投稿記事 by Rittai_3D » 11年前

すいません、余分なところまで消してしまったみたいです…

うう、お恥ずかしい…

何がともあれ、解決してよかったです。
初心者です

閉鎖

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