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

مبتدئ  Kinan مشاركة 1

السلام عليكم...
أنا مبتدئ بتعلم DirectX مع الـ c++ وأقوم بقراءة أحد الكتب عن هذا الموضوع... وعندما قمت ببناء المثال الخاص بدرس بناء تضاريس عن طريق ملف raw... ظهرت في البداية أخطاء بسبب إسناد متحولات int إلى float فقمت بعمل قلب للأنواع واختفت المشكلة ومع ذلك لم يعمل التطبيق مع أنّ المترجم ( Visual c++2008) قام ببناء المثال دون أية أخطاء أو تحذيرات...
 
وعندما قمت بعمل Debug ظهرت الرسالة التالية:


Unhandled exception at 0xe5e8e8db in Terrain-chapter 13.exe: 0xC0000005:
 Access violation reading location 0xe5e8e8db.

أرجو المساعدة في اكتشاف الخطأ...ملفات المثال في الملف Terrain.rar...مع صورة الإكساء في الملف Pictures.rar وملف raw... وإذا لم يستطع أحد مساعدتي فأرجو على الأقل أن ترشدوني إلى الطريقة الصحيحة في بناء أمثلة تضاريس...وشكراً جزيلاً...😄

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

السلام عليكم،
 
ملفات الكود ناقصة (Camera.h وربما غيره). أرجو طرح الكود الكامل، وحبذا لو تطرح الكود الأصلي من المثال قبل تعديلاتك، كي نتفادى أية أخطاء مصطنعة.

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

مبتدئ  Kinan مشاركة 3

آه...عفواً أستاذ وسام...
هذه هي ملفات المثال الأصلية...مع العلم أنه في المثال الأصلي يوجد ملفات اسمها dxutil وكان المترجم يظهر لي أخطاء فيها لذلك ابتعدت عن استخدامها...ستجدها في المرفقات...من هذه الأخطاء:

'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, 
use _CRT_SECURE_NO_WARNINGS



والتي لم أفهم منها شيئاً...😳

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

جربت المثال ولم تظهر لي أية أخطاء أثناء بنائه، وها هي النتيجة:




 


في 12/رمضان/1431 09:48 ص، قال keen28 بهدوء وتؤدة:

من هذه الأخطاء:

'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, 
use _CRT_SECURE_NO_WARNINGS

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

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

مبتدئ  Kinan مشاركة 5

في البداية شكراً لمتابعتك للموضوع أستاذ وسام...😄
أنا لدي Visual studio 2008 وقد قمت ببناء جميع أمثلة الكتاب من قبل وعملت كلها بصورة صحيحة...
أما الطريقة التي أبني بها المشروع...من القائمة أضغط على new-> project......وبعد ذلك General ...ثم empty project...وأقوم بإضافة ملفات الـ header والـ source وأضيف من الـ linker ثلاث مكتبات مذكورة في الكتاب أنه يجب إضافتها وهي :d3d9.lib و d3dx9.lib و winmm.lib
وبعد ذلك أعمل Build للمشروع ويظهر ملف الـ SLN....
عفواً على الإطالة........................
ولكن هناك نقطة أنه في هذا المشروع وفي الملف terrain.cpp  يوجد هذا السطر :


inFile.read(
   (char*)&in[0], // buffer
   in.size());
 
وبالتحديد كتابة [0] بعد in الذي هو vector  يعني الوصول إلى العنصر الأول منه والذي لم يوجد بعد...وبسبب هذا كانت تظهر لي رسالة خطأ عند فتح الملف التنفيذي للتطبيق...مكتوب فيها : Debug Assertion failed...و vector subscript out of range....وعندما قمت بمسح [0] اختفت الرسالة ولكن بقي التطبيق لا يعمل حيث تظهر رسالة : terrain.exe has stopped working
شكراً...

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

حسناً، خطوات البناء سليمة.
 

وفي 12/رمضان/1431 12:24 م، قال keen28 متحمساً:

ولكن هناك نقطة أنه في هذا المشروع وفي الملف terrain.cpp  يوجد هذا السطر :


inFile.read(
   (char*)&in[0], // buffer
   in.size());
 
وبالتحديد كتابة [0] بعد in الذي هو vector  يعني الوصول إلى العنصر الأول منه والذي لم يوجد بعد...وبسبب هذا كانت تظهر لي رسالة خطأ عند فتح الملف التنفيذي للتطبيق...مكتوب فيها : Debug Assertion failed...و vector subscript out of range....

