这是一个如此愚蠢的问题,即使提出它也令人沮丧。拜托,请耐心等待,今天我对这一个感到特别愚蠢....
我有一个带有某个typedef结构的库。基本上:
typedef struct {int x; int y;} coords;
我真正想做的是在我的标题中声明一个变量数组:
coords MyCoords[];
(我最近将其切换为coords *MyCoords;
,然后运行了MyCoords = new coords[4];
)
然后在我的init中我想在其中硬编码一些值。
MyCoords[] = {{0, 0}, {2, 2} etc.
我今天一定只是在脑力激荡,因为它不会让我做任何简单的事情,甚至像MyCoords[0] = {0, 0}
抱歉上面的一些语法。谢谢你的帮助。我甚至不关心一次对所有值进行硬编码。我现在很好,只需要MyCoords[0] = {0, 0}
工作。我可以做MyCoords[0].x = 0; MyCoords[0].y = 0
然后我永远不知道我做错了什么。非常感谢任何人..
答案 0 :(得分:9)
您只能在声明它的同一位置初始化数组。可行的表格是:
coords MyCoords[] = {{0, 0}, {2, 2}};
如果您需要在标题中声明MyCoords以便许多模块可以访问它,我认为以下内容将起作用:
extern coords MyCoords[];
答案 1 :(得分: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(1999版C)引入了所谓的复合文字。它允许你写
MyCoords[0] = (coords){0, 0};
它实际上会按照您的意愿执行 - 创建coord
类型的右侧值并将其分配到左侧。但是你应该只是因为兼容性原因(许多C编译器不合理C99兼容 - 而C ++和C89都不支持复合文字),请使用我之前向您展示的方法之一。
答案 2 :(得分:2)
我不确定这是否也是您实际代码中的问题,但是:
typedef struct coords {int x, int y};
不是C中的完整typedef声明,因为它没有给 type 命名,只给结构(struct标签与标准C中的类型名称不在同一名称空间中) 。要使typedef声明正确,您必须为整个类型struct coords {int x, int y}
指定一个名称,就好像您声明了该类型的变量一样,如下所示:
typedef struct coords {int x, int y} coords;
答案 3 :(得分:0)
应该是:
typedef struct coords {int x, int y} coords;
coords MyCoords[] = {{0, 0}, {2, 2}, {3, 4}};