2013-08-04 4 views
5

मैं सी हैडरmalloc त्रुटि

typedef struct { 
    kiss_fft_scalar r; 
    kiss_fft_scalar i; 
} kiss_fft_cpx; 

और में निम्न कोड मैं परीक्षण कार्यक्रम

kiss_fft_cpx *fin = malloc(4*sizeof(kiss_fft_cpx)); 

में निम्न कोड को लागू किया है और यह मुझे त्रुटि संदेश दिया : "प्रकार शून्य का एक मूल्य 'kiss_fft_ctx' प्रकार की इकाई को आरंभ करने के लिए उपयोग नहीं किया जा सकता है।

मैं विजुअल स्टूडियो सी/सी ++ win32 कंसोल प्रोजेक्ट का उपयोग कर रहा हूं।

क्या कोई मुझे बता सकता है कि यहां मॉलोक का सही तरीके से उपयोग कैसे करें? धन्यवाद!

+0

[शून्य \ * 'से' नोड \ * '\ [-fpermissive \]] से अवैध रूपांतरण [http://stackoverflow.com/questions/16793587/invalid-conversion-from-void-to -node-fpermissive) –

+1

मुझे नहीं लगता कि त्रुटि संदेश 'void का उपयोग kiss_fft_ctx' को प्रारंभ करने के लिए नहीं किया जा सकता है। मुझे लगता है कि यह 'शून्य *' और 'kss_fft_ctx *' था। उन तारों का अर्थ ** बीआईजी ** अर्थ और भाषा की आपकी समझ में अंतर बनाता है। सी ++ के बारे में नोट के लिए – abelenky

उत्तर

12

आप इस तरह वापसी प्रकार कास्ट करने के लिए की जरूरत है:

kiss_fft_cpx *fin = (kiss_fft_cpx*) malloc(4*sizeof(kiss_fft_cpx)); 

लेकिन निहितार्थ यह है कि आप, सी ++ के बजाय सी के रूप में अपने कोड संकलित कर रहे हैं, क्योंकि वह एक सी ++ के बजाय एक सी त्रुटि त्रुटि है। आप अपने फ़ाइल एक्सटेंशन और/या अपनी कंपाइलर सेटिंग्स को देखना चाह सकते हैं।

तुम सच में हैं सी ++ का उपयोग कर, आप चाहिए एक न्यूनतम उपयोग new बजाय malloc पर:

kiss_fft_cpx *fin = new kiss_fft_cpx[4]; 

और आदर्श पर पुनर्विचार आप इस तरह गतिशील वस्तुओं का निर्माण करने की जरूरत है कि क्या - आप का उपयोग कर किया जा सकता है एक std::vector या इसके बजाए इसी तरह के?

+2

+1। –

+0

कूल, समस्या यह है कि मुझे अपने सी ++ प्रोजेक्ट में दूसरों द्वारा प्रोग्राम किए गए सी कोड का उपयोग करना होगा। इसलिए, मैं सोच रहा हूं कि स्मृति आवंटन को समाप्त करने के लिए मॉलोक की बजाय अन्य योजना का उपयोग करना भी संभव है। (अन्यथा, सी ++ सी ++ में सी का उपयोग करते समय सी ++ बहुत मूर्खतापूर्ण प्रतीत होता है) – Cancan

+4

@ कंकन यह है, लेकिन आप बेहतर नहीं हैं। बस इसके बजाय सी के रूप में संकलित करें। ** सी कोड को सी ++ के रूप में संकलित करने की कोशिश न करें। ** वे अलग-अलग भाषाएं हैं। –

3

सी में आप malloc द्वारा लौटाए गए शून्य सूचक को कास्ट कर सकते हैं। सी यह आपके लिए करता है लेकिन आप भी स्पष्ट हो सकते हैं।

mallocvoid * या शून्य पॉइंटर लौटाता है, तो यह लौटाया गया मूल्य प्रोग्रामर द्वारा अन्य पॉइंटर प्रकारों में डाला जा सकता है। या प्रोग्रामर टाइप रूपांतरण करने के लिए सी पर निर्भर हो सकता है। कास्ट का उपयोग कर सी का प्रकार रूपांतरण बदलने की उम्मीद नहीं है।

हालांकि, सी-कंपाइलर पर निर्भर सी कोड बाधा और पढ़ने में मुश्किल हो सकता है। एक डेवलपर प्रोग्रामर रखरखाव प्रोग्रामर की मदद कर सकता है जो अंततः कोड को पढ़ना होगा।

malloc के लौटे हुए मूल्य पर एक स्पष्ट कलाकार जोड़ना उन लोगों की सहायता करता है जिनके पास कोड पढ़ने और लेखक के इरादे को निर्धारित करने के लिए होगा। malloc द्वारा लौटाए गए शून्य सूचक को स्पष्ट रूप से कास्टिंग करने का यह वास्तविक लाभ है। यह प्रोग्रामिंग अभ्यास संकलक को गलत तरीके से निर्देशित नहीं करता है या कुछ आर्केन कंपाइलर सुविधा का उपयोग नहीं करता है जो बदल सकता है।

निम्नलिखित तीन उदाहरण इस प्रोग्रामिंग अभ्यास को हाइलाइट करते हैं। पहले उदाहरण में, malloc (जिसे <stdlib.h> में परिभाषित किया गया है) स्पष्ट रूप से कास्ट किया गया है और कुछ मामूली काम किया गया है।

#include <stdlib.h> 
    #define nr_chars 4 
    main() 
    { 
    char *data; 

    data = (char *) malloc(nr_chars*sizeof(char)); 

    *data++ = 'a'; 
    *data++ = 'b'; 
    *data++ = 'c'; 
    *data++ = '\0'; // it is allowed to go one past an array 

    data -= nr_chars; // back to the front of data 

    printf("%s\n", data); 
    // prints abc at the console 

    } 

इस दूसरे उदाहरण में, फर्क सिर्फ इतना है कि <stdlib.h> बाहर टिप्पणी की है। कोड अभी भी चलाता है और एक ही परिणाम उत्पन्न करता है। अब, यह क्यों काम करता है "क्यों" काफी प्रत्यक्ष है। जब सी को किसी फ़ंक्शन के प्रोटोटाइप नहीं मिलते हैं तो यह मानता है कि फ़ंक्शन int देता है, लेकिन malloc एक शून्य पॉइंटर देता है।इस मामले में स्पष्ट कलाकार ने सी कंपाइलर के साथ-साथ स्रोत की कार्बन इकाई को बताया है कि malloc द्वारा लौटाए गए मान को एक वर्ण सूचक में परिवर्तित किया जाना चाहिए।

//#include <stdlib.h> 
    #define nr_chars 4 
    main() 
    { 
    char *data; 

    data = (char *) malloc(nr_chars*sizeof(char)); 

    *data++ = 'a'; 
    *data++ = 'b'; 
    *data++ = 'c'; 
    *data++ = '\0'; // it is allowed to go one past an array 

    data -= nr_chars; // back to the front of data 

    printf("%s\n", data); 
    // prints abc at the console 

    } 

अंतिम (हाँ) उदाहरण डाली जारी नहीं करता है और <stdlib.h> शामिल नहीं है। ग्रहण संपादक और संकलक दोनों इस कोड के बारे में शिकायत करते हैं (जैसा कि उन्हें करना चाहिए)। संकलक संदेश

..\main.c(18) : warning C4047: '=' : 'char *' differs in levels of indirection from 'int' 

है और स्रोत कोड है:

//#include <stdlib.h> 
    #define nr_chars 4 
    main() 
    { 
    char *data; 

    data = malloc(nr_chars*sizeof(char)); 

    *data++ = 'a'; 
    *data++ = 'b'; 
    *data++ = 'c'; 
    *data++ = '\0'; // it is allowed to go one past an array 

    data -= nr_chars; // back to the front of data 

    printf("%s\n", data); 
    // compiler displays a "warning" and prints abc at the console 

    } 

बदलने उदाहरण 3 कोई चेतावनी में परिणाम शामिल करने के लिए और के रूप में इरादा कार्यक्रम चलाता है। हालांकि, दोनों उदाहरण 2 और 3 में स्पष्ट कलाकारों की कमी है और इस शैली में लिखे गए कोड के जीवनकाल में इस तरह का कोड अधिक महंगा होगा और मनुष्यों द्वारा गलत तरीके से बदला जा सकता है (इस प्रकार अतिरिक्त व्यय) जो कि समर्थित हैं सी compilers।

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