2013-07-26 6 views
5

मैं structs की एक सरणी शुरू करने की कोशिश कर रहा हूं। structs उन में समारोह संकेत दिए गए है और इस तरह के रूप में परिभाषित कर रहे हैं: मैं एक सरल ट्यूटोरियल का उपयोग समारोह संकेत परिभाषितउनमें फंक्शन पॉइंटर्स के साथ structs की एक सरणी प्रारंभ करें C

infosection section[] = { 
     ("Software", *SoftwarePtr), 
     ("Hardware", *HardwarePtr), 
} 

:

typedef struct{ 
     char str[512]; 
     char *fptr; 
} infosection; 

तो मैं एक सरणी बनाने के लिए प्रयास करें। समारोह सॉफ्टवेयर रिटर्न एक पूर्णांक

int (*SoftwarePtr)()=NULL; 
SoftwarePtr = &Software; 

मेरा प्रश्न चेतावनी मैं संकलन पर मिलता है के बारे में है।

आरंभ करने में कोई डाली

चेतावनी संदर्भ खंड सरणी में लाइनों के बिना सूचक से पूर्णांक बनाता है।

  1. */&/न कर रहा हूँ सूचक के लिए मैं हर के संयोजन की कोशिश की है और मैं अभी भी एक ही चेतावनी प्राप्त करने के लिए लग रहे हैं मैं गलत इस्तेमाल कर रहा हूँ के बारे में पता:

    तो मैं दो शक है प्रत्येक का अर्थ, बस यह सुनिश्चित करें कि वे इस विशेष उदाहरण में कैसे लागू होते हैं।

  2. मैं एक सरणी में infosection struct का एक उदाहरण घोषणा कर सकते हैं के रूप में मैं यहाँ क्यों है? मैं कई उदाहरण हैं, जहां लोगों की घोषणा देखा है उनके एक for loop में array of struct, हालांकि मेरी अंतिम उत्पाद structs की एक लंबी सूची है कि में निहित करने की आवश्यकता है सरणी। मैं अपना कोड portable बनाना चाहता हूं जैसे कि add structs (स्ट्रिंग्स जो फ़ंक्शंस के साथ मेल खाते हैं) एक आसान सूची-जैसी फैशन में देखे जा सकते हैं। सरणी

    infosection section[]; 
        section[0].str="software"; 
        section[0].fptr=SoftwarePtr; 
    

बस स्पष्ट करने के लिए का एक उदाहरण घोषित करने के लिए इस एक ही रास्ता है, मैं structs, array of structs, और function pointers पर काफी अनुसंधान के एक बिट किया है। ऐसा लगता है कि 3 का संयोजन परेशानी पैदा कर रहा है।

+0

मैंने सोचा कि फ़ंक्शन पॉइंटर्स शून्य *() थे। – Jiminion

+0

@ जिम मैं यहां पढ़ता हूं: http://www.newty.de/fpt/fpt.html#defi जो फ़ंक्शन पॉइंटर की फ़ंक्शन के रिटर्न प्रकार के साथ घोषित करने की आवश्यकता को इंगित करता है ... –

+0

'char * fptr; 'यह' char * 'के बीच फ़ंक्शन पॉइंटर और रूपांतरण नहीं है और फ़ंक्शन पॉइंटर अच्छी तरह से परिभाषित नहीं हैं – Lundin

उत्तर

7

एक

एक गलती मैं एक खोज, समारोह सूचक की संरचना घोषणा में गलत है:

typedef struct{ 
     char str[512]; 
     int (*fptr)(); // not char* fptr 
} infosection; 

दो

घोषणा:

infosection section[] = { 
     ("Software", *SoftwarePtr), 
     ("Hardware", *HardwarePtr), 
} 

होना चाहिए:

infosection section[] = { 
     {"Software", SoftwarePtr}, 
     {"Hardware", HardwarePtr} 
} 

* निकालें। और आंतरिक (){} के साथ प्रतिस्थापित करें।

तीन:

infosection section[]; 
section[0].str="software"; // compiler error 
section[0].fptr=SoftwarePtr; 

गलत है आप इस तरह से स्ट्रिंग नहीं सौंप सकते। आपको निम्नानुसार strcpy() का उपयोग करने की आवश्यकता है;

strcpy(section[0].str, "software"); 
+0

पिछला कॉमा के साथ कुछ भी गलत नहीं है: कुछ कोडिंग शैलियों का भी पक्ष है क्योंकि यह प्रत्येक पंक्ति को लगातार बना देता है। ऐरे प्रारंभिक सूचियों को हमेशा अंतिम पंक्ति पर पिछली कॉमा रखने की अनुमति है। – Lundin

+0

@ लंदन हाँ आप सही हैं। धन्यवाद। –

2

संरचना सदस्य वर्तमान में एक char * है, जो आपके फ़ंक्शन हस्ताक्षर के लिए सही सूचक प्रकार में बदल जाता है।

typedef struct{ 
    char str[512]; 
    int (*fptr)(); 
} infosection; 

* पॉइंटर को अव्यवस्थित करें, पढ़ें * foo "क्या foo पॉइंट्स" के रूप में पढ़ें। आप स्ट्रक्चर सदस्य को वास्तविक सूचक में सेट करना चाहते हैं, तो पैराथेसिस के बजाय ब्रैकेट का भी उपयोग करें।

infosection section[] = { 
    {"Software", SoftwarePtr}, 
    {"Hardware", HardwarePtr} 
} 
1

थोड़ी देर के बाद से मैं पॉइंटर्स के साथ खेल रहा था लेकिन शायद एक निर्माता मदद करेगा?

struct infosection{ 
     char str[512]; 
     char *fptr; 
     infosection(char* strN, char* fptrN): str(strN), fptr(fptrN) {} 
}; 

infosection[] isxn = { new infosection(&str1,fptr1), 
       new infosection(&str2,fptr2)}, 
       ... }; 

मेरी क्षमा याचना ... शुरू होता है जहाँ c बंद हो जाता है और C++ मेरे मन में धुंधलाता जा रहा है, मुझे लगता है कि इस तरह दिखता है ग के लिए एक समाधान देखा है (लेकिन वास्तव में, सूचक के कुछ यकीन है कि im सामान मिलाया जाता है अप लेकिन यह विचार था)

struct infosection{ 
    char str[512]; 
    char *fptr; 
}; 

infosection* myIS (char *strN, char *fptrN) { 
    infosection i = new infosection(); 
    i.str = &strN; 
    i.fptr = fptrN; 
    return *i; 
} 

//infosection* newInfoSection = myIS(myStrPtr,myFptr); 
+0

कन्स्ट्रक्टर्स हालांकि सी ++ का हिस्सा हैं, और इस सेनारियो में काम नहीं करेंगे =) – krs

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