تحذير عند النوع بين المؤشر والمؤشر إلى الوظيفة

StackOverflow https://stackoverflow.com/questions/1556651

  •  21-09-2019
  •  | 
  •  

سؤال

أقوم بنقل بعض التعليمات البرمجية C إلى بيئة رقاقة Ti DSP. أنا أتصارع مع برنامج التحويل البرمجي C.

لدي بنية بيانات تتضمن مؤشرًا إلى وظيفة. لدي وظيفة تهيئة بنية البيانات. شيء من هذا القبيل:

typedef void (*PFN_FOO)(int x, int y);

struct my_struct
{
    PFN_FOO pfn;
};

init_struct(struct my_struct *p, void *pfn)
{
    p->pfn = (PFN_FOO)pfn;
}

ضمن Visual Studio و GCC هذا النوع من التعليمات البرمجية دون شكوى. في الواقع ، لأن pfn الحجة نوع void * لا أحتاج حقًا حتى لوضع ممثلين هناك ؛ سوف يلقي ضمنيا دون شكوى.

في Code Composer Studio لبطاطا Ti DSP ، أحصل على "تحذير: تحويل نوع غير صالح"

تتمثل سياستي في جعل رمزتي تجمع دون تحذيرات ، لذلك أريد إصلاح هذا. لقد جربت كل أنواع الصب. اكتشفت أن المترجم سعيدًا تمامًا إذا ألقيت void * مؤشر ل int أولا ، ثم يلقيها على النوع الصحيح. EW ، يوك!

كيف يمكنني القيام بهذا المدلى بها دون أن يشكو المترجم؟ هل يجب أن ألقي حقًا int لإغلاق المترجم؟

ملاحظة: أنا على وجه التحديد ليس تبحث عن حل لتأثير "التغيير init_struct() لقبول أ PFN_FOO بدل من void *"هذا من شأنه أن ينجح في مقتطف الرمز المبسط هذا ، لكنه لن يعمل مع الكود الفعلي ، الذي يبني قائمة بالأشياء غير المتجانسة.

هل كانت مفيدة؟

المحلول

لا يدعم المعيار C على وجه التحديد التحويلات بين المؤشرات إلى كائنات البيانات والمؤشرات إلى الوظائف. تدعم GCC و Visual Studio هذا كامتداد.

إذا كنت ترغب في جعل وظيفتك القياسية (ولكن لا تزال تستخدم void * المعلمة) ، يمكنك تمرير مؤشر إلى مؤشر الوظيفة بدلاً من ذلك. هذا يعمل لأن مؤشرات الوظائف نفسها هي كائنات عادية ، لذلك يمكن تحويل مؤشر إلى مؤشر الوظيفة من وإلى void * بخير:

init_struct(struct my_struct *p, void *pfn)
{
    PFN_FOO *foo = pfn;
    p->pfn = *foo;
}

يجب على المتصل إنشاء مؤقت PFN_FOO اعتراض لتمرير مؤشر عندما يقوم بالمكالمة:

PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);

نصائح أخرى

ألا يجب أن تكتب؟

typedef void (*PFN_FOO)(int x, int y);

انظر الى هذا الدورة التعليمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top