3

这是一个愚蠢的问题,即使问它也令人沮丧。请多多包涵,我今天对这个特别傻……

我有一个带有特定 typedef 结构的库。基本上:

typedef struct {int x; int y;} coords;

我真正想做的是在我的头文件中声明一个变量数组:

coords MyCoords[];

(我最近将其切换为 justcoords *MyCoords;然后运行 ​​a MyCoords = new coords[4];

然后在我的初始化中,我想在其中硬编码一些值。

MyCoords[] = {{0, 0}, {2, 2} etc. 

我今天一定只是在放屁,因为它不允许我做任何简单的事情,甚至像这样简单的东西MyCoords[0] = {0, 0}

对上面的一些语法感到抱歉。谢谢你的帮助。我什至不关心一次硬编码所有值。我现在可以正常MyCoords[0] = {0, 0}工作了。我可以做MyCoords[0].x = 0; MyCoords[0].y = 0,但我永远不会弄清楚我做错了什么。非常感谢任何人..

4

4 回答 4

9

您只能在声明它的同一位置初始化一个数组。有效的形式是:

coords MyCoords[] = {{0, 0}, {2, 2}};

如果您需要在标头中声明 MyCoords 以便许多模块可以访问它,我认为以下方法将起作用:

extern coords MyCoords[];
于 2009-04-21T16:37:06.567 回答
5

好吧,您创建的不是变量数组。这是一个大小未知的数组。该数组的类型不完整,因此不能在 C++ 中定义。你能做的就是把它放在extern它前面,让它成为一个声明。

extern coords MyCoords[];

然后,在初始化它的 .cpp 文件中,您可以创建(定义)该数组 - 请注意,您应该在命名空间范围内执行此操作,当然,在任何函数之外:

coords MyCoords[] = {{1, 2}, {3, 4}, ... };

如果你想要的是一个数组,它的大小在编译时未知,而是在运行时,你应该使用std::vector

std::vector< coords > MyCoords;

然后稍后如果你填写它,做

MyCoords.push_back( coords(1, 2) );
MyCoords.push_back( coords(3, 4) );
....

或者创建一个本地数组,然后使用该数组元素的副本初始化向量:

coords c[] = ....;
MyCoords.insert(MyCoords.end(), c, c + sizeof c / sizeof *c);

嗯,在 C 中,它与在 C++ 中略有不同。您可以定义一个维度未知的数组。发生的事情是它被视为“暂定”定义。如果在文件的末尾(更准确地说,它的翻译单元,即该文件,以及它包含的所有文件 - 意味着编译器一起翻译的所有内容)没有包含大小的后续定义,那么大小被认为是1。但是,在 C++ 中没有暂定定义,不包含大小且不包含可以判断大小的初始化程序的定义是无效的 C++ 程序。

由于您的代码变得贪婪的原因,您正在做

MyCoords[0] = {0, 0}

编译器将读取为:

-> Set LHS to RHS
-> -> LHS is a variable of type `coords`. Fine
-> -> RHS is... hmm, `{0, 0}`. What the heck is it??

你看,编译器不知道右手边应该是什么意思。出于这个原因,C99(C 的 1999 版)引入了所谓的复合文字。它允许你写

MyCoords[0] = (coords){0, 0};

它实际上会做你想做的事——创建一个右侧的类型值coord并将其分配给左侧。但是,出于兼容性原因(许多 C 编译器不合理地兼容 C99 - C++ 和 C89 都不支持复合文字),您应该使用我之前向您展示的方法之一。

于 2009-04-21T16:43:48.063 回答
2

我不确定这是否也是您的实际代码中的问题,但是:

typedef struct coords {int x, int y};

不是 C 中的完整 typedef 声明,因为它没有给type命名,只给 struct (struct 标签与标准 C 中的类型名称不在同一个命名空间中)。要使 typedef 声明正确,您必须为整个 type 指定一个名称struct coords {int x, int y},就好像您要声明该类型的变量一样,如下所示:

typedef struct coords {int x, int y} coords;
于 2009-04-21T16:48:15.043 回答
0

它应该是:

typedef struct coords {int x, int y} coords;
coords MyCoords[] = {{0, 0}, {2, 2}, {3, 4}};
于 2009-04-21T17:13:02.317 回答