2013-02-22 58 views
6

मैं मिलीसेकंड को जीएनयू (जीसीसी) लिनक्स की टाइमपेक संरचना में परिवर्तित करना चाहता हूं। मैंने इसके लिए कोड का पालन करने की कोशिश की है।मिलीसेकंड्स को टाइमपेक में कनवर्ट करें - जीएनयू पोर्टिंग

timespec GetTimeSpecValue(unsigned long milisec) 
    { 
    struct timespec req; 
    //long sec = (milisecondtime /1000); 
    time_t sec = (time_t)(milisec/1000); 
    req->tv_sec = sec; 
    req->tv_nsec = 0; 
    return req; 
    } 

इस कोड को चलाने से मुझे निम्नलिखित त्रुटि मिलती है।

की उम्मीद '=', ',', ';', 'एएसएम' या '__attribute__' 'GetTimeSpecValue'

इससे पहले कि मैं भी कोड में time.h फ़ाइल को शामिल किया है।

+0

एचएम, या तो time.h ठीक से शामिल नहीं किया गया था या कहीं ऊपर अर्धविराम गायब है। – KBart

+0

अच्छी तरह से, यह मामला नहीं है।मैं पहले से ही पूरे कोड से गुजर चुका हूं और ऐसी कोई गलती नहीं मिली है। :-( –

+4

आपके कोड में कई त्रुटियां हैं। कोई 'टीवी' घोषित नहीं किया गया है जिसे आप वापस करने का प्रयास करते हैं (मुझे लगता है कि आप इसके बजाय' req' वापस करना चाहते हैं)। 'Req' एक सूचक नहीं है लेकिन आप इसे एक्सेस करने का प्रयास करते हैं '->' के माध्यम से। और आपको 'timespec' के बजाय 'struct timespec' वापस करना होगा। – scai

उत्तर

11

timespec संरचना दो भागों में समय का प्रतिनिधित्व करता है - सेकेंड और नैनोसेकंड। इस प्रकार, मिलीसेकंड से रूपांतरण के लिए एल्गोरिदम बहुत आसान सरल है। एक सेकंड में हजार मिलीसेकंड होते हैं, एक मिलीसेकंड में एक हजार माइक्रोसॉन्ड होते हैं और एक माइक्रोसेकंड में हजारों नैनोसेकंड होते हैं, जिसके लिए हम SI का आभारी हैं। इसलिए, हमें पहले कई सेकंड प्राप्त करने के लिए मिलीसेकंड को हजारों तक विभाजित करने की आवश्यकता है। कहें, उदाहरण के लिए, 1500 मिलीसेकंड/1000 = 1.5 सेकंड। पूर्णांक अंकगणित (एक फ़्लोटिंग प्वाइंट नहीं) दिया गया है, शेष गिरा दिया गया है (यानी 1500/1000 केवल 1 के बराबर है, 1.5 नहीं)। फिर हमें एक ऐसा शेष लेने की आवश्यकता है जो कई मिलीसेकंडों को दर्शाती है जो निश्चित रूप से एक सेकंड से भी कम है, और इसे एक लाख से गुणा करके इसे नैनोसेकंड में परिवर्तित करने के लिए गुणा करें। 1000 से विभाजित करने के लिए, हम module operator (%) (यानी 1500 % 1000 is equal to 500) का उपयोग करते हैं। उदाहरण के लिए, सेकंड और नैनोसेकंड को 4321 मिलीसेकेंड में परिवर्तित करते हैं:

  1. 4321 (मिलीसेकेंड)/1000 = 4 (सेकंड)
  2. 4321 (मिलीसेकेंड)% से लेकर 1000 = 321 (मिलीसेकेंड)
  3. 321 (मिलीसेकेंड) * 1000000 =00000 (नैनोसेकंड)

उपर्युक्त को जानने के लिए, केवल एक चीज जो शेष है, वह थोड़ा सी कोड लिखना है। ऐसी कुछ चीजें हैं जिन्हें आपने सही नहीं किया:

  1. सी में, आपको struct के साथ संरचना डेटा प्रकारों को उपसर्ग करना होगा। उदाहरण के लिए, timespec कहने के बजाय आप struct timespec कहते हैं। सी ++ में, हालांकि, आपको यह करने की ज़रूरत नहीं है (दुर्भाग्य से, मेरी राय में)।
  2. आप सी में फ़ंक्शन से संरचनाएं वापस नहीं कर सकते हैं। इसलिए, आपको उस फ़ंक्शन में पॉइंटर द्वारा संरचना को पास करने की आवश्यकता है जो उस संरचना के साथ कुछ करता है।

ठीक है, पर्याप्त बात कर रही है। नीचे एक सरल सी कोड उदाहरण है:

#include <time.h> 
#include <stdlib.h> 
#include <stdio.h> 

static void ms2ts(struct timespec *ts, unsigned long ms) 
{ 
    ts->tv_sec = ms/1000; 
    ts->tv_nsec = (ms % 1000) * 1000000; 
} 

static void print_ts(unsigned long ms) 
{ 
    struct timespec ts; 
    ms2ts(&ts, ms); 
    printf("%lu milliseconds is %ld seconds and %ld nanoseconds.\n", 
      ms, ts.tv_sec, ts.tv_nsec); 
} 

int main() 
{ 
    print_ts(1000); 
    print_ts(2500); 
    print_ts(4321); 
    return EXIT_SUCCESS; 
} 

उम्मीद है कि यह मदद करता है। शुभ लाभ!

+0

यह 'ts-> tv_nsec = (ms - (ts-> tv_sec * 1000)) * 1000000' का उपयोग करने के लिए बेहतर/तेज़ नहीं होगा, मॉड एक धीमी ऑपरेशन है, विशेष रूप से उन प्रोसेसर पर जिनके पास हार्डवेयर नहीं है FPU – Geoffrey

+0

यह ध्यान दिया जाना चाहिए कि कुछ फ़ंक्शन, जैसे pthread_mutex_cond_timedwait tv_sec में टाइमस्टैम्प का उपयोग करते हैं ... इसने मुझे थोड़ी देर के लिए अपने सिर को खरोंच कर दिया था। – Geoffrey

+0

मुझे आपकी व्याख्या पसंद आया! – jafarmlp

2

इस प्रयास करें:

struct timespec GetTimeSpecValue(unsigned long millisec) { 
    struct timespec req; 
    req.tv_sec= (time_t)(millisec/1000); 
    req.tv_nsec = (millisec % 1000) * 1000000; 
    return req; 
} 

मुझे नहीं लगता कि struct timespec typedef'ed जाता है, इसलिए आप struct साथ timespec पहले जोड़ें की जरूरत है। और यदि आप सटीक होना चाहते हैं तो नैनो दूसरे भाग को बाहर करें। ध्यान दें कि req एक सूचक नहीं है। इस प्रकार सदस्यों को '->'

+1

यदि वह इनपुट के रूप में मिलीसेकंड प्राप्त करता है तो वह किसी भी नैनोसेकंड की गणना नहीं कर सकता :)। – scai

+0

सच :) लेकिन वह tv_nsec को यथासंभव यथासंभव सटीक इनपुट मिलियन सेकंड अपडेट कर सकता है। मैं इसे अपने पोस्ट – hetepeperfan

+0

में ठीक कर दूंगा, मेरे पास नैनो दूसरे के लिए कोई उपयोग नहीं था..और मैंने अपनी गलती को सही किया और आपकी मदद ने चाल की .. बहुत धन्यवाद –