ウィンドウを最小化すると落ちてしまう。

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

ウィンドウを最小化すると落ちてしまう。

#1

投稿記事 by namari » 11年前

一度最小化して、再びウィンドウを開くと、再び開いた瞬間に重くなって、
直ぐに動作を停止してしまいます。
プロセス処理の部分で-1を返しているのですが、これは一体何を意味するのでしょうか。
このエラーはループのどの段階で行なっても起きます。最小化すると確実に落ちます。

コード:

 
//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す ここで-1を返して落ちてしまう。
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
    return 0;
}

追記:前にリリースしたバージョンだと起こらないことや、
他に一つ支離滅裂なバグが存在することから考えると、
(初期化してまだ出てくるはずのない状態異常フラグが初めから付いているバグが「リリースしたexe」で実行した場合のみ起こる)
質問するまでもなくメモリ侵犯なのではないかという疑惑が出てきました。
といっても、メモリ侵犯を効率よく調べる方法は分かりませんが。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#2

投稿記事 by namari » 11年前

まあ雲をつかむような質問でしたので返信が来ないのもしょうがないですね・・・。
あれから「とにかくコードを大雑把に消して、バグが出るか出ないかで場所を特定していく」ような形で原因を見つけました。
例えば、
load_main();←こちらを消す。バグが出なくなったら、この関数が原因。まだ出たならばfirst_iniが原因。
first_ini();
のような感じです。もしかしたら常套手段なのかもしれませんが今初めて思いついたので・・・。

しかし、特定は出来たのですが、結局どの表記がおかしいのか分かりません。
やはりメモリ侵犯だと思うのですが…
以下がバグの直接の原因となっていると同定された部分です。
画像の分割読み込み部です。
//8 //9 は画像の分割読み込みの切り方を中途半端にしてあえてエフェクトに工夫しています。この部分は怪しそうですが、これを消してもバグは消えません・・・。

コード:

//GV.cpp
GLOBAL int img_effect[501][100];   //エフェクト画像[エフェクト番号][エフェクト番号ごとのアニメーション用番号]
GLOBAL int effect_image_amount[501];//エフェクトの画像数
GLOBAL double effect_next_image_time[501];//エフェクトの画像送り時間
GLOBAL int effect_blend_number[501];//エフェクトの描画法。0普通 1加算

