الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

int main() VS void main(void) en langage C++ & C

بدأه khaled_prg في 9 يوليو 2010 · 16 رد · 3,183 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

موضوعي اليوم يدور حول الكتابة الصحيحة للدالة الرئيسية :wink:

بداية .. قمت بتطبيق الكتابات التالية على Borland c++ v 4.5 و قد كانت صحيحة 100% و لم يعترض عليها:

int main(int argc,char *argv[])
int main(void)
void main(void)
int main()
void main()
main()

بينما لم يقبل Dev بالكتابة الثالثة و القبل الأخيرة.

السؤال الآن هو :

لماذا يقبل بعض المترجمات كتابة معينة للدالة الرئيسية و يرفضها البعض !؟

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 9 يوليو 2010 في 19:56

#2
int main(int argc,char *argv[])
int main(void)
int main()

تلك هى الصيغ المثلى التى تحددها اللغه، بالنسبه لأخر تعريفين فهم متماثلين حيث وجود void مثل عدمه فهو يحدد عدم وجود معاملات.

الصيغ الأخرى قد تعمل على مترجم و لا تعمل على أخر.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#3

السلام عليكم

اقتباس

int main(int argc,char *argv[])
int main(void)
int main()

تلك هى الصيغ المثلى التى تحددها اللغه، بالنسبه لأخر تعريفين فهم متماثلين حيث وجود void مثل عدمه فهو يحدد عدم وجود معاملات.

الصيغ الأخرى قد تعمل على مترجم و لا تعمل على أخر.

كلام جميل جدا :)

1-هل أفهم من كلامك أنه حسب قواعد اللغة فإن الدالة الرئيسية تعيد قيمة صحيحة int ولكن بعض المترجمات أضاف خيار آخر و هو إمكانية أن لا تعيد الدالة شيء حيث نكتب أمامها void ؟

يعني هذا مجرد إضافة لبعض المترجمات و ليس من أصول اللغة ؟

2-سمعتُ البعض يقول أن الدالة الرئيسية تعيد القيمة 0 عندما يتم تنفيذ البرنامج بنجاح و تعيد القيمة1 عندما يحصل خطأ في تنفيذ البرنامج.

هل هذا صحيح ؟

3-أرجو منك أن تجيب على هذا السؤال (لو سمحت :blush: )

اقتباس
عندما نكتب:

int main()

فيجب أن نضع العبارة التالية في أسفل البرنامج:

return 0;

و لكن الغريب في الأمر كون بعض المترجمات لا يعترض على الكود عندما نحذف عبارة return 0 بالرغم من أن الكود يُخالف قواعد اللغة ...!

اقتباس
اخى خالد رد الاخ علاء تقريبا ترجمة للينك اللى انا كتبته فى مشكارة سابقة

الامر سهل... :)

مشكورة و ما قصرتي :)

تحياتي.

#4

السلام عليكم

اقتباس
عندما تستغنى عن كتابة return 0 انت تستخدم exit(0)

و تقريبا هما متساويان من حيث تنفيذ البرنامج و لكن يوجد اختلاف بسيط جدااااا

أشكرك أختي اسراء على المتابعة :) و أسأل الله سبحانه و تعالى أن يرزقنا و إياك شربة (من حوض النبي) لا نظمئ بعدها أبدا :)

بالنسبة لسؤالي فأنا لا أقصد استخدام الدالة exit بدلا من كتابة العبارة return وإنما قصدت الإستغناء عن كتابة return في حين أن الدالة تعيد int , انظري الكود:

#include<iostream>
using namespace std;
int main()
{
    cout<<"hello"<<endl;
    system("Pause");
    //return 0;
}

المترجم لم يعترض على الكود و قال بأنه سليم 100% مع أن المترجم سيتجاهل عبارة return و هذا يجب ان يكون خطأ لأن الدالة يجب أن تعيد قيمة صحيحة.

ما رأيكم ؟

أرجو الإجابة على هذا السؤال:

