أخطاء في تصريف البرنامج ؟ الكثير من اﻷخطاء و ﻻ حل لها ؟ هنا الحل
بواسطة
في 25-04-2011 عند 19:44 (2358 الزيارات)
السلام عليكم و رحمة الله و بركاته
سأتحدث هنا عن اﻷخطاء في كتابة البرنامج
ﻻحظت كثيرا من اﻹخوة اﻷعزاء يصادفون أخطاء في برامجهم و ينتابهم الرعب من هذه اﻷخطاء
يتحيرون و ﻻ يدرون ما يفعلون
يسألون و يسألون و مرة يُجَابون و عشر مرات يُتْركون
من شخص يقول syntax error إلى آخر يقول أنه متأكد من صحة برنامجه لكن المخرج خطأ
هل تعلم ؟
هل تعلم أن المصرف البرمجي يظهر لك مكان اﻷخطاء و يذكر لك الخطأ بالضبط
نعم ، ﻻ داعي ﻷن تسأل عن المشكلة ﻷن المصرف يخبرك ما هي المشكلة ، كل ما عليك هو حلها أو السؤال عن حلها و ليس السؤال عنها
لنأخذ عددا من اﻷمثلة
أستخدم في أمثلتي بيئة Code::Blocks و المصرف GCC
لو افترضنا أن أحدا كتب البرنامج التالي :
إذا قمنا بتصريف البرنامج فإن المصرف سيظهر لنا أخطاء ، سنجد أن واجهة كود بلوكس بهذا الشكل :كود:#include <iostream> using namespace std; //main function int main () { int a=0 cout << a << endl; return 0; } //**main function
نجد في أسفل الواجهة وصفا بالخطئ و تجد أيضا أن كود بلوكس حدد السطر الذي فيه الخطأ بمربع أحمر على يسار السطر
في مثالنا سطر الخطئ هو السطر السابع لذلك ننظر في السطر السابع و ما حوله
الوصف يقول
في العمود اﻷول يظهر لنا ملف الخطئكود:/home... | 7 | error: expected ‘,’ or ‘;’ before ‘cout’ |
في العمود الثاني يظهر لنا رقم سطر الخطئ و هو 7
في العمود الثالث يظهر لنا وصف بالخطئ
إذا قرأنا الوصف فهو :
معنى العبارة السابقة خطأ: أتوقع ',' أو ';' قبل 'cout'كود:error: expected ‘,’ or ‘;’ before ‘cout’ |
بكل بساطة يعني هذا أن المصرف يتوقع الرمز ',' أو ';' قبل أمر cout لكننا لم نكتبه
إذا ذهبنا إلى السطر الذي يسبق السطر السابع و هو السطر السادس
نجد المكتوب ما يلي :
ﻻحظ أن اﻷمر لم ينته بالفاصلة المنقوطة ; و هو الخطأ الذي ارتكبه المبرمجكود:int a=0
إذا عدلنا السطر و أنهيناه بفاصلة منقوطة بهذا الشكل :
نكون قد حللنا المشكلةكود:int a=0;
لم يكن صعبا أليس كذلك ؟
قد يكون هناك أكثر من خطئ في البرنامج و عندها يقوم المصرف بإعطاء قائمة باﻷخطاء و سطرها و وصفها في أسفل الواجهة كما شاهدنا
تحت قائمة اﻷخطاء مباشرة تجد أن المصرف كتب لنا عدد اﻷخطاء و اﻹنذارات في البرنامج
مكتوب أن هناك خطأ واحدا و صفرا من اﻹنذارات و هكذا نعرف عدد اﻷخطاءكود:=== Build finished: 1 errors, 0 warnings ===
سأترك الحديث عن اﻹنذارات لوقت ﻻحق
لنأخذ مثالا آخر عن اﻷخطاء
مثلا في البرنامج التالي :
في البرنامج السابق ظهرت لي اﻷخطاء التالية :كود:#include <iostream> using namespace std; float average(float a,float b) { result=(a+b)/2; return result; } //main function int main () { float a=0; cin << a; cout << "average is " << average(a) << endl; return 0; } //**main function
أولا ذكر المصرف الدالة التي تحوي اﻷخطاء التي سيذكراها و هي الدالة averageكود:In function ‘float average(float, float)’: 5 | error: ‘result’ was not declared in this scope In function ‘int main()’: 11 | error: no match for ‘operator<<’ in ‘std::cin << a’ 4 | error: too few arguments to function ‘float average(float, float)’ 13 | error: at this point in file === Build finished: 4 errors, 0 warnings ===
بعدها ذكر الرسالة :
السطر الخامس كتبنا فيه :كود:5 | error: ‘result’ was not declared in this scope
يقول الخطأ result was not declared أن أن result لم يتم اﻹعلان عنهكود:result=(a+b)/2;
بكل بساطة فإن خطأنا هو أننا استخدمنا المتغير result قبل إعلانه
كان المفترض أن نكتب :
أي أن نعلن المتغير result قبل استخدامهكود:float result=(a+b)/2;
بعدها ذكر المصرف أن الدالة التي فيها اﻷخطاء اﻷخرى هي main أي الدالة الرئيسية
أول خطئ هو :
أي أن استخدام العملية >> ليس موجودا مع cinكود:11 | error: no match for ‘operator<<’ in ‘std::cin << a’
كل ما في اﻷمر أننا عكسنا اتجاه السهمين
كان علينا أن نكتب :
الخطآن الذان يليانه هما :كود:cin >> a;
اﻷول في السطر الرابع و هو السطر الذي أعلنا فيه الدالة averageكود:4 | error: too few arguments to function ‘float average(float, float)’ 13 | error: at this point in file
مكتوب أن عدد مدخلات الدالة أقل من المحدد
و في الخطئ الذي يليه كتب أن الخطأ في السطر الثالث عشر "في هذه النقطة"
أظهر المصرف أن خطأ استدعاء الدالة بمدخلات قليلة في سطر الدالة لتحديد الدالة التي تم استدعاءها
ثم ذكر السطر الذي تم اﻻستدعاء فيه و هو الثالث عشر
مع أن الخطأ كان واحدا لكن المصرف كتبه لنا على شكل خطأين لنعرف بالضبط ماهية الخطئ
كل ما فعلنا أننا استدعينا الدالة average التي تحسب متوسط عددين في السطر الثالث عشر و لكننا أعطيناها عددا واحدا
كان علينا أن نعطيها عددا آخر
مع كثرة اﻷخطاء التي ظهرت لنا و الكلام الطويل العريض إﻻ أن اﻷخطاء كانت بسيطة جدا و ليست معقدة
بعد هذا أتمنى أن تستطيعوا أن تفهموا أخطاء برامجكم و تصححوها
أو على اﻷقل أن تكونوا عارفين شيئا عنها و ﻻ تسألون "ما هو الخطأ ؟" بدون أن تعرفوا شيئا عنه
تحياتي
روح سامية