次の質問に対する答えを見つけることができず、機能に関連する問題がいくつかあります。
私の主なプログラミングは C# で行われており、勉強中に C++ を実際に学んだことはありませんが、現在の仕事では C++ プログラミングもいくつか行う必要があります。
C++ プログラミングのほとんどは元従業員によって行われ、彼はロギング用の関数を作成しました。
時々、この関数はエラー (アクセス違反) になります。これはユーザーには表示されませんが、デバッガーでコードを実行しているときに表示されます。
エラーが発生すると、次のコード行が示されます。
vfprintf( LogFile, fmt, va );
次に、前後のコードを詳しく調べました。上記をコンテキストに入れると、コードは次のようになります。
void FileLog( char *fmt, ... )
{
va_list va;
struct time t;
struct date d;
long clk;
static int ReEntrant = 0;
if( FileLogEnabled == false )
return;
ReEntrant++;
if( ReEntrant > 1 )
return;
if( LogFile == NULL )
LogFile = fopen( LogFileName, "a+" );
if( LogFile != NULL )
{
gettime( &t );
getdate( &d );
fprintf( LogFile, "\n%d-%02d-%02d %2d:%02d:%02d.%02d0> ", d.da_year, d.da_mon, d.da_day, t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund );
va_start( va, fmt );
vfprintf( LogFile, fmt, va );
va_end( va );
fflush( LogFile );
...
}
ReEntrant = 0;
}
実際、なぜそれが必要なのか理解できません (必要な場合は?) fprintf と vfprintf の両方を呼び出しますか? 最初の fprintf 呼び出しは、フォーマットされた文字列をストリーム (ファイル) に書き込むと思いますが、それで十分でしょうか?
少しの説明またはいくつかの情報をいただければ幸いです:)
編集: nos からのコメントの後 - 今日このエラーを頻繁に引き起こしている関数への特定の呼び出しを追跡しました。
FileLog( "TimerRestore[%d], Name=%s", Package.CurGame->Timers[ Index ].Name.c_str() );
「TimerRestore[%d], Name=%s」の後には 10 進数と文字列の引数が必要ですが、文字列の引数しか与えられないため、これは確かに問題を引き起こす可能性があると思います。私はいくつかのテストを行う必要がありますが、このコードを書いた作者は次のように書くつもりだったと確信しています:
FileLog( "TimerRestore[%d], Name=%s", Index, Package.CurGame->Timers[ Index ].Name.c_str() );
ただし、関数呼び出しが常にエラーになるとは限らない理由はまだわかりません。または、FileLog 関数の "ReEntrant" 変数が失敗しないときにブロックしていることが原因でしょうか?
すべてのフィードバックと情報に感謝します。