2012-04-02 20 views
5

配列(2d)をパラメータとして関数に渡そうとしています。 次のように私は、コードを持っている:2次元配列をC++の関数に渡す方法

int main() 
{ 
    float T[100][100]; 
    void set_T(float T[][]); 
} 


void set_T(float T1[][]) 
{ 


    for (int i =0 ; i<90;i++) 
    { 
     for(int j =0 ;j <90;j++) 
     { 
      T1[i][j] = 3; 
     } 
    } 

} 

私は関数に配列を渡す方法を確認していない...私は、エラーの多くを取得しています。誰でも助けてください。

+0

可能な複製[関数を渡す](http://stackoverflow.com/questions/8767166)/passing-2d-array-to-function) – legends2k

答えて

-3

ちょうどこのようにそれを呼び出す:

int main() 
{ 
    float T[100][100]; 
    set_T(T); 
} 

そして@suddnely_meが言ったように、関数宣言でT1の種類はfloat**する必要があります。

+2

'float [] []'と 'float **'は異なります。 –

+0

@Jesseは正しいです。 Cスタイルの2D配列は配列への*ポインタ*の配列として実装されていません。これは、配列の配列、つまり100要素の第1行、100要素の第2行などです。したがって、C構文を使用して2D配列に正しくアクセスするには、呼び出される関数は1次元以外のすべての次元を指定する必要があります。 –

5
void set_T(float (&T)[100][100]); 
8

二つの問題がここにあります

  • Cは、2D配列
  • と全く同じものであるどちらも2次元配列、配列へのポインタの配列または配列の配列のみをサポートしていません。
  • Cは配列を引数として関数に渡すことはできません。配列へのポインタだけです(一般的に、配列の0番目の要素へのポインタを使用します。アレイアクセス)

最初の問題のため、2次元配列(配列の配列または配列へのポインタの配列)をどのように表現するかを決める必要があります。 100個の浮動小数点数の100の配列の配列であることを、あなたはT宣言した。ここ

void set_T(float (*T1)[100]) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float T[100][100]; 
    set_T(T); 
} 

、およびset_Tは100個のfloatの配列としてへのポインタを取ります:あなたが最初のルートを行く場合は、あなたのコードは次のように見て終わりますその議論。配列名をその0番目の要素へのポインタとして扱う言語として、 'T'を直接set_Tに渡します。

代わりに使用すると、配列へのポインタの配列を使用したい場合は、あなたのようなもので終わる:

void set_T(float **T1) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float *T[100]; 
    float space[100*100]; 
    for (int i = 0; i < 100; i++) 
     T[i] = space + i*100; 
    set_T(T); 
} 

ここでの欠点は、あなたがセカンドレベルアレイのすべてのスペースを割り当てる必要があるということで、すべての第1レベルのポインタを指すように手動で初期化します。利点は、第2レベルの配列のサイズがset_Tに渡される引数の型の一部ではないことです。したがって、可変サイズの配列をより簡単に扱うことができます。もちろん

あなたは本当にC++はなくCを使用している場合、あなたはすべてのCアレイを使用すべきではない - あなたの代わりにstd::vectorstd::arrayを使用する必要があります - C配列1Dのみの問題を共有し、どちらも、あなたはベクトルのベクトルまたは配列の配列(またはおそらく配列のベクトルまたはベクトルの配列)が必要です

+0

私はあなたの答えが 'float(*)[100]'や 'float **'の本当の意味でより良い代替案を挙げることができると思っています。 –