前回の記事の類似問題。
変数操作により実行する関数を切り替えるというのが解決したい問題。
例えば下図のように、FuncPtrArray[0]とすれば関数Aが実行され、FuncPtrArray[1]とすれば関数Bが実行されるといった具合。
実装
#include <stdio.h>
static void function_A(void){ printf("hello"); }
static void function_B(void){ printf("bye"); }
static int function_C(void){ return 1; }
// 関数へのポインタを指し示す配列
void (* const FuncPtrArray[])(void) = {
function_A,
function_B,
function_C,
};
int main(void)
{
FuncPtrArray[0]();
FuncPtrArray[1]();
printf("%d", ((int (*)(void))FuncPtrArray[2])());
}
ここで、FuncPtrArrayとfunction_Cは型が異なるので要注意。
処理系次第では正しく実行できるかもしれないが、下記のようなwarningが出ると思われる。
warning: initialization of 'void (*)(void)' from incompatible pointer type 'int (*)(void)'
{
void (* pfunc)(void);
pfunc = (void (*)(void))function_C;
printf("%d", ((int (*)(void))pfunc)());
}
このように実装すればwarningは出ないんだけど、変数操作で切り替えるという目的を達成できないんだよな~。
何か良い方法あるのだろうか。
追記(20200514)
頂いたコメントを元にコードを修正しました。
@SaitoAtsushiさん、@@fujitanozomuさん、ありがとうございます。