2012-08-15 6 views
8

मैं https://github.com/amree/mykad-c/blob/master/scdump.c से एक सी फ़ाइल को चलाने की कोशिश कर रहा है, लेकिन मैं कोड के इस हिस्से पर Invalid suffix "-252" on integer constant बार आ रही है:अमान्य प्रत्यय "-252" पूर्णांक निरंतर पर

 if (RxBuffer[0x11E-252] == 'P') 
      printf("Female\n"); 
     else if (RxBuffer[0x11E-252] == 'L') 
      printf("Male\n"); 
     else 
      printf("%c\n", RxBuffer[0x11E-252]); 

मैं बहुत यकीन है कि यह है हूँ वाक्यविन्यास से संबंधित। लेकिन मैं वास्तव में कोड नहीं समझता (मैं कोशिश कर रहा हूं, लेकिन मैं काफी अटक गया हूं)। क्या कोई मेरी मदद कर सकता है?

+0

आप किस कंपाइलर का उपयोग कर रहे हैं? यह एक कंपाइलर बग है जो जीसीसी 2.95, शायद शुरुआती जीसीसी 3.x, और शायद अन्य कंपाइलर्स में मौजूद था। –

+0

@ आर। - यह त्रुटि मेरे लिए हाल ही में जीसीसी 4.6.1 के साथ होती है - एक बग को "रिवॉल्व इनवाल्ड" के रूप में बंद किया जाता है: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3885 ट्रैकिंग की एक खुली बग है नैदानिक ​​मित्रवत बनाना: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24976 –

+0

@ आर ..: मैं क्यूटी फ्रेमवर्क का उपयोग कर रहा हूं, तो मुझे लगता है कि मैं जीसीसी कंपाइलर का उपयोग कर रहा हूं? मुझे विंडोज़ (मिंगडब्लू) और लिनक्स (पीसीएससी-लाइट का उपयोग करने के लिए संशोधित) पर एक ही त्रुटि मिली (जीसीसी 4.5.2) – amree

उत्तर

5
0x11E-252 

सी में एक हेक्साडेसिमल चल बिन्दु स्थिर है और -252 प्रतिपादक हिस्सा है। आपको चेतावनी मिलती है क्योंकि आप एक फ्लोट स्थिर के साथ एक पूर्णांक वस्तु प्रारंभ कर रहे हैं।

0x11E - 252 // Note the whitespace 

एक पूर्णांक अभिव्यक्ति है।

उत्तरार्द्ध का वांछित व्यवहार करने के लिए उपयोग करें।

संपादित:

मेरा उत्तर वास्तव में सच नहीं है। जबकि फिक्स ठीक है, क्या हो रहा है इसके वास्तविक स्पष्टीकरण के लिए @MichaelBurr से उत्तर देखें। 0x11E-252 सी नियमों के तहत एक टोकन के रूप में पढ़ा जाता है और यह मान्य फ़्लोटिंग (या पूर्णांक) संख्या नहीं है।

+1

यह एक चेतावनी नहीं है, यह एक त्रुटि है, क्योंकि हेक्स एफपी स्थिरांक 'ई' के बजाय 'पी' का उपयोग करते हैं (क्योंकि 'ई' एक वैध हेक्स अंक है)। यहां एक [लिंक] है (http://stackoverflow.com/a/4825867/335858) सी 99 के हेक्स फ्लोट स्थिरांक समझाते हुए। – dasblinkenlight

+0

खैर मेरा मतलब सी डायग्नोस्टिक के भाव में चेतावनी थी। – ouah

+0

आह, मैं देखता हूं। अच्छा जवाब, वैसे (+1)। – dasblinkenlight

10

हालांकि यह समस्या हेक्स फ़्लोटिंग पॉइंट स्थिरांक के रास्ते से संबंधित है, समस्या का मूल कारण यह नहीं है क्योंकि 0x11E एक हेक्स फ्लोट स्थिरता की शुरुआत है (क्योंकि यह एक हेक्स फ़्लोटिंग स्थिरता की शुरुआत नहीं है)।

समस्या यह है कि 0x11E-2520x11F-252 जैसे तीन टोकन के बजाय एक एकल टोकन है। आप C99 6.4.8 को देखें, तो "संख्या Preprocessing", आप देखेंगे कि एक पीपी-संख्या टोकन है: (।)

एक preprocessing संख्या अंक के एक वैकल्पिक अवधि से पहले के साथ शुरू होता है और पालन किया जा सकता वैध पहचानकर्ता अक्षर और चरित्र से अनुक्रम ई +, ई, ई +, ई, पी +, p-, पी +, या पी

तो, 0x11E-252 एक भी निशानी है और tokenizing अनुवाद चरण 3 में होता है, लेकिन जब टोकन को वाक्य रचनात्मक और अर्थात् (जो अनुवाद चरण 7 में होता है) की व्याख्या करने का समय आता है, तो यह वाक्य रचनात्मक रूप से मान्य नहीं है, इसलिए आपको एक कंपाइलर त्रुटि मिलती है।

दूसरी ओर, 0x11F-252 तीन टोकन क्योंकि - एक preprocessing संख्या टोकन का हिस्सा जब तक कि यह तुरंत एक P या E (ऊपरी या लोअरकेस) से पहले नहीं है।

बेशक, यह फ्लोट स्थिरांक (हेक्साडेसिमल या अन्यथा) से संबंधित है क्योंकि यही कारण है कि - चरित्र प्रीप्रोकैसिंग संख्या टोकन के बीच में समाप्त हो सकता है। हालांकि, ध्यान दें कि आपको 0xx11F या 22bad_token जैसे टोकन के लिए एक ही त्रुटि संदेश मिलेगा, जिसमें हेक्स फ़्लोटिंग पॉइंट निरंतरता के समान कोई समानता नहीं है।

फिक्स as ouah noted है, - से पहले व्हाइटस्पेस डालें ताकि संकलक को एक से अधिक टोकन के रूप में अनुक्रम का इलाज करने के लिए मजबूर किया जा सके। यदि यह आपका कोड था, तो उन सभी जादू संख्याओं (enums या macros) को नाम देने के लिए एक बेहतर समाधान हो सकता है। - के बाद एक पहचानकर्ता को एक टोकन नहीं माना जाएगा।इसके अलावा आप उम्मीद करेंगे कि कोड को थोड़ा और अधिक दस्तावेज़ बनाने का बोनस होगा।

+0

इस मुद्दे पर स्पष्ट जीसीसी दस्तावेज़ीकरण के लिए http://gcc.gnu.org/onlinedocs/gcc/Incompatibilities.html का अंत देखें। –