38119


関数配列を更に配列の中に入れてアクセスしたかったのですが・・・  
下のようなソースで関数配列を作って、それに対してアクセスすることは成功したのですが  
その関数配列を更に配列に入れたところで詰まってしまいました  
fAllに対して配列番号を指定して配列の中にある関数を実行するにはポインタをどのように渡せば良いのでしょう

[code]

    //関数の戻り値の構造体
    typedef struct {
        long    Prm1;
        long    Prm2;
        long    Prm3;
    } TBL_DOFUNC, *PTBL_DOFUNC;
    
    //関数の型定義    
    typedef TBL_DOFUNC(*FUNCTBL)(PTBL_DOFUNC ,long* );
    //関数のプロトタイプ
    static TBL_DOFUNC s_none(PTBL_DOFUNC, long* );
    static TBL_DOFUNC s_0_0(PTBL_DOFUNC, long* );
    static TBL_DOFUNC s_1_1(PTBL_DOFUNC, long* );
    static TBL_DOFUNC s_2_2(PTBL_DOFUNC, long* );
    
    //テーブルの1
    FUNCTBL f[3][3]={
        { s_0_0,s_none,s_none },
        { s_none,s_1_1,s_none },
        { s_none,s_none,s_2_2 }
    };
    //テーブルの2
    FUNCTBL f2[][3] = {
        { s_0_0,s_none,s_none },
        { s_none,s_1_1,s_none }
    };
    //テーブルの3
    FUNCTBL f3[][2] = {
        { s_0_0,s_2_2},
    };
    //テーブルを更にテーブルで配列
    FUNCTBL fAll[][2] = {
        { f,f2 },
        { f3,f2 }
    };
    
    void main() {
        TBL_DOFUNC ret;
        FUNCTBL* ret2;
        long param[10];
        TBL_DOFUNC ret3;
    
        ret.Prm1 = 100;
        ret.Prm2 = 10;
        ret.Prm3 = 22;
        param[0] = 10;
        param[1] = 99;
        param[2] = 100;
    
        ret = f[0][0](&ret, param);
    
        ret2 = fAll[0][0];
    
        ret3 = fAll[0][0][0][0](&ret, param);   // ●オブジェクト型へのポインターを渡せというエラー
    }
    
    TBL_DOFUNC s_none(PTBL_DOFUNC ptf, long* param)
    {
        TBL_DOFUNC ret;
        ret.Prm1 = 1;
        ret.Prm2 = 2;
        ret.Prm3 = 3;
    
        return ret;
    }
    
    TBL_DOFUNC s_0_0(PTBL_DOFUNC ptf, long* param)
    {
        TBL_DOFUNC ret;
        ret.Prm1 = 0;
        ret.Prm2 = 9;
        ret.Prm3 = 99;
    
        return ret;
    }
    
    TBL_DOFUNC s_1_1(PTBL_DOFUNC ptf, long* param)
    {
        TBL_DOFUNC ret;
    
        ret.Prm1 = 333;
        ret.Prm2 = ptf->Prm2;
        ret.Prm3 = 332;
    
        return ret;
    }
    
    TBL_DOFUNC s_2_2(PTBL_DOFUNC ptf, long* param)
    {
        TBL_DOFUNC ret;
        ret.Prm1 = 444;
        ret.Prm2 = param[0];
        ret.Prm3 = 444;
        return ret;
    }
    
[/code]


CC BY-SA 3.0
2017-09-22T11:15:18.543
38116
2017-09-22T12:05:05.490
15047
question
c array ポインタ
C言語で関数配列の配列


`f`と`f2`は同じ型`FUNCTBL(*)[3]`へ変換可能ですが、`f3`は異なる型`FUNCTBL(*)[2]`になります。このままでは配列`fAll`に異なる型が混在しますので、どうやっても同じ配列に格納することができません。

一つの解決方法としては、`f3`にダミー要素を1つ追加して`FUNCTBL(*)[3]`に変換可能となればOKです：

[code]

    FUNCTBL f[3][3] = /*...*/;
    FUNCTBL f2[2][3] = /*...*/;
    FUNCTBL f3[1][3] = {
      { s_0_0, s_2_2, NULL }
    };
    
    FUNCTBL (*fAll[2][2])[3] = {
      { f, f2 },
      { f3, f2 }
    };
    
[/code]

もはやパズルの様相を呈していますが、`fAll`の型は「`FUNCTBL`の3要素配列へのポインタ型の2要素配列の2要素配列」となります。


CC BY-SA 3.0
2017-09-22T12:05:05.490
38119
2017-09-22T12:05:05.490
49
38116
answer