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

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

سأحاول في هذا الموضوع إضافة أسئلة محيرة عن البرمجة (بلغة C++ في الغالب). هذه مواقف وقعت فيها غالباً أو قرأت عنها أحياناً.
سأقوم بوضع سؤال جديد أسبوعياً على الأقل. أرجو أن نستفيد منها جميعاً. كما أشجع أن يضع بقية الأعضاء أسئلة بالإضافة للأجوبة.

حسناً دون أي تأخير سأضع أول سؤال. هذه المشكلة وقعت فيها اليوم بالذات، هذا السؤال بسيط الحل نسبياً وما جعلني أقع فيه هو كثرة استخدامي للغات .NET مثل C#

class Test
{
public:
	Test() : Value(0) { }
	Test(int v) : Value(v) { }
	int Value;
};

int main()
{
	Test myTest(5);
	Test myDefaultTest();

	myDefaultTest.Value = myTest.Value;
}

لماذا يعطي هذا البرنامج خطأ الـ syntax التالي عند السطر الأخير عند ترجمته باستخدام مترجم Microsoft (المترجمات الأخرى ستعطي أخطاء مشابهة)

error C2228: left of '.Value' must have class/struct/union

بانتظار إجاباتكم

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

محترف  انس مشاركة 2

السلام عليكم

الخطأ موجود في السطر



Test myDefaultTest();

فهدا عبارة عن تعريف دالة  من النوع Test

the default constructor (constructeur par defaut ) a   لا يحمل قوسين عند تعريف الكائن .

Test myTest ; //  تلقائيا  constructor  يتم ستدعاء 


Test myTest2(5) ; // appelle du constructeur surcharger
                 // Test(int v) : Value(v) { }


بهدا التعديل لا يوجد خطا عند الترجمة .... لدا اظتن ان الفكرة صحيحة 

شكرا على المبادرة نتمنى ان نلرى المزيد منها


سلام

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

في 19 شباط 2009 07:55 م، غمغم tombston باستغراب قائلاً:

السلام عليكم

الخطأ موجود في السطر

Test myDefaultTest();

نعم بالفعل هذا هو الجواب الصحيح. ولم يأخذ هذا وقتاً كثيراً. يبدو أن مريدي هذه الشبكة هم محترفون أكثر مما يدعون ☺
هذا السطر يقوم في الحقيقة بتعريف إجراء اسمه myDefaultTest لا يستقبل أية parameters و يرجع قيمة من نوع Test

وقعت في هذا الخطأ بسبب استخدامي المكثف في الآونة الأخيرة للغة C# حيث يجب أن تكتب القوسين دوماً حتى ولو لم يكن الـ constructor بستقبل أية parameters
فقط أحب أن أقول هنا أن وضع القوسين لنداء الـ  Default Constructor خطأ في هذه الحالة فقط هناك حالات أخرى يمكنك وضعهما أو اسقاطهما وأخرى يحب وضعهما ولا يصح بدونهما.
void Foo(const Test& t);

Test *p = new Test();      // هذا السطر صحيح هنا
Test *p = new Test;        // وهذا صحيح أيضاً

Foo(Test());               // القوسان ضروريان هنا

في الغالب سأضع قريباً سؤالاً عن الأنواع المختلفة للتعريفات والـ initializations لشرح هذه النقط وغيرها.😒
على فكرة: Visual Studio 2008 بعطي تحذيراً عند الوفوع في الخطأ المذكور ☺

حسناً هذه نقطة لـ tombston 😄

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

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

حسناً مع سؤال آخر (بسيط أيضاً) هذه المرة بلغة C#. الـ code التالي:
class Item
{
    const int MaxElements = 100;
    int[] InternalArray = new int[MaxElements];
    int this[int index]
    {
        get { return InternalArray[index]; }
        set { InternalArray[index] = value; }
    }
}

يعطي هذا الخطأ عند ترجمته:
error CS0542: 'Item': member names cannot be the same as their enclosing type

هل يمكتك معرفة السبب؟ هل أضطررت لترجمة الـ code لتكتشفه؟ ☺

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

