2016-08-20 8 views
-2

これはc99標準による有効なコードであり、このコードスニペットはgccコンパイラで正常に動作しています。C++の関数に動的な2次元を渡す方法

#include <stdio.h> 
void foo(int n, int m, int a[][m]){ 
    //do stuff 
} 

int main() { 
     int n, 
      m; 
     scanf("%d %d", &n, &m); 
     int a[n][m]; 
     foo(n, m, a); 
     return 0; 
} 

しかし、同等のC++コードはg ++コンパイラでは実行されていません。

#include <cstdio> 
#include <iostream> 
using namespace std; 
void foo(int n, int m, int a[][m]){ 
     //do stuff 
} 

int main() { 
     int n, 
      m; 
    cin >> n >> m; 
    int a[n][m]; 
    foo(n, m, a); 
    return 0; 
} 

次のエラーが発生しています。

error: use of parameter outside function body before ‘]’ token 
void foo(int n, int m, int a[][m]){ 

この問題では、Cで使用できるC++の単純な解決策が見つかりません。

+0

どのC++標準でコンパイルしていますか?もっと重要なのは、このプログラムはC++で書かれていなければなりませんか? –

+4

2つの異なる言語が同じ機能を持つと思われる理由は何ですか? – Olaf

+2

C++を使用している場合、なぜベクターを使用しないのですか?ここで何人のユーザーがCの多次元配列に問題があるのか​​は信じられません。 –

答えて

1

まず、変数を使用して関数ヘッダーの配列列を定義することはできないため、int a[][m]mを一定の値に置き換える必要があります。

第2に、int a[n][m]のように可変サイズの配列を宣言することはできません。ここでも定数を使用する必要があります。

可変サイズの配列を使用する場合は、動的に配列を作成できます。

int** a = new int*[n]; // It creates an array of pointers of size n 

このポインタの配列をループして、各ポインタに整数の配列を割り当てることができます。

for (int i = 0; i < n; i++){ 
    a[i] = new int[m]; 
} 

これにより、整数の2D配列が動的に作成されます。 そして、この配列を関数の引数として渡すには、pointer to pointerを使用できます。

アレイの使用が終了したら、動的に割り当てられた配列の割り当てを解除する必要があります。

for (int i = 0; i < n; i++){ 
    delete[] a[i]; 
    a[i] = 0; 
} 
delete[] a; 
a = 0; 

この方法が嫌いなら、いつでもvectorクラスを使用できます。

vector<vector<int>> a(n, vector<int>(m)); 

vectorを関数に渡す。

void foo(const vector<vector<int>>& a){ 
    size_t n = a.size(); 
    size_t m = 0; 
    if (n > 0) 
     m = a[0].size(); 
    // do your work 
} 

vector使用して、あなたが動的割り当てまたは割り当て解除を心配する必要はありません、vectorクラスは、原料自体のこの種を扱います。

+0

ベクトルのベクトルの例では、「ベクトル」(n、ベクトル(m));「ループは必要ありません。最後の例では、Cの通常の配列と同様に、VLAもfirst-element-addressを値として渡すので、ベクトルのベクトルを 'foo'に渡す論理的同義語は* reference *になります。書かれているように、それは価値のあるものです。 – WhozCraig

+0

ありがとう、私の答えを編集しました。 –

0

​​

この問題のためにC++で簡単な解決策は、2次元ベクトルを

vector <vector<int> > vecArray(10, vector <int> (10))

を使用して参照&vec2DArrayによって関数に渡すことであろう。

#include <vector> 
#include <iostream> 
#include <iomanip> 
using namespace std; 


// function to pass 2d vector array by reference & 
void function(int n, int m, vector <vector<int> > & vec2DArray) { 

    for (int y=0; y<10; y++){ 
     for (int x=0; x<10; x++ ){ 

      // perform some calculations 
      vec2DArray[y][x] = (y+1) * (x+1) *m *n; 

     } 
    } 
} 


int main() { 
    cout<<"function to pass 2d vector array by reference & \n\n"; 

    // create a 2D vector of dimension [10][10] 
    vector <vector<int> > vec2DArray(10, vector <int> (10)); 
    int n=0, int m=0; 

    // call function, pass 2d vector array by reference & 
    function(1, 1, vec2DArray); 

    // display calculation results 
    for (int y=0; y<10; y++){ 
     for (int x=0; x<10; x++ ){ 

      // display vec2DArray 
      cout << setfill(' ') << setw(2)<< vec2DArray[y][x] <<" "; 
     } 
     cout<<"\n"; 
    } 
    cout<<"\n"; 


cout<<"Press ANY key to close.\n\n"; 
cin.ignore(); cin.get(); 
return 0; 
} 
関連する問題