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

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

اكتشفت مؤخراً موضوع الـ pointer to function.. أو مؤشر إلى تابع...
التقنية مذهلة. واستطعت باستخدامها أن أبني مثل برنامج soft-wiring للدارات الإلكترونية...
لكني لا أستطيع أن أحصل على عنوان تابع ضمن class... ما هي الصيغة الازمة لذلك؟

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

التعليق على مشاركة سعيد بسيوني في Aug 13, 2005 11:5 :

> اكتشفت مؤخراً موضوع الـ pointer to function.. أو مؤشر
> إلى تابع...
> التقنية مذهلة. واستطعت باستخدامها أن أبني
> مثل برنامج soft-wiring للدارات الإلكترونية...
> لكني
> لا أستطيع أن أحصل على عنوان تابع ضمن class... ما هي
> الصيغة الازمة لذلك؟

إذا كنت تعني الحصول على مؤشر لإجراء من class (و ليس من class instance) مثل ClassA::Func() فهذا مبدئياً غير ممكن... ببساطة لأن المؤشر لن يملك ما يؤشر له ،تذكر أن الـ class لم يحجز بعد في الذاكرة, وبالتالي فإن أي معلومات يحاول الإجراء الوصول إليها من الـ class لن تكون valid...
والحل؟!!! ببساطة ضع static قبل تعريف الاجراء، بهذه الـ keyword أنت تخبر المترجم بأن هذا الاجراء لن يحاول الوصول إلى معلومات من الـ class نفسه, و بالتالي فلن يكون لهذا الاجراء علاقة بالـ class سوى علاقة الانتماء، وسيكون سعيداً بإعطائك مؤشراً له...

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

خبير  سعيد بسيوني مشاركة 3

ولكنني أريد شيئاً كهزا:
CMyClass obj;

FUNCTYPE *pFunc = &obj.SomeFunction;
pFunc();


ومن هناك يمكن نداء التابع تماماً وكأنه تم نداء obj.SomeFunction

هل هذا ممكن؟ أم أن هناك قيود أخرى؟

مبتدئ  وليد طه مشاركة 4

الفكرة جميلة والله...

ممكن تشرحلنا أكثر عن موضوع برنامج الدارات واعتماده على ال pointer to function؟

وليد طه

خبير  سعيد بسيوني مشاركة 5

الفكرة تقوم على إعطاء كل عنصر إلكتروني في الدارة التابع الذي يقوم بعمل حسابات خاصة على الإشارة...
تتألف الدارة من سلسلة من العناصر المرتبطة مع بعضها البعض.
أنا أقوم بالتعبير عن هزا التكوين باستخدام بنية معلومات شجرية (إذ يمكن التفرع بالدارة)، وللحصول على النتيجة، أقوم بتتبع الشجرة من أصلها إلى نهايتها عن طريق نداء مؤشر التابع لكل عنصر وهكزا...

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

كما قال عبد اللطيف، لا يمكنك أخذ عنوان إجراء من class مالم يكن الإجراء static...
ما الفكرة؟ الفكرة أن الإجراءات الخاصة بالـ class دائماً تستقبل قيمة (this) في البارامتر الأول (المبرمج لا يرى ذلك)... القيمة ذاتها تؤخذ من عنوان الـ instance التي تم نداء الإجراء منها...
في حالة المؤشر إلى الإجراء، لا يدري المترجم على أية instance تريد نداء الإجراء، وهكذا لا يمكنه توليد قيمة this... وهذه هي الحالة مع الإجراءات الـ static ضمن الـ class... إنها لا تستقبل this ولا يمكنك استعماله ضمنها...

للتسلية، أنظر إلى هذا الـ code:
class CSomeClass
{
public:
   void AccessMe(void);

protected:
   int m_iValue;
};

void CSomeClass::AccessMe(void)
{
   if (this == 0)
      return;
   printf("%d",m_iValue);
}


void main(void)
{
    CSomeClass *pClass = 0;
    pClass->AccessMe();
}


في الأحوال العادية، هذا الـ code سيتسبب بـ crash بسبب محاولتنا للتعامل مع مؤشر يؤشر إلى NULL، لكن السطر الأول من الإجراء AccessMe يقوم بالكشف عن قيمة this إن كانت NULL، وفي تلك الحالة يخرج من الإجراء بدون أن يقوم بقراءة قيمة المتغير m_iValue مما سيتسبب بالـ crash...

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

خبير  أحمد عبد الغني مشاركة 7

يا راجل!

هذه أمور داخلية جداً في مترجم الـ ++C...
كيف عرفتها؟!

جربت الكود وهو بالفعل يعمل كما قلت!

__
هناك 10 أنواع من البشر.. من يعرف نظام العد الثنائي، ومن لا يعرفه!

اللهم انصر أهلنا في فلسطين وآجرنا أن نكون عوناً لهم

خبير  Mohammad Khashashneh مشاركة 8

التعليق على مشاركة أحمد عبد الغني في Aug 21, 2005 16:1 :

> يا راجل!
>
> هذه أمور داخلية جداً في مترجم الـ ++C...
> كيف
> عرفتها؟!
>
> جربت الكود وهو بالفعل يعمل كما قلت!
>
> __
> هناك
> 10 أنواع من البشر.. من يعرف نظام العد الثنائي، ومن
> لا يعرفه!


With Experience. Sooner or later you will run into similar bugs while development and you will discover these hidden tiny issues. Anyway thanks Wisam for the Explanation.

Mohammad Khashashneh

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع

خبير  سعيد بسيوني مشاركة 9

لكن هزه أمور غير موثقة بشكل رسمي... يعني هزا التصرف هل هو معتمد من قبل كل مترجمات الـ ++C ولا لأ؟ أنا لم أجد شرح لهزا التصرف في المراجع...

خبير  Mohammad Khashashneh مشاركة 10

I experienced something similar with VC++ 6. But I`m not sure if it is a normal behavier with all compilers

Mohammad Khashashneh

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع