【问题标题】:Passing 2dimemnsional array to the function in c++ [duplicate]将二维数组传递给c ++中的函数[重复]
【发布时间】:2013-03-28 17:30:34
【问题描述】:

如何将二维数组传递给函数我已经创建了一个并想定义初始化这个数组的函数。

#include <iostream>

using namespace std;
int n = 5;**strong text**
void wypelnijTabliceBooli(bool** b){
      for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++)
            b[i][j] = 0;
    }
}
int main(){
    bool b[n][n];
    wypelnijTabliceBooli(b);
    return 0;
}

我得到了

error: cannot convert 'bool (*)[(((unsigned int)(((int)n) + -0x000000001)) + 1)][(((unsigned int)(((int)n) + -0x000000001)) + 1)]' to 'bool**' for argument '1' to 'void wypelnijTabliceBooli(bool**)'|

【问题讨论】:

  • 数组不是指针。
  • bool[n][n]bool** 不同。除非您发布真实代码,否则无法提供更多帮助。
  • @Aiias 这也不是合法代码。
  • @john 这是一个真实的代码
  • @RobertKilar 不幸的是,您选择使用非标准 C++。即使在您尝试将数组传递给函数之前,int n = 5; bool b[n][n]; 也是不合法的 C++。

标签: c++ multidimensional-array


【解决方案1】:

使用维度:

void wypelnijTabliceBooli(bool b[n][n])

您可以将它作为指向数组的指针传递,但除了“最外层”维度之外的所有维度都需要知道:

void wypelnijTabliceBooli(bool (* b)[n])

编辑:我接受这需要 GNU 或其他具有高于 C++ 标准的扩展的编译器。另一种方法是使n 成为一个常量值。

【讨论】:

  • 其实所有的外尺寸都需要知道,只有第一个可以省略。
  • 不知道这是另一个gcc扩展,还是C99?
  • @john,GCC 有 VLA,是的,但没有打开好的编译器选项。
  • @chris 不是在开玩笑吗?我认为该功能永远不会出现在 C++ 中。他们为什么要把它放进去?多么奇怪。
  • @WhozCraig,实际上有一个提案。
【解决方案2】:

只要我知道你什么时候使用:

void wypelnijTabliceBooli(bool** b){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++)
        b[i][j] = 0;
}
}

您不能使用索引来处理 bool 二维数组。发生这种情况是因为二维数组存储在连续的内存位置,如果您不提供至少一个数组维度,则无法知道何时知道给定“行结束”的时间。例子: 假设你有一个 bool 数组:

bool myArray[2][3]={{true,true,false},{false,false,true}};

在内存中是这样的(其中 [] 表示一个内存块):

[真][真][假][假][假][真]

现在只传递一个指向它的指针,你无法知道这是 array[3][2] 还是 array[2][3]。

这可以通过将数组的一维以外的所有维度传递给函数来解决,如下所示:

void wypelnijTabliceBool(bool b[][3] ){
  for(int i = 0; i < n; i++){
    for(int j = 0; j < n; j++)
        b[i][j] = 0;
}
}

(如果您的第二维是 3)。

【讨论】:

    【解决方案3】:

    您似乎希望数组的大小灵活。您可以将 b 声明为:

    bool** b = new bool*[n]
    for (i=0; i<n; i++)
        b[i] = new bool[n]
    

    【讨论】:

      【解决方案4】:

      数组不是指针。当传递给函数时,只有数组的“第一”(主要)维度可以衰减为指针。否则,如果你有一个多维数组,你必须在函数参数列表中相应地声明它:

      void funcTaking2DArray(int (*arr)[5])
      {
          // do stuff
      }
      
      int array[10][5];
      funcTaking2DArray(array);
      

      【讨论】:

      • @WhozCraig 谢谢,不知道这个术语。无论如何,这是“第一个”,而不是“最后一个”。
      • +1 不错的答案 =) 是的,它是充满热情的维度,因为它是所有其他遵循 combined 的维度。
      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 2018-12-08
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多