以下を教えて下さい。
1.タイムスタンプ(HH:MM:SS)を表示させる方法
2. ライン数がを表示させる方法
VC++初心者向けの本に上記のようなものがありましたが、
System::Diagnostics::Debug::WriteLine("hogehoge");
引数がふたつしか取れません。(同時に表示できる変数は2つまで?)
もっとよいものがあれば教えて下さい。
ラインに限っていえば、こんなイメージ。
printf("filename = %s , line = %d\n",__FILE__,__LINE__ );
これに相当するものを知りたいです。
あと、トレースした部分をログファイルに書き出してくれる機能とか
あるのでしょうか?あれば教えてください。
(とりあえず、聞いてみてるだけです。)
VC++は、2008ExpressEditionと.NET 2003を使っています。
VC++は、2008ExpressEditionと.NET 2003を使っています。
まず、最初に確認ですが、作成されたいアプリケーションのタイプは、
のどちらでしょうか?
「Visual C++ .NET 2003」「Visual C++ 2008 Express Edition」のどちらでも
「Windows ネイティブアプリケーション」「.NET アプリケーション」を作成可能ですが、
それぞれの開発環境により、利用可能なライブラリや構文が異なるので注意が必要です。
主なライブラリの使用用途としては、
という感じでしょうか。
「Visual C++ 2008 Express Edition」を使用されているということですので、
「CLR(VC++/CLI)」を使用して「.NET アプリケーション」を作成した場合について説明致します。
1.タイムスタンプ(HH:MM:SS)を表示させる方法
.NET のライブラリでは日付型を「HH:mm:ss」で書式化することで
「HH:MM:SS」の形式で表示されます。
■ @IT:.NET TIPS 日付や時刻を文字列に変換するには? - C# VB.NET http://www.atmarkit.co.jp/fdotnet/dotnettips/200customdate/
2. ライン数を表示させる方法
StackTrace を用いることでファイル名、行番号が取得可能です。
ただし、最適化の関係で、デバッグ版でしか正しい行番号が取得できないようです。
■ StackTrace クラス (System.Diagnostics) http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stack...
トレースした部分をログファイルに書き出してくれる機能
DefaultTraceListener にて出力先のファイル名を指定することで、
トレースした内容をログファイルに出力することが可能です。
■ @IT:.NET TIPS デバッグ・メッセージをファイルに出力するには? - C# VB.NET VS.NET http://www.atmarkit.co.jp/fdotnet/dotnettips/146debugonfile/debu...
以下は、サンプルになります。
Release ビルドでも Debugt::WriteLine() でファイル出力してしまうようですので、#if defined(_DEBUG) を用いて Debug ビルド時のみ出力するようにしています。
// File : DebugWriteLineTest.cpp // Compile : cl DebugWriteLineTest.cpp /clr /D "_DEBUG" /FU "c:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll" [Enter] // Usage : DebugWriteLineTest.exe [Enter] using namespace System; using namespace System::Diagnostics; int main(array<System::String ^> ^args) { #if defined(_DEBUG) // ■ @IT:.NET TIPS デバッグ・メッセージをファイルに出力するには? - C# VB.NET VS.NET // http://www.atmarkit.co.jp/fdotnet/dotnettips/146debugonfile/debugonfile.html DefaultTraceListener^ dtl = (DefaultTraceListener^)Debug::Listeners["Default"]; dtl->LogFileName = "C:\\TEMP\\debug.txt"; #endif // ■ @IT:.NET TIPS 日付や時刻を文字列に変換するには? - C# VB.NET // http://www.atmarkit.co.jp/fdotnet/dotnettips/200customdate/customdate.html DateTime^ dt = DateTime::Now; Debug::WriteLine( "DateTime: " + dt->ToString("HH:mm:ss") ); // ■ StackTrace クラス (System.Diagnostics) // http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stacktrace.aspx StackTrace^ st = gcnew StackTrace(true); StackFrame^ sf = st->GetFrame(0); Debug::WriteLine( "File: " + sf->GetFileName() ); Debug::WriteLine( "Line Number: " + sf->GetFileLineNumber().ToString() ); Debug::WriteLine( "Hello World" ); return 0; }
<実行結果(C:\TEMP\debug.txt の内容)>
DateTime: 19:19:36 File: c:\home\edu\vs2008\vc9\clr\debugwritelinetest\debugwritelinetest\debugwritelinetest.cpp Line Number: 19 Hello World
丁寧なご回答有難うございます。
幾つかリンク切れがあり、参照できないページがありましたが、
サンプルコードを組み込み、動作させたところ、概ね出来ました。
但し、行数表示に関しては、
Debug::WriteLine( "Line Number: " + sf->GetFileLineNumber().ToString() );
の行番号ではなく、
StackTrace^ st = gcnew StackTrace(true);
の行番号が表示されました。
ご指摘の通り、最適化の関係で、デバッグ版でしか正しい行番号が取得できない
ということでしょうか?