C硬编码typedef结构的数组

时间:2009-04-21 16:30:28

标签: c++ c arrays struct declaration

这是一个如此愚蠢的问题,即使提出它也令人沮丧。拜托,请耐心等待,今天我对这一个感到特别愚蠢....

我有一个带有某个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然后我永远不知道我做错了什么。非常感谢任何人..

4 个答案:

答案 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}};