画面に数字を表示したとき
画面に数字を表示したとき
DXライブラリのDrawFormatStringをつかって、画面に文字と数字を表示したときに、
たまに文字化けみたいなのが起こるのですが、原因が分かりません。
文字化けが起こる原因を教えていただけませんか?
たまにしか起こらないのでどこが悪いのかが分からないのです。
こう書くと文字化けが起こるみたいなのを教えていただけたら幸いです。
たまに文字化けみたいなのが起こるのですが、原因が分かりません。
文字化けが起こる原因を教えていただけませんか?
たまにしか起こらないのでどこが悪いのかが分からないのです。
こう書くと文字化けが起こるみたいなのを教えていただけたら幸いです。
Re:画面に数字を表示したとき
開発環境はVisual Studio .NET 2003です。
FPSを表示したときに文字化けみたいになりました。
文字化けというよりか、文字がなくなるみたいな感じです。
FPSを表示したときに文字化けみたいになりました。
文字化けというよりか、文字がなくなるみたいな感じです。
Re:画面に数字を表示したとき
極端な例で言うと
とか…
wchar_t wstr[21]={L"あいうえおかきくけこ"};
setlocale(LC_ALL,"");
DrawFormatString(0,0,GetColor(255,255,255),"%s",wstr);
とか…
たぶん「ダメ文字」が関わるとは思えませんし、可能性があるとすると…
・機種依存文字(98系統はUnicodeは弱い)
・Shift_JISの範囲外の文字を使用している(通常ないと思います)
文字が無くなるのだとしたら、背景色とカメレオンになっていませんか?
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:画面に数字を表示したとき
59の周りが文字化けしているということだとすると、何か出力できない文字を出力していませんか??
何か文字列のところに数値を指定しているとか…
何か文字列のところに数値を指定しているとか…
Re:画面に数字を表示したとき
回答ありがとうございます。
int形で数値を指定しています。
DrawFormatString(0,0,white,"%5d",suuji);
suujiには適当な数字をいれています。
これが原因ですか?
int形で数値を指定しています。
DrawFormatString(0,0,white,"%5d",suuji);
suujiには適当な数字をいれています。
これが原因ですか?
Re:画面に数字を表示したとき
あるゲームの真似なのでということですが、問題となっている部分のソースコード公開では著作権の問題にならないと思います。
そのプログラムで特許が申請されているようなシステムが実現出来たり著作権のある画像や音楽を含めてアップするというのなら問題かもしれませんが・・。
なので、問題となっている部分だけでいいので公開してもらえませんか?
その変数が関係している部分だけでも結構です。
もしも、その変数にあきらかに以上が無い場合、オーバーフローなどによって値が変わっている可能性があります。
以下、入れた覚えの無い値が出てきてしまう例の一つです。
構造体の中は連続したアドレスが入るはずだと思いますので、以下のような事が起こることがあります。
tag_t型を作って、pという構造体を作っています。
p.bには何も代入していないので、0が入っているはずです。ですから0が表示されるはずですが、なぜか5が表示されます。
これはaの配列は要素が[1]までしかないのに、[2]に5を入れてしまっているので、[1]のアドレスよりひとつ分先に用意されたbに入ってしまっているのです。
このように、p.bに値を入れた覚えが無くても、他で入れた値が思わぬところで入ってしまったと言うことがあります。
よくfor文などを使って配列に値を代入したとき、上限値を間違って、オーバーフローすることがありますので、
その辺をチェックしてみてはいかがでしょうか。
たとえば上記の例ですと、以下のような場合オーバーフローします。
VC++などではオーバーフローしたよ、とコンパイラが教えてくれないので自分でチェックしないといけないです
(指示してくれるオプションがあるのかもしれませんが、当方は存じません)
そのプログラムで特許が申請されているようなシステムが実現出来たり著作権のある画像や音楽を含めてアップするというのなら問題かもしれませんが・・。
なので、問題となっている部分だけでいいので公開してもらえませんか?
その変数が関係している部分だけでも結構です。
もしも、その変数にあきらかに以上が無い場合、オーバーフローなどによって値が変わっている可能性があります。
以下、入れた覚えの無い値が出てきてしまう例の一つです。
構造体の中は連続したアドレスが入るはずだと思いますので、以下のような事が起こることがあります。
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:画面に数字を表示したとき
デバッグのところに
作成できるフォントハンドル数 40 の限界を超えました
フォントハンドル値が異常です
↑のようにでています。
今実行したら文字が消えました。文字化けではありませんが・・・
また、
シンボルが読み込まれていません。
というのがたくさんあります。
何か関係ありますか?
作成できるフォントハンドル数 40 の限界を超えました
フォントハンドル値が異常です
↑のようにでています。
今実行したら文字が消えました。文字化けではありませんが・・・
また、
シンボルが読み込まれていません。
というのがたくさんあります。
何か関係ありますか?
Re:画面に数字を表示したとき
文字化けする理由分かったかも知れません。
あの"ファイルから読み込む"というのをDXライブラリのやり方が
分からなかったので、普通のやり方を使っていました。
そのときにstdio.hを読み込むのを忘れていました。
これも原因の一つだと思うのですがどうですか?
でもこれだけではFPSを表示したときのが説明できませんが・・・
あの"ファイルから読み込む"というのをDXライブラリのやり方が
分からなかったので、普通のやり方を使っていました。
そのときにstdio.hを読み込むのを忘れていました。
これも原因の一つだと思うのですがどうですか?
でもこれだけではFPSを表示したときのが説明できませんが・・・
Re:画面に数字を表示したとき
Dxライブラリでは、標準で使われるフォントのほかに、新たなフォントデータを作成する事ができるのです。
そのハンドル値がフォントハンドルです。
そのハンドル値がフォントハンドルです。
Re:画面に数字を表示したとき
回答ありがとうございます。
ループのたびにフォントハンドルは生成していません。
でも、初期化するときにフォントハンドルを生成してると思います。
フォントハンドルを生成するのは最初だけでいいですか?
それと、効果音や画像を読み込むのも1回だけでいいですか?
ループのたびにフォントハンドルは生成していません。
でも、初期化するときにフォントハンドルを生成してると思います。
フォントハンドルを生成するのは最初だけでいいですか?
それと、効果音や画像を読み込むのも1回だけでいいですか?
Re:画面に数字を表示したとき
いったんメモリ上に作成したデータはそのまま使えますから別に何度も読み込む必要はありません。
その他考えられるのが、数字以外のところが化けるのであれば、日本語に全く対応していないフォントを使っているとか…
それと、書き込んだファイルを見せてくれませんか?それで何とかなるかもしれませんので。
その他考えられるのが、数字以外のところが化けるのであれば、日本語に全く対応していないフォントを使っているとか…
それと、書き込んだファイルを見せてくれませんか?それで何とかなるかもしれませんので。
Re:画面に数字を表示したとき
はい、そうです。
テキストの内容によってはその原因が分かるかもしれません。
その他、できれば、出力した時のフォントの名前があるといいでしょう。そうすればある程度の環境は、僕のほうで再現できるかもしれません。
Dxライブラリのデフォルトフォントで出力した場合はデフォルトと教えてください。
テキストの内容によってはその原因が分かるかもしれません。
その他、できれば、出力した時のフォントの名前があるといいでしょう。そうすればある程度の環境は、僕のほうで再現できるかもしれません。
Dxライブラリのデフォルトフォントで出力した場合はデフォルトと教えてください。
Re:画面に数字を表示したとき
font = CreateFontToHandle("MS ゴシック", 55, 1, DX_FONTTYPE_ANTIALIASING);
DrawFormatStringToHandle(0, 0, white, font, "%7d", suuji);
C言語でsuuji.txtファイルをライトモードでオープンして、
fprintf(fp, "%d", suuji);
画面に表示するときのフォントサイズが55というのが悪いのかもしれません。
DrawFormatStringToHandle(0, 0, white, font, "%7d", suuji);
C言語でsuuji.txtファイルをライトモードでオープンして、
fprintf(fp, "%d", suuji);
画面に表示するときのフォントサイズが55というのが悪いのかもしれません。
Re:画面に数字を表示したとき
ループに入る前に
if(font==-1)MessageBox(NULL,"フォントの作成に失敗しています","警告",MB_OK);
といれて実行してみてください。
if(font==-1)MessageBox(NULL,"フォントの作成に失敗しています","警告",MB_OK);
といれて実行してみてください。
Re:画面に数字を表示したとき
このプログラムをコンパイルして実行してください。(新プロジェクトでもかまいません)
実行後、「Data_TkLog.txt」という名前のファイルができているはずなので、それを見せてください。
それと、Dxライブラリのログファイルがあるはずなのでそれもできれば見せてください。
#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:画面に数字を表示したとき
管理人様、tkmakwins15様お疲れ様です。
お二方の丁寧で優しい回答をされているのを見ているとただの閲覧者のわたしの気分も良くなってきます^^
リクさん、エラーと格闘されているようですね。お疲れ様です。
ただ、管理人様の回答をスルーされていますよね・・・。
わたしも、管理人様と同様、プログラムの開示はよほどのことがない限り著作権に引っかかることはないと思っています。疑わしいなら変数名とかを全く別のものに変えてしまい、出来るだけその固有名詞っぽいものを排除してはどうでしょう?
tkさんが突っ込んだ回答をされていて少し道が開けたかも知れませんが、
満足のいく回答を出来るだけ早く得たいとお考えであれば、
「再現性のある」ソースの開示をオススメします。
以上、横槍でした。
お二方の丁寧で優しい回答をされているのを見ているとただの閲覧者のわたしの気分も良くなってきます^^
リクさん、エラーと格闘されているようですね。お疲れ様です。
ただ、管理人様の回答をスルーされていますよね・・・。
わたしも、管理人様と同様、プログラムの開示はよほどのことがない限り著作権に引っかかることはないと思っています。疑わしいなら変数名とかを全く別のものに変えてしまい、出来るだけその固有名詞っぽいものを排除してはどうでしょう?
tkさんが突っ込んだ回答をされていて少し道が開けたかも知れませんが、
満足のいく回答を出来るだけ早く得たいとお考えであれば、
「再現性のある」ソースの開示をオススメします。
以上、横槍でした。
Re:画面に数字を表示したとき
みなさんに迷惑かけているようなのでこれで投稿を終わらせていただきます。
今まで親切に回答してくださったみなさんありがとうございました。
ソースを開示しなかったのは、文字化けが起こるのが1箇所ではなく複数あったことと、
ソースの書き方がへたくそで分かりにくいと思ったことと、ソースの量が多いことです。
今まで本当にありがとうございました。
今まで親切に回答してくださったみなさんありがとうございました。
ソースを開示しなかったのは、文字化けが起こるのが1箇所ではなく複数あったことと、
ソースの書き方がへたくそで分かりにくいと思ったことと、ソースの量が多いことです。
今まで本当にありがとうございました。