2009-09-24 13 views
13

私はtimeval型の値を印刷しようとしています。実際に私はそれを印刷することができていますが、私は次の警告を得る:この行でUNIXプログラミング。 struct timevalそれを印刷する方法(Cプログラミング)

複数のマーカー

  • フォーマット「%ldが」「long int型」と入力期待しますが、引数2「はstruct timevalにを入力したが'

プログラムはコンパイルして値を出力しますが、私は何か間違っているかどうかを知りたいと思います。ありがとう。

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

あなたは根本的な分野で取得する必要があります:使用量がstruct timevalのでタイプ

typedef struct{ 
    struct timeval ru_utime; /* user time used */ 
    struct timeval ru_stime; /* system time used */ 
    long ru_maxrss;  /* maximum resident set size */ 
    long ru_ixrss;   /* integral shared memory size */ 
    long ru_idrss;   /* integral unshared data size */ 
    long ru_isrss;   /* integral unshared stack size */ 
    long ru_minflt;  /* page reclaims */ 
    long ru_majflt;  /* page faults */ 
    long ru_nswap;   /* swaps */ 
    long ru_inblock;  /* block input operations */ 
    long ru_oublock;  /* block output operations */ 
    long ru_msgsnd;  /* messages sent */ 
    long ru_msgrcv;  /* messages received */ 
    long ru_nsignals;  /* signals received */ 
    long ru_nvcsw;   /* voluntary context switches */ 
    long ru_nivcsw;  /* involuntary context switches */ 
}rusage; 

struct rusage usage; 
+0

よく私はそれが私に警告を与えるが、これを適切に行う方法があり、なぜ体timevalはタイプ長いザッツのではありません知っていますか? – user69514

+0

あなたの岩は...完璧に働いています... – user69514

答えて

20

In the GNU C Librarystruct timeval

はSYS/TIME.Hで宣言され、 以下のメンバーを持っているされています

long int tv_sec 

これは、経過時間の全体の秒数を表します。

long int tv_usec 

これは、マイクロ秒の数で表される残りの経過時間(1秒単位)です。それは常に100万未満です。

だから、

printf("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 

1.000123のように "きれいにフォーマット" のタイムスタンプを取得するために行う必要があります。

+2

私のシステムでは、struct timevalは "time_t tv_sec"と "suseconds_t tv_usec"で宣言されています。私はこれらを "%ld"で印刷して運が良かったですが、保証はありません。おそらく印刷する前にキャストするのが最も安全です。 –

7

である

printf("%ld.%6ld\n",usage.ru_stime); 
    printf("%ld.%6ld\n",usage.ru_utime); 

は次のように宣言されます

printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 
printf ("%ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec); 
+0

%06ldを使用する必要があります。そうしないと面白い場所で空白ができます。また、%ldを使用すると、長いキャストを心配する必要があります。 –

+0

システム時刻を別の変数に割り当てる場合は、次のようにします。 long specialTime; これを行う方法はありますか? – user69514

+0

あなたが望む解像度に依存します。私は自分の "struct timeval myTime;"を宣言するだけです次に "memcpy(&myTime、&(usage.ru_stime)、sizeof(myTime));"を使用します。その後、それを後のru_stimeと比較して持続時間を取得することができます。 – paxdiablo

1

はい、体timevalは確実に助けの

printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 

をします使用して、この

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

のように定義されています。

1

ええ、もちろんその

int main(void) 
{ 
    clock_t start, stop; 
    long int x; 
    double duration; 
    static struct timeval prev; 
    struct timeval now; 

    start = clock(); // get number of ticks before loop 

    for(x = 0; x < 1000000000; x++); 
    // sleep(100); 

    stop = clock(); // get number of ticks after loop 

    // calculate time taken for loop 
    duration = (double) (stop - start)/CLOCKS_PER_SEC; 

    printf("\nThe number of seconds for loop to run was %.2lf\n", duration); 

    gettimeofday(&now, NULL); 
    prev.tv_sec = duration; 
    if (prev.tv_sec) 
    { 
     int diff = (now.tv_sec-prev.tv_sec)*1000+(now.tv_usec-prev.tv_usec)/1000; 
     printf("DIFF %d\n",diff); 
    } 

    return 0; 

} 
+2

レコードのために、あなたのdiff変数を計算するには、 '#include 'で定義された 'timersub()'マクロを使うべきです。 'man 3 timeradd'を参照してください。 –

+1

@HeisSpiter 'timersub'はPOSIXに準拠しておらず、移植性があまりありません。 – nwellnhof

関連する問題