2012-12-06 26 views
33

चेतावनी वैला द्वारा उत्पन्न सी कोड द्वारा उत्पादित की जाती है।चेतावनी की मरम्मत कैसे करें: प्रारंभकर्ता के आसपास लापता ब्रेसिज़?

चेतावनी: लापता प्रारंभकर्ता

कोड काम करता है लेकिन चेतावनी कष्टप्रद है चारों ओर ब्रेसिज़। Vala चेतावनी द्वारा संदर्भित कोड

struct Position {uint x; uint y;} 
private static Position positions[8]; 

है उत्पन्न सी कोड

static Position det_positions[8] = {0}; 

मैं पदों आरंभ आधा दर्जन अलग अलग तरीकों की कोशिश की है है, लेकिन वाक्यविन्यास पाने के लिए संतुष्ट नहीं कर पा रहे चेतावनी। क्या यह GCC bug 53119 है या इसे ठीक करने का कोई तरीका है?

+0

मुझे जीसीसी 4.6.3 पर वैला 0.16 या 0.18 के साथ यह चेतावनी नहीं मिली है। अपने पर्यावरण को साझा करने की देखभाल? इसके अलावा, जेनरेट सी क्या समस्या पैदा कर रहा है? – apmasell

+0

@apmasell एम्बेडेड लिनक्स लक्ष्य एक तेंदुए 368 है, जीसीसी 4.4.1 है, टूलचेन कोडोर्सरी/arm-2010q1 है, और मैंने प्रश्न के लिए जेनरेट सी जोड़ा है। मैंने कोड को सही तरीके से स्वरूपित किया है जिसे मैं पहले करना भूल गया था। – jacknad

उत्तर

41

हां, यह GCC bug 53119 से संबंधित प्रतीत होता है। यदि आप सी घोषणा को {{0}} पर बदलते हैं तो यह दूर हो जाता है। आपके विकल्प हैं:

  1. चेतावनी को अनदेखा करें।
  2. या इसी तरह के उपयोग से {0} के बजाय के बजाय {{0}} के बाद पी कोड के बाद सी कोड में हेरफेर करें।
  3. वाला में सरणी extern घोषित करें, और कहीं और सी परिभाषा लिखें। (# 2 का स्थायी संस्करण।)
  4. struct foo { int bar; Position positions[8]; } static foo position_holder और {0} जैसे कुछ करें position_holder.bar प्रारंभ करना होगा जो ठीक है और चेतावनी दूर हो जाती है।
+9

या अमान्य चेतावनी को चुप करने के लिए अपने संकलन में "-वनो-लापता-ब्रेसिज़" जोड़ें। – JohnH

+1

नोट, हालांकि, चेतावनी सामान्य रूप से अमान्य नहीं है! केवल शून्य प्रारंभिकरण के लिए (यानी '' = {0} ''), यह हमेशा अमान्य है। चेतावनी के लिए वैध मामले के लिए [आदित हां का जवाब] (http://stackoverflow.com/a/21873585/490560) देखें। – Ignitor

10

यह चेतावनी तब भी प्रकट होती है जब बहु-आयामी सरणी को रैखिक सरणी के रूप में माना जाता है (हालांकि यह अभी भी सही है और कोड पूरी तरह से चलता है) -वॉल कंपाइलर झंडे सेट के साथ।

उदाहरण

लिए
char array[5][10][2] = {\ 
"0","0","0","0","0","0","0","0","0","0",\ 
"1","1","1","1","1","1","1","1","1","1",\ 
"2","2","2","2","2","2","2","2","2","2",\ 
"3","3","3","3","3","3","3","3","3","3",\ 
"4","4","4","4","4","4","4","4","4","4" }; 

यह चेतावनी उत्पन्न होगा।

के रूप में नीचे

char array[5][10][2] = {\ 
{"0","0","0","0","0","0","0","0","0","0" },\ 
{"1","1","1","1","1","1","1","1","1","1"},\ 
{"2","2","2","2","2","2","2","2","2","2"},\ 
{"3","3","3","3","3","3","3","3","3","3"},\ 
{"4","4","4","4","4","4","4","4","4","4"} }; 

दिखाया मुझे सही करें कृपया अगर मैं गलत हूँ चेतावनी दूर करने के लिए निम्न परिवर्तन करो।

+0

मैंने इसे 2 डी मैट्रिक्स पर किया और यह काम नहीं किया! – gsamaras

+0

इस उदाहरण में सरणी का पहला और दूसरा स्तर '{' के साथ दर्ज किया गया है, और तीसरा स्ट्रिंग परिभाषित करके (''0'' में समाप्त होता है)' 2 में दर्ज किया गया है, यदि आप तारों का भी उपयोग करते हैं , फिर '{': '{" 0 "} यानी के केवल एक स्तर का उपयोग करें'char '0'' फिर' char '\ 0'' शून्य के बाद और यदि आप तारों का उपयोग नहीं करते हैं तो' {':' {{0}} 'i.e. zeros के दो स्तर। – fripon