デバック用の関数

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

デバック用の関数

#1

投稿記事 by デバック用 » 15年前

デバック用の関数を作ろうとしてます。
ただ可変引数の参照の仕方がイマイチわかりません。
下記のソースでエラーが出るのですが
このようなことはできないのでしょうか?
void DebText(char *FormatString, ... ){
    DrawFormatString(0,0,GetColor(255,255,255), FormatString, (char*)(&FormatString+1));
}
また変数名の取得をする方法などはあるのでしょうか?
調べたのですが出てきませんでした・・・。
例えば

int test=0;

引数にtestを入れると
FormatStringに格納されている値がtest(※0ではなくて)になる。

というのも自動的に"test = 0"みたいに表示して欲しいので質問させていただきました。

デバック用

Re:デバック用の関数

#2

投稿記事 by デバック用 » 15年前

連レスにて失礼します。
間違えてました。

エラーが出ます → エラーは出ないのですが値が変です。

たいちう

Re:デバック用の関数

#3

投稿記事 by たいちう » 15年前

他の人にも必要そうな情報ならば、
ちょっとググればサンプルが見つかるのです。

可変長引数について
http://www.geocities.jp/ky_webid/c/057.html

DrawFormatStringについて
http://studiokingyo.fc2web.com/dxlib/kowaza/k1.html

※ リンクがあると投稿に失敗したので、全角にしています。

non

Re:デバック用の関数

#4

投稿記事 by non » 15年前

>また変数名の取得をする方法などはあるのでしょうか?

残念ながら、存じません。
変数名を、文字列リテラルで与えていいのなら、出来ますが、
そうすると、
引数が(test,"test")のようになって面倒ですね。

デバック用

Re:デバック用の関数

#5

投稿記事 by デバック用 » 15年前

ご回答ありがとうございます。

>>たいちう様
URLを拝見させていただきました。

1つ目のリンクなのですがこれだと引数にいくつの可変長引数があるかを
あらかじめ与えてあげないのではないでしょうか?
出来ればそういった情報を与えないでも自動的にやってくれるようにしたいです。

2つ目は何処を見ればよろしいのでしょうか・・・?

>>non様
では多分出来ないのでしょうね・・・。
残念です><
色々と教えていただきありがとうございます。

non

Re:デバック用の関数

#6

投稿記事 by non » 15年前

>1つ目のリンクなのですがこれだと引数にいくつの可変長引数があるかを
>あらかじめ与えてあげないのではないでしょうか?

なんらかの形で引数の数を知らせる必要があります。
しかし、あなたの仕様では
char *FormatString があるので、これでわかりますね。
%d や %s などで個数と型がわかります。

たいちう

Re:デバック用の関数

#7

投稿記事 by たいちう » 15年前

> 出来ればそういった情報を与えないでも自動的にやってくれるようにしたいです。

http://www.ncad.co.jp/ ̄komata/c-kouza4.htm
これが参考になるかと。


> 2つ目は何処を見ればよろしいのでしょうか・・・?

DrawFormatStringの使い方のサンプルもあったほうが良いかと思い、
「メインメモリのリアルタイム容量表示」の部分を紹介したつもりでした。
不要ならば結構です。

デバック用

Re:デバック用の関数

#8

投稿記事 by デバック用 » 15年前

ご回答ありがとうございます。
URLを張っていただいたりした中
申し訳ないのですが今の私では理解できそうにありません・・・。

どうか今回だけはサンプルを頂けないでしょうか。
void DebText(char *FormatString, ... ){
//    va_list list;
//    va_start( list, FormatString );  /* 可変引数リストの使用準備 */
//    for(int i=0; i<FormatString; ++i){
///        DrawFormatString(x,y,GetColor(255,255,255), FormatString, (char*)(&FormatString+1));
//    }
//    va_end( list );  
}

non

Re:デバック用の関数

#9

投稿記事 by non » 15年前

たいちうさんが示された可変長変数のURLの練習問題2が参考になると思います。

デバック用

Re:デバック用の関数

#10

投稿記事 by デバック用 » 15年前

non様
回答ありがとうございます。
私がやると下記の様なエラーが出てしまいます。
お願いします・・・。関数を作っては頂けないでしょうか?


