在下面的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 :(得分: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;