如何在函数内初始化结构数组?

时间:2010-06-13 07:42:14

标签: c

在下面的make_quad()函数中,如何在quad_t结构中设置vertex_color数组的默认值?

/* RGBA color */
typedef struct {
    uint8_t r,g,b,a;
} rgba_t;

/* Quad polygon - other members removed */
typedef struct {
    rgba_t vertex_color[ 4 ];
} quad_t;

在其他地方,一个制作和初始化四边形的功能:

quad_t *make_quad() {
    quad_t *quad = malloc( sizeof( quad_t ) );
    quad->vertex_color = ??? /* What goes here? */
    return ( quad );
}

显然我可以这样做:

quad->vertex_color[ 0 ] = { 0xFF, 0xFF, 0xFF, 0xFF };
...
quad->vertex_color[ 3 ] = { 0xFF, 0xFF, 0xFF, 0xFF };

但是这个:

quad->vertex_color = {
    { 0xFF, 0xFF, 0xFF, 0xFF },
    { 0xFF, 0xFF, 0xFF, 0xFF },
    { 0xFF, 0xFF, 0xFF, 0xFF },
    { 0xFF, 0xFF, 0xFF, 0xFF }
};

...导致“错误:'{'令牌”之前的预期表达。

编辑:修正了几个拼写错误

4 个答案:

答案 0 :(得分:4)

您的代码中存在许多错误,我已在此处更正了所有错误。 quad_t已定义<sys/types.h>,因此我将其更改为myquad_t

基本上,您无法静态初始化在运行时动态分配的内存,因此您可以创建一个在编译时初始化的全局,然后使用memcpy将其复制到动态分配的内容中记忆。

以下是designated initializers的解释。

#include    <stdlib.h>
#include    <string.h>
#include    <stdint.h>

/* RGBA color */
typedef struct rgba {
    uint8_t r,g,b,a;
} rgba_t;

/* Quad polygon - other members removed */
typedef struct quad {
    rgba_t vertex_color[ 4 ];
} myquad_t;

static const myquad_t init_quad = {
     .vertex_color[ 0 ... 3 ] = { 0xFF, 0xFF, 0xFF, 0xFF } 
    };    

myquad_t *make_quad() {
    myquad_t *q = malloc( sizeof( myquad_t ) );
    memcpy(q , &init_quad, sizeof( myquad_t ) );
    return ( q );
}    

int main(void) {

    myquad_t * q = make_quad();

    return 0;
}

答案 1 :(得分:1)

请发布实际代码。例如:

typedef {
    uint8_t r,g,b,a;
} rgba_t;

不会编译。似乎你正在尝试做任务,而不是初始化。如果你已经正确地声明了结构,你可以说:

rgba_t t = { 1,2,3,4 };

但不是:

t = { 1,2,3,4 };

答案 2 :(得分:1)

尝试

memset(quad, 0xFF, sizeof(quad_t));

答案 3 :(得分:1)

在C99中,您可以执行类似

的操作
*quad = (quad_t const){
  .vertex_color = {
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF },
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF },
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF },
    { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF },
  }
};

其中右侧是所谓的复合文字。 任何现代编译器都应该以最有效的方式实现它。

但是,更系一点可能会更好

#define RGBA_INITIALIZER { .r = 0xFF, .g = 0xFF, .b = 0xFF, a. = 0xFF }
#define QUAD_INITIALIZER {                      \
.vertex_color = {                               \
  RGBA_INITIALIZER, RGBA_INITIALIZER,           \
  RGBA_INITIALIZER, RGBA_INITIALIZER            \
  }                                             \
}

然后写下

*quad = (quad_t const)RGBA_INITIALIZER;