2009-06-18 7 views
6

Mã của tôi trông giống như sau:Ý nghĩa của cảnh báo GCC "giá trị nhãn trường hợp vượt quá giá trị tối đa cho loại" là gì?

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

Bất kỳ manh mối nào?

+0

KEY_F làm gì? Bạn có bộ char được ký hoặc chưa ký? –

+0

Vui lòng hiển thị việc triển khai macro/hàm KEY_F() của bạn. Và, dòng nào là gcc cảnh báo bạn? – Convict

Trả lời

7

Một char là một số nằm trong khoảng từ -128 đến 127. KEY_F (9) có thể là một giá trị nằm ngoài phạm vi đó.

Sử dụng:

  • char unsigned, hoặc
  • int, hoặc
  • (char) KEY_F (9)

Hoặc thậm chí tốt hơn, sử dụng một trình gỡ lỗi và xác định sizeof (KEY_F (9)) để chắc chắn rằng đó là một byte và không phải là một đoạn ngắn.

+2

Truyền KEY_F (9) sang char có thể mất thông tin tùy thuộc vào việc thực hiện macro đó. Ngoài ra, char được ký hoặc unsigned tùy thuộc vào nền tảng mặc định và thường xuyên chuyển mạch trình biên dịch. – RBerteig

+0

Đúng sự thật, và nó đã được một thời gian kể từ khi tôi chơi trong C. Tôi luôn luôn sử dụng các loại ký tự chuỗi anyway và luôn luôn sử dụng unsigned char cho loại, vì vậy tôi đã không chạy vào này bao giờ ... – razzed

+0

Đúc nó để char làm việc một nét duyên dáng - cảm ơn rất nhiều. – Alistair

0

Dường như KEY_F (9) phải đánh giá thứ gì đó nằm ngoài phạm vi của một char.

3

Trong trường hợp này, KEY_F(9) đang đánh giá điều gì đó nằm ngoài phạm vi char. Tuyên bố switch giả định rằng bởi vì đối số của nó là char, rằng tất cả các nhãn trường hợp cũng sẽ là. Thay đổi switch để đọc switch((unsigned int)ch) sẽ khắc phục.

8

Vâng, KEY_F (9) sẽ là 273 (xem curses.h) vượt quá phạm vi của char (-128,127).

+2

Phạm vi của char phụ thuộc vào việc char được ký hoặc chưa ký. Tuy nhiên, nếu curses.h là nguồn của macro, thì nó nằm ngoài phạm vi một trong hai cách. – RBerteig

0

Những gì mọi người khác đã nói về phạm vi cho char.

Tôi nhớ điều này từ những ngày đầu viết C ... có lẽ bạn đang gọi decode_input từ một vòng lặp, phải không? Nếu người dùng nhấn một cái gì đó như F9, bạn sẽ nhận được hai byte trong bộ đệm bàn phím - và byte đầu tiên sẽ là 0x0.