في الكود الأصلي مستحيل حدوث هذا الخطأ. لا بد وأن تعديلاً قد طرأ على الكود وتسبب بالخطأ الذي تراه. فصفيفة in يتم تحجيمها لتتسع لعدد النقاط _numVertices، وهو عدد ثابت لو تتبعت طريقة حساب قيمته. 



وفي 12/رمضان/1431 12:24 م، ظهر شبح ابتسامة على وجه keen28 وهو يقول:

قمت بمسح [0] اختفت الرسالة ولكن بقي التطبيق لا يعمل حيث تظهر رسالة : terrain.exe has stopped working

هذا طبيعي. فما قمت به يتسبب بالكتابة فوق بنية vector الأصلية، بدلاً من الكتابة على عناصره. وهذا يعني تخريب الذاكرة. ☺

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

مبتدئ  Kinan مشاركة 7

آه...ما الذي يحدث...والله لم أقم بتعديل أي شيء على الملف...حتى أنني قمت باستخدامه من الـ cd المرفق لكي لا يتغير...ولكن من دون فائدة...🙁
على كل حال سأبقى أحاول وأغير حتى يعمل بإذن الله...وشكراً أستاذ وسام على مساعدتك...والمهم أنني تأكدت منك أن الكود لا يحوي أي خطأ...وأشكر لك وقوفك معي منذ اليوم الأول لتسجيلي في الموقع...😄

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

لا بأس عليك، للأسف أنا أستخدم الإصدار 2010 من فيجوال ستوديو هنا، ولولا ذلك لكنتُ قد أرسلتُ لك المشروع كاملاً لتتحقق من بنائه.
 
في هذا الصدد، أنصح وبشدة استخدام أساليب تتبع الأخطاء المذكورة في المقالات العلمية في هذه الشبكة. المقالات التالية تمسّ مباشرة ما تواجهه من مشاكل:
 
* تحويل أنواع المتغيرات في ++C، سلاح ذو حدين:
http://www.agdn-online.com/papers/typecasting.htm
 
* تقصي وكشف الأخطاء في Visual Studio (ج1):
http://www.agdn-online.com/papers/debug1.htm
 
* تقصي وكشف الأخطاء في Visual Studio (ج2):
http://www.agdn-online.com/papers/debug2.htm
 
أرجو لك التوفيق.

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

مبتدئ  Kinan مشاركة 9

السلام عليكم أستاذ وسام...
قمت بتحميل visual studio 2010 ولم يعمل عليه المثال...........😭
وبعد أن قمت بعمل Debug للمشروع في ضوء مقالاتك...صدر لي الخطأ التالي:



Microsoft Visual Studio C Runtime Library has detected a fatal error in Terrain.exe.
وفي نافذة call stack تظهر الجملة التالية:



> msvcr100d.dll!_crt_debugger_hook(int _Reserved)  Line 62 C
وهو خطأ من المكتبة dbghook.c والتي لم أسمع عنها من قبل...😖
أعلم أن الخطأ ليس في الكود...ربما خطأ في النظام نتيجة نقص ملفات أو ما شابه...لا أدري...حاولت البحث في المواقع عن مثل هذا الخطأ كثيراً...ولكن من دون فائدة...بعضهم يقول خطأ في مكتبة msvcr100.dll وأنه يجب تحميل visual c++ 2010 redistributable.....وقمت بذلك من دون فائدة أيضاً...
وبعض المواقع تحمل الأخطاء المشابهة على أنه خطأ في الكود...ولكن وبما أنني أعلم أن الخطأ ليس في الكود...فمن يدري...ربما اكتشفت أنا خطأ في مكتبات لغة C...😒 😄
في النهاية...أعتقد أن المشكلة عندي هي في استخدام vector في مشروعاتي...ليس الخطأ في طريقة الاستخدام...ولكن هناك مشكلة ما في نظامي تجعل هذا الخطأ يظهر عند استخدام vector....
وشكراً على مقالاتك...عنجد كتير مفيدة...

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

وفي 15/رمضان/1431 10:19 ص، أعرب keen28 عن رأيه بالموقف كالآتي:

أعتقد أن المشكلة عندي هي في استخدام vector في مشروعاتي...ليس الخطأ في طريقة الاستخدام...ولكن هناك مشكلة ما في نظامي تجعل هذا الخطأ يظهر عند استخدام vector....

غريييب. على كل حال كل الأخطاء غريبة.. 😄    هل تستطيع إرسال مشروع الـ VS2010 لأحاول به أنا أيضاً؟

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