【问题标题】:3 errors in a function declaration that returns a 2-dimensional array返回二维数组的函数声明中的 3 个错误
【发布时间】:2019-10-07 17:51:17
【问题描述】:

这段代码

int[][] settile(int[][] field, int x, int y, bool player);

在头文件中给出以下错误:

expected an identifier

在第一个[]

an array may not have elements of this type

在第二个[]

expected a ';'

settile。错误在哪里,我该如何解决?

【问题讨论】:

  • 我建议改为返回 std::array<std::array<int>>std::vector<std::vector<int>>。在大多数情况下避免使用 C 样式的数组..
  • 也许从一本好的 C++ 书开始。如果你有 Java 或 C# 背景,你可能不得不忘记你所知道的大部分事情。
  • 你精通C#吗? C# 中的数组,如 int[][] 是对象。在 C++ 中,您应该使用类似的对象 std::vector<std::vector<int>>
  • @S.M.我知道。我假设 OP 可以自己查找基本语法。

标签: c++ arrays function


【解决方案1】:

简而言之:您不能以这些方式返回和传递二维数组。使用向量(或向量数组,如 cmets 中建议的 @以前已知的_463035818)。

数组是内存的线性部分。 [] 运算符在内存中取值某个偏移量。所以它等于arr[i] == *(arr + i)。对于 2D 数组,编译器需要知道除一维之外的所有维度,因此编译器可以像这样使用它:arr[i][j] == *(arr + i * N + j)。当您在函数中传递数组时,您必须指定除一个(或您想要的所有)维度之外的所有维度的大小。 IE。 void f(int a[][5]);

关于返回二维数组。 C++ 中的数组不是一种类型,它是一种特殊的声明形式。所以返回int[][] 是没有意义的。您必须使用某种包装器(例如std::vectorstd::array),它将复制所有数据。

【讨论】:

  • 您对使用向量的建议可能有点误导,因为std::array 也可以工作
  • 是的,但从问题中不清楚是否是这种情况。在 OPs 代码中传递二维向量也是错误的,因为第一个维度必须是固定的(并且没有大小作为参数传递),所以很可能大小是固定的。在任何情况下,动态或固定大小都与在 OPs 代码中返回二维数组/向量的问题正交
【解决方案2】:

您可以返回并作为参数传递一个动态数组,该数组基本上是一个指针数组。

语法:

int** settile(int** field, int x, int y, bool player);

在此处查看更多关于二维动态数组的信息How do I declare a 2d array in C++ using new?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多