1

在我的代码中,我输入了两个维度的大小,然后声明了一个二维数组。我的问题是,如何将该数组用作函数参数?我知道我需要在函数规范中写入列数,但是如何传递列数?

 void gameDisplay(gameCell p[][int &col],int a,int b) {
         for(int i=0;i<a;i++) {
                for(int j=0;j<b;j++) {
                         if(p[i][j].getStat()==closed)cout<<"C ";
                         if(p[i][j].getStat()==secure)cout<<"S ";
                         if(p[i][j].getBomb()==true&&p[i][j].getStat()==open)cout<<"% ";
                         if(p[i][j].getBomb()==false&&p[i][j].getStat()==open) {
                                 if(p[i][j].getNum()==0)cout<<"0 ";
                                 else cout<<p[i][j].getNum()<<" ";
                         }
                 cout<<endl;
                 }
         }
 }

 int main() {
         int row,col,m;
         cout<<"Rows: ";cin>>row;cout<<"Columns: ";cin>>col;
         m=row*col;
         gameCell p[row][col];
         gameConstruct(p[][col],m);
         gameDisplay(p[][col],row,col);
 }

我试过这种方式,但它不起作用。

谢谢你。

4

6 回答 6

2

在 C++ 中,不能有可变长度数组。也就是说,您不能将输入整数用作数组的大小,如下所示:

std::cin >> x;
int array[x];

(这将在 gcc 中工作,但它是一个不可移植的扩展)

但是,当然,也可以做类似的事情。允许您拥有动态大小数组的语言特性是动态分配new[]。你可以这样做:

std::cin >> x;
int* array = new int[x];

但请注意,array这里不是数组类型。它是一种指针类型。如果要动态分配二维数组,则必须执行以下操作:

std::cin >> x >> y;
int** array = new int*[x]; // First allocate an array of pointers
for (int i = 0; i < x; i++) {
  array[i] = new int[y]; // Allocate each row of the 2D array
}

但同样,这仍然不是数组类型。它现在是一个int**,或“指向 int 的指针”。如果要将其传递给函数,则需要函数的参数为int**​​ . 例如:

void func(int**);
func(array);

那会好的。但是,您几乎总是需要知道函数内部数组的维度。你怎么能那样做?只需将它们作为额外的参数传递!

void func(int**, int, int);
func(array, x, y);

这当然是一种方法,但它肯定不是惯用的 C++ 方法。它存在安全问题,因为它很容易忘记delete一切。您必须手动管理内存分配。您必须这样做以避免内存泄漏:

for (int i = 0; i < x; i++) {
  delete[] array[i];
}
delete[] array;

所以忘记我刚刚告诉你的一切。使用标准库容器。您可以轻松使用std::vector并且无需担心传递尺寸:

void func(std::vector<std::vector<int>>);

std::cin >> x >> y;
std::vector<std::vector<int>> vec(x, std::vector<int>(y));
func(vec);

如果您最终处理的是数组类型而不是动态分配数组,那么您可以通过定义一个引用数组的模板函数来获取数组的维度:

template <int N, int M>
void func(int (&array)[N][M]);

该函数将为传递给它的所有不同大小的数组实例化。模板参数(数组的维度)必须在编译时知道。

于 2012-12-25T15:36:02.203 回答
0

而不是访问p[i][j]你应该访问p[i*b + j]- 这实际上是编译器为你做的,因为int[a][b]在内存中被展平为一个大小为a*b

此外,您可以将函数的原型更改为“void gameDisplay(gameCell p[],int a,int b)”

固定代码:

void gameDisplay(gameCell p[],int a, int b) {
         for(int i=0;i<a;i++) {
                for(int j=0;j<b;j++) {
                         if(p[i*a +j].getStat()==closed)cout<<"C ";
                         if(p[i*a +j].getStat()==secure)cout<<"S ";
                         if(p[i*a +j].getBomb()==true&&p[i][j].getStat()==open)cout<<"% ";
                         if(p[i*a +j].getBomb()==false&&p[i][j].getStat()==open) {
                                 if(p[i*a +j].getNum()==0)cout<<"0 ";
                                 else cout<<p[i*a +j].getNum()<<" ";
                         }
                 cout<<endl;
                 }
         }
 }

 int main() {
         int row,col,m;
         cout<<"Rows: ";cin>>row;cout<<"Columns: ";cin>>col;
         m=row*col;
         gameCell p[row][col];
         gameConstruct(p[][col],m);
         gameDisplay(p[],row,col);
 }
于 2012-12-25T15:58:42.347 回答
0

我做了一个小程序:

#include <iostream>
using namespace std;
void fun(int tab[][6], int first)
{}
int main(int argc, char *argv[])
{
    int tab[5][6];
    fun(tab, 5);
    return 0;
}

在函数定义中,您必须输入第二个索引的大小。列数作为参数传递。

于 2012-12-25T15:24:52.403 回答
0

这是你要找的吗?

int* generate2DArray(int rowSize, int colSize)
{
    int* array2D = new int[rowSize, colSize];
    return array2D;
}

例子 。. .

#include <iostream>
#include <stdio.h>

int* generate2DArray(int rowSize, int colSize);
int random(int min, int max);

int main()
{
    using namespace std;

    int row, col;
    cout << "Enter row, then colums:";
    cin >> row >> col;

    //fill array and display
    int *ptr = generate2DArray(row, col);
    for(int i=0; i<row; ++i)
        for(int j=0; j<col; ++j)
        {
            ptr[i,j] = random(-50,50);
            printf("[%i][%i]: %i\n", i, j, ptr[i,j]);
        }

    return 0;
}


int* generate2DArray(int rowSize, int colSize)
{
    int* array2D = new int[rowSize, colSize];
    return array2D;
}

int random(int min, int max)
{
    return (rand() % (max+1)) + min;
}
于 2012-12-25T15:27:34.367 回答
0

我从Problems with 'int'猜测您已遵循已验证问题的建议并且您正在使用 std::vector

这是一个返回“数组”列数的函数(如果有问题则返回 0)。

int num_column(const std::vector<std::vector<int> > & data){
    if(data.size() == 0){
        std::cout << "There is no row" << std::endl;
        return 0;
    }
    int first_col_size = data[0].size();
    for(auto row : data) {
        if(row.size() != first_col_size){
            std::cout << "All the columns don't have the same size" << std::endl;
            return 0;
        }
    }
    return first_col_size;   
}
于 2012-12-25T15:30:25.583 回答
0

如果您使用 C 风格的数组,您可能需要在参数中进行引用:

int (&array)[2][2]; // reference to 2-dimensional array
于 2012-12-25T15:30:27.487 回答