2012-02-02 8 views
0

なぜ私は次の操作を実行した場合:time.tv_usecは4259840バイトを使用しているgettimeofday()とtime_tが意味をなさないのはなぜですか?

time seconds 4 useconds 4259840 

struct timeval time; 

gettimeofday(&time, NULL); 

log("time seconds %i useconds %i", sizeof(time.tv_seconds), sizeof(time.tv_usec)); 

が、それはOpenWrtの中に戻るのか? tv_seconds(エポック以降)は長いlong intなので意味があります。しかし、 tv_usecは常に100万円以下でなければなりません。

答えて

3

sizeofオペレータは、size_tオブジェクトを返します。 %zu形式を使用してください。%iではなく、印刷してください。不一致の書式文字列と引数型の結果として、何らかの引数を渡している可能性があります。あなたのコンパイラで警告レベルを上昇させるならば、それについての警告を得るべきです。たとえば、打ち鳴らすは私に語った:

もちろん
example.c:7:25: error: conversion specifies type 'int' but the argument has type 
     'unsigned long' [-Werror,-Wformat] 
    printf("time seconds %i useconds %i\n", sizeof(time.tv_sec), ... 
         ~^     ~~~~~~~~~~~~~~~~~~~ 
         %lu          

、あなたのlog()機能が実装されているかに依存してもよいこと - も、あなたのバグの原因であるかもしれません。

+0

これらはどちらも長いと思われますが、何らかの理由で%liの形式の文字列に出力すると機能しません。だから私は実験して、lliはtv_secondsの間働いています。 tv_usecondsは常に間違っています。だから、私はこれらの変数が実際のサイズであるかどうか把握しようとしています。 – napierzaza

+0

@Nathan No: 'struct timeval.tv_sec'は' long'ではなく 'time_t'として定義されています。さらに、私のマニュアルは 'struct timeval.tv_usec'が' long long'ではなく 'suseconds_t'であると伝えています。 –

1

私のクリスタルボールを覗くと...問題は、あなたのログ機能がその引数を間違って解析していることです。代わりにprintfを試してみてください。

+1

次の場合はどうなりますか?log( "time seconds%i useconds%i"、4lu、4lu)? –

+0

あなたは正しいです。なぜそれが動作しないのか分かりません。より多くのバグ、より多くのバグが文字列と関係します! – napierzaza

関連する問題