اقتباس
هل أفهم من كلامك أنه حسب قواعد اللغة فإن الدالة الرئيسية تعيد قيمة صحيحة int ولكن بعض المترجمات أضاف خيار آخر و هو إمكانية أن لا تعيد الدالة شيء حيث نكتب أمامها void ؟

يعني هذا مجرد إضافة لبعض المترجمات و ليس من أصول اللغة ؟

تحياتي.

#5
اقتباس

المترجم لم يعترض على الكود و قال بأنه سليم 100% مع أن المترجم سيتجاهل عبارة return و هذا يجب ان يكون خطأ لأن الدالة يجب أن تعيد قيمة صحيحة.

الداله main هى حاله خاصه من الدوال داخل اللغه حيث لها قواعد تختلف عن الدوال العاديه التى تقوم انت كمبرمج بتعريفها. - راجع الجزء [basic.start.main] بوثائق اللغه لمعرفة المزيد عن الداله main - إذا لم تقم بكتابة return داخل الداله main و وصل تنفيذ الداله إلى قوس الإغلاق سيكون للداله نفس تأثير تنفيذ return 0.

اقتباس

هل أفهم من كلامك أنه حسب قواعد اللغة فإن الدالة الرئيسية تعيد قيمة صحيحة int ولكن بعض المترجمات أضاف خيار آخر و هو إمكانية أن لا تعيد الدالة شيء حيث نكتب أمامها void ؟

يعني هذا مجرد إضافة لبعض المترجمات و ليس من أصول اللغة ؟

هذا السؤال سيحتاج لأن نغوص داخل المترجمات لنعرف كيف تقوم بتنفيذ الداله main.

سأتكلم هنا بشكل حصرى عن مترجم Intel و VC داخل نظام تشغيل ويندوز - و على اجهزة Intel او AMD او VIA - حيث انه داخل الأنظمة الأخرى يختلف الأمر قليلا.

مترجم VC يحتوى على الداله mainCRTStartup و التى تعتبر نقطة بدء برنامجك الرئيسيه و التى تقوم بإحضار الـ Command Line و تجهيزهم ثم تقوم بتمريرهم لدالة main اخرى تأخذ 3 معاملات (نعم 3 معاملات لا تندهش) و هى بدورها تقوم بإستدعاء الداله main الخاصه ببر3ج%Dمجك و عندما تقوم بالخروج من دالتك (و المترجم بشكل افتراضى عندما لا تضع انت return بها يقوم بكتابة واحده عوضا عنك) سيتم اخذ القيمه المعاده و تمريرها للداله main ذات الـ 3 معاملات و التى بدورها سيتم تمريرها للداله mainCRTStartup و التى بدورها تقوم بإستدعاء الداله exit فإذا حدث خطأ اثناء تنفيذها يتم الحصول على رقم الخطأ يليها اظهار الشاشه الخاصه بالـ Error Reporting لهذا الخطأ ثم انهاء البرنامج.

مترجم Intel لويندوز يستخدم الـ CRT للأسف و بالتالى الكلام السابق ينطبق عليه ايضا.

الكلام السابق هو implementation defined و يختلف من مترجم لأخر و كل ما يهمك منه هو شكل الداله main الخاصه بك لذا إذا اردت ان يكون برنامجك protable قم بإستخدام اى من الصيغتين اللذان تم ذكرهما فى مشاركتى السابقه.

و الله ولي التوفيق

2

مدونتي: C++ Tips and Tricks

#6

السلام عليكم

بداية أشكرك أستاذي علاء على الإفادة و مازلت أنتظر منك المزيد من التوضيحات بخصوص هذا الموضوع :)

اقتباس
إذا لم تقم بكتابة return داخل الداله main و وصل تنفيذ الداله إلى قوس الإغلاق

أنا أتكلم عن مرحلة الترجمة (قبل التنفيذ).

ألا يجب أن يتم تصنيف الأمر (عدم كتابة return) على أنه خطأ عند الوصول إلى مرحلة الترجمة ؟ أم أن المترجم يقوم بكتابة العبارة بدلا مني ؟

اقتباس
سيكون للداله نفس تأثير تنفيذ return 0

هل تقصد أنه سيكون لإغلاق معكوف الدالة نفس تأثير return 0 ؟