//load.cpp
		int number=0;
		number++;
		//1
		LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=5;
		effect_next_image_time[number]=0.2;
		number++;

		//2
		LoadDivGraph( "dat/img/effect/effect2.png" , 20 , 5 , 4 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=20;
		effect_next_image_time[number]=0.4;
		number++;

		//3
		LoadDivGraph( "dat/img/effect/effect3.png" , 12 , 12 ,1 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=12;
		effect_next_image_time[number]=0.4;
		number++;

		//4
		LoadDivGraph( "dat/img/effect/effect4.png" , 10 , 10 ,1 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=10;
		effect_next_image_time[number]=0.4;
		number++;

		//5
		LoadDivGraph( "dat/img/effect/effect5.png" , 10 , 10 ,1 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=10;
		effect_next_image_time[number]=0.4;
		number++;

		//6
		LoadDivGraph( "dat/img/effect/effect6.png" , 10 , 10 ,1 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=10;
		effect_next_image_time[number]=0.4;
		number++;

		//7
		LoadDivGraph( "dat/img/effect/effect7.png" , 8 , 4 ,2 , 144 , 144 , img_effect[number] ) ;
		effect_image_amount[number]=8;
		effect_next_image_time[number]=0.1;
		number++;

		//8
		LoadDivGraph( "dat/img/effect/effect8.png" , 7 , 1 ,7 , 600 , 257 , img_effect[number] ) ;//あえて画像読み込みの切り方をずらしている
		effect_image_amount[number]=7;
		effect_next_image_time[number]=0.4;
		number++;

		//9
		LoadDivGraph( "dat/img/effect/effect9.png" , 9 , 1 ,10 , 600 , 200 , img_effect[number] ) ;//あえて画像読み込みの切り方をずらしている
		effect_image_amount[number]=9;
		effect_next_image_time[number]=0.4;
		number++;


		//10
		LoadDivGraph( "dat/img/effect/effect10.png" , 5 , 1 ,5 , 320 , 120 , img_effect[number] ) ;
		effect_image_amount[number]=5;
		effect_next_image_time[number]=0.2;
		number++;

		//11
		LoadDivGraph( "dat/img/effect/effect11.png" , 10 , 10 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=10;
		effect_next_image_time[number]=0.2;
		effect_blend_number[number]=1;
		number++;

		//12
		LoadDivGraph( "dat/img/effect/effect12.png" , 7 , 7 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=7;
		effect_next_image_time[number]=0.2;
		number++;

		//13
		LoadDivGraph( "dat/img/effect/effect13.png" , 1 , 1 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=1;
		effect_next_image_time[number]=1;
		number++;

		//14
		LoadDivGraph( "dat/img/effect/effect14.png" , 8 , 8 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=8;
		effect_next_image_time[number]=0.2;
		number++;

		//15
		LoadDivGraph( "dat/img/effect/effect15.png" , 1 , 1 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=1;
		effect_next_image_time[number]=1;
		number++;

		//16
		LoadDivGraph( "dat/img/effect/effect16.png" , 8 , 8 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=8;
		effect_next_image_time[number]=0.05;
		number++;

		//17
		LoadDivGraph( "dat/img/effect/effect17.png" , 8 , 4 ,2 , 256 , 256 , img_effect[number] ) ;
		effect_image_amount[number]=8;
		effect_next_image_time[number]=0.1;
		number++;

		//18
		LoadDivGraph( "dat/img/effect/effect18.png" , 5 , 5 , 1 , 192 , 192 , img_effect[number] ) ;
		effect_image_amount[number]=5;
		effect_next_image_time[number]=0.2;
		number++;

		//19
		LoadDivGraph( "dat/img/effect/effect19.png" , 8 , 8 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=8;
		effect_next_image_time[number]=0.4;
		number++;

		//20
		LoadDivGraph( "dat/img/effect/effect20.png" , 10 , 5 , 2 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=10;
		effect_next_image_time[number]=0.8;
		number++;

		//21
		LoadDivGraph( "dat/img/effect/effect21.png" , 7 , 1 , 7 , 320 , 120 , img_effect[number] ) ;
		effect_image_amount[number]=7;
		effect_next_image_time[number]=0.8;
		number++;
		
		//22
		LoadDivGraph( "dat/img/effect/effect22.png" , 1 , 1 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=1;
		effect_next_image_time[number]=1;
		number++;

		//23
		LoadDivGraph( "dat/img/effect/effect23.png" , 1 , 1 ,1 , 48 , 48 , img_effect[number] ) ;
		effect_image_amount[number]=1;
		effect_next_image_time[number]=1;
		number++;
 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#3

投稿記事 by softya(ソフト屋) » 11年前

メモリ侵犯って聞いたこと無いけど有名な用語なのでしょうか? 検索でも引っかかりません。
独自用語は質問では使われないほうが良いと思います。

さて、ご質問の件ですがぱっと見には問題無さそうに見えます。
読み込み情報をテーブル化すれば楽そうな処理かなとは思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#4

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:メモリ侵犯って聞いたこと無いけど有名な用語なのでしょうか? 検索でも引っかかりません。
独自用語は質問では使われないほうが良いと思います。

さて、ご質問の件ですがぱっと見には問題無さそうに見えます。
読み込み情報をテーブル化すれば楽そうな処理かなとは思いますが。
メモリリークですかね。次から気を付けます。

問題ないですか・・・
もう一度試してみましたが、しつこくなんども最小化するとeffect画像読み込み部分を消しても落ちることがありました。
頻度はかなり下がるのですが、ここ以外に原因があるということですね。
以下は次に怪しい所というべきでしょうか。
「以下のコード+前述のeffect画像読み込み」をコードから取り除くのバグの一切がなくなります。20回ほど最小化して落ちたなかったのでおそらく全く無くなったのだと思われますが…。
こちらも正直おかしな表記などはないような気がするんですが・・・どうでしょうか。

コード:

 
//GV.h

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

//画像用変数宣言部
GLOBAL int img_user[256];	//ユーザーアイコン
GLOBAL int img_block[256];   //壁、床とかの画像
GLOBAL int img_item[32];   //アイテム画像
GLOBAL int img_effect[501][100];   //エフェクト画像[エフェクト番号][エフェクト番号ごとのアニメーション用番号]
GLOBAL int img_board[256];   //その他画像
GLOBAL int img_darkness[10];   //暗闇画像
GLOBAL int img_suuji[100];
GLOBAL int img_trap[100];   //トラップ画像

GLOBAL int special_block_condition_effect_number[100];//特殊地形のエフェクト番号。最初のロードで読んどく

//音楽ファイル用変数宣言部
GLOBAL int sound_se[SE_MAX];
GLOBAL int SE_size;

//load.cpp
       //前述のeffect画像分割読み込み

		LoadDivGraph( "dat/img/darkness_block.png" , 9 , 3 , 3 , 48 , 48 , img_darkness ) ;
		LoadDivGraph( "dat/img/suuji12x24.png" , 98 , 13 , 7 , 12 , 24 , img_suuji ) ;
		
		img_item[1]=LoadGraph("dat/img/item/item_bread.png");
		img_item[2]=LoadGraph("dat/img/item/item_plant.png");
		img_item[3]=LoadGraph("dat/img/item/item_makimono.png");
		img_item[4]=LoadGraph("dat/img/item/item_toilet.png");
		img_item[5]=LoadGraph("dat/img/item/item_paperplane.png");
		img_item[6]=LoadGraph("dat/img/item/item_weapon.png");
		img_item[7]=LoadGraph("dat/img/item/item_shield.png");
		img_item[8]=LoadGraph("dat/img/item/item_decoration.png");
		img_item[9]=LoadGraph("dat/img/item/item_money.png");
		img_item[10]=LoadGraph("dat/img/item/item_gag.png");
		img_item[11]=LoadGraph("dat/img/item/item_chaos.png");
		img_item[12]=LoadGraph("dat/img/item/item_tag.png");
		img_item[13]=LoadGraph("dat/img/item/item_icon.png");
		img_item[14]=LoadGraph("dat/img/item/item_favo.png");

		img_trap[1]=LoadGraph("dat/img/trap/sleep.png");
		img_trap[2]=LoadGraph("dat/img/trap/unco.png");
		img_trap[3]=LoadGraph("dat/img/trap/riora.png");
		img_trap[4]=LoadGraph("dat/img/trap/down.png");
		img_trap[5]=LoadGraph("dat/img/trap/nikoyaka.png");
		img_trap[6]=LoadGraph("dat/img/trap/bomb.png");
		img_trap[7]=LoadGraph("dat/img/trap/small_bomb.png");
		img_trap[8]=LoadGraph("dat/img/trap/oreore.png");
		img_trap[9]=LoadGraph("dat/img/trap/banana.png");
		img_trap[10]=LoadGraph("dat/img/trap/beat.png");
		img_trap[11]=LoadGraph("dat/img/trap/tako.png");
		img_trap[12]=LoadGraph("dat/img/trap/raicyu.png");
		img_trap[13]=LoadGraph("dat/img/trap/pikurusu.png");
		img_trap[14]=LoadGraph("dat/img/trap/natume.png");
		img_trap[15]=LoadGraph("dat/img/trap/xhalx.png");
		img_trap[16]=LoadGraph("dat/img/trap/keira.png");
		img_trap[17]=LoadGraph("dat/img/trap/aoshi.png");
		img_trap[18]=LoadGraph("dat/img/trap/JUMP.png");
		img_trap[19]=LoadGraph("dat/img/trap/kinoko.png");
		img_trap[20]=LoadGraph("dat/img/trap/hanryu.png");
		img_trap[21]=LoadGraph("dat/img/trap/kuchito.png");
		img_trap[22]=LoadGraph("dat/img/trap/siokosyou.png");

		img_trap[99]=LoadGraph("dat/img/trap/anime.png");

		number=1;
		special_block_condition_effect_number[number]=12;number++;//1
		special_block_condition_effect_number[number]=13;number++;//2
		special_block_condition_effect_number[number]=13;number++;//3
		special_block_condition_effect_number[number]=13;number++;//4
		special_block_condition_effect_number[number]=13;number++;//5
		special_block_condition_effect_number[number]=14;number++;//6
		special_block_condition_effect_number[number]=15;number++;//7
		special_block_condition_effect_number[number]=16;number++;//8
		special_block_condition_effect_number[number]=22;number++;//9
		special_block_condition_effect_number[number]=23;number++;//10

		sound_se[1]=LoadSoundMem("dat/se/jingle/levelup.ogg");
		sound_se[2]=LoadSoundMem("dat/se/effect/punch.ogg");
		sound_se[3]=LoadSoundMem("dat/se/effect/item_nanika.ogg");
		sound_se[4]=LoadSoundMem("dat/se/effect/sonic.ogg");
		sound_se[5]=LoadSoundMem("dat/se/effect/haaaaa.ogg");
		sound_se[6]=LoadSoundMem("dat/se/effect/up.ogg");
		sound_se[7]=LoadSoundMem("dat/se/effect/down.ogg");
		sound_se[8]=LoadSoundMem("dat/se/effect/decide.ogg");
		sound_se[9]=LoadSoundMem("dat/se/effect/enter14.ogg");
		sound_se[10]=LoadSoundMem("dat/se/effect/escaped.ogg");
		sound_se[11]=LoadSoundMem("dat/se/effect/break.ogg");
		sound_se[12]=LoadSoundMem("dat/se/effect/bomb2.ogg");
		sound_se[13]=LoadSoundMem("dat/se/effect/trap.ogg");
		sound_se[14]=LoadSoundMem("dat/se/effect/water.ogg");
		sound_se[15]=LoadSoundMem("dat/se/effect/bocya.ogg");
		sound_se[16]=LoadSoundMem("dat/se/effect/se_maoudamashii_onepoint29.ogg");
		sound_se[17]=LoadSoundMem("dat/se/effect/damage2.ogg");
		sound_se[18]=LoadSoundMem("dat/se/effect/reitoubeam.ogg");
		sound_se[19]=LoadSoundMem("dat/se/effect/baku004a.ogg");
		sound_se[20]=LoadSoundMem("dat/se/effect/wallet1.ogg");
		sound_se[21]=LoadSoundMem("dat/se/effect/statusup.ogg");
		sound_se[22]=LoadSoundMem("dat/se/effect/se_maoudamashii_explosion08.ogg");
		sound_se[23]=LoadSoundMem("dat/se/effect/se_maoudamashii_element_fire12.ogg");
		sound_se[24]=LoadSoundMem("dat/se/effect/kaminari.ogg");
		sound_se[25]=LoadSoundMem("dat/se/effect/se_maoudamashii_element_wind03.ogg");
		sound_se[26]=LoadSoundMem("dat/se/effect/myon.ogg");
		sound_se[27]=LoadSoundMem("dat/se/effect/glass-break2.ogg");
		sound_se[28]=LoadSoundMem("dat/se/effect/car-drift1.ogg");
		sound_se[29]=LoadSoundMem("dat/se/effect/magic-quake2.ogg");
		sound_se[30]=LoadSoundMem("dat/se/effect/metal1.ogg");
		sound_se[31]=LoadSoundMem("dat/se/effect/se_maoudamashii_magical25.ogg");
		sound_se[32]=LoadSoundMem("dat/se/effect/vacuum-cleaner-on1.ogg");
		sound_se[33]=LoadSoundMem("dat/se/effect/write.ogg");
		sound_se[34]=LoadSoundMem("dat/se/effect/stupid3.ogg");
		sound_se[35]=LoadSoundMem("dat/se/effect/shine3.ogg");
		sound_se[36]=LoadSoundMem("dat/se/effect/trumpet1.ogg");
		sound_se[37]=LoadSoundMem("dat/se/effect/publictelephone-money1.ogg");
		sound_se[38]=LoadSoundMem("dat/se/effect/se_maoudamashii_se_drink01.ogg");
		sound_se[39]=LoadSoundMem("dat/se/effect/eye-shine1.ogg");
		sound_se[40]=LoadSoundMem("dat/se/effect/sweet-eat1.ogg");
		sound_se[41]=LoadSoundMem("dat/se/effect/magic-reflection1.ogg");
		sound_se[42]=LoadSoundMem("dat/se/effect/magic-flame1.ogg");
		sound_se[43]=LoadSoundMem("dat/se/effect/water-drop3.ogg");
		sound_se[44]=LoadSoundMem("dat/se/effect/se_maoudamashii_system18.ogg");
		sound_se[45]=LoadSoundMem("dat/se/effect/nyu3.ogg");
		sound_se[46]=LoadSoundMem("dat/se/effect/nyu1.ogg");
		sound_se[47]=LoadSoundMem("dat/se/effect/ricochets1.ogg");
		sound_se[48]=LoadSoundMem("dat/se/effect/alerm1.ogg");
		sound_se[49]=LoadSoundMem("dat/se/effect/alerm2.ogg");

		SE_size=255;
		for(i=0;i<=63;i++){ChangeVolumeSoundMem( SE_size, sound_se[i] ) ;}//音量調整

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#5

投稿記事 by softya(ソフト屋) » 11年前

sound_se0や50以降を読み込んでいないのにChangeVolumeSoundMemしているのは気になるぐらいでしょうか。
あとは
LoadDivGraph( "dat/img/suuji12x24.png" , 98 , 13 , 7 , 12 , 24 , img_suuji ) ;
数があっていないとか。
これらもテーブル化して極力省力化すれば防げそうな問題ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#6

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:sound_se0や50以降を読み込んでいないのにChangeVolumeSoundMemしているのは気になるぐらいでしょうか。
あとは
LoadDivGraph( "dat/img/suuji12x24.png" , 98 , 13 , 7 , 12 , 24 , img_suuji ) ;
数があっていないとか。
これらもテーブル化して極力省力化すれば防げそうな問題ですね。
そうですね。今作は色々冗長なコードだらけなので、テーブル化も含めて綺麗に書く必要がありそうです。

指摘してくださった部分を変更してもバグはなくなりませんでした。
もしかして、メモリリークは別の部分で起きているのでしょうか・・・。
あるいは別のバグなのか・・・
なんにせよ無理が出てきました。

加えて、_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
でチェックはしているんですが、出力ウィンドウにはメモリリークについて何も表示されないんですよね。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#7

投稿記事 by h2so5 » 11年前

メモリーリークではなくてバッファオーバーランでしょう。
かなり重くなりますが、 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF); で検出できる場合があります。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#8

投稿記事 by namari » 11年前

h2so5 さんが書きました:メモリーリークではなくてバッファオーバーランでしょう。
かなり重くなりますが、 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF); で検出できる場合があります。
_CRTDBG_CHECK_ALWAYS_DFに変えても変化はないですね。
バッファオーバーランじゃない可能性があるかもしれないですが・・・
そもそも一部を消さない場合、たとえ落ちなかった場合も、
最小化して再びウィンドウを開くのに10秒ぐらいかかることがあるのですが、
これは明らかに正常じゃないですよね。
まあこの問題も上記のコードを除くことでなくなるんですけど・・・
やはり上記の何処かに問題があることしかもう思いつかないです。
画像は全て-1を返さず、ハンドルを渡せているのをデバッガで確認済みなんですが、
画像に問題が合ったりする場合もあるんですかね。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#9

投稿記事 by namari » 11年前

さらに問題を小さくしました。
effectを1つ読み込んだだけでも落ちます。
ここまで縮めてもまだ意味が分からないというのが実情です。

コード:

 
//main.cpp
#define GLOBAL_INSTANCE 
#include "../include/GV.h"
#include "../include/first.h"
#include "../include/resource.h"
#include <crtdbg.h> 

#ifdef _DEBUG
   #ifndef DBG_NEW
      #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
      #define new DBG_NEW
   #endif
#endif  // _DEBUG

//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
    return 0;
}

//ゲームの大きな枠組み
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
	SetGraphMode(600 , 480 , 16);

    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    while(ProcessLoop()==0){//メインループ
		        global_cnt++;//func_state,global_cntはGV.hでグローバル変数として宣言
                switch(func_state){
                        case 0:
								if(global_cnt==1){load_main();}         //データロード
                                func_state=1;
                                break;
						case 1:
								break;
~以下無関係のstate~

//load.cpp
void load(){
	    int i,j,number;
		number=0;
		number++;
		//1
		LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , img_effect[number] ) ;
		effect_image_amount[number]=5;
		effect_next_image_time[number]=0.2;
		number++;
}

void load_main(){
	load();
}

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#10

投稿記事 by namari » 11年前

コード:

 
void load(){
        int i,j,number;
       	number=0;
	number++;
	//1
	LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , img_effect[1] ) ;
}
これだけで落ちますね。LoadDivGraphの問題だと思われます。
effect1.pngは320*64の画像で、320*64の何も描いてない画像に差し替えても落ちますが、
effect1.pngを消すと、ロードに失敗して、img_effectの中には何も入っていない変わりに、最小化によっておちることは無くなります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#11

投稿記事 by softya(ソフト屋) » 11年前

effect1.png自体に問題が有るかもしれません。
たまに破損しているとか、圧縮に問題が有るpngがありますので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#12

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:effect1.png自体に問題が有るかもしれません。
たまに破損しているとか、圧縮に問題が有るpngがありますので。
何も描いてない画像に差し替えても落ちるんですよね…。
何も描いてない画像はペイントソフトで作ってるんですが、これが破損しているようなことは無いと思いたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#13

投稿記事 by softya(ソフト屋) » 11年前

大昔のDXライブラリに最小化すると落ちるというバグが合ったのを思いだしました。バージョンは新しいですか?
あとnamariさんのプログラムに問題が有る可能性が捨て切れませんので別プロジェクトを作ってLoadDivGraphなど最小限にしてテストしてみてください。
他の部分の影響を受けている可能性があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#14

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:大昔のDXライブラリに最小化すると落ちるというバグが合ったのを思いだしました。バージョンは新しいですか?
あとnamariさんのプログラムに問題が有る可能性が捨て切れませんので別プロジェクトを作ってLoadDivGraphなど最小限にしてテストしてみてください。
他の部分の影響を受けている可能性があります。
本当に最低限にしてみました。
この状態でも最小化、再表示でおちます。
以下のプログラムで全てです。

コード:

//main.cpp
#define GLOBAL_INSTANCE 
#include "../include/GV.h"


//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    return 0;
}

//ゲームの大きな枠組み
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード

    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    while(ProcessLoop()==0){//メインループ
                switch(func_state){
                        case 0:
								load_main(); 
                                func_state=1;
                                break;
						case 1:
								break;
				}
    ScreenFlip();//裏画面反映
    }

    DxLib_End();//DXライブラリ終了処理
    return 0;
}


// load.cpp
#include "../include/GV.h"


void load(){
	    int i,j,number;
		LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , img_effect[1] ) ;
}



void load_main(){
	load();
}

//function.h

	#ifdef GLOBAL_INSTANCE
	#define GLOBAL
	#else
	#define GLOBAL extern 
	#endif

	GLOBAL void load_main();

//GV.h
#include "../../include/DxLib.h"


#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern 
#endif

#include "function.h"

GLOBAL int img_effect[501][100];   //エフェクト画像[エフェクト番号][エフェクト番号ごとのアニメーション用番号]
GLOBAL int func_state;   

//リソースファイルはなし。
またDXライブラリの最新版にするというのは、DXライブラリ公式からダウンロードしてきたフォルダを、
ソリューションのあるファイルなどに持ってきて、そのフォルダをインクルードディレクトリに設定するということでいいですよね。
上記のプログラムで最新版をインクルードしても結果は変わらず、最小化後再び開くと落ちました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#15

投稿記事 by softya(ソフト屋) » 11年前

Log.txtでバージョン確認をお願いします。
それとLog.txtでエラーが出ていないか確認しておいて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#16

投稿記事 by namari » 11年前

log.txtで確認した所バージョンがVer3.04dになっていました!
最新版に全くもって移行出来ていなかったようです。
これが原因ですね。

しかし、
http://dixq.net/g/h_01.htmlを参考に最新版を入れたフ ... て、デバッグをすると
error LNK2019: 未解決の外部シンボル _WSAStartup@8 が関数 "int __cdecl DxLib::InitializeNetWork(struct HWND__ *)" (?InitializeNetWork@DxLib@@YAHPAUHWND__@@@Z) で参照されました。
のようなエラー文が大量に出てきます・・・。
最新版に移行する手段として何かしら間違っているのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#17

投稿記事 by softya(ソフト屋) » 11年前

ご本家の導入手順でお願いします。
「DXライブラリ置き場 使い方説明」
http://homepage2.nifty.com/natupaji/DxLib/dxuse.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yukiri

Re: ウィンドウを最小化すると落ちてしまう。

#18

投稿記事 by yukiri » 11年前

LoadDivGraph()の第7引数ってポインタだから、

コード:

LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , img_effect[1] ) ;
ここって、

コード:

LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , &img_effect[1] ) ;
じゃないのかな。

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

Re: ウィンドウを最小化すると落ちてしまう。

#19

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

yukiri さんが書きました:LoadDivGraph()の第7引数ってポインタだから、

コード:

LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , img_effect[1] ) ;
ここって、

コード:

LoadDivGraph( "dat/img/effect/effect1.png" , 5 , 5 , 1 , 64 , 64 , &img_effect[1] ) ;
じゃないのかな。
img_effectの宣言は

コード:

GLOBAL int img_effect[501][100];   //エフェクト画像[エフェクト番号][エフェクト番号ごとのアニメーション用番号]
となっているので、&img_effect[1]ではなくimg_effect[1]でいいと思います。
配列の名前は、その配列の先頭要素へのポインタに変換できるようです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#20

投稿記事 by namari » 11年前

中々上手く行かなかったので、公式の最新版導入の経路を最初っから順にやっていって、
そのプロジェクトに元あったプロジェクトを手作業で入れることにしました。

まだ、デバッグできないので最新版で実行できるかどうかもバグが直っているかどうかも不明なのです。
というのも
エラー 103 error C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
のようなエラー(というか警告?)が出てしまいます。
書き直そうにも引数の数が違うせいで一斉置換はできないですし、
_CRT_SECURE_NO_WARNINGSをプリプロセッサの定義に置いても、
#define _CRT_SECURE_NO_WARNINGSをmainやGV.hなど思いつくところに置いてみても、
このエラーが消えることはありませんでした。
一体どこで宣言すればいいのでしょうか・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#21

投稿記事 by softya(ソフト屋) » 11年前

それは警告でエラーではないので無視です。よく分からない人が使っても安全性がさほど増すわけではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#22

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:それは警告でエラーではないので無視です。よく分からない人が使っても安全性がさほど増すわけではありません。
errorとして表示されるので、デバッグが通らないんですよね。
自分も今までwarningとして出てきた時はずっとスルーしてきたのですが、
今回エラーとして出てきてしまったので・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#23

投稿記事 by softya(ソフト屋) » 11年前

プロジェクトの追加オプションにこれを加えてみては?
-D_SCL_SECURE_NO_WARNINGS
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#24

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:プロジェクトの追加オプションにこれを加えてみては?
-D_SCL_SECURE_NO_WARNINGS
すみません。プロジェクトの追加オプションとはなんでしょうか・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#25

投稿記事 by softya(ソフト屋) » 11年前

失礼雑でしたね。
プロジェクトのプロパティのC/C++のプリプロセッサのプリプロセッサ定義に
;_SCL_SECURE_NO_WARNINGS
を書き加えてみてください。前のものは消さないように。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#26

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:失礼雑でしたね。
プロジェクトのプロパティのC/C++のプリプロセッサのプリプロセッサ定義に
;_SCL_SECURE_NO_WARNINGS
を書き加えてみてください。前のものは消さないように。
駄目みたいです。
同様のエラーが出ます。
そもそもDXlibを最新版にして初めてこのエラーが出ました。
これはDXライブラリじゃなくてVisualC++からの警告だと思っていたのですが・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#27

投稿記事 by softya(ソフト屋) » 11年前

過去ログで自分が返答したのに答えがありました。
「ビルドが止まってしまう • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=14870
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#28

投稿記事 by usao » 11年前

オフトピック
今まで C4996 を黙らせる際に,
_CRT_SECURE_NO_WARNINGS
っていうのをプリプロセッサ定義に加えていたのだけれど
>_SCL_SECURE_NO_WARNINGS
というのもあるんですね… 両者は何が違って,どう使い分けるのだろう??
[追記]
ググり方が悪かった模様…
そそらく,
_CRT_... が
http://msdn.microsoft.com/ja-jp/library/wd3wzwts.aspx
で,
_SCL_... の方が
http://msdn.microsoft.com/ja-jp/library/aa985872.aspx
ということかな.

今,エラー報告されているのが strtok なのであれば,_CRT_... 側を使えばいいのかも.

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#29

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:過去ログで自分が返答したのに答えがありました。
「ビルドが止まってしまう • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=14870
SDKチェックをオフにすることで全てのエラーが警告に変わって、デバッグが通りました!
問題に次ぐ問題で申し訳ないのですが、
DXライブラリを最新版にする過程で、上手く設定できないことを解決するため、一度最初からプロジェクトを作って、
そのプロジェクトに手作業でコードを埋め込むというなんとも原始的な方法を取りました。
そのせいで、カレントディレクトリ(?)が変わったのか、相対パスが通らず、画像読み込み関数が-1を返すようになりました。
相対パスの位置を変えるとロードできることから基準の位置が変わってしまったのでしょう。

この基準の位置(カレントディレクトリでいいのでしょうか)は一体どのように変更するのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ウィンドウを最小化すると落ちてしまう。

#30

投稿記事 by softya(ソフト屋) » 11年前

プロジェクトのプロパティに実行時のカレントディレクトリを変更する機能はあります。
なにもしない場合は、プロジェクトファイルが置かれている所がカレントになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
namari
記事: 111
登録日時: 12年前

Re: ウィンドウを最小化すると落ちてしまう。

#31

投稿記事 by namari » 11年前

softya(ソフト屋) さんが書きました:プロジェクトのプロパティに実行時のカレントディレクトリを変更する機能はあります。
なにもしない場合は、プロジェクトファイルが置かれている所がカレントになります。
残念ながらVC++のディレクトリを変更しても効果がなく、仕方ないのでミスの無いよう一括置換して、相対パスをあわせました。
(配布時にexeの置き方が少し変になるかもしれませんが・・・)

デバッグが通ったので、ウィンドウを最小化したところ、全く落ちませんでした!
DXライブラリが最新版じゃなかった、というかあまりに古すぎたのが原因でした。
環境設定が苦手なせいで余計手間取った感はありますが、これにてウィンドウの最小化で落ちてしまう問題は解決したことになりました。
ご教授本当にありがとうございました。
特にソフト屋さんは本当に最初から最後までお世話して頂いて本当に感謝しています。
もし一人で考えていたら1ヶ月以上かかっただろう問題を解決まで漕ぎ着けることが出来ました!ありがとうございました。

閉鎖

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