2016-10-27 18 views
1

この関数へのポインタとして渡すために、どのようにして配列を作成できますか?2D配列がCで渡される

void SomeFunction(double *a, double *b, double *c); 

私はそうのように私の2D配列を作った(しかし、私はエラーを持っている):

static double matrix_a [MATRIX_DIM][MATRIX_DIM]; 
static double matrix_b [MATRIX_DIM][MATRIX_DIM]; 
static double matrix_c [MATRIX_DIM][MATRIX_DIM]; 

for (i=0;i<MATRIX_DIM;i++) { 
    for (j=0;j<MATRIX_DIM;j++) { 
     // initializing matrices here 
    } 
} 

今、私は配列へのポインタを作る:

double *a = &matrix_a; 
double *b = &matrix_b; 
double *c = &matrix_c; 

と次の関数を呼び出します。

SomeFunction(a, b, c); 

しかし、私は次のエラーを取得する:

cannons.c: In function ‘main’: 
cannons.c:29:14: warning: initialization from incompatible pointer type  [enabled by default] 
double *a = &matrix_a; 
      ^
cannons.c:30:14: warning: initialization from incompatible pointer type [enabled by default] 
double *b = &matrix_b; 
      ^
cannons.c:31:14: warning: initialization from incompatible pointer type [enabled by default] 
double *c = &matrix_c; 
      ^

なぜ?

+0

あなたが渡している引数がポインタではないからですか? –

答えて

0

double *は、 "single doubleへのポインタ"を意味します。しかし、要素がdoubleの配列である配列があります。あなたはa[1][2] = 5.0;として、それをアクセスするとき

double (*a)[MATRIX_DIM] = &matrix_a[0]; // or matrix_a 

:だから、実際には、二重の配列へのポインタをしたいです。別の方法としては、一度に配列全体を指すことができます:

double (*x)[MATRIX_DIM][MATRIX_DIM] = &matrix_a; 

が、その後、あなたはそれにアクセスするために余分な間接レベルを必要とする:(*x)[1][2] = 5.0;

あなたも、パラメータリスト内の同じ宣言を使用する必要があります。

+0

どのように配列を作成して、関数の引数リストで期待されるものに合うようにすることができますか?私は関数の仕組みを理解できないので型を変更できませんが、2次元配列を渡す必要があります – abc

+0

@abcでは '(double *)&matrix_a'を使用できます。これは、行優先順序で1次元配列ビューを持つ関数を表示します –