محترف  انس مشاركة 5

سلام



void Foo(const Test& t);

Test *p = new Test();      // هذا السطر صحيح هنا
Test *p = new Test;        // وهذا صحيح أيضاً

Foo(Test());               // القوسان ضروريان هنا

 يمكن ايضا كتابة السطر الاخير دون اقواس على ما اعتقد

Foo(p);               


اما بالنسبة للسؤال الجديد ... لا اعرف الكثير عن الس شارب فانا اسعى لتعلمه لانه حسب راي لغة المستقبل ☺ .

رغم >لك ساحاول الاجابة .

الخطأ حسب راي موجود هنا



 int this[int index]

اظن ان
  this


من الكلمات المحجوزة للسي شارب و هو مؤشر الكائن الحالي


شكرا على الاسئلة

سلام

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

ما شاء الله على هذه السرعة.

في 20 شباط 2009 05:22 م، قال محمد انس بهدوء وتؤدة:

 يمكن ايضا كتابة السطر الاخير دون اقواس على ما اعتقد
Foo(p);               
كلامك صحيح أخي محمد. إلا أن ما عنيته هو أنك لا تستطيع تعريف نسخة من Test (باستخدام الـ default constructor) وتمريرها للإحراء Foo في نفس التعليمة دون وضع الأقواس، بعكس تعريف نسخة من Test وحدها ☺ . أي أنك لا تستطيع أن تكتب شيئاً كهذا:
Foo(Test);



في 20 شباط 2009 05:22 م، عقد محمد انس حاجبيه بتفكير وقال:

اظن ان
  this
من الكلمات المحجوزة للسي شارب و هو مؤشر الكائن الحالي
نعم. كلمة this هي من الكلمات المحجوزة وهي كما تفضلت reference للكائن الحالي ☺ . إلا هذا الـ syntax صحيح تماماً في لغة C# و يستخدم لتعريف indexer للـ class المدعو Item. أي أنه بإمكانك باستخدام هذه الطريقة كتابة شيء كهذا:
Item myItem = new Item();
myItem[5] = 100;
int i = myItem[10];

بفرض أنك تخلصت من الخطأ المذكور. ملاحظات ممتازة أخي محمد 😄 ، لكن الخطأ له سبب آخر، هل تستطيع إيجاده؟ 😒

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

محترف  انس مشاركة 7

سلام


كما دكرت سابقا لا عرف الكثير عن السي شارب و لكن ساحاول .... و اعدروني ان تفوهت بحماقة


حسنا لقد قمت بترجمة الكود في مترجم السي بلس بلس .... فقام هذا الاخير بشتمي بعدة شتائم ☺

مقارنتا مع السي بلس بلس  لا يمكننا  اعطاء قيم للمتغيرات في كلاس ما .... بل نستخدم  constructor   لهذا الغرض

اتمنى ان لا اكون قد تفوهت بحماقة تجعل احدكم يشتمني كما فعل المترجم ☺


سلام

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

وفي 20 شباط 2009 06:24 م، قال انس متحمساً:

حسنا لقد قمت بترجمة الكود في مترجم السي بلس بلس .... فقام هذا الاخير بشتمي بعدة شتائم ☺

مقارنتا مع السي بلس بلس  لا يمكننا  اعطاء قيم للمتغيرات في كلاس ما .... بل نستخدم  constructor   لهذا الغرض
نعم بالفعل. لذلك يفضل الكثيرون لغة C# ☺ . حيث أنها تقدم الكثير من التسهيلات كهذه مثلاً. على فكرة لترجمة code مكتوب بلغة C# فإنه يجب استخدام مترجم يدعم لغة C#. هذا ما لا يفعله مترجم Microsoft المدعو cl.exe والذي يستخدمه Visual Studio افتراضياً لترجمة مشاريع C و C++ 😒 .
لذلك فإنه من طهور أخطاء كثيرة أمر متوقع. جرب استخدام مترجم C# ☺


