0

我对C相当陌生,想知道我是否可以先初始化一个设定大小的结构数组,然后在声明后用实际的结构填充数组。下面的代码片段展示了我想要做的事情,它应该非常简单。

/* Make rectangle 2D object */
struct two_d_obj rect = {0, 4, {0, 0, 1}, {0, 0}, {0, -20.0}, {{0, 0}, {0.1, 0.1}, {0, 0.1}, {0.1, 0}}};
struct two_d_obj obj_array[25];
obj_array[0] = rect;

但是,在尝试编译此代码时,出现以下错误:

hellomousept2.c:39: error: conflicting types for ‘obj_array’
hellomousept2.c:33: error: previous definition of ‘obj_array’ was here
hellomousept2.c:39: error: invalid initializer

同样,我是 C 的新手,主要是 Java 的代码,所以任何帮助我走上正轨的帮助都将受到高度赞赏,并提前致谢。

编辑:下面是我的 two_d_obj 结构的代码

struct two_d_obj
{
    int iType; /*integer signifying shape of object (0 for rect, 1 for circle) */
    int num_vertices; /* number of vertices contained in the shape */
    double color[3]; /*array containing RGB values signifying color of object */
    double center_pos[2]; /*center position of object */
    double velocity[2]; /*velocity of object */
    double vertex_array[50][2]; /*array of vertice coordinates (read in pairs
                             x coordinate followed by y coordinate)
                             protocol: first pair of coordinates is bottom left
                             vertice, pairs that follow are vertices going
                             counter-clockwise       
                             */
};
4

4 回答 4

0

使用 C99(或更高版本)“复合文字”允许您编写:

struct two_d_obj obj_array[25];
obj_array[0] = (struct two_d_obj){ 0, 4, {0, 0, 1}, {0, 0}, {0, -20.0},
                                   { {0, 0}, {0.1, 0.1}, {0, 0.1}, {0.1, 0} } };

从语法上讲,复合文字由一个指定类型的强制转换和一个带有适合强制转换中指定类型的初始值的大括号初始化器组成。它可以在需要相同类型的值的任何地方使用。

但是,您的直接问题是,就在问题中的代码之前(或者可能就在之后),您还定义obj_array了 ,并且您不能在同一范围内两次定义相同的名称。

编译器消息的第三行令人费解。您将了解到给定行的第一个错误通常是准确的;来自同一行的第二条和随后的错误消息(或出现错误的第一行之后的行)通常只是表明编译器由于第一个问题而感到困惑并因此误解了该行的其余部分。我怀疑“无效初始化程序”警告属于该类别。我们不能确定,因为您没有在代码中同时显示第 33 行和第 39 行。

于 2013-09-02T21:58:38.550 回答
0

好吧,如果它是一个结构,你总是可以做一个 memcpy

struct two_d_obj rect = { ... };
struct two_d_obj obj_array[25];
memcpy(obj_array,&rect,sizeof(two_d_obj ));

如果你想初始化更多的数组成员,只需循环

for (i = 0; i < 25; ++i)
  memcpy(obj_array + i,&rect,sizeof(rect));
于 2013-09-02T21:49:51.567 回答
0

是的,你可以做到。结构可以作为参数传递给函数,可以由函数返回,并且可以是运算符的左值和右值。

于 2013-09-02T21:50:10.293 回答
0

是的,您可以声明一个数组,然后填充它。使用简单类型的简单示例:

char str[12];
char str[0] = 'a';

也可以通过赋值 (=) 复制复合类型的值:

struct foo {
    int x;
    int y;
};

struct foo A = {
    .x = 1,
    .y = 2
};

struct foo B = A;

A 和 B 现在将是两个具有相同值的独立结构。使用数组:

struct foo fooray[10];
fooray[0] = A;

您也可以通过初始化来做到这一点:

struct foo fooray[10] = { A };

意思是,第一个元素fooray将等于预定义的 struct foo A。如果以这种方式(部分)初始化数组,则数组的其余元素将被清零,因此:

struct foo fooray[10] = { { 0, 0 } };
// or more simply:
struct foo fooray[10] = { 0 };

将是一个包含所有零元素的数组。请注意,出于安全原因,大多数现代操作系统无论如何都会将堆栈内存归零,但这不是 C 标准的一部分,而使用初始化是。

于 2013-09-02T21:50:19.757 回答