プログラムが動かなくなった

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dast

プログラムが動かなくなった

#1

投稿記事 by dast » 13年前

こんにちは、プログラミングを勉強している初心者です。
今日プログラムを組もうとVisual C++ 2008 Express Editionを立ち上げ、前回まで普通に動いていたプログラムをロードする画像だけ変えてビルドして立ち上げたところ作成されたウィンドウには何も表示されず、ボタンを押しても反応がありません。そこでそのプログラムを組む前にバックアップを取っておいたプログラムを読み込んで起動させたのですが、そちらの方も同じように起動できませんでした。この場合どうすればまたプログラムが普通に動いてくれるようになるのでしょうか?ご教授お願いします。
ちなみにプログラムの内容は メニュー表示→ゲームスタートを選ぶとゲーム画面に移行→ゲーム画面で左右キーを押すと自機が動く というもので、読み込んだ二つのプログラムソースは次のようなものです。

ロードする画像だけを変えたプログラム

コード:

#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する

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

//変数の用意
int Back1;
int Waku1;
int Waku2;
int mode;
int SelectNum;
int ziki_img[12];

//構造体の用意
// メニュー用構造体
typedef struct{
	int x, y;       // 座標格納用変数
	char name[128]; // 項目名格納用変数
} MenuElement_t ;
MenuElement_t MenuElement[4]={// メニュー項目要素
	{ 260, 285, "ゲームスタート" }, // タグの中身の順番で格納される。xにが、yにが、nameに"ゲームスタート"が
	{ 280, 335, "おまけ" },
	{ 280, 385, "コンフィグ" },
	{ 280, 435, "ゲーム終了" },
};
// 自機データ構造体
typedef struct{
	int x, y;       // 座標格納用変数
	int maxx;       // 移動範囲右端
	int minx;       // 移動範囲左端
	int cnt;        // 画像ループ用変数
	int no;         // 画像ループ用変数
	int z;          // 残機数
	int b;          // 残りボム数
} ziki_t ;
ziki_t ziki={200,444,609,30,0,0,3,3};// 自機データ

//関数の用意
//自機操作関数
void Zmove(){
	ziki.no=(ziki.cnt%48)/12;
	ziki.cnt++;
	if(Key[KEY_INPUT_LEFT]>=1 && ziki.x>=ziki.minx && Key[KEY_INPUT_RIGHT]==0){    //右キーが押されている間
		ziki.no += 8;
		ziki.x -=2;
	}
	if(Key[KEY_INPUT_RIGHT]>=1 && ziki.x<=ziki.maxx && Key[KEY_INPUT_LEFT]==0){
		ziki.no += 4;
		ziki.x +=2;
	}
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
		//ウィンドウモードに設定,DXライブラリ初期化処理,描画先を裏画面に設定

//変数
		//変数への数値の代入
		mode = 0;
		SelectNum = 0;                   // 現在の選択番号
		ziki.x = (ziki.maxx+ziki.minx)/2;// 自機初期位置
		ziki.no =(ziki.cnt%48)/12;            // 画像ループ用変数設定

		//変数への画像の格納
		Back1 = LoadGraph("画像/システム/神社周辺.png");
		Waku1 = LoadGraph("画像/システム/枠.png");
		Waku2 = LoadGraph("画像/システム/パラメータ表示部分.png");
		LoadDivGraph("画像/キャラ/自機.png",16,4,4,66,66,ziki_img);



		//ループ部分
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 & gpUpdateKey()==0 ){//while(裏画面の物を表画面に写す,メッセージ処理,画面を消去,キーの状態の更新)
			if(mode==0){
				mode=10;
			}
//タイトル画面
			else if(mode==10){
				                                     //計算フェーズ
				
				                                      //下方向への移動
				if( Key[ KEY_INPUT_DOWN ] == 1 ){      // 下キーが押された瞬間だけ処理
					SelectNum = ( SelectNum + 1 ) % 4; // 現在の選択項目を一つ下にずらす(ループする)
					
					for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
						if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
							MenuElement[i].x = 260;     // 座標をにする
						} else {                       // 今処理しているのが、選択番号以外なら
							MenuElement[i].x = 280;    // 座標をにする
						}
					}
				}
				                                      //上方向への移動
				if( Key[ KEY_INPUT_UP ] == 1 ){        // 上キーが押された瞬間だけ処理
					SelectNum = ( SelectNum + 3 ) % 4; // 現在の選択項目を一つ上にずらす(逆ループする)
					for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
						if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
							MenuElement[i].x = 260;     // 座標をにする
						} else {                       // 今処理しているのが、選択番号以外なら
							MenuElement[i].x = 280;    // 座標をにする
						}
					}
				}
				if( Key[ KEY_INPUT_A] == 1 ){
					if(SelectNum == 0){
						mode=20;
					}
					if(SelectNum == 3){
						break;
					}
				}
				                                     //描画フェーズ
				for( int i=0; i<4; i++ ){ // メニュー項目を描画
					DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
				}

			}
