デバックするとウィンドウは出るのにすぐに消えてしまいます。

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

デバックするとウィンドウは出るのにすぐに消えてしまいます。

#1

投稿記事 by 田中太郎 » 13年前

C++で簡単なじゃんけんゲームを作ってみようとしたのですが、その途中段階でエラーが出てしまいました。どこか間違えてるはずなんですが、自分では見つけることが出来なかったのでこちらで質問させて頂きました。

エラー内容は、デバックしてウィンドウが表示されると数秒後に勝手に閉じてしまうことです。
また、デバックは問題なく出来るのですがエラーメッセージで「値を返さないコントロールパスがあります」と出ます。これも関係しているのでしょうか。

※どこが原因がわからないので、今書いてある文を全部貼ります。なので少し長いかもしれません。

コード:

//main.cpp

#include "DxLib.h"
#include "Key.h"
#include "mode.h"
#include "title.h"
#include "play.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

		switch(mode_func(0,0)){
			case 0  : title_main(); break;
			case 1  :  play_main(); break;
			case 10 :  DxLib_End(); break;

		}

		DxLib_End();
		return 0;
	}
}

コード:

//title.cpp

#include "DxLib.h"
#include "key.h"
#include "mode.h"

static int m_y=305;

void title_menu(){
	DrawString(  80 , m_y , "■" ,GetColor(255,255,255) );
	DrawString( 100 , 300 , "START" ,GetColor(255,255,255) );
	DrawString( 100 , 320 , "EXIT" ,GetColor(255,255,255) );
}

void title_key(){
	if(Key_Get(KEY_INPUT_DOWN)==1 ||(Key_Get(KEY_INPUT_DOWN)%5==0 && Key_Get(KEY_INPUT_DOWN)>20)){
		// たった今押したか、20カウンター以上押しっぱなしかつ5回に一度
		m_y+=20;
		if(m_y==345)	//y座標が一番下なら
			m_y=305;	//選択座標を一番上に
	}

	if(Key_Get(KEY_INPUT_UP)==1 ||(Key_Get(KEY_INPUT_UP)%5==0 && Key_Get(KEY_INPUT_UP)>20)){
		// たった今押したか、20カウンター以上押しっぱなしかつ5回に一度
		m_y-=20;
		if(m_y==285)	//y座標が一番上なら
			m_y=305;	// 選択座標を一番上に
	}

	if(m_y==305){
		if(Key_Get(KEY_INPUT_RETURN)==1){
			mode_func(1,1);}
	}

	if(m_y==325){
		if(Key_Get(KEY_INPUT_RETURN)==1){
			mode_func(1,10);}
	}
}

void title_main(){
	title_menu();
	title_key();
}

コード:

//title.h

#ifndef DEF_TITLE_H
#define DEF_TITLE_H

void title_main();

#endif

コード:

//play.cpp

#include "DxLib.h"

void play_main(){
	DrawString( 0 , 0 , "( ̄ー ̄)bグッ!" ,GetColor(255,255,255) );
}

コード:

//play.h

#ifndef DEF_PlAY_H
#define DEF_PlAY_H

void play_main();

#endif

コード:

//key.cpp

#include "DxLib.h"

static int m_Key[256];  // キーの入力状態格納用変数

// キーの入力状態更新
void Key_Update(){
        char tmpKey[256];             // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey );  // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        m_Key[i]++;   // 加算
                } else {              // 押されていなければ
                        m_Key[i] = 0; // 0にする
                }
        }
}

// KeyCodeのキーの入力状態を取得する
int Key_Get( int KeyCode ){
        return m_Key[ KeyCode ]; // KeyCodeの入力状態を返す
} 

コード:

//key.h

#ifndef DEF_KEY_H //二重include防止
#define DEF_KEY_H

// キーの入力状態を更新する
void Key_Update();

// 引数のキーコードのキーの入力状態を返す
int Key_Get( int KeyCode );

#endif 

コード:

//mode.cpp

int mode_func(int mode_sel, int mode_new)
{
	static int m_mode = 0; //現在のmode(最初はゼロ)

	if(mode_sel == 0)
		return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。

	else if(mode_sel == 1)
		m_mode = mode_new;
}

コード:

//mode.h

#ifndef DEF_MODE_H
#define DEF_MODE_H

int mode_func(int mode_sel, int mode_new);

#endif
※以上です。

わかる方居ましたら教えてください。
よろしくお願いします。

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#2

投稿記事 by とっち » 13年前

main.cppのmain関数において
DxLib_End();とreturn 0;
がwhile文の中にあります

ですから、ループの一回目にreturnされてmain関数が終了してしまいます。

田中太郎
記事: 24
登録日時: 13年前

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#3

投稿記事 by 田中太郎 » 13年前

>とっちさん

まったく気づきませんでした。
ご回答頂きありがとうございました。

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#4

投稿記事 by とっち » 13年前

ちなみに「値を返さないコントロールパスがあります」という警告についてですが、
この警告は直しておくことを推奨します。
今回の場合、

コード:

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
     // 略
    while(条件){
       // 処理
       return 0;
    }
}
間違っていたコードはこのようになっていたと思います。
このとき、もしwhile文の中に入らなかった場合WinMain関数は
intの値を返さなければならないのにもかかわらず、返すあたいがありません。
ですから「値を返さないコントロールパスがあります」という警告が発せられます。

