سؤال

وكيف يمكنني إنشاء مجموعة من عشرة مؤشرات الدالة؟ ما قلته هو للحلقة، وأريد أن أضع مؤشر دالة إلى وظيفة مختلفة في كل التكرار. لذلك:

//pseudocode
for i (0..10)
    function = array_of_functions[i];
//...
هل كانت مفيدة؟

المحلول

// Define alias for function pointer type for convenience
typedef void (*action)(int);

// Example function
void print(int) { ... }

action fs[10] = { print, ... };
for (int i = 0; i < 10; ++i)
{
    action f = fs[i];

    // Call it somehow
    f(i * i);
}

نصائح أخرى

وهذا الرمز:

return_t (*array_of_functions[10])(arg1_t, arg2_t);

ويعلن "array_of_functions" باعتباره مجموعة من 10 عنصرا من مؤشرات الدالة حيث، أشار إلى كل وظيفة يأخذ حجتين من نوع arg1_t وarg2_t والعوائد نوع return_t. استبدال أنواع وضبط عدد من الحجج حسب الاقتضاء.

وأي وقت لديك للتعامل مع تركيب مؤشر الدالة قبيحة فمن الأفضل لاستخدام الرموز المميزة ل typedef.

#include <iostream>

void a(int i)
{
    std::cout<<"a: "<<i<<std::endl;
}

void b(int i)
{
    std::cout<<"b: "<<i<<std::endl;
}

typedef void (*fn)(int);

int main(int argc, char**argv)
{

    fn foo[2];


    foo[0] = a;
    foo[1] = b;


    for(size_t i = 0; i < sizeof(foo) / sizeof(foo[0]); ++i)
    {
        foo[i](i);
    }

    return 0;
}

وأبسط طريقة للقيام بذلك هي لإنشاء الرموز المميزة ل typedef عن وظيفة الخاص بك، ومن ثم يعلن صفيف مع هذا النوع. لإنشاء الرموز المميزة ل typedef عن وظيفة: typedef returntype (*typedefname)(argtype1,argtype2,...,argtypeN); EX:

#include <stdio.h>
#include <stdlib.h>

typedef void (*functype)();

void func1()
{
 //...
}

void func2()
{
 //..
}

//...


void func10()
{
//...
}

int main(int argc, char* argv[])
{
     functype array[] = 
     { 
         &func1, 
         &func2, 
         &func3, 
         &func4, 
         &func5,
         &func6, 
         &func7, 
         &func8, 
         &func9, 
         &func10
     };

     // Use the array...
     return 0;   
}
T (*array_of_functions[10])();

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

int foo(void) {...}
int bar(int x) {...}
int bletch(double y, double z) {...}
...
int (*array_of_functions[10])() = {foo, bar, bletch, ...};

وإذا كان الأمر كذلك، عليك أن تتبع ما عدد وأنواع المعلمات يتطلب كل وظيفة بطريقة أو بأخرى حتى تتمكن من الاتصال بشكل صحيح.

وأنا في الواقع نوع من أسفل على typedefs لأنواع مؤشر دالة. فإنها تميل إلى طمس بقدر ما تبسيط.

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