ما معنى تحذير دول مجلس التعاون الخليجي "قيمة تسمية الحالة تتجاوز الحد الأقصى لقيمة النوع"؟
-
06-07-2019 - |
سؤال
الكود الخاص بي يبدو كالتالي:
char * decode_input(char ch)
{
switch(ch) {
case 'g':
return "get";
break;
case KEY_F(9):
return "quit";
break;
default:
return "unknown";
break;
}
}
أي أدلة؟
المحلول
الحرف هو رقم يقع بين -128 و127.من المحتمل أن تكون KEY_F(9) قيمة خارج هذا النطاق.
يستخدم:
- حرف غير موقع، أو
- كثافة العمليات، أو
- (شار) KEY_F(9)
أو من الأفضل استخدام مصحح الأخطاء وتحديد sizeof(KEY_F(9)) للتأكد من أنها بايت وليست قصيرة.
نصائح أخرى
حسنا، KEY_F (9) سيكون 273 (انظر curses.h) وهو ما يتجاوز مجموعة من شار (-128127).
في هذه الحالة، KEY_F(9)
هو تقييم إلى شيء خارج نطاق char
. البيان switch
وعلى افتراض أن لحجتها هي char
، أن جميع تسميات الحالة سوف يكون أيضا. وتغيير switch
لقراءة switch((unsigned int)ch)
علاجه.
ويبدو KEY_F (9) يجب تقييم إلى ما هو خارج نطاق شار.
وماذا الجميع قال بشأن النطاق لشار.
وأتذكر هذا من أوائل أيامي كتابة C ... ربما كنت تدعو decode_input من حلقة، أليس كذلك؟ إذا كان المستخدم بالضغط شيء من هذا القبيل F9، وأنت ذاهب للحصول على وحدتي بايت في المخزن المؤقت لوحة المفاتيح -. وسوف يكون البايت الأول 0x0