//ゲーム画面
            else if(mode==20){
                                                     //計算フェーズ
                                                                //自機の設定
				Zmove();

                                                     //描画フェーズ
                DrawGraph(20,80,Back1,TRUE);
                DrawRotaGraph(ziki.x,444,1.0,0.0,ziki_img[ziki.no],TRUE);
				DrawGraph(0,0,Waku1,TRUE);
				DrawGraph(20,15,Waku2,TRUE);
            }
 
    }
 
        DxLib_End();    // DXライブラリ終了処理
        return 0;
} 

バックアップしたプログラム

コード:

#include "DxLib.h"
int Key[256]; // キーが押されているフレーム数を格納する
 
// キーの入力状態を更新する
int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}
 
//変数の用意
int Back1;
int Waku1;
int Waku2;
int mode;
int SelectNum;
int ziki_img[12];
 
//構造体の用意
// メニュー用構造体
typedef struct{
    int x, y;       // 座標格納用変数
    char name[128]; // 項目名格納用変数
} MenuElement_t ;
 
// 自機データ構造体
typedef struct{
    int x, y;       // 座標格納用変数
    int maxx;       // 移動範囲右端
    int minx;       // 移動範囲左端
    int cnt;        // 画像ループ用変数
    int no;         // 画像ループ用変数
    int z;          // 残機数
    int b;          // 残りボム数
} ziki_t ;
 
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );
        //ウィンドウモードに設定,DXライブラリ初期化処理,描画先を裏画面に設定
 
//構造体
        // メニュー項目要素
        MenuElement_t MenuElement[4]={
            { 260, 285, "ゲームスタート" }, // タグの中身の順番で格納される。xにが、yにが、nameに"ゲームスタート"が
            { 280, 335, "おまけ" },
            { 280, 385, "コンフィグ" },
            { 280, 435, "ゲーム終了" },
        };
        // 自機データ
        ziki_t ziki={200,444,609,30,0,0,3,3};
 
//変数
        //変数への数値の代入
        mode = 0;
        SelectNum = 0;                   // 現在の選択番号
        ziki.x = (ziki.maxx+ziki.minx)/2;// 自機初期位置
        ziki.no =(ziki.cnt%48)/12;            // 画像ループ用変数設定
 
        //変数への画像の格納
        Back1 = LoadGraph("画像/システム/神社周辺.png");
        Waku1 = LoadGraph("画像/システム/枠.png");
        Waku2 = LoadGraph("画像/システム/パラメータ表示部分.png");
        LoadDivGraph("画像/キャラ/自機.png",12,4,3,40,40,ziki_img);
 
 
 
        //ループ部分
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 & gpUpdateKey()==0 ){//while(裏画面の物を表画面に写す,メッセージ処理,画面を消去,キーの状態の更新)
            if(mode==0){
                mode=10;
            }
//タイトル画面
            else if(mode==10){
                                                     //計算フェーズ
                
                                                      //下方向への移動
                if( Key[ KEY_INPUT_DOWN ] == 1 ){      // 下キーが押された瞬間だけ処理
                    SelectNum = ( SelectNum + 1 ) % 4; // 現在の選択項目を一つ下にずらす(ループする)
                    
                    for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
                        if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
                            MenuElement[i].x = 260;     // 座標をにする
                        } else {                       // 今処理しているのが、選択番号以外なら
                            MenuElement[i].x = 280;    // 座標をにする
                        }
                    }
                }
                                                      //上方向への移動
                if( Key[ KEY_INPUT_UP ] == 1 ){        // 上キーが押された瞬間だけ処理
                    SelectNum = ( SelectNum + 3 ) % 4; // 現在の選択項目を一つ上にずらす(逆ループする)
                    for( int i=0; i<4; i++ ){          // メニュー項目数である個ループ処理
                        if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
                            MenuElement[i].x = 260;     // 座標をにする
                        } else {                       // 今処理しているのが、選択番号以外なら
                            MenuElement[i].x = 280;    // 座標をにする
                        }
                    }
                }
                if( Key[ KEY_INPUT_A] == 1 ){
                    if(SelectNum == 0){
                        mode=20;
                    }
                    if(SelectNum == 3){
                        break;
                    }
                }
                                                     //描画フェーズ
                for( int i=0; i<4; i++ ){ // メニュー項目を描画
                    DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
                }
 
            }