اقتباس
هذا السؤال سيحتاج لأن نغوص داخل المترجمات لنعرف كيف تقوم بتنفيذ الداله main.

أرجو أن لا أغرق ...! :lol: :lol:

اقتباس
مترجم VC يحتوى على الداله mainCRTStartup و التى تعتبر نقطة بدء برنامجك الرئيسيه و التى تقوم بإحضار الـ Command Line و تجهيزهم ثم تقوم بتمريرهم لدالة main اخرى تأخذ 3 معاملات (نعم 3 معاملات لا تندهش) و هى بدورها تقوم بإستدعاء الداله main الخاصه ببر3ج%Dمجك و عندما تقوم بالخروج من دالتك (و المترجم بشكل افتراضى عندما لا تضع انت return بها يقوم بكتابة واحده عوضا عنك) سيتم اخذ القيمه المعاده و تمريرها للداله main ذات الـ 3 معاملات و التى بدورها سيتم تمريرها للداله mainCRTStartup و التى بدورها تقوم بإستدعاء الداله exit فإذا حدث خطأ اثناء تنفيذها يتم الحصول على رقم الخطأ يليها اظهار الشاشه الخاصه بالـ Error Reporting لهذا الخطأ ثم انهاء البرنامج.

:blink: :wacko: :wacko: :wacko: :wacko: :wacko: :wacko: :blink:

ما فائدة كل من mainCRTStartup و الدالة التي تأخذ 3 معاملات :wacko: :blink:

أرى أنك قد تعمقت في الإجابة :blink: :wacko: و أنا مبتدأ و أريد إجابة سطحية (إن أمكن).

أرجو التركيز على هذا السؤال:

اقتباس
يعني هذا مجرد إضافة لبعض المترجمات و ليس من أصول اللغة ؟

بقي هذ السؤال .. أرجو ان تجيب عنه (لو سمحت :blush: )

اقتباس
سمعتُ البعض يقول أن الدالة الرئيسية تعيد القيمة 0 عندما يتم تنفيذ البرنامج بنجاح و تعيد القيمة1 عندما يحصل خطأ في تنفيذ البرنامج.

هل هذا صحيح ؟

أشكرك على الإفادة :)

ملاحظة (إلى الأستاذ علاء):

أرسلتُ لك رسالة على الخاص .. هل وصلتك ؟

إذا كان الجواب "لا" فأرجو منك أن ترسل لي رسالة على الخاص و أقوم بالرد عليها.

دمت ألف خير :)

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 13:08

#7

السلام عليكم.

الدالة main يجب ان ترجع قيمة من نوع int لان ال C++ Standards تقول ذلك.

ثانيا في حالة اردنا التحقق من انتهاء البرنامج بشكل صحيح فاننا سنعود للقيمة المرجعة من طرف الدالة main والتي سترجع 0 في حالة انتهاء البرنامج بشكل صحيح. لكن ماذا لو استعملنا void main في هذه الحالة؟

هنا فعملية التحقق تتوقع من الدالة main ارجاع قيمة من نوع int .. لكن نحن استعملنا void وهذا ما سيؤدي الى أخذ قيمة عشوائية و بالتالي سيتم اعتبار ان البرنامج انتهى بخطأ.

بينما التفسير الوحيد لاستعمال ال void main من طرف بعض المترجمات مثل Microsoft VC هو ان ارجاع قيمة من طرف الدالة main اصبح obsolete .

كخلاصة : استعمل int main لكي يكون برنامجك متوافقا مع ال C++ Standards.

2
#8

السؤال الذي يجب طرحه هو

هل هذه الكتابات صحيحة في ال C++ Standards?

تقول الC++ standards ان الدالة main يجب ان ترجع قيمة من نوع int.

اذن استعمل int main و لا تستعمل void main حتى لو كان مترجمك يسمح بذلك.

2
#9

السلام عليكم

أشكرك أخي xpero على المداخلة المفيدة :)

بانتظار تعليق علاء على المداخلة و الإجابة عن بقية اسئلتي السابقة.

تحياتي.