1>C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h(29) : warning C4005: 'va_start' : マクロが再定義されました。
1> C:\Program Files\Microsoft Visual Studio 8\VC\include\varargs.h(88) : 'va_start' の前の定義を確認してください
1>C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h(30) : warning C4005: 'va_arg' : マクロが再定義されました。
1> C:\Program Files\Microsoft Visual Studio 8\VC\include\varargs.h(89) : 'va_arg' の前の定義を確認してください
1>C:\Program Files\Microsoft Visual Studio 8\VC\include\stdarg.h(31) : warning C4005: 'va_end' : マクロが再定義されました。
1> C:\Program Files\Microsoft Visual Studio 8\VC\include\varargs.h(90) : 'va_end' の前の定義を確認してください
1>.\DrawLib.cpp(211) : error C2065: 'va_alist' : 定義されていない識別子です。
1>.\DrawLib.cpp(211) : error C2146: 構文エラー : ';' が、識別子 'va_list' の前に必要です。
1>.\DrawLib.cpp(211) : error C2146: 構文エラー : ';' が、識別子 'va_alist' の前に必要です。
1>.\DrawLib.cpp(211) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>.\DrawLib.cpp(211) : error C2377: 'va_list' : 再定義されています。typedef は他のどのシンボルでもオーバーロードできません
1> C:\Program Files\Microsoft Visual Studio 8\VC\include\vadefs.h(61) : 'va_list' の宣言を確認してください。
1>.\DrawLib.cpp(211) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>.\DrawLib.cpp(211) : error C2371: 'va_alist' : 再定義されています。異なる基本型です。
1>.\DrawLib.cpp(211) : error C2447: '{' : 対応する関数ヘッダーがありません (旧形式の仮引数リスト?)
1>.\DrawLib.cpp(214) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(214) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(215) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(215) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(217) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(217) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(218) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(218) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(220) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(220) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(221) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(221) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(222) : error C3872: '0x3000': この文字を識別子で使用することはできません
1>.\DrawLib.cpp(222) : error C3872: '0x3000': この文字を識別子で使用することはできません

たいちう

Re:デバック用の関数

#11

投稿記事 by たいちう » 15年前

> どうか今回だけはサンプルを頂けないでしょうか。

どう見ても捨てハンの人に今回だけって言われてもねぇ。
どっちみち今使っているPCにはDXライブラリが入ってないので作れません。

それよりも自分で作れるようになる方が魅力的ではないですか?
そのための手伝いならできますので、まず、
http://www.geocities.jp/ky_webid/c/057.html
の void func(int num, ...); を実行してください。

ST

Re:デバック用の関数

#12

投稿記事 by ST » 15年前

たいちう様
すみません・・・。
いつも本家で聞いておりこちらに来たのが初めてだったので・・・。
また固定のHNをもったことがないのでこれからは私のイニシャルで投稿させていただきます。

自分で作りたいのですが
こればかりはサンプルのソースを見たほうが
理解できると判断したので質問させていただきました。
普通の関数などは作ることができます・・・。

お願いです・・・。教えてください><

softya

Re:デバック用の関数

#13

投稿記事 by softya » 15年前

出ているエラーが、関数が作れる人のエラーと思えません。
初心者レベルのエラーが多数見受けられます。
とりあえずエラー取ってみませんか。

non

Re:デバック用の関数

#14

投稿記事 by non » 15年前

あのエラーはどのプログラムのエラーですか?
ソースを載せてください。

それより、なぜ、そんなデバッグ用の関数が必要なんでしょうか?
なくてもいいのでは?

ST

Re:デバック用の関数

#15

投稿記事 by ST » 15年前

すみません・・・かなりいじってしまったので
ソースの原型が残っておりません・・・。

作りたい理由としてこれを呼ぶだけでy軸を調整してくれるような仕様にしようと考えております。
Deb.Cntに読んだ回数
FONT_SIZEが文字サイズです。

