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

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

عندما أترجم هذا الكود في gcc-4.3 فإنني أحصل على خطأ. الكود:

struct QTREENODE
{
	QTREENODE();
	~QTREENODE();

	// Access children by name or by index
	union
	{
		QTREENODE* children[4];
		struct CHILDREN
		{
			QTREENODE* top_left;
			QTREENODE* top_right;
			QTREENODE* bottom_left;
			QTREENODE* bottom_right;
		} named;
	};

	// Calculates the center vertex of this quad tree cell
	VERTEX center(void) const { return VERTEX((min.x+max.x)*0.5f,(min.y+max.y)*0.5f); }

	VERTEX min,max; // Geometric extents
	bool occupied; // Raised if this cell is occupied (completely or partially) by an obstacle
	std::vector<qtreenode*> neighbours; // Adjacency information

	// Path finding info
	QTREENODE* path_previous_node;
	real total_g;
	real local_h;
};

الخطأ:

In file included from /home/.../mp/main.cpp:20,
                 from /home/.../fasr.cc:10:
/.../mp/space_partitioning.h:33: error:
‘struct QTREENODE::::CHILDREN’ invalid;
   an anonymous union can only have non-static data members
حسب معلوماتي، فإن الاتحادات الغير مسماة مدعومة ضمن مواصفات اللغة. رسالة الخطأ تقول أنني أضع متغيرات ثابتة ضمن التعريف، وهذا غير صحيح. هل واجه أحد هذا الخطأ من قبل؟ هل يوجد طريقة لتخطيه دون إعطاء الاتحاد اسماً؟

من الجدير بالذكر أن هذا الكود يترجم بشكل ناجح في مترجم مايكروسوفت.

هل من مساعدة؟

شكراً

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

مفصول عمر سمير  مشاركة 2

أخي وسام  مرحبا

البرنامج المترجم يجب تحديثه ليتعدى الخطأ  لأنه توجد مشكلة  في المترجم  gcc4.3

وهذا Patch  سوف يحل  مشكلتك بأذن الله تعاى 

انقر على هذا الموقع  
Add gcc 4.3.2 patch support

http://www.sfr-fresh.com/windows/misc/root_v5.22.00.win32gcc.tar.gz

يجب تحديثه اولاً

OSF متخصص محترف

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

لا أدري إن كان هذا الكود مطابقاً لمواصفات اللغة أم لا (ليس لدي نسخة من المواصفات حالياً 😳 )
كما لا أستطيع أن أجزم إن كان ما سأقوله صحيحاً في gcc (ليس لدي نسخة من gcc حالياً 😳 😳 )

على كل حال فإني أرى الرسالة منطقية جداً. إذ أنك بالفعل تعرف النوع CHILDREN داخل الـ union وهو ما أزعج على ما يبدو المترجم. لذلك فإني أقترح أن تحاول ما يلي:
1. أن تحمل آخر نسخة من gcc وهي 4.3.3 وتتأكد إن كانت هذه المشكلة (إن كانت مشكلة أصلاً) قد حلت فيه
2. أن تعرف الـ structure على أنه غير مسمى أي أن تسقط "كلمة" CHILDREN من أصلها
3. أن تعرف الـ structure على أنه نوع باستخدام الكلمة typedef ثم تعرف متغيراً من هذا النوع
4. أن تنقل تعريف CHILDREN خارج الـ union من أصله وتعرف متغيراً من نوعه داخله
5. إذا فشل كل ما سبق فيمكنك تطبيق الـ patch الذي اقترحه عمر

أتمنى أن يساعدك هذا

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

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

شكراً لكم. المشكلة ليست في المترجم نفسه، فالتحديث لم يحل الخطأ.
 


في 14 مارس 2009 04:40 ص، عقد عبد اللطيف حاجي علي حاجبيه بتفكير وقال:

حاول ما يلي:
1. أن تحمل آخر نسخة من gcc وهي 4.3.3 وتتأكد إن كانت هذه المشكلة (إن كانت مشكلة أصلاً) قد حلت فيه
2. أن تعرف الـ structure على أنه غير مسمى أي أن تسقط "كلمة" CHILDREN من أصلها
3. أن تعرف الـ structure على أنه نوع باستخدام الكلمة typedef ثم تعرف متغيراً من هذا النوع
4. أن تنقل تعريف CHILDREN خارج الـ union من أصله وتعرف متغيراً من نوعه داخله
5. إذا فشل كل ما سبق فيمكنك تطبيق الـ patch الذي اقترحه عمر

لقد جربت الاقتراحين 2 و 4، وكلاهما حل الخطأ، وكلاهما يعمل على المترجمين الاثنين (مايكروسوفت و GCC). ☺  
 
تحياتي

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