الشبكة العربية لمطوري الألعاب

محترف مشرف عبد اللطيف حاجي علي مشاركة 11

ما هو الخطأ الذي يظهر؟
لا زلت أفضل فكرة أن تقوم بعمل مشروع صغير لتجريب الـ std::vector وربما تجريب إجراءات الـ OpenGl معها. الفكرة هنا أن نعزل الخطأ ليسهل إصلاحه (إن وجد طبعاً)

عبد اللطيف حاجي علي
مبرمج
In|Framez

مبتدئ  maya مشاركة 12

السلام عليكم
شكرا اخي غبد اللطيف على اهتمامك
ها هي الاخطاء التي تاتيني


C:\Documents and Settings\AHLEM\Bureau\rav\exemple opengl\lesson03\ex\ex.cpp(152) : error C2601: 'KillGLWindow' : local function definitions are illegal
C:\Documents and Settings\AHLEM\Bureau\rav\exemple opengl\lesson03\ex\ex.cpp(200) : error C2601: 'CreateGLWindow' : local function definitions are illegal
C:\Documents and Settings\AHLEM\Bureau\rav\exemple opengl\lesson03\ex\ex.cpp(368) : error C2601: 'WndProc' : local function definitions are illegal
C:\Documents and Settings\AHLEM\Bureau\rav\exemple opengl\lesson03\ex\ex.cpp(429) : error C2601: 'WinMain' : local function definitions are illegal
C:\Documents and Settings\AHLEM\Bureau\rav\exemple opengl\lesson03\ex\ex.cpp(489) : fatal error C1004: unexpected end of file found
Error executing cl.exe.


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

http://up3.m5zn.com/download-2009-5-7-09-sefk5k77i.rar

خبير مدير وسام البهنسي مشاركة 13

أما في 07 مايو 2009 05:08 م، فقد تنهد maya بارتياح وهو يرد:

السلام عليكم
شكرا اخي غبد اللطيف على اهتمامك
ها هي الاخطاء التي تاتيني

...\ex\ex.cpp(152) : error C2601: 'KillGLWindow' : local function definitions are illegal
...\ex\ex.cpp(200) : error C2601: 'CreateGLWindow' : local function definitions are illegal
...\ex\ex.cpp(368) : error C2601: 'WndProc' : local function definitions are illegal
...\ex\ex.cpp(429) : error C2601: 'WinMain' : local function definitions are illegal
...\ex\ex.cpp(489) : fatal error C1004: unexpected end of file found
Error executing cl.exe.

حسناً هذا الخطأ الظريف يقول أنكِ تحاولين تعريف إجراءات داخل إجراءات أخرى، وطبعاً أنا أعرف أنكِ برئية من هذه التهمة ☺
 
هذه واحدة من الأخطاء التي لا يستطيع المترجم أن يلتقطها بشكل صحيح. هو يظن أننا نقوم بتعريف الإجراء KillGLWindow داخل الإجراء الذي يسبقه. إذن السؤال هو ما الذي يدفع المترجم إلى هذا الاعتقاد؟
 
فلنلق نظرة أقرب على كتلة الكود التي تقع قبل إجراء KillGLWindow:


......
 

  for (int i=0;i<t.size();i++)>
  {
    glBegin(GL_TRIANGLES);
    glColor3f(0.0f,0.0f,0.1f);
    glVertex3f(v[t[i].v1-1].x*0.25, v[t[i].v1-1].y*0.25, v[t[i].v1-1].z*0.25);
    glVertex3f(v[t[i].v2-1].x*0.25, v[t[i].v2-1].y *0.25, v[t[i].v2-1].z *0.25);
    glVertex3f(v[t[i].v3-1].x *0.25, v[t[i].v3-1].y*0.25 , v[t[i].v3-1].z*0.25);
    glEnd(); // Done Drawing The Quad
 

  return TRUE;  // Keep Going
}
 
 