同様に

コード:

//mode.cpp
 
int mode_func(int mode_sel, int mode_new)
{
    static int m_mode = 0; //現在のmode(最初はゼロ)
 
    if(mode_sel == 0)
        return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。
 
    else if(mode_sel == 1)
        m_mode = mode_new;
}
もmode_selが0または1以外(たとえば2など)のとき
mode_func関数は値を返せずエラーとなります。

だから

コード:

int mode_func(int mode_sel, int mode_new)
{
    static int m_mode = 0; //現在のmode(最初はゼロ)
 
    if(mode_sel == 0)
        return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。
 
    else if(mode_sel == 1)
        m_mode = mode_new;
    else
        return -1// エラーなら-1を返す
}
のようにすべきです。

田中太郎
記事: 24
登録日時: 13年前

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#5

投稿記事 by 田中太郎 » 13年前

なるほどです。
解答して頂いた上に警告の方も教えて頂きありがとうございます。
早速取り入れようと思います。
本当にありがとうございました。

かずま

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#6

投稿記事 by かずま » 13年前

とっち さんが書きました:だから

コード:

int mode_func(int mode_sel, int mode_new)
{
    static int m_mode = 0; //現在のmode(最初はゼロ)
 
    if(mode_sel == 0)
        return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。
 
    else if(mode_sel == 1)
        m_mode = mode_new;
    else
        return -1// エラーなら-1を返す
}
のようにすべきです。
return -1 の後に ; を補ったとしても、やはりこのプログラムは「値を返さないコントロールパスがあります」という警告が発せられますよ。

nil
記事: 428
登録日時: 13年前

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#7

投稿記事 by nil » 13年前

かずま さんが書きました:
とっち さんが書きました:だから

コード:

int mode_func(int mode_sel, int mode_new)
{
    static int m_mode = 0; //現在のmode(最初はゼロ)
 
    if(mode_sel == 0)
        return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。
 
    else if(mode_sel == 1)
        m_mode = mode_new;
    else
        return -1// エラーなら-1を返す
}
のようにすべきです。
return -1 の後に ; を補ったとしても、やはりこのプログラムは「値を返さないコントロールパスがあります」という警告が発せられますよ。

コード:

int mode_func(int mode_sel, int mode_new)
{
    static int m_mode = 0; //現在のmode(最初はゼロ)
 
    if(mode_sel == 0)
        return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。
 
    else if(mode_sel == 1)
        m_mode = mode_new;

    return -1// エラーなら-1を返す
}
こうすべきですね

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#8

投稿記事 by beatle » 13年前

多分mode_selが0か1のときはエラーじゃないので、mode_selが1のときにも-1を返してしまう涼雅さんのプログラムは、田中太郎さんの意図とは異なる気がします。
単なる憶測ですが。

nil
記事: 428
登録日時: 13年前

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#9

投稿記事 by nil » 13年前

beatle さんが書きました:多分mode_selが0か1のときはエラーじゃないので、mode_selが1のときにも-1を返してしまう涼雅さんのプログラムは、田中太郎さんの意図とは異なる気がします。
単なる憶測ですが。
本当ですね……気を付けなければいけませんね……
beatleさんご指摘ありがとうございますm(_ _)m

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#10

投稿記事 by beatle » 13年前

田中太郎さんのプログラムには、コメントに関する重要なミスが含まれます。

コード:

    if(mode_sel == 0)
        return m_mode; //mode_sel == 0ならmode_nowをそのまま返す。
コメントとプログラム本体が不整合を起こしています。こういう場合の整合性がないコメントは害です。
コメントが間違っていてもプログラムは動きますが、間違ったコメントは凶悪です。
後から見返したとき、または他人が読んだとき、プログラムのミスなのか、コメントのミスなのか判断できません!

田中太郎
記事: 24
登録日時: 13年前

Re: デバックするとウィンドウは出るのにすぐに消えてしまいます。

#11

投稿記事 by 田中太郎 » 13年前

解決!マークを出したからもう誰も来ないだろうと思っていたので、返信数が9になっていて驚きました。
みなさん、ありがとうございます。

>beatleさん
ご指摘ありがとうございます。
これは自分だけわかればいいかな、と思い変えてませんでした。
考えたら、もっと多くのファイルを作ったりするとわからなくなるかもしれませんよね。
これからは他人が見てもわかるような設計を心がけることにします。

プログラムですが、とっちさんのでもエラーが出たので

コード:

//mode.cpp

int mode_func(int mode_sel, int mode_new)
{
	static int m_mode = 0; //現在のmode(最初はゼロ)

	if(mode_sel == 0)
		return m_mode; //mode_sel == 0ならm_modeをそのまま返す。

	else if(mode_sel == 1){
		m_mode = mode_new;
		return 0;
	}

	else
		return -1;	//エラーなら-1を返す
}
と書き換えました。
ですが、ウィンドウが表示されると警告文が見れないのでこれでエラーが出ないかはわからないです。
良かったら、どなたか結果を教えて頂けると助かります。

閉鎖

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