2010-08-28 17 views
6

मैं एक सी (सी नहीं ++) struct कि एक समारोह मैं इस तरह डेटा एकत्रित में फिर इससी struct सरणियों

typedef struct mystruct{ 
float a,b; 
int x, y; 
} mystruct; 

की तरह चला जाता है:

mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber].a = masterlist[i].a; 

... आदि

ListNumber++; 
} 
} 

तो मैं सरणी को एक फ़ंक्शन

पर भेजता हूं

यह काम करता है, लेकिन जब मैं इस तरह यह करने के लिए ....

mystruct setter(int i) 
{ 
mystruct TEMP; 
TEMP.a = masterlist[i].a; 
//......etc 
return TEMP; 
} 


mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber] = setter(i); 
    ListNumber++; 
} 
} 

यह अजीब त्रुटियों का एक बहुत का कारण बनता है की कोशिश करो। ये क्यों हो रहा है? संपादित करें: @ tommieb75 मैं ज्यादा जानकारी नहीं दे सकता, परिणाम एक पैटर्न प्रतीत नहीं होता है। सूची को स्क्रीन पर सामान खींचने के सामान्यीकृत तरीके के रूप में उपयोग किया जाता है, और प्रत्यक्ष सेटिंग के बजाय फ़ंक्शन होने से प्रतिपादन में अजीब समस्याएं होती हैं- और यादृच्छिक-, लेकिन कोई संकलक त्रुटियां उत्पन्न नहीं करती हैं। जीडीबी कुछ पूर्णांक को पूर्णांक से बड़ा होने के रूप में दिखाता है, यह एकमात्र पैटर्न है जो मुझे मिलता है। मास्टरलिस्ट एक और संरचना का वैश्विक सरणी है। डेटा को इस उदाहरण में संरचना में परिवर्तित करने की आवश्यकता है। कोई संकलक चेतावनी या त्रुटियां बिल्कुल नहीं। मैं शायद अधिक संवेदनशील चेतावनियों को बदल सकता हूं, लेकिन मुझे हमेशा किसी भी सामान्य त्रुटि की सूचना मिलती है जो मैं सोच सकता हूं। मैं चयनित समाधान का प्रयास करने जा रहा हूं, जो पर्याप्त होना चाहिए। वैसे भी इसी तरह के फ़ंक्शन लौटने वाले फ़्रेम का उपयोग मेरे कोड में किया जाता है और सभी इस मामले को पूरी तरह से structs की सरणी के साथ छोड़कर काम करते हैं।

+1

आप त्रुटियों आप हो रही है में से कुछ पोस्ट कर सकते हैं? – GameFreak

+0

कोई मेरी याददाश्त ताज़ा करता है: क्या आप सी में मूल्य से structs वापस कर सकते हैं? –

+2

क्यों नहीं? पॉइंटर्स तेज होना चाहिए, लेकिन आप मूल्य से वापस आ सकते हैं। Btw। www.ideone.com और आप जांच सकते हैं ;-) – nilphilus

उत्तर

1

एक सरल स्थापित करने के लिए?

mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber].a = masterlist[i].a; 
    ListNumber++; 
} 
} 

तुम सच में एक समारोह की जरूरत है, जैसे पैरामीटर के रूप में गंतव्य स्मृति का उपयोग करें:

void setter(mystruct *dest,const mystruct *src) 
{ 
    dest->a = src->a; 
} 
for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    setter(&List[ListNumber], &masterlist[i]); 
    ListNumber++; 
} 
} 
+0

हां, फ़ंक्शन को थोड़ा सा साफ़ करना है, यह एक विशाल नजरअंदाज है एक तेज़ तरीके से पढ़ने और बदलने के लिए मुश्किल है। हालांकि यह एक दिलचस्प समाधान प्रतीत होता है, मैं इसका परीक्षण करने जा रहा हूं। – Balkania

1

क्या है

