我正在解决一个问题,我试图传递一个结构的二维数组并尝试操作它但是,每当我使用#include <iostream>
using namespace std;
typedef struct mat
{
int data;
int flag;
} cell;
int mat(cell *);
int main()
{
int m,n;
cin>>m>>n;
cell game[n][m];
cout<<"The length of matrix is "<<mat(&game[0][0]);
}
int mat(cell *arr)
{
return (sizeof(arr[0])/sizeof(arr[0][0]));
}
运算符访问数组元素时,我得到一个编译时间错误:
不匹配'operator []'
在我的代码块IDE中。
{{1}}
答案 0 :(得分:2)
cell game[n][m];
这不是合法的C ++。您正在使用特定于编译器的扩展。此时我建议您不要使用任何特定于编译器的扩展。仅使用标准C ++。在标准C ++中,没有可变长度数组。不要在C ++程序中使用数组。获得适当的可变长度数组功能。您应该使用std::vector
代替,如下所示:
std::vector<std::vector<cell>> game;
此外,
&game[0][0]
不是2D数组的地址。这是数组中第一个元素的地址。它不包含有关元素数量的信息。它永远失去了。您无法将其传递给某个函数,并期望恢复数组的大小。要使用内置大小函数获得正确的数组功能,请使用std::vector
。
最后但并非最不重要的,
(sizeof(arr[0])/sizeof(arr[0][0]));
arr
是cell*
。 arr[0]
是cell
。 arr[0][0]
无效,因为cell
既不是数组也不是指针,也没有定义自定义[]
运算符。在任何情况下,您都不能使用sizeof
从指向其第一个元素的指针中恢复数组中的元素数。要使用内置大小函数获得正确的数组功能,请使用std::vector
。
答案 1 :(得分:1)
两件事:
您的函数会指向cell
,但由于您将其视为2D数组,因此您应该将签名更改为接受cell ** arr
或{{{ 1}}其中cell arr[m][]
是数组的(固定)大小,必须指定。请注意,这些数据结构在内存中具有根本不同的表示形式 - 它们只具有相同的m
语法来访问元素。
如果将数组作为指向elem的指针传递,则无法使用[][]
函数来确定数组的长度。您需要将维度与数组一起传递,如下所示:
sizeof
答案 2 :(得分:0)
给出的定义基本上表示您的类没有定义operator [],这意味着您不能使用您尝试使用的语法。