开发者

How to initialize an array of structures within a function?

In the make_quad() function below, how do I set the default values for the vertex_color array in the quad_t structure?

/* 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;

Elsewhere, a function to make and init a quad:

quad_t *make_quad() {
    quad_t *quad = malloc( sizeof( quad_t ) );
    quad->vertex_co开发者_开发知识库lor = ??? /* What goes here? */
    return ( quad );
}

Obviously I can do it like this:

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

but this:

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

...results in "error: expected expression before '{' token".

EDIT: Fixed a couple typos


There were a number of errors in your code, I've corrected them all here. quad_t was already defined in <sys/types.h> so I changed it to myquad_t.

Basically, you can't statically init memory that's dynamically allocated at run-time, so what you can do is create a global which is initialized at compile time which you then use memcpy to copy into your dynamically allocated memory.

Here is an explanation of 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;
}


Please post the actual code. This, for example:

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

won't compile. And it seems you are trying to do assignment, not initialisation. If you had declared the struct properly, you would be able to say:

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

but not:

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


Try

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


In C99 you could do something like

*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 },
  }
};

where the right hand side is a so-called compound literal. Any modern compiler should implement this in the most efficient way.

But it would probably be better to be a bit more systematic

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

and then just write

*quad = (quad_t const)RGBA_INITIALIZER;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