ページ 11

画面に数字を表示したとき

Posted: 2007年12月11日(火) 15:15
by リク
DXライブラリのDrawFormatStringをつかって、画面に文字と数字を表示したときに、
たまに文字化けみたいなのが起こるのですが、原因が分かりません。
文字化けが起こる原因を教えていただけませんか?
たまにしか起こらないのでどこが悪いのかが分からないのです。
こう書くと文字化けが起こるみたいなのを教えていただけたら幸いです。

Re:画面に数字を表示したとき

Posted: 2007年12月11日(火) 15:48
by keichan
開発環境を教えてください。
それと具体的にどんな文字を表示して文字化けしたのかも教えてください。

Re:画面に数字を表示したとき

Posted: 2007年12月11日(火) 17:25
by リク
開発環境はVisual Studio .NET 2003です。
FPSを表示したときに文字化けみたいになりました。
文字化けというよりか、文字がなくなるみたいな感じです。

Re:画面に数字を表示したとき

Posted: 2007年12月11日(火) 23:14
by tk-xleader
できればその文字化け的なことが起こるソースコードを見せてくれませんでしょうか?
そうすると速く解決するかもしれません。

Re:画面に数字を表示したとき

Posted: 2007年12月11日(火) 23:37
by リク
あるゲームを真似てつくっているので、見せることができないんです。
こう書いたら文字化けが起こるというのを教えていただけませんか?

Re:画面に数字を表示したとき

Posted: 2007年12月11日(火) 23:57
by tk-xleader
極端な例で言うと
char str[81]={0};
int i,ch;
for(i=0;i<80;i++){
    ch=GetRand(255);
    if(CHAR_MAX<UCHAR_MAX)ch-=128;
    str=ch;
}

DrawFormatString(0,0,GetColor(255,255,255),"%s%s",str,"文字化けする");

とか…


wchar_t wstr[21]={L"あいうえおかきくけこ"};

setlocale(LC_ALL,"");

DrawFormatString(0,0,GetColor(255,255,255),"%s",wstr);

とか…
たぶん「ダメ文字」が関わるとは思えませんし、可能性があるとすると…
・機種依存文字(98系統はUnicodeは弱い)
・Shift_JISの範囲外の文字を使用している(通常ないと思います)

文字が無くなるのだとしたら、背景色とカメレオンになっていませんか?

Re:画面に数字を表示したとき

Posted: 2007年12月13日(木) 17:17
by リク
回答ありがとうございます。

背景色は黒が主体になっています。
文字化けしたときの画像をコピーしたので添付します。
回答よろしくお願いします。

Re:画面に数字を表示したとき

Posted: 2007年12月13日(木) 22:54
by tk-xleader
59の周りが文字化けしているということだとすると、何か出力できない文字を出力していませんか??

何か文字列のところに数値を指定しているとか…

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 10:52
by リク
回答ありがとうございます。

int形で数値を指定しています。
DrawFormatString(0,0,white,"%5d",suuji);
suujiには適当な数字をいれています。
これが原因ですか?

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 14:25
by tk-xleader
うーん、書式指定を%dのみにしたらどうなりますか?

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 16:35
by 管理人
あるゲームの真似なのでということですが、問題となっている部分のソースコード公開では著作権の問題にならないと思います。

そのプログラムで特許が申請されているようなシステムが実現出来たり著作権のある画像や音楽を含めてアップするというのなら問題かもしれませんが・・。

なので、問題となっている部分だけでいいので公開してもらえませんか?
その変数が関係している部分だけでも結構です。
もしも、その変数にあきらかに以上が無い場合、オーバーフローなどによって値が変わっている可能性があります。

以下、入れた覚えの無い値が出てきてしまう例の一つです。

構造体の中は連続したアドレスが入るはずだと思いますので、以下のような事が起こることがあります。
tag_t型を作って、pという構造体を作っています。
#include <stdio.h>

typedef struct{
	int a[2];
	int b;
}tag_t;
tag_t p;

int main(){
	p.a[2]=5;
	printf("%d",p.b);
}

実行結果
5
 
 
p.bには何も代入していないので、0が入っているはずです。ですから0が表示されるはずですが、なぜか5が表示されます。
これはaの配列は要素が[1]までしかないのに、[2]に5を入れてしまっているので、[1]のアドレスよりひとつ分先に用意されたbに入ってしまっているのです。
このように、p.bに値を入れた覚えが無くても、他で入れた値が思わぬところで入ってしまったと言うことがあります。

よくfor文などを使って配列に値を代入したとき、上限値を間違って、オーバーフローすることがありますので、
その辺をチェックしてみてはいかがでしょうか。

たとえば上記の例ですと、以下のような場合オーバーフローします。
VC++などではオーバーフローしたよ、とコンパイラが教えてくれないので自分でチェックしないといけないです
(指示してくれるオプションがあるのかもしれませんが、当方は存じません)
for(i=0;i<=2;i++)
   p.a=5;
 

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 16:53
by tk-xleader
その問題の出力をファイルに出力するとどうなりますか?
できれば出力してその結果を見せてください。

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 18:04
by リク
デバッグのところに

作成できるフォントハンドル数 40 の限界を超えました
フォントハンドル値が異常です

↑のようにでています。
今実行したら文字が消えました。文字化けではありませんが・・・

また、
シンボルが読み込まれていません。
というのがたくさんあります。

何か関係ありますか?

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 20:10
by リク
文字化けする理由分かったかも知れません。

