可以在声明后填充结构数组吗?

时间:2013-09-02 21:34:40

标签: c arrays struct

我对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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

是的,你可以做到。结构可以作为参数传递给函数,可以由函数返回,也可以是运算符的L值和R值。

答案 2 :(得分: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标准的一部分,而使用初始化则是。

答案 3 :(得分: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,并且您无法在同一范围内两次定义相同的名称。 / p>

第三行编译器消息是不可理解的。您将了解到给定线路上的第一个误差通常是准确的;来自同一行的第二个和后续错误消息(或第一行之后的行有错误)通常只是表明编译器由于第一个问题而混淆,并且因此错误解释了行的其余部分。我怀疑'无效的初始化程序'警告符合该类别。我们无法确定,因为您的代码中没有显示第33行和第39行。