تم تعديل هذه المشاركة بواسطة khaled_prg في 11 يوليو 2010 في 16:46

#10
اقتباس
أرسلتُ لك رسالة على الخاص .. هل وصلتك ؟

لم تصلنى اى رسائل

اقتباس

هل تقصد أنه سيكون لإغلاق معكوف الدالة نفس تأثير return 0 ؟

لا اقصد هذا، وقت ترجمة البرنامج إلى النسخه التنفيذيه إذا لم يجد المترجم return داخل الداله main يقوم بإضافة واحدة بلغة الأسمبلى للنسخه التى يتم ترجمتها.

اقتباس
يعني هذا مجرد إضافة لبعض المترجمات و ليس من أصول اللغة ؟

نعم هى كذلك، و تذكر انها قد تكون غير مدعومه من قبل نفس المترجم او مترجمات اخرى على منصات اخرى.

اقتباس
سمعتُ البعض يقول أن الدالة الرئيسية تعيد القيمة 0 عندما يتم تنفيذ البرنامج بنجاح و تعيد القيمة1 عندما يحصل خطأ في تنفيذ البرنامج.

هل هذا صحيح ؟

بالنسبه للنجاح فيتم اعادة صفر و عند الفشل يتم اعادة رقم، معنى هذا الرقم يمكنك معرفته من خلال نظام التشغيل و لكن بشكل عام اى رقم غير الصفر يعبر عن انتهاء البرنامج و انه فشل فى تنفيذ احد العمليات التى يقوم بها.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#11
اقتباس

أنا - معنى هذا الرقم يمكنك معرفته من خلال نظام التشغيل

خالد - كيف ذلك ؟

راجع هذا الرابط يحتوى على العديد من الـ Exit Status التى يتم العوده بها من البرامج التى تعمل على ويندوز.

اقتباس
الدالة main يجب ان ترجع قيمة من نوع int لان ال C++ Standards تقول ذلك.

ثانيا في حالة اردنا التحقق من انتهاء البرنامج بشكل صحيح فاننا سنعود للقيمة المرجعة من طرف الدالة main والتي سترجع 0 في حالة انتهاء البرنامج بشكل صحيح. لكن ماذا و 648 استعملنا void main في هذه الحالة؟

هنا فعملية التحقق تتوقع من الدالة main ارجاع قيمة من نوع int .. لكن نحن استعملنا void وهذا ما سيؤدي الى أخذ قيمة عشوائية و بالتالي سيتم اعتبار ان البرنامج انتهى بخطأ.

السؤال الذي يجب طرحه هو

هل هذه الكتابات صحيحة في ال C++ Standards?

تقول الC++ standards ان الدالة main يجب ان ترجع قيمة من نوع int.

اذن استعمل int main و لا تستعمل void main حتى لو كان مترجمك يسمح بذلك.

+1 على كل الكلام ماعدا الأحمر.

عندما يتم استخدام void دائما سيتم ارجاع صفر.

اجابه ادق لمن يعرف لغة الأسمبلى

عندما يتم استخدام void و عند استخدام return للخروج من الداله او عندما لا توجد return يتم اضافة الكود التالى بعد كود المستخدم و هو

xor eax, eax

و هذه طريقه سريعه لجعل eax بصفر و بعدها يتم حفظ قيمة eax و من ثم اجراء عمليات اخلاء ذاكره الـ stack بعدها يتم ارجاع قيمة eax مره اخرى بصفر يليها استدعاء دالة إنهاء البرنامج و حينها يكون eax بصفر و هذه هى الـ Exit Status و التى تعنى operation completed successfully.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 14 يوليو 2010 في 21:40

مدونتي: C++ Tips and Tricks

#12

السلام عليكم

اقتباس
عندما يتم استخدام void دائما سيتم ارجاع صفر.

لكن ماذا لو حدث خطأ في تنفيذ البرنامج ...! هل سيتم ارجاع صفر !؟

سؤال آخر:

إذا كتبنا كود معين (خالي من الأخطاء) و وضعنا في الأخير return 3 هل سيتم تنفيذ البرنامج بنجاح أم سيتم تصنيف الأمر على أنه حدث الخطأ رقم 3 !؟