GLvoid KillGLWindow(GLvoid) // Properly Kill The Window
{
  if (fullscreen)				// Are We In Fullscreen Mode?
  {
    ChangeDisplaySettings(NULL,0);	// If So Switch Back To The Desktop
    ShowCursor(TRUE);			// Show Mouse Pointer
  }

 
....
 
لاحظي حلقة for التكرارية التي تقوم برسم بعض المثلثات. في السطر الذي يلي عبارة for، نقوم بفتح كتلة كود عن طريق القوس } والذي يجب أن يقابله قوس آخر { عند نهاية التعليمات في الحلقة. أي بعد النداء إلى glEnd. لكن... لا يوجد قوس إغلاق بعدها!!!
 
هذا هو الخطأ الذي ارتكبته أنت. الآن من منظور المترجم هو سيبحث عن أقرب قوس إغلاق لينهي كتلة العمليات للحلقة for، وهذا القوس سيتصادف أن يكون القوس بعد السطر return TRUE.  هذا يترك الإجراء DrawGLScene مفتوحاً، ومن ثم يأتي السطر الذي يقوم بتعريف الإجراء KillGLWindow... هذا خطأ طبعاً، لأننا ما زلنا في تعريف الإجراء السابق، لكننا نقوم بتعريف إجراء آخر في داخله الآن.
 
بقية الأخطاء هي ظواهر جانبية للخطأ الأساسي طبعاً ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  maya مشاركة 14

السلام عليكم
لقد جربت ما قلته لي اخي وسام لكن وجدت انه تخرج لي تقارير اخطاء لم افهم معناها


IBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/ex.exe : fatal error LNK1120: 1 unresolved externals

هذا بعد ان اضفت }

محترف مشرف عبد اللطيف حاجي علي مشاركة 15

يبدو أن إعدادت المشروع لديك تفترض أن الإجراء المدخل (Entry Function) هو main. على كلٍ لحل هذه المشكلة يمكنك فعل أحد الحلول التالية:

1. تعديل اسم الإجراء WinMain إلى الاسم main بحيث لا يأخذ أي محددات ويرجع قيمة int

int main()
{
       // Same implementation
}

2. تمرير المحدد التالي للـ Linker أو المترجم cl.exe 

/SUBSYSTEM:WINDOWS
بدلاً عن
/SUBSYSTEM:CONSOLE


3. تعديل إعداد المشروع المسمى (SubSystem) الموجود في Project Properties/Configuration Properties/Linker/System بحيث يأخذ القيمة Windows
بدلاً عن Console 

تعديل: لقد حملت مشروعك للتو. يبدو أنك تستخدم الإصدار السادس (الذي أكل عليه الدهر وشرب) والحل الأخير الذين اقترحته يمكن تطبيقه على الإصدار السابع أو ما بعده من المترجم.
تعديل2: أضفت ملف المشروع المعدل الذي يصلح هذه المشكلة
تعديل3: تم تعديل الملف المرفق. آسف على الخطأ

عبد اللطيف حاجي علي
مبرمج
In|Framez

مبتدئ  maya مشاركة 16

السلام عليكم
 لا ادري ماذا غيرت لانني بدلت اشياء كثيرة  اصبحت لدي خطا واحد هو


LINK : fatal error LNK1104: cannot open file "opengl.obj"
اسفة لانني اسال عن اشياء احتمال انها تبدو لكم تافهة لكنني جديدة في هذا المجال

محترف مشرف عبد اللطيف حاجي علي مشاركة 17

غريب هذا الخطأ. على كلٍ جرب الأشياء التالية:
1. تنفيذ عملية Recompile All (أو Rebuild All)
2. إعادة ملف المشروع (ex.dsp) الأصلي والذي يمكنك تحميله من مشاركتك السابقة أو تحميله من مشاركتي السابقة مع التصحيح

عبد اللطيف حاجي علي
مبرمج
In|Framez

مبتدئ  maya مشاركة 18

لقد قمت باعادة تحميل المشروع السابق و اضفت

وفي 14/جمادى الأولى/1430 08:37 ص، ظهر شبح ابتسامة على وجه عبد اللطيف حاجي علي وهو يقول:

int main()

بدل التي كانت
فلم اتيني اي خطا لكن لا يرسم لي هل من الممكن ان اعدادات الرسم هي السبب

محترف مشرف عبد اللطيف حاجي علي مشاركة 19

أما في 08 أيار 2009 11:06 ص، فقد تنهد maya بارتياح وهو يرد:

فلم اتيني اي خطا لكن لا يرسم لي هل من الممكن ان اعدادات الرسم هي السبب

لست متأكداً وللأسف ليس لدي ما أستطيع التجريب عليه. هلا جربت الحل الثاني أو الثالث من الحلول التي اقترحتها؟ أو هلا جربت تحميل ملف المشروع الذي وضعته في مشاركتي (انتبه أني قمت بتعديله).

عبد اللطيف حاجي علي
مبرمج
In|Framez

مبتدئ  maya مشاركة 20

لقد اعدت تحميل المرفق الذي وضعته لكن نفس المشكلة تبقى النافذة سوداء سارى ما يمكنني فعله
رغم انني لست متاكدة انني ساجد الخطا فبما انني مبتداة فلا اعرف كيف اغير في onsize