وفي 20 شباط 2009 06:24 م، ظهر شبح ابتسامة على وجه انس وهو يقول:

اتمنى ان لا اكون قد تفوهت بحماقة تجعل احدكم يشتمني كما فعل المترجم
أبداً أخي محمد (يبدو أن اسمك أصبح أنس الآن 😄 ) جميعنا هنا لنتعلم. أحياناً نصيب وغالباً ما نخطئ. لكن هذا كله هو جزء مهم من عملية التعليم الذي نصيبو إليه ☺

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

محترف  انس مشاركة 9

السلام عليكم

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



وفي 20 فبراير 2009 06:46 م، ظهر شبح ابتسامة على وجه عبد اللطيف حاجي علي وهو يقول:

نعم بالفعل. لذلك يفضل الكثيرون لغة C#

انا احببت هذه اللغة لانها بسيطة  و تدعمها شركة مايكروسوفت .... كما انها تسمح بتطوير الالعاب على الاكس بوكس الجديد
ضف الى دلك انني سمعت عن مزاياها الكثيرة و قربها للغة جافا من الحيث  SNYNTAX

و لكن لا املك مصادر كثيرة لتعلمها ... فاما ان اجد مصادر معقدة جدا او بسيطة جدا ☺ .
و لكن الوم او غدا ساتعلمها بادن الله .



أما في 20 فبراير 2009 06:46 م، فقد تنهد عبد اللطيف حاجي علي بارتياح وهو يرد:

أبداً أخي محمد (يبدو أن اسمك أصبح أنس الآن )
غرت اسمي ثلاث مرات اليوم ☺ ... فلا يليق ان استخدم اسم اجنبي في منتدى عربي .
اسمي الكامل هو  مصطفاوي محمد انس ... الجمع يناديني انس ... لهدا غيرت الاسم من محمد انس الى انس 😄 .



في 20 فبراير 2009 06:46 م، غمغم عبد اللطيف حاجي علي باستغراب قائلاً:

أحياناً نصيب وغالباً ما نخطئ. لكن هذا كله هو جزء مهم من عملية التعليم الذي نصيبو إليه

كلما اخطئتا  نسعى لنصحح الخطئ و لكن ادا اصبنا فقليل منا من يريد تطوير اصابته  ☺ ☺


بصراحة تهة مع هدا الكود

    int this[int index]
    {
        get { return InternalArray[index]; }
        set { InternalArray[index] = value; }
    }

ساحاول ان اقدم ما فهمته من الكود .



 const int MaxElements = 100;
انشاء متغير بقيمة ثابة .



  int[] InternalArray = new int[MaxElements];
انشاء جدول بنفس حجم المتغير دو القيمة الثابتة اي 100 خانة من نوع INT


int this[int index]

مؤشر الكائنات الموجودة في المصفوفة .



get { return InternalArray[index]; }
        set { InternalArray[index] = value; }
كل من الكائنات المشار لها ب THIS  لديها الدالتين GET .. SET ...




هناك امر غريب لمادا المؤر this  لديه نوع int
الا يعمل بنفس مبدئ السي بلس بلس ؟

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

عزيزي أنس. أعتقد أنه من الحكمة اعتبار لغة C# لغة منفصلة تماماً عن لغة C++ وإن كان كثير من الـ syntax مأخوذاً من الأخيرة وتعلمها على هذا الأساس ☺ .
على كلٍ هذا رابط مبدئياً للتعلم عن الـ Indexers:
http://msdn.microsoft.com/en-us/library/aa288465(VS.71).aspx
وإن كنت أنصحك بتعلم مبادئ C# الأخرى أولاً 😄 .

إن كان لديك أي سؤال آخر عن هذا الموضوع فأتمنى أن تضعه على الشبكة لكن ضعه في موضوع منفصل ولنبق هذا الموضوع مخصصاً للأسئلة المحيرة وذلك حفاظاً على ترتيب المواضيع في الشبكة ☺ .

إذاً عودة للموضوع. هل يملك أحد إجابة على هذا السؤال؟ 😒

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