2016-09-05 4 views
0

未知のサイズの配列へのポインタへのポインタを取るインタフェースを定義したいと思います。関数本体は、この配列にすでに静的に割り当てられた配列を移入する必要があります。未知の次元の配列へのポインタを更新するプロトタイプ

問題は、私が渡している配列が未知の1次元と2次元アレイの一部である、次のとおりです。

T_MY_STRUCT (*pMyConfigArray)[][2]; 

私は唯一のインタフェースへの呼び出しごとに既知の寸法に沿って更新します。

、以下のように事前に割り当てられた配列は、(2と寸法が知られているが、10は発呼側によって不明である)別のファイル(インターフェイスの理由)で定義されている:

T_MY_STRUCT preAllocatedArray[2][10] = 
{ 
    { 
    {0,TRUE,0,1,&dummyParam[0]}, 
    {1,TRUE,1,1,&dummyParam[1]}, 
    {2,TRUE,2,1,&dummyParam[2]}, 
    {3,TRUE,3,1,&dummyParam[3]}, 
    {4,TRUE,4,1,&dummyParam[4]}, 
    {5,TRUE,5,1,&dummyParam[5]}, 
    {6,TRUE,6,1,&dummyParam[6]}, 
    {7,TRUE,7,1,&dummyParam[7]}, 
    {8,TRUE,8,1,&dummyParam[8]}, 
    {9,TRUE,9,1,&dummyParam[9]} 
    }, 
    { 
    {0,TRUE, 0,1,&dummyParam[0]}, 
    {1,FALSE,1,1,&dummyParam[1]}, 
    {2,TRUE, 2,1,&dummyParam[2]}, 
    {3,FALSE,3,1,&dummyParam[3]}, 
    {4,TRUE, 4,1,&dummyParam[4]}, 
    {5,FALSE,5,1,&dummyParam[5]}, 
    {6,TRUE, 6,1,&dummyParam[6]}, 
    {7,FALSE,7,1,&dummyParam[7]}, 
    {8,TRUE, 8,1,&dummyParam[8]}, 
    {9,FALSE,9,1,&dummyParam[9]} 
    } 
}; 

構造「コピー」できるようにするインターフェース機能は、以下のように実装されます。

int retrieveConfigArray(int arrayIndex, T_MY_STRUCT (**configTab)[]) 
{ 
    int nbParam = 0; 

    if ((configTab != NULL_VOID_PTR) && (arrayIndex < 2)) 
    { 
    *configTab = &(preAllocatedArray[mmsPid]); 
    nbParam = 10; 
    } 

    return nbParam; 
} 

そして、それを更新することができますので、私は、この関数にpMyConfigArrayのアドレスを渡す:

私の質問は、どのようにこれらの配列定義/宣言だけでなく、関数のプロトタイプを定義して目的の動作を得ることができますか?上のように、私は配列を渡す行に error: invalid use of array with unspecified boundsを受け取ります。配列関数のプロトタイプと一致する正しい次元へのポインタを渡すために配列ポインタの崩壊とアドレス演算子をどのように利用できますか?

+2

http://stackoverflow.com/questions/35614862/passing-a-2d-array-of-structs/35615201#35615201 – Olaf

答えて

0

私が持っていた問題は、配列pMyConfigArrayへのポインタをどのように宣言したかに関係していました。私は、構造体の配列へのポインタの配列だっ必要なものを実際に

T_MY_STRUCT (*pMyConfigArray)[][2]; 

::私はT_MY_STRUCT構造体の2次元配列へのポインタとして定義されていた

T_MY_STRUCT (*pMyConfigArray[])[2] = {NULL, NULL}; 

この意味上の違いは、使用しています異なる宣言構文を使用し、初期化する必要があります。

C Wikibookのこのリソースは、同様の状況の人々に役立つことがあります。それは参考のために、様々なアレイ/ポインタ構造を示します。

int i;   // integer variable 'i' 
int *p;  // pointer 'p' to an integer 
int a[];  // array 'a' of integers 
int f();  // function 'f' with return value of type integer 
int **pp;  // pointer 'pp' to a pointer to an integer 
int (*pa)[]; // pointer 'pa' to an array of integer 
int (*pf)(); // pointer 'pf' to a function with return value integer 
int *ap[];  // array 'ap' of pointers to an integer 
int *fp();  // function 'fp' which returns a pointer to an integer 
int ***ppp; // pointer 'ppp' to a pointer to a pointer to an integer 
int (**ppa)[]; // pointer 'ppa' to a pointer to an array of integers 
int (**ppf)(); // pointer 'ppf' to a pointer to a function with return value of type integer 
int *(*pap)[]; // pointer 'pap' to an array of pointers to an integer 
int *(*pfp)(); // pointer 'pfp' to function with return value of type pointer to an integer 
int **app[]; // array of pointers 'app' that point to pointers to integer values 
int (*apa[])[];// array of pointers 'apa' to arrays of integers 
int (*apf[])();// array of pointers 'apf' to functions with return values of type integer 
int ***fpp(); // function 'fpp' which returns a pointer to a pointer to a pointer to an int 
int (*fpa())[];// function 'fpa' with return value of a pointer to array of integers 
int (*fpf())();// function 'fpf' with return value of a pointer to function which returns an integer 
関連する問題