2013-02-15 12 views
5

私は配列のポインタ(私のプログラムにいくつかの関数で必要なパラメータを含む)を構造体に渡そうとすると問題が発生します。構造体に渡す必要があります。例えば、GSLは私にこのようにパラメータを渡すことを望んでいます。静的な2D配列のポインタを構造体/クラスに渡すにはどうすればよいですか?

#include <iostream> 

using namespace std; 

struct myparams 
{ 
    double * a; 
    double ** b; 
}; 

int main() 
{ 
    double c[10] = {0,1,2,3,4,5,6,7,8,9}; 
    double d[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; 

    double** e = new double*[4]; 
    for (int i = 0; i < 4; i++) { 
     e[i] = new double[3]; 
    } 

    myparams params; 

    // THIS WORKS: 
    params.a = c; 
    for (int i = 0; i < 10; i++) { 
     cout << params.a[i] << endl; 
    } 

    // THIS DOESN'T WORK 
    params.b = d; 

    // THIS WORKS: 
    params.b = e; 

    delete[] e; 
} 

コンパイラが"cannot convert 'double[4][3]' to 'double**' in assignment"または(ドイツ語からの翻訳)そのようなことで文句を言う

params.b = d 

に問題がどのようなものです:

小さなプログラム例では、このようになります。

+1

'double [n] [m]'は 'double **'には減衰できませんが、 'double [n]'は 'double *'に減衰することができます。そのため、最初の割り当ては有効で、後者は有効ではありません。 – Zeta

+0

http://stackoverflow.com/a/13273979/560648およびhttp://stackoverflow.com/a/95578​​55/560648およびhttp://stackoverflow.com/a/7139014/560648 –

+0

また、これはもう一度動作しません "! –

答えて

7

double d[4][3];は配列の配列です。 double b**;はポインタへのポインタです。これらのタイプは同じではありません(インターネット上で読んでいるかもしれない共通の「配列は単なるポインタです」が間違っている)。

dの要素は、double[3]です。配列を渡すと、配列は最初の要素へのポインタになります(C++標準の4.2節参照)。 dは、double(*)[3](3倍の配列へのポインタ)に減衰します。

短いストーリー、double(*)[3]double**に変換できません。これはコンパイラがあなたに伝えているものです。

dをそのまま使用する必要がある場合は、bをdouble (*b)[3]とする必要があります。

詳細については、this SO questionを参照してください。

+0

ありがとう!これはほぼ解決策でした。これは 'double(* b)[4]'ではなく 'double(* b)[3] 'です。 – GriffinPeterson

+0

私は正しくない答えをあなたが受け入れた方法が好きです。それは理にかなっている。 –

+0

@LightnessRacesinOrbitあなたが間違っていることを指摘すれば、それを修正します。ありがとうございました。 – jrok

6

これは、ポインタへのポインタ(またはポインタとして使用できるポインタの配列)が配列の配列と異なるためです。メモリ内のレイアウトに互換性がありません。

例えば、我々はこれらの2つの宣言を持って言うことができます:

char aa[2][2] = { { 'a', 'b' }, { 'c', 'd' } }; 
char **pp; 

pp = new char*[2]; 
pp[0] = new char[2]; 
pp[1] = new char[2]; 

配列aaは、メモリ内に次のようになります。

+----------+----------+----------+----------+ 
| aa[0][0] | aa[0][1] | aa[1][0] | aa[1][1] | 
+----------+----------+----------+----------+ 

"アレイ" ppは、その間次のようになります。

+------+------+ 
| a[0] | a[1] | 
+------+------+ 
    |  | 
    |  v 
    |  +---------+---------+ 
    |  | a[0][0] | a[0][1] | 
    |  +---------+---------+ 
    V 
    +---------+---------+ 
    | a[0][0] | a[0][1] | 
    +---------+---------+ 

「配列」ppにはポイントが含まれています他の "配列"に

+0

+1:絶対に正しいです。 –

+0

迅速な対応をありがとう!しかし、配列 'd'へのポインタを格納するために、どのメンバが私の構造体' myparams'に必要ですか? – GriffinPeterson

+0

それは[私の図](http://stackoverflow.com/a/7139014/560648)よりも良いと思います。ダメージ。 –

関連する問題