2009-07-30 2 views
4

Как создать массив из десяти указателей на функции? У меня есть цикл for, и я хочу установить указатель на другую функцию на каждой итерации. так:абстрактные указатели функций

//pseudocode 
for i (0..10) 
    function = array_of_functions[i]; 
//... 

ответ

8
// 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); 
} 
4

Этот код:

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

Объявляет «array_of_functions», как 10-элементный массив указателей на функции, где каждый указал к функции а принимает два аргумента типа arg1_t и arg2_t и возвращает тип return_t , Замените типы и при необходимости скорректируйте количество аргументов.

2

Самый простой способ сделать это - создать 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; 
} 
2

Каждый раз, когда вам приходится иметь дело с уродливой функцией синтаксисом указателя лучше использовать ЬурейиЙ.

#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; 
} 
1
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, ...}; 

Если да, то вы должны будете следить за какие числа и типов параметров каждой функции требуется каким-то образом, чтобы вы могли назовите его правильно.

На самом деле я нахожусь на типех для типов указателей функций; они, как правило, затушевывают столько, сколько они упрощают.

 Смежные вопросы

  • Нет связанных вопросов^_^