printfDXについて

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

printfDXについて

#1

投稿記事 by FOX » 15年前

現在、「C言語ゲームプログラミング教室」という参考書で、C言語を勉強させてもらってます。
そこで、デバッグライト(プログラムを動作させながら、変数の中身などを確認)という手法が掲載されており
printf関数はコンソールアプリケーションでしか使用できないので、DXライブラリでは代わりに
printfDX関数を使用する。とあり、
printfDX関数の使用方法は、printf関数と同じです。と書いてありました。
ですが、printfDX関数を、printf関数と同じようにつかってみると、
定義の仕方が違います。のようなエラーがでます。
どのように使えばいいのでしょうか?
ややこしい文章ですみませんが、よろしくお願いします。 画像

softya

Re:printfDXについて

#2

投稿記事 by softya » 15年前

どの様に書いたか、貼りつけてもらえますか。正確なエラーメッセージもお願いします。

FOX

Re:printfDXについて

#3

投稿記事 by FOX » 15年前

ちょっと書き方をかえたら、エラーの内容が変わりました。プログラムのソースが長いので、全部は載せれませんが、
その周辺だけ載せます。
エラーの内容は
1>mymain.obj : error LNK2005: "int g_akey_previous" (?g_akey_previous@@3HA) は既に myhelper.obj で定義されています。
1>C:\Documents and Settings\****\My Documents\Visual Studio 2008\Projects\chap4\Release\chap4.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。
です。
このプロジェクトはmymain.h,mymain.cpp,myhelper.h,myhelper.cppの4つからなっています。
g_akey_previousは
mymain.h内で、
BOOL g_akey_previous = FALSE;//Aキーの状態

そして、myhelper.cppで
while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
ClsDrawScreen(); //画面を消去
MyMain();
printfDx("Aのボタン%d",g_akey_previous);
ScreenFlip(); //画面を切り替え
//1ループにかかった時間を計測
int curtime = GetNowCount() & INT_MAX;
g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
g_lasttime = curtime;
if (g_frametime > 0.03f) g_frametime = 0.03f;
}
と使用されています。
尚、myhelper.hにはg_akey_previousに関することは何も書かれていません。

以上です。
もし、リンクの問題ならば、解決法を詳しくお願いします。
初心者なので、○○を□□すればよいといわれても、
○○する方法がわかんなかったりします;;
よろしくおねがいします。

画像

softya

Re:printfDXについて

#4

投稿記事 by softya » 15年前

ヘッダの書き方が間違っていますね。
BOOL g_akey_previous = FALSE;//Aキーの状態
これだと実体の定義ですので、ヘッダでやっては行けませんよ。
実体はmymain.cppで書いてください。
ヘッダでは、
extern BOOL g_akey_previous;
と書きます。

参考にしてください。分割コンパイル
http://www.geocities.jp/ky_webid/c/032.html

FOX

Re:printfDXについて

#5

投稿記事 by FOX » 15年前

ありがとうございます!!
HPを参考にして、おっしゃられたとおりに書き直したらできました。
いつもありがとうございます^^
またおねがいします!

閉鎖

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