//ゲーム画面
            else if(mode==20){
                                                     //計算フェーズ
                                                                //自機の設定
                ziki.no=(ziki.cnt%48)/12;
                ziki.cnt++;
                if(Key[KEY_INPUT_LEFT]>=1 && ziki.x>=ziki.minx && Key[KEY_INPUT_RIGHT]==0){    //右キーが押されている間
                    ziki.no += 8;
                    ziki.x -=2;
                }
                if(Key[KEY_INPUT_RIGHT]>=1 && ziki.x<=ziki.maxx && Key[KEY_INPUT_LEFT]==0){
                    ziki.no += 4;
                    ziki.x +=2;
                }
                                                     //描画フェーズ
                DrawGraph(20,80,Back1,TRUE);
                DrawRotaGraph(ziki.x,444,1.0,0.0,ziki_img[ziki.no],TRUE);
                DrawGraph(0,0,Waku1,TRUE);
                DrawGraph(20,15,Waku2,TRUE);
            }
 
    }
 
        DxLib_End();    // DXライブラリ終了処理
        return 0;
}

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

Re: プログラムが動かなくなった

#2

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

コンパイル・実行して見ましたが普通に実行してメニューが表示されました。
もし問題があれば実行時に出来るLog.txtになにか書かれているはずです。

次のことを確認してください。
(1)Debugにあるexeは今日の日付か?
(2)Log.txtは今日の日付か?
(3)Log.txtにエラーは出ていないか?
(4)リビルドしても状況は変わらないか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast

Re: プログラムが動かなくなった

#3

投稿記事 by dast » 13年前

ご指摘を受けた所を確認して見ましたところ、Debugのexe、Log.txt共に今日の日付で、リビルドしても状況は変わりませんでした。
Log.txtの中でエラーが起きていそうな文は
2777: 周期的エフェクトの作成に失敗しました。
がありました。他は特に問題がありそうな所はありませんでした。

それと、少し時間をおいてから試したところ、ロードする画像を変えたソースは動きませんでしたが、バックアップをしたソースは上手くいきました。それをみて色々試したところ、新しい画像に差し替えると動かなくなるらしいという事が分かりました。
そんな訳でこの画像ファイルを見て貰いたいのですが、この掲示板への画像の添付の仕方を教えていただけないでしょうか?よろしくお願いします。

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

Re: プログラムが動かなくなった

#4

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

何処かのアップローダを使うか、こちらのmixc++に登録していただく必要があります。
[補足]mixc++にユーザー登録すると返信時にファイル添付が出来るようになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast

Re: プログラムが動かなくなった

#5

投稿記事 by dast » 13年前

そのmixc++に入るにはどうしたらいいのですか?金とかかかったりしませんか?

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

Re: プログラムが動かなくなった

#6

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

無料ですよ。以下が登録の入り口です。

「ユーザー登録 • ユーザーCP • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/ucp.php?mode=register

dast
記事: 41
登録日時: 13年前

Re: プログラムが動かなくなった

#7

投稿記事 by dast » 13年前

登録してきましたー。
で、どうやって画像ファイルを貼りつけるのですか?

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

Re: プログラムが動かなくなった

#8

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

返信を書くときの画面の下にファイル添付のタブがあるのでそれを押してください。あとは見れば分かると思います。
あっ、「ファイル追加」を押し忘れないように。
添付.png
添付.png (7.34 KiB) 閲覧数: 3781 回
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast
記事: 41
登録日時: 13年前

Re: プログラムが動かなくなった

#9

投稿記事 by dast » 13年前

できました、ありがとうございます。
で、早速ですが問題の画像を貼っておきます。
この画像に何か問題はあるでしょうか?
添付ファイル
自機.png
自機.png (8.07 KiB) 閲覧数: 3778 回

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

Re: プログラムが動かなくなった

#10

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

分かりました。ziki_imgが16個必要なのに宣言は12個なのでメモリ破壊しているみたいです。
こっちは、画像がなかったので動いていたみたいです。

誤 int ziki_img[12];
正 int ziki_img[16];
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dast
記事: 41
登録日時: 13年前

Re: プログラムが動かなくなった

#11

投稿記事 by dast » 13年前

ご指摘通り訂正したらできました。ありがとうございます。
しかしメモリに無理をさせると処理が全部止まってしまうんですね。いやはや、恐ろしいことです。

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

Re: プログラムが動かなくなった

#12

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

よく異常終了するとか停止するアプリとかゲームありますよね。こういうのが原因です。
まぁ、配列が足らないのとポインタのミスが大半ってことですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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