Kodax

قراءة أخطاء المترجم والتصحيح — أساسيات C++

قراءة أخطاء المترجم والتصحيح

رسائل مترجم C++ مخيفة في البداية: طويلة ومليئة بالمصطلحات. لكنها تتبع نمطاً ثابتاً، ومعرفة قراءتها توفر عليك ساعات.

شكل الرسالة

main.cpp:7:5: error: 'cout' was not declared in this scope

| الجزء | المعنى |

|---|---|

| main.cpp | الملف |

| 7:5 | السطر 7، العمود 5 |

| error | خطأ يمنع الترجمة (warning تحذير فقط) |

| بقية السطر | وصف المشكلة |

ابدأ دائماً بأول خطأ: خطأ واحد (مثل ; ناقصة) قد يولّد عشرات الأخطاء التالية. أصلح الأول وأعد الترجمة.

أشهر الأخطاء وأسبابها

| الرسالة | السبب المعتاد |

|---|---|

| expected ';' before ... | ; ناقصة في السطر السابق |

| 'x' was not declared in this scope | خطأ إملائي، أو متغير خارج نطاقه، أو #include / std:: ناقصة |

| expected '}' at end of input | قوس معقوف لم يُغلق |

| no match for 'operator<<' | محاولة طباعة نوع لا تعرف cout طباعته |

| invalid conversion from ... | أنواع غير متوافقة |

| too few arguments to function | عدد وسائط خاطئ |

| undefined reference to ... | خطأ ربط: دالة مُصرَّح بها لكن لم تُعرَّف |

التحذيرات مهمة

التحذير لا يمنع الترجمة لكنه غالباً خطأ منطقي: if (x = 5)، متغير غير مهيأ، مقارنة int مع size_t. فعّل التحذيرات (-Wall -Wextra مع g++) وعاملها كأخطاء.

أخطاء لا يراها المترجم

البرنامج يترجم وينفّذ لكنه يتصرف بشكل خاطئ أو يتوقف:

- قسمة صحيحة غير مقصودة: sum / count.

- فيضان int.

- متغير غير مهيأ: قيمة عشوائية.

- فهرس خارج المصفوفة: قيم غريبة أو توقف (Segmentation fault).

- حلقة لا نهائية بسبب شرط لا يصبح خاطئاً أبداً.

هذه من النوع "السلوك غير المعرّف" (undefined behavior): قد يبدو البرنامج سليماً على جهازك ويفشل على جهاز آخر.

أدوات التصحيح

1. الطباعة: اطبع قيم المتغيرات في النقاط المشكوك فيها.

2. المصحح (debugger): في VS Code أو CLion ضع نقطة توقف ونفّذ سطراً سطراً.

3. أدوات الفحص: -fsanitize=address,undefined مع g++/clang تكتشف تجاوز الحدود والسلوك غير المعرّف عند التشغيل.

تمرين

البرنامج في المثال يترجم ويعمل، لكنه يحتوي على ثلاثة أخطاء منطقية مشروحة في التعليقات. شغّله، وتوقع الناتج الصحيح، ثم أصلح الأخطاء الثلاثة.

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> scores = {90, 85, 77};

    // خطأ منطقي 1: قسمة صحيحة — النتيجة 84 بدل 84.0
    int sum = 0;
    for (int s : scores) sum += s;
    double average = sum / scores.size();          // الإصلاح: static_cast<double>(sum) / scores.size()
    cout << "average: " << average << endl;

    // خطأ منطقي 2: فيضان int — النتيجة سالبة أو غريبة
    int population = 2000000000;
    long long doubled = population * 2;            // الإصلاح: 2LL * population
    cout << "doubled: " << doubled << endl;

    // خطأ منطقي 3: off-by-one — يحسب عنصراً أقل
    int count = 0;
    for (size_t i = 1; i < scores.size(); i++) {   // الإصلاح: يبدأ من 0
        if (scores[i] >= 80) count++;
    }
    cout << "scores >= 80: " << count << " (الصحيح 2)" << endl;
    return 0;
}
اختبر فهمك