2012年7月30日月曜日

デバッグウインドウへ出力する

Win32APIのソフト開発なら
#include <windows.h>とインクルードしていると思いますが、この時
OutputDebugString(L"この文字列が出力される");
 という関数でプログラムの実行中に下に表示される「出力」というウインドウに文字列を表示できます。(文字列の前につけているLはユニコード設定でのコンパイル用です。)


数字の出力
以下は、数字も出力できるようにテンプレート関数を定義して使う例です。(ブラウザによっては改行コードが文字化けしているかも知れません。また、意味もなく文字の色が変わっているかも知れません。)



#include <windows.h>
#include <sstream> 

//引数一つ
template < typename T > void ods( T tep)
{
 std::wstringstream ss;
 std::wstring st;

 ss << tep<< L"\n";
 st = ss.str();
 OutputDebugString(st.c_str());
};
//引数2つバージョン
template < typename T, typename T2 > void ods( T tep, T2 tep2)
{
 std::wstringstream ss;
 std::wstring st;

 ss << tep << tep2<< L"\n";
 st = ss.str();
 OutputDebugString(st.c_str());
};
//引数3つバージョン(ただし型の種類は2つで交互に配置)
template < typename T, typename T2 > void ods( T tep, T2 tep2, T tep3)
{
 std::wstringstream ss;
 std::wstring st;

 ss << tep << tep2<< tep3 << L"\n";
 st = ss.str();
 OutputDebugString(st.c_str());
};

int main()
{
int x = 3;


ods(L"x = ", x, L" センチメートル");

  getchar();
  return 0;
}
--------出力結果----------
x = 3 センチメートル
-------------------------
以上の例で定義したodsという名前の関数は内部でストリングストリームというクラスを使って数字を文字列に変換しているためsstreamというヘッダが必要に成ります。

ストリングストリームを継承してみた


#include <windows.h>
#include  <sstream>

// デバッグウインドウへ文字列を出力する関数OutputDebug()があることと、その関数がデストラクタから呼ばれる事以外は
//wostringstreamと変わらないクラス
class DebugStringStream : public std::basic_ostringstream <wchar_t, std::char_traits<wchar_t> >
{
public:
              //デストラクタによる自動出力
 ~DebugStringStream ()
 {
  OutputDebug();
 }
              //引数で改行量を指定して出力
 void  OutputDebug(int kaigyou = 1)
 {
   for(int i = 0; i < kaigyou; ++i)
   {
    *this << L"\n";
   }
    //大域空間のOutputDebugStringを呼ぶ
    ::OutputDebugString(this->str().c_str());
    //一回呼ぶと内容はクリアされる
    this->str(L"");
 }   
};

int main()
{
DebugStringStream dss;
dss << L"あ~テステス " << 180 <<L"度";
dss.OutputDebug(2);//これで出力


 double pai = 3.14159265358979;
 //doubleやfloatの精度を設定
 dss.precision(15); 
 dss << L"円周率 = " << pai <<L"…";


//デストラクタが呼ばれても出力される
  return 0;
}

//---出力結果----
あ~テステス 180度

円周率 = 3.14159265358979…
ーーーーーーーーー
こちらはIOストリームの整形機能が利用できるし、沢山の出力をしたい場合、速度面で有利です。
まぁ普通にストリングストリームを使うのとさほど違いはありません。

0 件のコメント: