LoginSignup
11
3

More than 3 years have passed since last update.

関数ポインタの配列

Last updated at Posted at 2020-05-14

前回の記事の類似問題。
変数操作により実行する関数を切り替えるというのが解決したい問題。
例えば下図のように、FuncPtrArray[0]とすれば関数Aが実行され、FuncPtrArray[1]とすれば関数Bが実行されるといった具合。

image.png

実装


#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さん、ありがとうございます。

11
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
3