2015-12-16 11 views
5

मैं निम्नलिखित कोड को चलाने के लिए कोशिश कर रहा हूँ:सी जबकि पाश अन-समझाया व्यवहार

#include <sys/time.h> 
#include <stdio.h> 

int main() 
{ 
unsigned int ms, oldms = 0,dif; 
struct timeval tv; 
while(1) 
{ 
gettimeofday(&tv, NULL); 
ms=tv.tv_sec; 
//printf("%d\n",ms-oldms); 
dif=ms-oldms; 
if(dif>3) 
    {  
     printf("3 seconds up"); 
     oldms=ms; 
    } 
} 
} 

मैं इसे "ऊपर 3 सेकंड" हर 3 सेकंड के बाद मुद्रित करने के लिए उम्मीद कर रहा हूँ, लेकिन यह है कि प्रदर्शित नहीं करता है संदेश। मैंने जीडीबी का उपयोग करके इसे डीबग करने का प्रयास किया लेकिन कुछ भी गलत नहीं लगता है और अभी भी कोई आउटपुट नहीं है। डीबग करने का प्रयास करते समय, मैंने एक printf कथन जोड़ा और जादुई रूप से आउटपुट देखा जा सकता है।

यदि मैं // printf ("% d \ n", ms-oldms) को हटाने के बाद प्रोग्राम चलाता हूं; बयान, फिर से कोई आउटपुट नहीं है। मुझे यकीन नहीं है कि क्या हो रहा है और क्या यह किसी भी चीज़ पर निर्भर है।

$ जीसीसी --version जीसीसी (उबंटू 4.8.2-19ubuntu1) 4.8.2

+4

, अपने printf – Jorgel

+0

@Jorgel पर एक नई पंक्ति डाल printf में एक नई पंक्ति डाल काम का प्रयास करता है। लेकिन, मैं अभी भी इस व्यवहार के बारे में उलझन में हूं। यह पहली बार हुआ जब मैंने इसका सामना किया। – kid

+0

आपके पास अनंत लूप है - यह "पहली बार" है। यदि आप 'printf' के बाद' ब्रेक 'जोड़ते हैं तो भी नई लाइन के बिना यह ठीक काम करेगा। – i486

उत्तर

10

आउटपुट बफरिंग कारण है।

stdout टर्मिनल डिवाइस से जुड़ा हुआ डिफ़ॉल्ट रूप से लाइन buffered है। आप fflush(stdout); का उपयोग कर \nprintf() यानी printf("3 seconds up\n"); का उपयोग कर इसे बाहर निकाल सकते हैं। या इसे setbuf(stdout, 0);

I/O सामान्य रूप से धीमा है। तो लागू होने के बाद कार्यान्वयन एक निश्चित आकार बफर और printf का उपयोग करते हैं। प्रैक्टिस में, fflush(stdout); पर कॉल करना अक्सर प्रदर्शन को प्रभावित कर सकता है।

+0

तो यह समस्या printf के साथ सही है? आपके उत्तर से मुझे लगता है कि कोड में होने वाली प्रसंस्करण के दौरान लूप या बड़ी मात्रा में कुछ भी गलत नहीं है। – kid

+0

हां। लूप के साथ कुछ भी गलत नहीं है। लेकिन मैं नहीं कहूंगा कि यह एक "समस्या" है। एक अच्छा कारण है कि libc कार्यान्वयन क्यों बफरिंग करते हैं: प्रदर्शन। –

+0

या तो printf ("3 सेकंड अप \ n"); या printf ("\ n3 सेकंड अप"); काम नहीं किया Printf ("3 सेकंड अप \ n") से पहले एक नया printf ("\ n") भी जोड़ने में मदद नहीं मिली। यदि कोड टिप्पणी – kid

1

पोस्ट कोड समस्याओं की एक जोड़ी है

  1. चर oldms बीता हुआ समय या तो fflush(stdout); के लिए एक कॉल या एक अनुगामी न्यू लाइन (बिना जाँच की जा रही है
  2. से पहले किसी भी विशिष्ट मान पर सेट नहीं किया जा रहा है प्रारूप स्ट्रिंग में '\ n'), कुछ भी नहीं है एक बहुत लंबे समय के लिए निर्गम (, जब तक कि प्रणाली stdout बफर भर जाता है हो जाएगा)
  3. पठनीयता के लिए
  4. , स्वयंसिद्ध only one statement per line and (at most) one variable declaration per statement कोड
करने के लिए लागू किया जाता है

निम्नलिखित कोड सफाई से संकलित करता है तथा वांछित आपरेशन

#include <sys/time.h> 
#include <stdio.h> 

int main() 
{ 
    unsigned int ms; 
    unsigned int oldms = 0; 
    unsigned int dif; 
    struct timeval tv; 

    gettimeofday(&tv, NULL); 
    oldms = tv.tv_sec; 

    while(1) 
    { 
     gettimeofday(&tv, NULL); 
     ms=tv.tv_sec; 
     //printf("%d\n",ms-oldms); 
     dif=ms-oldms; 

     if(dif>3) 
     { 
      printf("3 seconds up\n"); 
      oldms=ms; 
     } 
    } 
} // end function: main 
संबंधित मुद्दे