10 個の関数ポインターの配列を作成するにはどうすればよいですか? 私が持っているのは for ループで、各反復で関数ポインターを別の関数に設定したいと考えています。それで:
//pseudocode
for i (0..10)
function = array_of_functions[i];
//...
10 個の関数ポインターの配列を作成するにはどうすればよいですか? 私が持っているのは for ループで、各反復で関数ポインターを別の関数に設定したいと考えています。それで:
//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型の2つの引数を取り、return_t型を返します。タイプを置き換え、必要に応じて引数の数を調整します。
これを行う最も簡単な方法は、関数の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;
}
醜い関数ポインター構文を処理する必要がある場合はいつでも、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;
}
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, ...};
その場合、関数を正しく呼び出すことができるように、関数ごとに必要なパラメーターの数と型を追跡する必要があります。
私は実際には、関数ポインター型の typedef に少し落ち込んでいます。それらは単純化するのと同じくらいあいまいになる傾向があります。