あの"ファイルから読み込む"というのをDXライブラリのやり方が
分からなかったので、普通のやり方を使っていました。
そのときにstdio.hを読み込むのを忘れていました。
これも原因の一つだと思うのですがどうですか?

でもこれだけではFPSを表示したときのが説明できませんが・・・

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 21:10
by tk-xleader
ループのたびにフォントハンドルを生成していませんか?

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 21:12
by tk-xleader
C言語でファイルを開く方法は大丈夫ですよね?

ファイルに同じ要領で同じ内容を書き込むとどうなりますか?

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 21:44
by リク
フォントハンドルとは何ですか?

ファイルに書き込むのは問題ないと思います。
ちゃんと数値が書き込まれているので。

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 22:20
by tk-xleader
Dxライブラリでは、標準で使われるフォントのほかに、新たなフォントデータを作成する事ができるのです。
そのハンドル値がフォントハンドルです。

Re:画面に数字を表示したとき

Posted: 2007年12月14日(金) 22:40
by リク
回答ありがとうございます。

ループのたびにフォントハンドルは生成していません。

でも、初期化するときにフォントハンドルを生成してると思います。
フォントハンドルを生成するのは最初だけでいいですか?
それと、効果音や画像を読み込むのも1回だけでいいですか?

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 09:09
by tk-xleader
いったんメモリ上に作成したデータはそのまま使えますから別に何度も読み込む必要はありません。

その他考えられるのが、数字以外のところが化けるのであれば、日本語に全く対応していないフォントを使っているとか…

それと、書き込んだファイルを見せてくれませんか?それで何とかなるかもしれませんので。

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 11:52
by リク
文字化けするところのデータをテキストファイルに書き込みしたのでいいのですか?

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 12:04
by tk-xleader
はい、そうです。
テキストの内容によってはその原因が分かるかもしれません。

その他、できれば、出力した時のフォントの名前があるといいでしょう。そうすればある程度の環境は、僕のほうで再現できるかもしれません。
Dxライブラリのデフォルトフォントで出力した場合はデフォルトと教えてください。

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 13:49
by リク
font = CreateFontToHandle("MS ゴシック", 55, 1, DX_FONTTYPE_ANTIALIASING);

DrawFormatStringToHandle(0, 0, white, font, "%7d", suuji);

C言語でsuuji.txtファイルをライトモードでオープンして、
fprintf(fp, "%d", suuji);

画面に表示するときのフォントサイズが55というのが悪いのかもしれません。

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 15:06
by tk-xleader
ループに入る前に
if(font==-1)MessageBox(NULL,"フォントの作成に失敗しています","警告",MB_OK);
といれて実行してみてください。

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 15:29
by tk-xleader
このプログラムをコンパイルして実行してください。(新プロジェクトでもかまいません)
#include<stdio.h>
#include<stdlib.h>
#include"DxLib.h"

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,char*,int)
{
	int font,num;
	int count=0;
	FILE* file;
	
	ChangeWindowMode(TRUE);
	
	if(DxLib_Init()==-1)abort();
	
	file=fopen("Data_TkLog.txt","w");
	
	SetDrawScreen(DX_SCREEN_BACK);
	
	font=CreateFontToHandle("MS ゴシック", 55, 1, DX_FONTTYPE_ANTIALIASING);
	if(font==-1)fputs("フォントの作成に失敗しました。\n",file);
	else fputs("フォントの初期化には成功しています。\n",file);
	
	num=0;
	
	while(ProcessMessage()!=-1&&CheckHitKey(KEY_INPUT_E)!=1){
		
		DrawFormatStringToHandle(0,0,GetColor(255,255,255),font,"乱数 %5d",num);
		if(count==0)fprintf(file,"乱数 %5d\n",num);
		
		ScreenFlip();
		ClearDrawScreen();
		if(count%30==0){
			num=GetRand(1000);
		}
		count++;
	}
	fclose(file);
	DxLib_End();
	return 0;
}
このプログラムの意味は知らなくてもかまいません。
実行後、「Data_TkLog.txt」という名前のファイルができているはずなので、それを見せてください。
それと、Dxライブラリのログファイルがあるはずなのでそれもできれば見せてください。

Re:画面に数字を表示したとき

Posted: 2007年12月15日(土) 21:02
by やそ
管理人様、tkmakwins15様お疲れ様です。

お二方の丁寧で優しい回答をされているのを見ているとただの閲覧者のわたしの気分も良くなってきます^^

リクさん、エラーと格闘されているようですね。お疲れ様です。

ただ、管理人様の回答をスルーされていますよね・・・。
わたしも、管理人様と同様、プログラムの開示はよほどのことがない限り著作権に引っかかることはないと思っています。疑わしいなら変数名とかを全く別のものに変えてしまい、出来るだけその固有名詞っぽいものを排除してはどうでしょう?

tkさんが突っ込んだ回答をされていて少し道が開けたかも知れませんが、
満足のいく回答を出来るだけ早く得たいとお考えであれば、
「再現性のある」ソースの開示をオススメします。

以上、横槍でした。

Re:画面に数字を表示したとき

Posted: 2007年12月18日(火) 11:35
by リク
みなさんに迷惑かけているようなのでこれで投稿を終わらせていただきます。

今まで親切に回答してくださったみなさんありがとうございました。

ソースを開示しなかったのは、文字化けが起こるのが1箇所ではなく複数あったことと、
ソースの書き方がへたくそで分かりにくいと思ったことと、ソースの量が多いことです。

今まで本当にありがとうございました。