2010-06-13 33 views
2

在下面的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 } 
}; 

...结果在“错误:经过在'{'标记“之前插入表达式。

编辑:修正了几个错别字

+0

Missign分号rgba_t vertex_color后[4]? – zoli2k 2010-06-13 07:51:27

回答

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

请张贴实际的代码。例如:

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

不会编译。看起来你正在尝试做任务,而不是初始化。如果你已经正确声明的结构,你就可以说:

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

但不是:

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

我输入时省略了'struct'关键字。我已经把它修正了......除非我错过了其他的东西,那么它会编译。 – 2010-06-13 07:55:40

+0

C支持结构赋值... – Artelius 2010-06-13 07:58:01

+0

@Artelius不包含初始化值。 – 2010-06-13 07:59:54

1

尝试

memset(quad, 0xFF, sizeof(quad_t)); 
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;