質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1738閲覧

デバッグの支援関数を作っています。処理を短くして見やすくしたいです。

tunakan_ex

総合スコア21

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/15 11:49

編集2016/02/15 11:51

C

1#include <list> 2#include <string> 3 4//デバッグリストに追加するには次の4行を貼り付ける 5char buf[32]; 6sprintf_s(buf, "%d", 10); 7char buf2[32] = "テスト"; 8addDebugList(buf2, buf); 9 10 11//listのコンテナ宣言 12list<string> debugList1; 13list<string> debugList2; 14void addDebugList(char(&bungen)[32], char(&atai)[32]) 15{ 16 debugList1.push_back(bungen); 17 debugList2.push_back(atai); 18} 19

以上のようなデバッグを支援するためのコードがあったとします。
デバッグしたい項目があればaddDebuglistに項目名とそのデータを引数で渡します。

しかし、そのリストに追加するためには四つも処理(4~7行目あたり)を行わなければいけません。デバッグする度に4行も書いていたらソースが読みにくくなる原因になると思いました。

誰かこれを今よりも短くすることはできますか?

ちなみにDXライブラリを使って自作ゲームを作っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

クラス、関数テンプレート、マクロを組み合わせます。

以下のようにヘッダーにデバッグ支援コードを書きます。

C++

1#include <list> 2#include <string> 3#include <sstream> 4 5class DebugList 6{ 7 std::list<std::string> debugList1; 8 std::list<std::string> debugList2; 9 10 DebugList() 11 {} 12 13public: 14 static DebugList & getInstance() 15 { 16 static DebugList instance; 17 return instance; 18 } 19 20 template <class Type> 21 void addDebugList(const std::string & bungen, const Type & atai) 22 { 23 std::stringstream ss; 24 ss << atai; 25 debugList1.push_back(bungen); 26 debugList2.push_back(ss.str()); 27 } 28}; 29 30#define ADD_DEBUG_LIST(bungen, atai) DebugList::getInstance().addDebugList(bungen, atai)

このヘッダーをインクルードすればADD_DEBUG_LIST("テスト", 10);のように1行で書けます。
マクロにしておけば、後で__FILE____LINE__のようなデバッグに役に立つ情報を組み込みたくなったときに、呼び出し側を変える必要がないという利点があります。

投稿2016/02/15 12:41

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2016/02/15 12:47

あう、先をこされてしまった。ほとんど同じもの書いてました。 マクロ化、良いですね。 ところで、クラスまではしないで安易にグローバル関数で良いような気もします。
catsforepaw

2016/02/15 12:56

デバッグ支援コードは状況によって(リリースビルドとかで)無効化したいこともあるので、マクロにすると都合が良いんですよね。 > ところで、クラスまではしないで安易にグローバル関数で良いような気もします。 最初はそれも考えたのですが、ご質問のコードの「listのコンテナ」の置き場所を考えたら、クラス化した方が扱いやすいと思いました。
Chironian

2016/02/15 13:11

ヘッダにだけ支援コードを書いてでcpp不要にしたってわけですね。なるほど。 デバッグ支援は使いたい時にサッと使いたいですもんね。その発想は持ってませんでした。頂きます。
tunakan_ex

2016/02/15 13:17

ありがとうございます。使ってみます。
catsforepaw

2016/02/15 13:28

Chironian さん > ヘッダにだけ支援コードを書いてでcpp不要にしたってわけですね。 それです。「デバッグ支援コードはヘッダーに書く」ということが私の中で常識化してしまったので説明を省いてしまいました。特にチーム開発などではいかに簡単に使わせるのかということも重要な課題ですからね。
guest

0

実行中に変数がどのようになっているか調べたいのなら、
char buf[32];
sprintf_s(buf, "%d", 10);
char buf2[32] = "テスト";
addDebugList(buf2, buf);

ではなくて
addDebugList(buf2, buf);
のみでいいのでは?
buf2やbufではなくて調べたい変数(iやstrなど)をそのまま書けば1行で済む。

投稿2016/02/15 12:00

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問