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

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

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

#1

投稿記事 by Vanity » 10年前

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();
	}
}
 

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

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

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

#2

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

とりあえずぱっと見でわかる問題点は
  • DXライブラリを使ったプログラムは、終了する前にDxLib_End()を呼ばないといけないはずなのに呼ばれていません。
  • bun[-1]は範囲外なので、アクセスしてはいけません。
  • そもそも、-1 == 2は偽なので、for文の中身は実行されません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Vanity

AAAはでました!

#3

投稿記事 by Vanity » 10年前

みけ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]...に入っているようです...

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

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

#4

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

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();
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Vanity

成功しました!

#5

投稿記事 by Vanity » 9年前

教えて頂いたとおりにすると、綺麗に表示してくれました!
何度も質問をしてごめんなさい。
本当にありがとうございました!

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

閉鎖

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