2009-06-18 17 views
6

Mój kod wygląda następująco:Jakie jest znaczenie ostrzeżenia GCC "wartość etykiety sprawy przekracza maksymalną wartość dla typu"?

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

żadnych wskazówek?

+0

Co robi KEY_F? Czy masz zestaw znaków do podpisu lub niepodpisany? –

+0

Proszę pokazać implementację makr/funkcji KEY_F(). A która linia jest ostrzeżeniem dla gcc? – Convict

Odpowiedz

7

Znak jest liczbą od -128 do 127. KEY_F (9) prawdopodobnie jest wartością spoza tego zakresu.

Zastosowanie:

  • unsigned char, lub
  • int lub
  • (char) KEY_F (9)

Albo jeszcze lepiej używać debuggera i określić sizeof (KEY_F (9)), aby upewnić się, że jest to bajt, a nie krótki.

+2

Przesyłanie KEY_F (9) na char może utracić informacje w zależności od implementacji tego makra. Ponadto znak char jest albo podpisany, albo niepodpisany, w zależności od domyślnych ustawień platformy i często przełączników kompilatora. – RBerteig

+0

Prawdą jest, i minęło trochę czasu, odkąd grałem w C. Zawsze używałam typów znaków dla ciągów znaków i zawsze używałam typu unsigned char dla tego typu, więc nie natknąłem się na to nigdy ... – razzed

+0

Rzuciłem to na char urok - bardzo dziękuję. – Alistair

0

Wygląda na to, że KEY_F (9) musi ocenić coś, co znajduje się poza zakresem znaku.

3

W tym przypadku wartość parametru KEY_F(9) jest inna niż zakres char. Oświadczenie switch zakłada, że ​​ponieważ jego argumentem jest char, wszystkie etykiety przypadku będą również. Zmianaw celu odczytania switch((unsigned int)ch) go wyleczy.

8

Cóż, KEY_F (9) będzie 273 (patrz curses.h), który przekracza zakres char (-128,127).

+2

Zakres znaków zależy od tego, czy znak jest podpisany, czy niepodpisany. Jednak jeśli curses.h jest źródłem makra, to jest poza zakresem w obie strony. – RBerteig

0

Co wszyscy inni powiedzieli o zakresie char.

Pamiętam, że od samego początku pisania C ... prawdopodobnie nazywasz decode_input z pętli, prawda? Jeśli użytkownik naciśnie coś w stylu F9, otrzymasz dwa bajty w buforze klawiatury - a pierwszy bajt będzie wynosił 0x0.