2009-06-18 3 views
6

मेरा कोड इस तरह दिखता है:जीसीसी चेतावनी का क्या अर्थ है "केस लेबल मान प्रकार के लिए अधिकतम मूल्य से अधिक है"?

char * decode_input(char ch) 
{ 
     switch(ch) { 
       case 'g': 
         return "get"; 
         break; 
       case KEY_F(9): 
         return "quit"; 
         break; 
       default: 
         return "unknown"; 
         break; 
     } 
} 

कोई सुराग?

+0

KEY_F क्या करता है? क्या आपके पास चार सेट पर हस्ताक्षर किए या हस्ताक्षर किए गए हैं? –

+0

कृपया अपने मैक्रो/फ़ंक्शन KEY_F() के कार्यान्वयन को दिखाएं। और, कौन सी रेखा जीसीसी आपको चेतावनी दे रही है? – Convict

उत्तर

7

एक char -128 और 127 के बीच एक संख्या है। KEY_F (9) शायद उस सीमा के बाहर एक मान है।

उपयोग:

  • अहस्ताक्षरित चार, या
  • पूर्णांक, या
  • (चार) KEY_F (9)

या और भी बेहतर, एक डिबगर का उपयोग करें और sizeof का निर्धारण (KEY_F (9)) यह सुनिश्चित करने के लिए कि यह एक बाइट है और छोटा नहीं है।

+2

KEY_F (9) को चार में कास्ट करना उस मैक्रो के कार्यान्वयन के आधार पर जानकारी खो सकता है। साथ ही, प्लेट को या तो प्लेटफ़ॉर्म डिफ़ॉल्ट और अक्सर कंपाइलर स्विच के आधार पर हस्ताक्षरित या हस्ताक्षरित किया जाता है। – RBerteig

+0

सच सच है, और यह थोड़ी देर हो गया है क्योंकि मैंने सी में खेला था। मैं हमेशा स्ट्रिंग वर्णों के लिए प्रकारों का उपयोग करता हूं और हमेशा इस प्रकार के लिए हस्ताक्षरित चार का उपयोग करता हूं, इसलिए मैंने इसे कभी भी नहीं चलाया है ... – razzed

+0

इसे चार काम करने के लिए कास्टिंग एक आकर्षण - बहुत बहुत धन्यवाद। – Alistair

0

ऐसा लगता है कि KEY_F (9) को char की सीमा से बाहर की किसी चीज़ का मूल्यांकन करना चाहिए।

3

इस मामले में, KEY_F(9)char की सीमा के बाहर कुछ का मूल्यांकन कर रहा है। switch कथन यह मान रहा है कि इसकी तर्क char है, कि सभी केस लेबल भी होंगे। switch((unsigned int)ch) पढ़ने के लिए switch को बदलना इसे ठीक करेगा।

8

ठीक है, KEY_F (9) 273 होगा (curses.h देखें) जो char (-128,127) की सीमा से अधिक है।

+2

char की श्रेणी इस बात पर निर्भर करती है कि क्या char हस्ताक्षरित या हस्ताक्षरित है या नहीं। हालांकि, अगर curses.h मैक्रो का स्रोत है, तो यह किसी भी तरह से सीमा से बाहर है। – RBerteig

0

char के लिए सीमा के बारे में सभी ने क्या कहा।

मुझे यह याद है कि शुरुआती दिनों से सी लिख रहा है ... आप शायद लूप से decode_input को कॉल कर रहे हैं, है ना? यदि उपयोगकर्ता F9 की तरह कुछ दबाता है, तो आपको कीबोर्ड बफर में दो बाइट्स मिलेंगे - और पहला बाइट 0x0 होगा।

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

  • कोई संबंधित समस्या नहीं^_^