ページ 11

デバック関数

Posted: 2009年5月17日(日) 03:52
by レスト
VS2005、WindowsAPI、C++、XPで開発をしています。

DebTextXYという関数を作ったのですが
画面を閉じるときにエラーが出てしまいます。
引数は(X座標、Y座標、表示する変数)です。

また表示されるテキストのdeb_1を動的に変数名に変更したいです。
例の場合 deb = 5 みたいなかんじです。
この処理がとても面倒な場合、
DebTextXY(20,40,str,abc)みたいにしてstrに
直接、deb = という感じに値を書こうかと考えています。
void DebTextXY(int x, int y, int deb){
	char str[/url] = "";
	wsprintf(str, TEXT("deb_1 = %d"), deb);		// ここ
	TextOut(hDC_Wnd, x, y, str, strlen(str));	
}

//処理部
char mess[/url] = "テスト"; 
int abc = 5;

DebTextXY(20,40,abc);

Re:デバック関数

Posted: 2009年5月17日(日) 09:34
by たいちう
char str[/url] = "";

char str[1024];

Re:デバック関数

Posted: 2009年5月17日(日) 09:50
by tk-xleader
void dumDebTextXY(int x, int y, int deb,const TCHAR *name){
	char str[1024]={0};
	wsprintf(str, TEXT("%s= %d"),name,deb);
	TextOut(hDC_Wnd, x, y, str, strlen(str));	
}

#define DebTextXY(X,Y,DEB) dumDebTextXY(X,Y,DEB,TEXT(#DEB))
でどうでしょうか?

Re:デバック関数

Posted: 2009年5月17日(日) 09:57
by tk-xleader
>たいちうさん

僕もつられてやっちゃってるんですが、wsprintfに渡すバッファの長さとしては、1024ではなくて、1025を指定したほうがいいです。
参考:
http://msdn.microsoft.com/ja-jp/library/cc364872.aspx
http://support.microsoft.com/kb/77255/ja

Re:デバック関数

Posted: 2009年5月17日(日) 13:16
by Justy
tkmakwins15さん
>DebTextXY

 TCHAR使うなら、charとか strlenもそれに合わせないと、コンパイルが通らないことがあるのではないでしょうか。

Re:デバック関数

Posted: 2009年5月17日(日) 13:53
by tk-xleader
あっ、そうですね。ということはこうなりますね。
void dumDebTextXY(int x, int y, int deb,const TCHAR *name){
	TCHAR str[1024]={0};
	wsprintf(str, TEXT("%s= %d"),name,deb);
	TextOut(hDC_Wnd, x, y, str, lstrlen(str));
}

#define DebTextXY(X,Y,DEB) dumDebTextXY(X,Y,DEB,TEXT(#DEB))

Re:デバック関数

Posted: 2009年5月17日(日) 14:06
by レスト
エラーも消え、できました><
みなさんありがとうございます。
定義文自体は理解しています。
例)#define FONT_MAX 16 は FONT_MAXを16と扱う

ただ#defineのところのTEXT(#DEB)についてよくわからなかったのですが
これはdebという変数を値ではなく変数名を取ってくるみたいな感じでよいのでしょうか?

Re:デバック関数

Posted: 2009年5月17日(日) 14:25
by tk-xleader
#define STRING(S) #S
とすると、マクロの引数のSを文字列リテラルにします。