ماذا لو كتبنا return -1 هل يوجد خطأ يحمل هذا الرقم !؟

بانتظار الرد :)

تم تعديل هذه المشاركة بواسطة khaled_prg في 14 يوليو 2010 في 22:17

#13

سأعتبر انى و انت شخص واحد و ساسئل بضعة اسئله و سأقوم بالإجابه عليها لإنه يبدو انه اختلطت الأمور لديك.

المتعارف عليه هو انه عندما تقوم داله بإرجاع قيمه فإنه يمكن استقبال هذه القيمه داخل متغير بداله اخرى.

1 - حيث أن main هى الداله الرئيسيه للبرنامج فما الفائده من ارجاع قيمة للنظام ؟

2 - و ماذا سيفعل النظام بها ؟

3 - و ماذا تؤثر القيمه العائده من الداله main على برنامجى (بعد انتهائه من العمل)؟

إجابة هذه الأسئله تحتاج لأن أضرب لك مثال بسيط يجيب لك على هذه الأسئله بالترتيب و بدون الدخول فى تفاصيل تجعل الأمور تختلط على بعضها، لاحظ ان اغلب ما انا على وشك قوله اغلبه محض خيال و لكن فقط لتقريب الصوره لك.

اغلبنا درسنا فى مرحلة ما - تعليميه او تدريبيه او خلافها - بعض اوامر الـ DOS و سنتكلم هنا الأمر Dir و الذى يقوم بإظهار محتويات مجلد معين، الأمر Dir هو أمر داخلى للـ DOS و لكن سنعتبر فى هذا المثال انه ملف تنفيذى خارجى و اسمه dir.exe حيث يقوم الـ DOS بتشغيله و تنفيذه و من ثم يظهر لك النتيجه، لنتخيل الأن كيف سيقوم الأمر Dir بالتنفيذ:

1 - اولا سنكتب الأمر dir و نضغط enter

2 - سيقوم الـ DOS بتشغيل الملف dir.exe، سيقوم الدوس بإستخدام داله داخليه لتشغيل هذا الملف و عندما يتم التشغيل سيتوقف الدوس عن العمل و سيعطى التحكم لبرنامج dir.exe

3 - سيقوم برنامج dir.exe بكتابة اسماء المجلدات و الملفات و خلافه و بعدما ينتهى سيقوم بإرجاع التحكم للداله التى قامت بتشغيله و التى الأن ستجعل الدوس يكمل عمله.

4 - المشكله هنا ان الدوس لم يعرف هل البرنامج dir.exe قام بما يتوجب عليه ام انه فشل فى القيام بما يريد لذا تم تطوير الـ DOS حيث قام بعمل مساحه ثابته بالذاكره و اسماها EXE_RETURN_VALUE و اعطى لها مكان ثابت بالذاكره و امر كل برنامج قبل ان يقوم بالإغلاق ان يضع رقم معين داخل هذا المكان ليحدد هل انتهى البرنامج بنجاح ام بفشل، هذه الأرقام الدوس من قام بتحديدها و تحديد معانيها و اعطى للمبرمج الفرصه ان يعيد اى من هذه الأرقام أو ان يعيد اى رقم يشاء و لكن فى هذه الحاله الدوس لن يعرف معنى هذا الرقم و قد يظهر "رسالة خطأ غير معروف".

5 - الأن تم تطوير البرنامج dir.exe ليتناسب مع الإصدار الجديد من الدوس لذا عندما بدء البرنامج dir.exe عمله واجهه مشكله و هى انه لا يستطيع الدخول على مجلد معين لذا خزن الرقم 1024 داخل المكان EXE_RETURN_VALUE ثم انهى نفسه و بعد انتهاء البرنامج dir.exe عاد التحكم للداله التى قامت بتشغيل البرنامج و اول شئ فعلته هو انها تحققت من القيمه المخزنه داخل المكان فوجدتها 1024 لذا عرفت ان هناك خطأ حدث لذا قامت بإستدعاء داله تأخذ هذا الرقم ثم تطبع رساله نصيه تقابل هذا الرقم و بعد ان تم طباعة هذا الرقم قامت الداله التى تقوم بتشغيل البرامج بجعل قيمة EXE_RETURN_VALUE لحذف أى قيمة قد تكون موجوده داخله.

