سؤال

ومن فضلك قل لي ما سوف الدعوة إلى إعطاء عودة وظيفة وكيف؟ رمز:

typedef struct {
    int size;
    ptrdiff_t index;
    void (*inlet) ();
    int argsize;
    ptrdiff_t argindex;
} CilkProcInfo;


/*
 * Returns a pointer to the slow version for a procedure
 * whose signature is p.
 */

/* the function definition is - */
static void (*get_proc_slow(CilkProcInfo *p)) () {
     return p[0].inlet;
}

/*The function gets called as -*/
   (get_proc_slow(f->sig)) (ws, f);
/*where f->sig is a pointer to CilkProcInfo struct*/
هل كانت مفيدة؟

المحلول

في هيكل CilkProcInfo الخاص بك، inlet هو مؤشر دالة التي تأخذ <م> عدد غير محدد من الحجج ولا ترجع قيمة، مثل void foo();.

في خط

(get_proc_slow(f->sig)) (ws, f);

وإرجاع الاستدعاء get_proc_slow(f->sig) هذا المؤشر وظيفة، لذلك ما يعادل

(f->sig[0].inlet) (ws, f);

وإذا كان الأمر كذلك نقاط f->sig[0].inlet الخاص بك إلى foo() وظيفة، وهو ما يعادل الدعوة

foo (ws, f);

وأود أن أعترف بأن بناء الجملة static void (*get_proc_slow(CilkProcInfo *p)) () {... هو غير مألوف بعض الشيء بالنسبة لي.

نصائح أخرى

وget_proc_slow () إرجاع مؤشر دالة من نوع الفراغ (*) () الذي يدعو رمز ذلك الحين. وذلك عند القيام به:

(get_proc_slow(f->sig)) (ws, f);

وانها نفس الأساس كما يفعل:

void (*fptr)() = get_proc_slow(f->sig);
fptr(ws, f);

ويبدو انها وظيفة يقوم بإرجاع مؤشر دالة الذي هو void التي لا يوجد لديه المعلمات (void(*)()) والتي تقبل مؤشر إلى CilkProcInfo struct كمعلمة قيمة الإرجاع. لست متأكدا لماذا كنت بحاجة إلى بناء p[0].inlet بالرغم من ذلك. قد لا مجرد إعادته كما p->inlet؟

وأوه نعم، وget_proc_slow هو اسم الدالة التي بإرجاع قال وظيفة المؤشر.

static void (*get_proc_slow(CilkProcInfo *p)) () {
     return p[0].inlet;
}

والقراءة من اسم من، مع الحرص مع القواعد النحوية: get_proc_slow هي وظيفة (مع الربط الداخلي) التي تأخذ مؤشر إلى البنية CilkProcInfo وإرجاع مؤشر إلى وظيفة اتخاذ الحجج غير محددة والعودة لا قيمة (void) .

(get_proc_slow(f->sig)) (ws, f);

وهذا البيان يدعو get_proc_slow مع المعلمة المناسبة (f->sig هو مؤشر إلى CilkProcInfo) ثم يستخدم قيمة الإرجاع (مؤشر إلى وظيفة) لاستدعاء هذه الوظيفة مع ws وf كوسائط.

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