2012-10-03 20 views
5

पर शून्य * कनवर्ट करें n फाइबोनैकी संख्याओं की गणना करने के लिए pthread लाइब्रेरी का उपयोग करने का प्रयास कर रहा हूं, जहां n0-1000 से हो सकता है। जब मैं अपने void* को double पर टाइपकास्ट करने का प्रयास करता हूं तो मैं एक अजीब त्रुटि में भाग रहा हूं। ,शून्य *

void *calc_fib(void *num) 
{ 
    double n; 
    n = (double)num; 
    ... 

लेकिन जब मैं यह करने के प्रयास:

pthread_create(&tid, &attr, calc_fib, (void *)n); 

मेरी calc_fib समारोह में मैं के साथ टाइपकास्ट करने का प्रयास कर रहा हूँ:

अपने मुख्य यहां मेरे calculate फिबोनैकी समारोह के लिए अपने कॉल है मुझे निम्न त्रुटियां मिलती हैं:

In function ‘calc_fib’: 
error: pointer value used where a floating point value was expected 
In function ‘main’: 
error: cannot convert to a pointer type 

क्या मैं ty void* से double से सी में या मैं बस गलत कर रहा हूं?

उत्तर

11

void *num एक सूचक है। double n एक चर है।

double *p = (double *)num; 

तो फिर तुम यह भिन्नता:

आप void*double* पर कास्ट कर सकते

double n = *p; 

या एक लाइन में:

double n = *(double *)num; 
+0

हाँ है कि यह वास्तव में किया गया था। मैं हमेशा अलग सूचक प्रकार के बीच कास्टिंग की बारीकियों के बारे में भूल जाते हैं। –

2

सबसे पहले आप शून्य * को एक डबल * में परिवर्तित करना चाहते हैं। फिर आपको इसे डबल को असाइन करने के लिए पॉइंटर को हटाना होगा।

void *calc_fib(void *num) 
{ 
    double n; 
    n = *(double*)num; 
    ... 
1

आप portably double नहीं डाल सकता एक सूचक के लिए - शुरुआत के लिए, सूचक प्रकार में पर्याप्त बिट्स नहीं हो सकते हैं ।

npthread_create बुला के बाद main में परिवर्तित नहीं किया जाएगा, तो आप एक सूचक n चर को main अपने आप में पारित कर सकते हैं (अर्थात (void*)&n, तो *(double*)numcalc_fib अंदर उपयोग करें)।

यदि n बदल सकता है - शायद आपके पास विभिन्न थ्रेडों को पार करने के लिए विभिन्न प्रकार के एन मानों की गणना करना एक लूप है - तो आपको दौड़ की स्थिति से बचना चाहिए जहां नए धागे ने मुख्य धागे से पहले मूल्य नहीं पढ़ा हो इसे बदल देता है आप इस के लिए एक म्युटेक्स इस्तेमाल कर सकते हैं - इसका अर्थ है वहाँ स्मृति की एक निश्चित राशि थ्रेड की संख्या की स्वतंत्र जरूरत है - लेकिन कोड के अपेक्षाकृत वर्बोज़ और इसे आगे serialises और धागे की शुरूआत को धीमा कर देती। एक आम तौर पर बेहतर दृष्टिकोण एक अलग स्मृति पते में प्रत्येक मान कर देना है। आप के रूप में कई मूल्यों के साथ एक सरणी इस्तेमाल कर सकते हैं के रूप में आप नए सूत्र होगा, या ढेर पर स्मृति को आबंटित करने के लिए प्रत्येक double तो धागे तो पढ़ा है कि स्मृति को रिहा करते हैं ....

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