6 - كما ترى القيمه التى قام البرنامج dir.exe لم يتم إستخدامها إلا بعد ان انهى البرنامج dir.exe عمله و تم اغلاقه و حت إذا لم يتم اغلاقه فلن يحدث شئ حتى يتم الإغلاق و السبب فى ذلك ان التحكم لا يعود للداله التى تنفذ البرنامج dir.exe إلا بعد ان يتم اغلاقه.

7 - كما ترى نظام التشغيل لم يستفد من معرفة الحالة التى انتهى البرنامج عليها و لكن المستخدم الذى طلب تشغيل البرنامج dir.exe هو من استفاد بالرساله لإنه عرف انه يوجد مجلد لا يستطيع النظام الوصول إليه و هذا جعله يتنبه لوجود امر غير طبيعى او whatever...

لنعود الأن إلى أرض الواقع لنجيب على الأسئله التى ذكرتها:

1 - حيث أن main هى الداله الرئيسيه للبرنامج فما الفائده من ارجاع قيمة للنظام ؟

الفائده هى ان القيمه ستحدد كيف انتهى البرنامج فإن حدث خطأ سينبه المستخدم لحدوث خطأ و سيطلب منه ارسال مجموعه من البيانات التى سببت فى انهيار البرنامج إلى مصممه ليستطيع إصلاحه، ايضا سيستفاد بها الـ System Administrator حيث سيكون لديه وصف كامل عما سبب اعلاق البرنمج بشكل غير طبيعى لياعد فى اصلاح المشكله إن كانت تتبع نظام التشغيل او غيره.

2 - و ماذا سيفعل النظام بها ؟

تعتمد على من استدعى برنامجك فإن كان تم تشغيل البرنامج الخاص بك من خلال سطح المكتب او الـ Explorer (ويندوز) فسيقوم نظام التشغيل بإظهار رسالة تفيد بأن البرنامج قد انتهى و قد حدث به خطأ و سيظهر وصف بسيط مع تشغيل برنامج Error Reporting يليه حفظ رقم الخطأ داخل Event Log اما اذا تم تشغيل برنامجك من خلال برنامج اخر مثل تشغيل محرر Visual Studio لمترجم VC، إذا حدث أن تم اغلاق المترجم بشكل غير متوقع سيتم العوده برقم معين للمحرر و الذى سيظهر لك رسالة تفيد بذلك و إذا كنت قد عملت على Visual Studio 2002 أو 2005 قد تتذكر ايهم.

3 - و ماذا تؤثر القيمه العائده على من الداله main على برنامجى (بعد انتهائه من العمل)؟

لا شئ، فقط هى وسيله للتواصل بين برنامجك و البرنامج الذى قام بتشغيله.

ارجو ان تكون الإجابه وافيه لك.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 14 يوليو 2010 في 23:08

مدونتي: C++ Tips and Tricks

#14

السلام عليكم

اقتباس
سأعتبر انى و انت شخص واحد و ساسئل بضعة اسئله و سأقوم بالإجابه عليها لأنه يبدو انه اختلطت الأمور لديك.

:blush: :blush: :blush:

اقتباس
ارجو ان تكون الإجابه وافيه لك.

هي كذلك :) ولكن لي استفسارات بسيـــــــــــطة أرجو أن لا أزعجك بها :blush:

اقتباس
4 - المشكله هنا ان الدوس لم يعرف هل البرنامج dir.exe قام بما يتوجب عليه ام انه فشل فى القيام بما يريد لذا تم تطوير الـ DOS حيث قام بعمل مساحه ثابته بالذاكره و اسماها EXE_RETURN_VALUE و اعطى لها مكان ثابت بالذاكره و امر كل برنامج قبل ان يقوم بالإغلاق ان يضع رقم معين داخل هذا المكان ليحدد هل انتهى البرنامج بنجاح ام بفشل، هذه الأرقام الدوس من قام بتحديدها و تحديد معانيها و اعطى للمبرمج الفرصه ان يعيد اى من هذه الأرقام أو ان يعيد اى رقم يشاء و لكن فى هذه الحاله الدوس لن يعرف معنى هذا الرقم و قد يظهر "رسالة خطأ غير معروف".

