【问题标题】:How do I properly pass a two dimensional int array to a function in C++?如何正确地将二维 int 数组传递给 C++ 中的函数?
【发布时间】:2021-07-02 18:44:13
【问题描述】:

我是 C++ 和一般编码方面的新手,因为这只是我的第二门课程。对于我的任务,我必须为记忆游戏编写程序,在该游戏中,用户选择二维数组中的卡片以尝试匹配它们。然而,现在,我正在努力让我的函数调用 initializeBoard() 编译没有错误。我得到的信息是:

    main.cpp:63:3: error: no matching function for call to
       'initializeBoard'
      initializeBoard(gameBoard, rows);

    main.cpp:35:6: note: candidate function not viable: no known
       conversion from 'int [rows][col]' to 'int (*)[col]' for 1st
       argument

我的代码的简化副本写在下面,其中包含我认为与错误有关的行。

    int rows = 4;
    int col = 4;

    void initializeBoard(int gameBoard[][col], int rows);

    int main()
    {
       int players;
       string p1Name, p2Name, p3Name, p4Name, p5Name;

       rules();

       getPlayers(players, p1Name, p2Name, p3Name, p4Name, p5Name);

       if (2 < players && players < 5)
       {
         rows = 6;
         col = 6;
       }
       else if (players == 5)
       {
         rows = 8;
         col = 8;
       }

       int (gameBoard)[rows][col];

       initializeBoard(gameBoard, rows); // I get an error saying there is no matching function for call to 'initializeBoard'
       }

有人可以向我解释我哪里出错并帮助我找到解决问题的方法吗?

【问题讨论】:

  • 传递一个指向第一个单元格的指针,以及最大行数和最大列数。这假设数组是连续的槽。
  • 那么我需要将 rows 和 col 变量作为与数组分开的 int 参数传递吗?是的,最终结果应该看起来更像一张桌子,而不是实际的单独卡片
  • 不完全是。接收二维数组的函数需要知道数组的容量,以行和列为单位。
  • 注意:C++ 没有像int (gameBoard)[rows][col]; 这样的可变长度数组的标准支持,所以你可能不喜欢你得到的东西。我通常做的是在一维数组中工作,所有这些都很好地包裹在一个类中,该类隐藏了将一维数组转换为二维并携带维度的数学,因此其他人不必这样做。 Here's a pretty good, simple example.

标签: c++ multidimensional-array function-call


【解决方案1】:
const int rows = 4;
const int col = 4;

void initializeBoard(int gameBoard[][col], int rows);

在这里,您定义了一个函数,该函数将采用第二维为 4 的二维数组(按指针)。行数不固定,但您将该维作为第二个参数传递。

看起来在main 中,您试图传递一个没有大小为 4 的列(或第二维)的二维数组。因此出现编译器错误。第二个维度必须是 4 才能调用initializeBoard

尽管您的编译器允许您声明一个可变大小的二维数组,但这是 C++ 标准的 isn't allowed。这是一个编译器特定的扩展。

您可以使用向量的向量,而不是像在 C 中那样使用原始数组。这将允许您传递一个 2D 矩阵:

#include <vector>

void initializeBoard(std::vector<std::vector<int>> &gameBoard);

或者,您可以将您的函数转换为模板函数,该函数将为您推断尺寸:

template<size_t row, size_t col>
void initializeBoard(int (&gameBoard)[row][col])
{
 ...
}

但是,数组维度应该在编译时知道。如果不是,最好使用向量的向量。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多