ページ 11

文字を繰り返して入力する方法がわかりません...

Posted: 2016年3月14日(月) 00:44
by Vanity
Dx.libをやっていて、分らないことがあるので、質問させて頂きます。
文字を配列に入れ、繰り返して表示させるプログラムを書こうとしたのですが、どうしてもわかりません。
自分の、下にあるプログラムで動かそうとすると、一瞬画面が出たのちに消えてしまいます。
どうすれば、文字を繰り返して表示させることができるのでしょうか?

コード:

 
#include "DxLib.h"
#include <iostream>
#include <string>
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS 
using namespace std;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	ChangeWindowMode(TRUE); 
	if (DxLib_Init() == -1) return -1; 

	int Green = GetColor(0, 255, 0);
	char* bun[4][200] = {
		"AAA",
		"BBB",
		"CCC",
		"DDD",
	};
	for (int a = -1;a == 2;a++ ){
		ProcessMessage();
		DrawString(10, 420,bun[a][200],Green);
		WaitKey();
		ClearDrawScreen();
	}
}
 

長文失礼しました。初歩的な質問ですいません...

Re: 文字を繰り返して入力する方法がわかりません...

Posted: 2016年3月14日(月) 01:31
by みけCAT
とりあえずぱっと見でわかる問題点は
  • DXライブラリを使ったプログラムは、終了する前にDxLib_End()を呼ばないといけないはずなのに呼ばれていません。
  • bun[-1]は範囲外なので、アクセスしてはいけません。
  • そもそも、-1 == 2は偽なので、for文の中身は実行されません。

AAAはでました!

Posted: 2016年3月14日(月) 20:51
by Vanity
みけCATさん、ありがとうございます!
DxLib_End(); をつけると、確かに動きました。
...しかし、AAAを表示すると、動作を停止し、消えてしまいます...
何故そうなってしまうのでしょうか?

追記 
書き忘れていましたが、

コード:

   char* bun[4][200] = {
        "AAA",
        "BBB",
        "CCC",
        "DDD",
    };
を見てみると、AAAはbun[-1][200]、BBBはbun[0][200]、CCCはbun[1][200]、
DDDはbun[2][200]...に入っているようです...

Re: 文字を繰り返して入力する方法がわかりません...

Posted: 2016年3月14日(月) 22:16
by みけCAT
Vanity さんが書きました:...しかし、AAAを表示すると、動作を停止し、消えてしまいます...
何故そうなってしまうのでしょうか?
bun[-1]の計算はundefined behaviorを引き起こすので、たまたまでしょう。
Vanity さんが書きました:

コード:

   char* bun[4][200] = {
        "AAA",
        "BBB",
        "CCC",
        "DDD",
    };
を見てみると、AAAはbun[-1][200]、BBBはbun[0][200]、CCCはbun[1][200]、
DDDはbun[2][200]...に入っているようです...
bun[-1]、bun[0][200]、bun[1][200]、bun[2][200]、全て範囲外です。アクセスしてはいけません。
オフトピック
普通のメモリ配置ならBBBはbun[0][200]ではなくbun[0][1]またはbun[-1][201]に入るはずだと思うが…undefined behaviorなら仕方ない。
Vanity さんが書きました:どうすれば、文字を繰り返して表示させることができるのでしょうか?
文字を繰り返して表示させるプログラムを書き、コンパイルし、実行すればいいでしょう。

コード:

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
	ChangeWindowMode(TRUE);
	if (DxLib_Init() == -1) return -1;

	int Green = GetColor(0, 255, 0);
	const char* bun[4] = {
		"AAA",
		"BBB",
		"CCC",
		"DDD",
	};
	for (int a = 0; a < (int)(sizeof(bun) / sizeof(*bun)); a++ ){
		DrawString(10, 420, bun[a], Green);
		WaitKey();
		ClearDrawScreen();
	}
	DxLib_End();
}

成功しました!

Posted: 2016年3月15日(火) 00:00
by Vanity
教えて頂いたとおりにすると、綺麗に表示してくれました!
何度も質問をしてごめんなさい。
本当にありがとうございました!

(これからも質問をすることがあるかもしれないので、教えていただければ幸いです。)