プログラムの書き方がいまいちわかりません

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

プログラムの書き方がいまいちわかりません

#1

投稿記事 by Vanity2 » 9年前

...すいません。プログラムを作っていると、又、分らない箇所が出来たのですが、どのようにプログラムをつなげばいいのでしょうか?
説明が下手で申し訳ありませんが、1の動作をしたのちに、2の動作をする...という風にしたいのです。
サンプルコード等を元に、組み立ててはいるのですが、いまいちわかりません。

コード:

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	SetGraphMode(800, 600, 32);
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
		int loop = 0;
		int b = 0, a = 0;
		const int  White = GetColor(255, 255, 255);
		char key[256];
		GetHitKeyStateAll(key);
		const char* co[4] = {
			"AAAA",
			"BBBB",
			"CCCC"
			"DDDD"};
		const int Green = GetColor(0, 255, 0);
		const char* bun[10] = {
			"EEEE",
			"FFFF",
			"GGGG",
			"HHHH",
			"IIII",
			"JJJJ",
			"KKKK",
			"LLLL",
			"MMMM",
			"NNNN"
		};
		for (int b = 0; b < (int)(sizeof(co) / sizeof(*co)); b++){ //1のプログラム
			DrawString(0, 0, co[b], Green);
			WaitKey();
			ClearDrawScreen();
                                  };
      LoadGraphScreen(0, 0, "a.jpg", FALSE);
	   LoadGraphScreen(450, 100, "b.png", TRUE);
	   LoadGraphScreen(45, 420, "c.png", TRUE);
		for (int a = 0; a < (int)(sizeof(bun) / sizeof(*bun)); a++){ //2のプログラム
			DrawString(0, 0, bun[a], Green);
			WaitKey();
			ClearDrawScreen();
                        LoadGraphScreen(0, 0, "a.jpg", FALSE);
	       LoadGraphScreen(450, 100, "b.png", TRUE);
	       LoadGraphScreen(45, 420, "c.png", TRUE);
		};
	};
         DxLib_End();
}
上に書かして頂いたプログラムを、初めに文字だけを表示し、次に画像と共に文字を表示するようにしたいです。
しかし、2のプログラムだけならば動くのですが、上のように、1と2を足すと、1が終わった後に止まってしまいます。
goto(使っていけないというのはわかります。)を使ってもダメでした。
何を使えばいいのでしょうか?

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

Re: プログラムの書き方がいまいちわかりません

#2

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

Vanity2 さんが書きました:しかし、2のプログラムだけならば動くのですが、上のように、1と2を足すと、1が終わった後に止まってしまいます。
coは4要素の配列なのに、文字列(の先頭へのポインタ)が3個しか無く、最後の1要素のNULLを表示しようとするときにアクセス違反になるようですね。
止まるのは本当に1が終わった後でしょうか?
Vanity2 さんが書きました:何を使えばいいのでしょうか?
状態遷移を使えばいいです。

コード:

#include <DxLib.h>

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	SetGraphMode(800, 600, 32);

	int phase = 0;
	int count = 0;
	const int Green = GetColor(0, 255, 0);
	const char* co[4] = {
		"AAAA",
		"BBBB",
		"CCCC"
		"DDDD",
		"ZZZZ"
	};
	const char* bun[10] = {
		"EEEE",
		"FFFF",
		"GGGG",
		"HHHH",
		"IIII",
		"JJJJ",
		"KKKK",
		"LLLL",
		"MMMM",
		"NNNN"
	};

	int a = LoadGraph("a.jpg");
	int b = LoadGraph("b.png");
	int c = LoadGraph("c.png");

	bool prevKeyPressed = false;
	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
		int keyStatus = CheckHitKeyAll();
		bool nowKeyPressed, keyPressed;
		// このフレームでキー(マウス、ゲームパッドを含む)が押されているか
		nowKeyPressed = (keyStatus != 0 && keyStatus != -1) // キー
			|| (GetMouseInput() != 0) // マウス
			|| ( GetJoypadInputState(DX_INPUT_PAD1) != 0) // 各ゲームパッド
			|| ( GetJoypadInputState(DX_INPUT_PAD2) != 0)
			|| ( GetJoypadInputState(DX_INPUT_PAD3) != 0)
			|| ( GetJoypadInputState(DX_INPUT_PAD4) != 0);
		// このフレームで新たにキーが押されたか
		keyPressed = nowKeyPressed && !prevKeyPressed;
		// 次のフレームの前のフレーム(このフレーム)でキーが押されているか
		prevKeyPressed = nowKeyPressed;

		switch (phase){
			case 0: // 1のプログラム
				DrawString(0, 0, co[count], Green);
				if (keyPressed){
					count++;
					if (count >= (int)(sizeof(co) / sizeof(*co))){
						count = 0;
						phase = 1;
					}
				}
				break;
			case 1: // 2のプログラム
				DrawGraph(0, 0, a, FALSE);
				DrawGraph(450, 100, b, TRUE);
				DrawGraph(45, 420, c, TRUE);
				DrawString(0, 0, bun[count], Green);
				if (keyPressed){
					count++;
					if (count >= (int)(sizeof(bun) / sizeof(*bun))){
						count = 0;
						phase = 0;
					}
				}
				break;
		}
	}
	DxLib_End();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: プログラムの書き方がいまいちわかりません

#3

投稿記事 by amehirune » 9年前

みけCATさんはしれっと訂正されていらっしゃいますが、変数定義の場所が間違っています。
whileループの中で変数定義をしてしまうと、複数回宣言がなされてしまうことになりますよね?
int~の部分はwhileの前に持ってきましょう。
(まぁ、これはフリーズの原因とは関係ないのですが。多分。)
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

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

Re: プログラムの書き方がいまいちわかりません

#4

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

amehirune さんが書きました:whileループの中で変数定義をしてしまうと、複数回宣言がなされてしまうことになりますよね?
宣言はプログラム上だけなので1回です。
初期化が毎ループされてしまいます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: プログラムの書き方がいまいちわかりません

#5

投稿記事 by amehirune » 9年前

みけCAT さんが書きました:
amehirune さんが書きました:whileループの中で変数定義をしてしまうと、複数回宣言がなされてしまうことになりますよね?
宣言はプログラム上だけなので1回です。
初期化が毎ループされてしまいます。
おうふ。そうでしたか。失礼しました。
オフトピック
日ごろから勉強していないということが露呈されている…
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

Vanity2

わかりました!

#6

投稿記事 by Vanity2 » 9年前

なるほど!そのようにかくのですね!
switchを使い書こうともしていたのですが、使い方がいまいちわからなかったのです。
今回、教えていただいたことにより、やっとわかりました!
本当にありがとうございます!
私も速く皆さんのように、DX.libを使いこなせるように精進します。

閉鎖

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