2009-09-24 13 views
13

मैं टाइप टाइमल के मान को प्रिंट करने की कोशिश कर रहा हूं। असल में मैं इसे मुद्रित करने में सक्षम हूँ, लेकिन मैं निम्नलिखित चेतावनी मिलती है: इस लाइनयूनिक्स प्रोग्रामिंग। स्ट्रक्चर टाइमवल इसे प्रिंट कैसे करें (सी-प्रोग्रामिंग)

  • प्रारूप '% ld' पर

    एकाधिक मार्करों टाइप 'लंबी पूर्णांक' उम्मीद है, लेकिन तर्क 2 टाइप है 'struct timeval '

प्रोग्राम संकलित करता है और यह मान प्रिंट करता है, लेकिन मैं जानना चाहता हूं कि मैं कुछ गलत कर रहा हूं या नहीं। धन्यवाद।

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

आप अंतर्निहित क्षेत्रों में प्राप्त करने की आवश्यकता:

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

जहां उपयोग प्रकार

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 कारण है कि यह मुझे चेतावनी देता है, लेकिन इसके ठीक से करने के लिए एक तरीका है लंबे thats प्रकार की नहीं है? – user69514

+0

आप लोग चट्टान ... जो पूरी तरह से काम किया ... – user69514

उत्तर

20

In the GNU C Library, struct timeval:

sys/time.h में घोषित कर दिया और निम्नलिखित सदस्य हैं जाता है:

long int tv_sec 

यह बीता हुआ समय के पूरे सेकंड की संख्या का प्रतिनिधित्व करता है।

long int tv_usec 

यह बीता हुआ समय के बाकी (एक दूसरे के एक अंश), माइक्रोसेकंड की संख्या के रूप में प्रतिनिधित्व है। यह हमेशा दस लाख से भी कम है।

तो तुम

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

1.000123 की तरह एक "ठीक से स्वरूपित" टाइमस्टैम्प प्राप्त करने के लिए करने की आवश्यकता होगी।

+2

मेरे सिस्टम पर, स्ट्रक्चर टाइमवल को "time_t tv_sec" और "suseconds_t tv_usec" के साथ घोषित किया जाता है। मुझे "% ld" के साथ इन्हें भाग्यशाली प्रिंटिंग मिली है, लेकिन इसकी कोई गारंटी नहीं है। मुद्रण से पहले लंबे समय तक कास्ट करना शायद सबसे सुरक्षित है। –

7

की है struct timeval के बाद से की तरह कुछ घोषित किया जाएगा

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

अगर मैं सिस्टम वैरिएबल को किसी अन्य चर में असाइन करना चाहता था, तो मान लें: लंबे विशेष समय; क्या ऐसा करने का कोई तरीका है? – user69514

+0

आपके इच्छित संकल्प पर निर्भर करता है। मैं बस अपना खुद का "स्ट्रक्चर टाइमवॉल मायटाइम" घोषित करने का विकल्प चुनूंगा; फिर "memcpy (और myTime, & (use.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 चर की गणना करने के लिए, आपको 'timersub()' मैक्रो को '#include ' में परिभाषित किया जाना चाहिए। 'मैन 3 टाइमरड' देखें। –

+1

@HeisSpiter 'timersub' POSIX-compliant नहीं है और इस प्रकार बहुत पोर्टेबल नहीं है। – nwellnhof

संबंधित मुद्दे