0

これに対する答えを探しましたが、何も見つかりませんでした。私が見つけた最も近い ものは、明らかに違いがあるときに0を返すdifftimeでした。これは、引数がスタックにプッシュされる方法とフォーマットが期待するものに関係する素晴らしい説明がありますが、私の問題は異なると思います。

例をできるだけ単純にしました。Cに次のコードがあるとします。

time_t starttime = time(NULL)
somefunction();
time_t newtime = time(NULL)

fprintf(stderr, "starttime %f and difftime %f\n", starttime, difftime(newtime, starttime));
fprintf(stderr, "difftime %f and starttime %f\n", difftime(newtime, starttime), starttime);
return 0;

また、somefunctionは、1秒または2秒間実行される関数です。これで得られる出力は次のとおりです。

starttime 2.000000 and difftime 0.000000
difftime 2.000000 and starttime 0.000000

どこから質問を始めればいいのかさえわかりません。順序を入れ替えても、出力値が同じなのはなぜですか?さらに、値の1つが0であるのはなぜですか?これは、%f、%d、%lu、%lluなどを使用しても同じです。これに対するスタック引数の説明はありますか?fprintfは実際に内部で何をしていますか?

ありがとうございました。私はこれをデバッグしようとして私の人生の多くを無駄にしてきました、そして私は本当にあなたの助けに感謝します!

4

2 に答える 2

2

"%f"指定子は、プラットフォームに適していませんtime_t。私の知る限り、time_t型は整数でも実数でもかまいません。

たとえば、POSIX標準は単に次のように述べています。

time_tclock_t整数型または実数浮動型でなければなりません。

これを試して:

/* Flawed bad and wrong. */
printf("%f\n", (double)starttime);

私はそれをにキャストするための提案を見てきましたuintmax_tunsigned long longなど。明らかに、本当の答えはここにあります:

printf()time_t、periodを統一する方法はありません。これを行うことは想定されていません。time_tが内部的に何であるかを知る必要さえありません。推奨される代替案には、ctime()およびstrftime()が含まれます。コードを移植可能に保つためにこれらを使用してください。

于 2011-12-10T12:10:36.777 に答える
1

starttimetime_tですが、を使用して印刷する必要があります。これには、が必要%fですdouble。明らかに、プラットフォームでtime_tは、代わりに整数型です。

おそらく、変数引数リスト関数に対するプラットフォームの呼び出し規約はfprintf()、整数引数とは異なる場所で浮動小数点引数を渡すようなものです。

このdifftime()関数は2.0を返す可能性があります。これは、最初の浮動小数点引数の場所で渡されます。そのため%f、どちらの場合も、最初の関数は2.0を出力します。2番目の浮動小数点引数の位置にはゼロが含まれているように見えるため、2番目の引数%fはどちらの場合もゼロを出力します。引数は、コードtime_tによってまったく調べられていない別の場所に配置されています。fprintf()

于 2011-12-10T12:33:15.323 に答える