2016-05-04 10 views
5

होने मैं निम्नलिखित कोड है:समस्याएं जब typedef और सरणी

typedef float vec3_t[3]; 

void f(const vec3_t v[2]){ 
    // do stuff 
} 

int main(int argc, char * argv[]){ 
    vec3_t v[2]; 
    v[2][1] = 1; 
    f(v); 
    return 0; 
} 

जो

gcc main.c -std=gnu99 -O0 -o main 

का उपयोग कर संकलन नहीं होगा लेकिन त्रुटि दिखा सकते हैं

main.c: In function ‘main’:' 
main.c:293:5: warning: passing argument 1 of ‘f’ from incompatible pointer type [enabled by default] 
    f(v); 
    ^
main.c:286:6: note: expected ‘const float (*)[3]’ but argument is of type ‘float (*)[3]’ 
void f(const vec3_t v[2]){ 
    ^

हैं मैं दूसरी तरफ समारोह में कॉन्स आवश्यकता को हटा देता हूं। यह सब ठीक काम करता है। मैं समझ नहीं सकता कि क्या गलत है ??

+0

भी देखें: http://stackoverflow.com/questions/28062095/pass-a-two-dimensional-array-to-a-function-of-constant-parameter –

+0

मेरी शिकार कड़ी में उल्लेख किया है, यह शायद सी प्रकार प्रणाली में एक दोष है। मुझे लगता है कि यह हाइलाइट करता है कि 'टाइपिफ़' के पीछे छिपाने वाले पॉइंटर्स या सरणी क्यों एक अच्छा विचार नहीं है। – user694733

+0

यह एक सटीक डुप्लिकेट नहीं है, क्योंकि लिंक किया गया प्रश्न सरणी पॉइंटर्स के संबंध में था। इस मामले में 2 डी सरणी हैं। जवाब हालांकि वही होगा। – Lundin

उत्तर

0

पैरामीटर को कॉन्स्ट करने के लिए क्यों नहीं डाला गया?

typedef float vec3_t[3]; 

void f(const vec3_t v[2]){ 
    // do stuff 
} 

int main(int argc, char * argv[]){ 
    vec3_t v[2]; 
    v[2][1] = 1; 
    f((const vec3_t*)v); 
    return 0; 
} 
+2

एक कलाकार के लिए पहुंचना एक अच्छा विचार नहीं है। संकलक एक कारण के लिए शिकायत करता है। जब तक आप अपने कंपाइलर से अधिक नहीं जानते, तो बस कास्टिंग जल्द से जल्द या बाद में परेशानी का कारण बन सकता है। –

+0

सी 11 '_ जेनेरिक 'के माध्यम से एक सुरक्षित" कॉन्स्ट कास्ट "लागू करना लिंक किए गए डुप्लिकेट में चर्चा की गई एक संभावित समाधान थी, उदाहरण के लिए चक्स द्वारा उत्तर देखें। यदि यह एक अच्छा विचार है या नहीं, तो मुझे यकीन नहीं है। लेकिन कच्चे कलाकारों के विपरीत, यह 100% सुरक्षित होगा। – Lundin

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