5 - الأن تم تطوير البرنامج dir.exe ليتناسب مع الإصدار الجديد من الدوس لذا عندما بدء البرنامج dir.exe عمله واجهه مشكله و هى انه لا يستطيع الدخول على مجلد معين لذا خزن الرقم 1024 داخل المكان EXE_RETURN_VALUE ثم انهى نفسه و بعد انتهاء البرنامج dir.exe عاد التحكم للداله التى قامت بتشغيل البرنامج و اول شئ فعلته هو انها تحققت من القيمه المخزنه داخل المكان فوجدتها 1024 لذا عرفت ان هناك خطأ حدث لذا قامت بإستدعاء داله تأخذ هذا الرقم ثم تطبع رساله نصيه تقابل هذا الرقم و بعد ان تم طباعة هذا الرقم قامت الداله التى تقوم بتشغيل البرامج بجعل قيمة EXE_RETURN_VALUE لحذف أى قيمة قد تكون موجوده داخله.

هل أفهم من كلامك أن القيمة التي تُعيدها الدالة main لا تعتمد على ماكتبناه في الكود و إنما تعتمد على الطريقة التي تم تنفيذ البرنامج بها فإذا تم تنفيذ البرنامج بنجاح ستتم إعادة الصفر و إلا فستتم إعادة عدد غير صفر , هذا العدد يدل على نوعية الخطأ الذي حدث !؟

تم تعديل هذه المشاركة بواسطة khaled_prg في 15 يوليو 2010 في 15:16

1 −1
#15
khaled_prg كتب:

السلام عليكم

لكن ماذا لو حدث خطأ في تنفيذ البرنامج ...! هل سيتم ارجاع صفر !؟

سؤال آخر:

إذا كتبنا كود معين (خالي من الأخطاء) و وضعنا في الأخير return 3 هل سيتم تنفيذ البرنامج بنجاح أم سيتم تصنيف الأمر على أنه حدث الخطأ رقم 3 !؟

ماذا لو كتبنا return -1 هل يوجد خطأ يحمل هذا الرقم !؟

بانتظار الرد :)

- يتم ارجاع 0 في حالة انتهاء البرنامج بدون اخطاء : ERROR_SUCCESS

-اذا وضعت return 3 فان ذلك سيؤدي الى اعتبار انه حدث خطأ ERROR_PATH_NOT_FOUND حتى لو كان الكود بدون اخطاء.

-بالنسبة ل -1 فلا يوجد مايقابله في system error codes

للمزيد من المعلومات : http://msdn.microsoft.com/en-us/library/ms681381%28v=VS.85%29.aspx

#16

السلام عليكم

بانتظار الأستاذ علاء حتى يجيب على هذا السؤال:

اقتباس
هل أفهم من كلامك أن القيمة التي تُعيدها الدالة main لا تعتمد على ماكتبناه في الكود و إنما تعتمد على الطريقة التي تم تنفيذ البرنامج بها فإذا تم تنفيذ البرنامج بنجاح ستتم إعادة الصفر و إلا فستتم إعادة عدد غير صفر , هذا العدد يدل على نوعية الخطأ الذي حدث !؟

و يعلق على هذه المداخلة المفيدة:

اقتباس
- يتم ارجاع 0 في حالة انتهاء البرنامج بدون اخطاء : ERROR_SUCCESS

-اذا وضعت return 3 فان ذلك سيؤدي الى اعتبار انه حدث خطأ ERROR_PATH_NOT_FOUND حتى لو كان الكود بدون اخطاء.

-بالنسبة ل -1 فلا يوجد مايقابله في system error codes

للمزيد من المعلومات : http://msdn.microsof...v=VS.85%29.aspx

