传递可变大小的二维数组

4
我试图从一个函数传递一个二维数组到另一个函数。然而,该数组的大小并不是固定的,大小是由用户决定的。
我尝试研究这个问题,但没有太多的运气。大多数代码和解释都是针对数组的恒定大小。
在我的函数A中,我声明变量,然后对它进行一些操作,然后必须将其传递给函数B。
void A()
{
      int n;
      cout << "What is the size?: ";
      cin >> n;

      int Arr[n-1][n];

      //Arr gets manipulated here

      B(n, Arr);
}

void B(int n, int Arr[][])
{
    //printing out Arr and other things

}

你可以将它作为变量传递给函数,就像你在问题中所做的那样。 - Nick Veys
2
@NickVeys:不,你不需要这样做,因为这不是创建数组的有效方法。 - Lightness Races in Orbit
@LightnessRacesinOrbit 哎呀!我只看了 int 参数。我想我那时候太轻率了。 :) - Nick Veys
3个回答

11

如果您想要动态大小的数组,请使用std::vector

std::vector<std::vector<int>> Arr(n, std::vector<int>(n - 1));
B(Arr);

void B(std::vector<std::vector<int>> const& Arr) { … }

3
OP 问如何创建动态大小的数组,我向他展示了如何实现这一点。std::vector 是一个实现了动态数组概念的抽象类,当需要使用动态数组时应使用它。 - user1804599
13
std::vector 是基础。new[] 是 C++ 的高级特性,只有在实现低级数据结构时才会使用。 - user1804599
6
@MarounMaroun Bjarne Stroustrup(C++的创始人)为初学者写了一本书:"Programming -- Principles and Practice Using C++"。你知道吗?vector在第100页出现,而new仅在中间的页面~500上出现。 - Evgeny Panasyuk
3
现在的C++已经拥有一些特性,使得程序员可以避免使用最麻烦的C语言特性。例如,标准库容器如vector、list、map和string可以用来避免大部分棘手的低级指针操作。-- Stroustrup - sehe
5
@MarounMaroun,不,这使你成为一个固执的人,认为每个程序员在学习基本和现代技术之前都需要学习手动内存管理。嗯。 - Griwes
显示剩余8条评论

3

C++不支持变长数组。如果使用C99并且以纯C编译,则可以像这样传递数组:

#include <stdio.h>

void B(int rows, int columns, int Arr[rows][columns]) {
    printf("rows: %d, columns: %d\n", rows, columns);
}

void A() {
    int n = 3;
    int Arr[n-1][n];
    B(n-1, n, Arr);
}


int main()
{
    A();
    return 0;
}

注意:在函数周围加上extern "C" {}不能解决C++与C99之间的不兼容性问题。
  g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2:
  error: use of parameter ‘rows’ outside function body
  error: use of parameter ‘columns’ outside function body
  warning: ISO C++ forbids variable length array

该死。这回答了我一个问题,但我不喜欢这个答案。我试图让一些完全正常的C代码在C++中工作,并且一直收到有关类型转换的错误。(如果clang直接说C++不支持可变大小数组就好了。)我尝试了很多带*和&的变化,但都无济于事。现在我知道原因了。C能够做到C++不能做的事情,这不是违背某种基本宗教信条吗? - Mark Adler

3

数组大小必须是常量。或者,您可以使用 std::vector<std::vector<int>> 表示动态二维数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接