mystruct setter(i) 
{ 
mystruct TEMP; 
TEMP.a = masterlist[i].a; 

'मैं' किसी भी प्रकार है?

// आप struct में अप्रारंभीकृत सदस्यों के साथ त्रुटियों मदद कर सकता है http://ideone.com/WRLVG

+1

यह अंतर्निहित int है। – Potatoswatter

+0

@Potatoswatter तर्क भी? मुझे रिटर्न वैल्यू के बारे में याद है, लेकिन तर्क नहीं (वैसे भी आप सही हैं) – nilphilus

0

पहली समस्या सेटर की अपनी परिभाषा है एक कानूनी समारोह हस्ताक्षर नहीं है मिलता है। पैरामीटर i एक प्रकार

mystruct setter(int i) { 
    ... 
} 

यह भी चर masterlist जो समारोह में निर्धारित नहीं है का उपयोग करता दिया जाना चाहिए। यह कानूनी रूप से एक स्थिर के रूप में कहीं और घोषित किया जा सकता है। यदि नहीं, तो इसे किसी भी तरह से

+0

मास्टरलिस्ट एक वैश्विक है। मुझे सी में उचित नाम नहीं पता है, यद्यपि ... वैसे भी जो कोड मैंने टाइप किया था वह अधिकतर उड़ने वाला था, यह अन्यथा बहुत बड़ा होता। – Balkania

+0

यह भी कि वास्तविक कोड की प्रतिलिपि नहीं थी, मैंने बस आसपास के शोर को हटाने के लिए फ्लाई पर एक उदाहरण बनाया ... बेशक वास्तविक चीज़ को यह सही मिला है, या मेरा कंपाइलर शिकायत करेगा; पी – Balkania

+0

@ ब्लैकानिया: आप 'किसी भी उपयोगी उत्तर नहीं मिलने जा रहे हैं, क्योंकि आपके बनाए गए उदाहरण ने वास्तविक समस्या को छोड़ दिया है। – caf

0

समस्या यह है कि setter फ़ंक्शन के भीतर आपके पास एक स्टैक आवंटित चर TEMP है जो फ़ंक्शन लौटने के बाद स्कोप से बाहर हो जाता है ... आप बेहतर हो सकते हैं ढेर पर my_struct सूचक का आवंटन और इसके बारे में पता वापस वापस बुला दिनचर्या के लिए बाहर करने के लिए ...

संपादित करें:

mystruct *setter(int i){ 
    mystruct *ptr_myStruct; 
    ptr_myStruct = malloc(sizeof(mystruct)); 
    if (ptr_myStruct != NULL){ 
     ptr_myStruct->a = masterlist[i].a 
     // etc... 
     return &ptr_myStruct; 
    } 
    return NULL; 
} 

mystruct List[MAX]; 
ListNumber = 0; 

for(i = 0; i < MAX; i++) 
{ 
if(conditions_meet) 
{ 
    List[ListNumber] = setter(i); 
    ListNumber++; 
} 
} 

यही कारण है कि क्या मान वापस बाहर निकलने के लिए की जरूरत है एक बार नियमित रूप से बाहर चला जाता है दायरे कायही कारण है कि एक struct सदस्य आप एक पूरे struct-तत्व से एक प्रति की जरूरत कहा जाता है वापसी-दर-संदर्भ

+0

यह मूल्य द्वारा वापस किया गया है। – Potatoswatter

+0

रिटर्न-बाय-वैल्यू और रिटर्न-बाय-रेफरेंस के बीच अंतर ... जो मैं ऊपर बता रहा हूं, संदर्भ द्वारा वापस आने वाले ढेर पर आवंटित पॉइंटर को पता वापस लौटकर। – t0mm13b

+0

यदि यह संदर्भ द्वारा लौट रहा था, तो एक समस्या होगी, लेकिन सौभाग्य से, सी में वह सुविधा नहीं है। यदि मूल्य से वापसी काम नहीं करती है, तो शायद वे इसे संकलित करने की अनुमति नहीं देते। – Potatoswatter

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