لنفرض جدلا أن الذي قاله الأخ xpero صحيح ...!

طيب .. انظر الكود التالي:

#include<iostream>
using namespace std;
int main()
{
	cout<<"hello"<<endl;
	system("pause");
	return 3;
}

عند تنفيذ البرنامج سيقوم بإظهار الجملة hello بدون أي مشاكل ...!

لماذا لا يتم إظهار رسالة تحذيرية تحمل نص الخطأ رقم 3 !؟

نفس الشيء بالنسبة لهذا الكود:

#include<iostream>
using namespace std;
int main()
{
	cout<<"hello"<<endl;
	system("pause");
	return -1;
}

عند تنفيذ البرنامج سيقوم بإظهار الجملة hello بدون أي مشاكل ...!

لماذا لا يتم إظهار رسالة تحذيرية تفيد بأن رقم الخطأ غير معروف ...!؟

هل معنى هذا أن القيمة التي تُعيدها الدالة main لا تعتمد على ماكتبناه في الكود و إنما تعتمد على الطريقة التي تم تنفيذ البرنامج بها فإذا تم تنفيذ البرنامج بنجاح ستتم إعادة الصفر و إلا فستتم إعادة عدد غير صفر , هذا العدد يدل على نوعية الخطأ الذي حدث !؟

بانتظار الرد.

تم تعديل هذه المشاركة بواسطة khaled_prg في 15 يوليو 2010 في 04:44

1
#17
اقتباس

عند تنفيذ البرنامج سيقوم بإظهار الجملة hello بدون أي مشاكل ...!

لماذا لا يتم إظهار رسالة تحذيرية تحمل نص الخطأ رقم 3 !؟

يا أخي,,, هذا الرقم يرجع لنظام التشغيل....

مثال (على لينوكس):

// ret_error.c



#include <stdio.h>



int main(void){



	return 100;

}

لمعرفة إرجاع الدالة main , قم بنتفيذ البرنامج و ليكن:

a.out

لاحظ أنه لم يتم طباعة أي شئ, لأن البرنامج لايقوم بأي شئ

قم بكتابة التالي لتعرف القيمه المرجعه من الدالة main لنظام التشغيل:

echo $?

ستلاحظ أن القيمه 100 يتم طباعتها......

ملاحظه, لمعرفة القيمه المرجعه من أخر عمليه تم تنفيذها (بغض النظر هل هي برنامج سي أو غيره) فإننا نستخدم

echo $? على الليونكس, و هناك شئ مقابل لها على الويندوز لا أعرفه, بإمكانك أن تبحث عنه, أو إنظر هنا

= إضافة =

قم بعمل ترجمه للبرنامج السابق على ويندوز عن طريق VC++ مثلا...

بعد ذلك قم بفتح ال command prompt من خلال أن تكتب في مربع run الأمر cmd ..

بعد ذلك إذهب إلي المسار الذي نتج به ملف ال exe :

>cd C:\Documents and Settings\mhewedy\My Documents\Visual Studio 2008\Projects\error_level\Debug

قم بعض المحتويات للتأكد من وجود ملف ال exe:

>dir

 Volume in drive C has no label.

 Volume Serial Number is 0C60-8BFF



 Directory of C:\Documents and Settings\mhewedy\My Documents\Visual Studio 2008\Projects\error_level\Debug

07/15/2010  04:49 PM	<DIR>      	.

07/15/2010  04:49 PM	<DIR>      	..

07/15/2010  04:49 PM        	30,208 error_level.exe

07/15/2010  04:49 PM   		300,188 error_level.ilk

07/15/2010  04:49 PM   		396,288 error_level.pdb

       		3 File(s)    	726,684 bytes

       		2 Dir(s)  32,315,875,328 bytes free

قم بعد ذلك بتنفيذ البرنامج, و تنفيذ الأمر echo%errorlevel% : كما بالأسفل

>error_level.exe>echo %errorlevel%100

تم تعديل هذه المشاركة بواسطة Snack3r في 23 ديسمبر 2013 في 13:12 — السبب: دمج المشاركات

1 −1

مواضيع مشابهة