かなり便利かと思うのですがこういうことはしないものなのでしょうか?
void DebText(char *FormatString, ... ){
    int x = 0;
    int y = Deb.Cnt*FONT_SIZE;

//    va_list list;
//    va_start( list, FormatString );  /* 可変引数リストの使用準備 */
//    for(int i=0; i<FormatString; ++i){
///        DrawFormatString(x,y,GetColor(255,255,255), FormatString, (char*)(&FormatString+1));
//    }
//    va_end( list );  
    Deb.Cnt++;
}

YuO

Re:デバック用の関数

#16

投稿記事 by YuO » 15年前

va_list相手に自分で処理するくらいなら,vsnprintfに任すのも手だと思います。
メモリの管理だけは自分でする必要がありますが。

MSDN: vsnprintf、_vsnprintf、_vsnprintf_l、_vsnwprintf、_vsnwprintf_l
http://msdn.microsoft.com/ja-jp/library/1kt27hek.aspx

流れとしては,
1. va_start
2. mallocで文字列バッファを確保 (malloc失敗時の処理を忘れずに)
3. vsnprintfでバッファへ出力
4. vsnprintfに失敗してればfreeして2へ (次回はバッファ長を増やす)
5. va_end
6. 文字列をDrawStringで出力
7. free
という感じになるかと思います

デバッグ目的とのことなので,場合によっては固定長の文字列バッファでもよいでしょう。
# 誰も突っ込まないので突っ込んでおくと,デバッ「グ」と,全ての音が濁ります (debug)。

たかぎ

Re:デバック用の関数

#17

投稿記事 by たかぎ » 15年前

>また変数名の取得をする方法などはあるのでしょうか?

ひとつだけ方法があります(厳密にいうともうひとつありますが紹介しません)。
可変長引数マクロを使って、

#define DebText(format, ...) #__VA_ARGS__ (以下省略)

のようにすれば、可変長引数に与えた内容が文字列として取り出せます。
あとは、これを解析すれば何とかなります。
ただし、単純な識別子やリテラルだけならともかく、式を実引数として与えると、C++パーサーと同じぐらいの仕事をしなければなりません。
それなりの大変さを覚悟してください。

SooA

Re:デバック用の関数

#18

投稿記事 by SooA » 15年前

>かなり便利かと思うのですがこういうことはしないものなのでしょうか?
なさろうとしていることが printf や printfDx そのものに
見えるんですが、そのまま使う方法ではダメなのでしょうか?

西村

Re:デバック用の関数

#19

投稿記事 by 西村 » 15年前

横から失礼します。
たかぎさんって毎回難しい言葉使って
質問者をいじめてませんか・・・?

スレ主には悪いですがこのような質問をする人が
C++パーサー等理解してるわけないですよね?

もう少しわかりやすく説明された方が
回答者からも喜ばれると思いますよ?

>>デバック用さん
以前、似た様な質問をここで見た記憶が御座います。
URLがでてこないのですがソース書きます。
可変長引数を与える方法ではないのですが
これでも表示ができます。
void        dumDebTextXY(int x, int y, int deb, char *name);
void        dumDebText(int deb,char *name);
#define        DebTextXY(X,Y,DEB)        dumDebTextXY(X,Y,DEB,TEXT(#DEB))
#define        DebText(DEB)            dumDebText(DEB,TEXT(#DEB))

void dumDebTextXY(int x, int y, int deb,char *name){
    char str[1024] = "";
    wsprintf(str, TEXT("%s = %d"),name,deb);
    DrawFormatString(x,y,GetColor(255,255,255),str);
}

void dumDebText(int deb,char *name){    
    //  Y座標指定
    int    y = Deb.Cnt * FONT_SIZE;
    
    char str[1024] = "";
    wsprintf(str, TEXT("%s= %d"),name,deb);
    DrawFormatString(0,y,GetColor(255,255,255),str);
    Deb.Cnt++;
}

たかぎ

Re:デバック用の関数

#20

投稿記事 by たかぎ » 15年前

> たかぎさんって毎回難しい言葉使って
> 質問者をいじめてませんか・・・?

いじめる意図はありません。
いじめる気があれば、荒らし行為を行うとか、もっといろいろやり方がありますね。

> スレ主には悪いですがこのような質問をする人が
> C++パーサー等理解してるわけないですよね?

理解しているかどうかは本人に聞いてみないとわかりませんが...
分からなければ検索すればよいだけのことです。
そのために、検索しやすい用語をわざわざ選んで使っているのですから。

