ページ 11

フォントハンドル値が異常です と出ます・・・

Posted: 2008年8月02日(土) 23:36
by C勉強者
初めまして。

最近DXライブラリを使い始めた者なのですが、うまくいきません。
一応、エラーはないので実行はできますが・・・(WinMain関数の内容のみ)

環境は
    OS : Windows Vista
コンパイラ : VC++

です。コードは、
//WinMain関数//
{
   ChangeWindowMode(TRUE); 
   SetGraphMode(800,600,16);

   //宣言等は省略します。//

   minntyo   = CreateFontToHandle("明朝体",40,3,DX_FONTTYPE_ANTIALIASING);//文字のセット用

   DrawStringToHandle(MENUX  , MENUY + SMALL ,"ゲームスタート", white	, minntyo );
   DrawStringToHandle(MENUX + StrLen[1] + (SPACE * 3) , MENUY + SMALL,"ゲーム終了",white ,minntyo );
   //上の場合、y400の位置にゲームスタートなどが描写されます

   menu(・・・省略)//ここでmenu関数へ行きます "minntyo"は渡していません

   DxLib_End();
   return 0;
}

int menu(…省略)
{
   int minntyo , b_minntyo;

   minntyo   = CreateFontToHandle("明朝体" , 20 , 2 , DX_FONTTYPE_ANTIALIASING);
   b_minntyo = CreateFontToHandle("明朝体" , 30 , 2 , DX_FONTTYPE_ANTIALIASING);

   //1//

   //ここでバイナリファイルを扱います

   DrawStringToHandle( SPACE2 + sizex + SPACE3 + STRINGSPACE ,
                        SPACE2 + STRINGSPACE , "データ2" , white , b_minntyo);

   DrawStringToHandle( SPACE2 + STRINGSPACE , (SPACE2 * 2) + sizey + STRINGSPACE + SPACE3 ,
                                                       "データ消去" , white , minntyo );
   //上の場合だと何故か描写されない・・

   //省略//

   return 0;
}


こんな感じです。マクロ定義は問題ないので気にしないでください。
WinMain関数でDrawStringToHandle関数を使用しても問題はなかったのですが、
menu関数で使用すると 出力 の所に"フォントハンドル値は異常です"と出てしまい、
何も画面に表示されません。それどころか画像等も表示されません。
また、DrawStringTo...を呼んだ回数だけ出力に表示されています。

それと、//1//の部分で、
if(minntyo == -1 || b_minntyo == -1)
printfDx("フォントが作成できません。");

と、実行もしているのですが問題ないようです。
ちなみに、バイナリファイルを扱う前はmenu関数のDrawStringTo...もちゃんと機能していました。

原因が分かる方、お願いします。

Re:フォントハンドル値が異常です と出ます・・・

Posted: 2008年8月03日(日) 00:38
by Justy

>原因が分かる方、お願いします

 再現できるコードとデータがあればベストなのですが、話を伺った限りで
真っ先に思い浮かぶ原因は、そのバイナリというのを扱った際にスタックを破壊してしまった為に
minntyo / b_minntyoのどちらか、或いは両方の値が変化してしまい、
DrawStringToHandle()内部で異常を検知した、ということはないでしょうか。

 試しに、CreateFontToHandle()直後の minntyo / b_minntyoの値と
DrawStringToHandle()の直前の minntyo / b_minntyoの値が同一かどうか
(できればデバッガ上で)調べてみて下さい。

Re:フォントハンドル値が異常です と出ます・・・

Posted: 2008年8月03日(日) 08:58
by C勉強者
>試しに、CreateFontToHandle()直後の minntyo / b_minntyoの値と
>DrawStringToHandle()の直前の minntyo / b_minntyoの値が同一かどうか
>(できればデバッガ上で)調べてみて下さい。


minntyo = CreateFontToHandle("明朝体" , 20 , 2 , DX_FONTTYPE_ANTIALIASING);
b_minntyo = CreateFontToHandle("明朝体" , 30 , 2 , DX_FONTTYPE_ANTIALIASING);

printfDx("minntyo = %d\n",minntyo);
printfDx("b_minntyo = %d\n\n",b_minntyo);//2回改行

ScreenFlip();
WaitKey();

//バイナリを扱います

printfDx(" minntyo = %d\n",minntyo);
printfDx("b_minntyo = %d\n",b_minntyo);

ScreenFlip();
WaitKey();

DrawStringToHandle(SPACE2 + STRINGSPACE , SPACE2 + STRINGSPACE , "データ1" , white , b_minntyo);





このようなプログラムを埋め込んだところ、

minntyo = 537067523
b_minntyo = 537133060

minntyo = -858993460
b_minntyo = -858993460

とおかしな値が出ました・・・これが原因ですね。



>そのバイナリというのを扱った際にスタックを破壊してしまった為に...

バイナリファイルを扱ったところに原因がある、ということでしょうか。
バイナリファイルを扱ったところを調べてみます。

Re:フォントハンドル値が異常です と出ます・・・

Posted: 2008年8月03日(日) 16:35
by C勉強者
すいません・・・バイナリファイルを別関数で扱ったところ、
正常に動作いたしました。

>>Justyさん

ご迷惑かけて申し訳ありません・・・・
バイナリファイルが原因だったようです。
ご回答ありがとうございました。

Re:フォントハンドル値が異常です と出ます・・・

Posted: 2008年8月03日(日) 19:09
by Justy

>バイナリファイルを別関数で扱ったところ正常に動作いたしました

 それはよかったです。
 
 でも、原因がバイナリデータを扱ったことによるスタックの破壊にあるのだとしたら、
別関数にしただけでは(DrawStringToHandleに影響がないだけで)まだ何かしら問題が起きる
可能性があります。

 もし、どこに問題があったのかを突き止めていないようでしたら、
念の為今の内に調べておいた方がいいかもしれません。