如何将动态2维传递给c ++中的函数

时间:2016-08-20 16:35:04

标签: c++ arrays function multidimensional-array

根据c99标准,这是一个有效的代码,这段代码片段在gcc编译器上正常运行。

#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 ++中找到这个问题的简单解决方案。

2 个答案:

答案 0 :(得分:1)

首先,您必须使用某个常量值替换m中的int a[][m],因为您无法使用变量来定义函数头中的数组列。

其次,你不能声明具有可变大小的数组,因为你已经完成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整数数组。 要将此数组作为参数传递给某个函数,可以使用指针指针。

void foo(int n, int m, int** a){
     // here use it just like you use an array.
}

当你完成使用数组时,你必须取消分配动态分配的数组。

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类本身会处理此类内容。

答案 1 :(得分:0)

enter image description here

C ++中针对此问题的简单解决方案是使用2D矢量

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;
}