ST

Re:デバック用の関数

#21

投稿記事 by ST » 15年前

>>西村様
ありがとうございます!!
出来ました><感激です。
どうやってもわからなかったので
手助けして頂いて感謝しております。

>>たかぎ様
いろいろとアドバイスありがとうございました。
正直いいますと西村様の言うとおり
わからない言葉を使われると戸惑ってしまいます・・・。

確かに調べなくてはいけないのですが
かなりモチベーションが下がります。

C++パーサーで調べたのですが
よく理解できませんでした><
ライブラリみたいなものでしょうか?
素人なので調べてもわからないことが多々御座います。
 ※調べ方も悪いのですが・・・。

回答して頂いたことに感謝はしております。
お気を悪くされましたら申し訳ございません。

甘えたことを言っているのはわかりますが
やはり可変長引数の使い方がわからないので
サンプルソースを頂けないでしょうか・・・。
宜しければ

たかぎ

Re:デバック用の関数

#22

投稿記事 by たかぎ » 15年前

> わからない言葉を使われると戸惑ってしまいます・・・。

それなら変数名を取り出すのは諦めてください。
nonさんでさえ、そんな方法は知らないといわれる内容です。簡単なはずがありません。

> 確かに調べなくてはいけないのですが
> かなりモチベーションが下がります。

理解できていないところに、コードだけ示せば、おそらくもっとモチベーションが下がると思います。
ボリューム的にも完全なコードを示すことはできませんので、やり方だけを示して、後は自力で何とかしなければならないのですから。

> C++パーサーで調べたのですが
> よく理解できませんでした><

何がどうわからないのでしょうか?
http://yougo.ascii.jp/caltar/パーサ

non

Re:デバック用の関数

#23

投稿記事 by non » 15年前

前に、たいちうさんや私が示したHPの解答②で
何が、わからないのでしょうか?
http://www.geocities.jp/ky_webid/c/057ans.html

これで、事足りていると、考えているのですが。
それ以上は、フォーマットの書式を示してもらわないとわかりません。
また、printfなどと、まったく同じ書式がすべて使えるようにするのは
大変なことですし、デバッグのためなら、すべてを満足する必要はないと思います。

たいちう

Re:デバック用の関数

#24

投稿記事 by たいちう » 15年前

> 甘えたことを言っているのはわかりますが
> やはり可変長引数の使い方がわからないので
> サンプルソースを頂けないでしょうか・・・。
> 宜しければ

可変長引数の使い方のサンプルについては、
私がリンクを張っています。

「可変長引数を理解する」ことと「DrawFormatStringを理解する」ことが、
STさんのやりたいことの必要条件のようですので、
まず前者に取り組んでみてはいかがですか?
と書いているのです。

目標達成までのステップは、次のようなものになるでしょう。

1.可変長引数の関数(1つ目の引数は、データの個数)
2.可変長引数の関数(vsnprintfで処理)
3.DrawFormatStringで文字列表示 (← これはできているようですね)
4.可変長引数をvsnprintfで処理してDrawFormatStringで表示

STさんが欲しがっているのは4.のサンプルですよね。
以前書いた通り私には作る環境がありませんし、
上記のステップを見れば、自分でも作れそうではないですか?

順番にやってください。
躓いたら適宜質問してください。

non

Re:デバック用の関数

#25

投稿記事 by non » 15年前

vsnprintfなんてのがあるのですね。失礼しました。
サンプルを作りました。
#include "DxLib.h"

void DebText(int x,int y,char *format, ... )
{
    va_list args;
    va_start( args, format );
    char str[100];
    vsnprintf_s(str,sizeof(str),_TRUNCATE, format, args);
    int White   = GetColor( 255 , 255 , 255 ) ; 
    DrawFormatString(  x, y, White ,  str );
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
    ChangeWindowMode( TRUE ) ; 
    if( DxLib_Init() == -1 ) return -1 ;

    int test=100;
    DebText(0,0,"test=%d",test);

    WaitKey() ;        
    DxLib_End() ;        
    return 0 ;     
}
va_end( args ); が必要なのかどうかわかりませんでした。

閉鎖

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