2010-06-13 6 views
2

Dans la fonction make_quad() ci-dessous, comment définir les valeurs par défaut pour le tableau vertex_color dans la structure quad_t?Comment initialiser un tableau de structures dans une fonction?

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

Par ailleurs, une fonction pour faire et init un quad:

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

Il est évident que je peux le faire comme ceci:

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

mais ceci:

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

... résultats dans "erreur: expe expression cted avant '{' jeton ".

EDIT: Correction de fautes de frappe couple

+0

Missign après virgule rgba_t vertex_color [4]? – zoli2k

Répondre

4

Il y avait un certain nombre d'erreurs dans votre code, Je les ai tous corrigés ici. quad_t était déjà défini dans <sys/types.h> donc je l'ai changé à myquad_t. Fondamentalement, vous ne pouvez pas statiquement initialiser la mémoire dynamiquement alloué à l'exécution, ce que vous pouvez faire est créer un global qui est initialisé à la compilation que vous utilisez ensuite memcpy pour copier dans votre mémoire allouée dynamiquement.

Voici une explication de designated initializers.

côté
#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

S'il vous plaît poster le code réel. Ceci, par exemple:

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

ne compilera pas. Et il semble que vous essayez de faire une mission, pas d'initialisation. Si vous aviez déclaré struct correctement, vous seriez en mesure de dire:

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

mais pas:

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

J'ai omis le mot-clé 'struct' quand je l'ai saisi. Je l'ai réparé ci-dessus ... et à moins que j'ai raté quelque chose d'autre, ça compile. –

+0

C prend en charge l'affectation de structure ... – Artelius

+0

@Artelius non d'accolade contient des valeurs d'initialisation. –

1

Essayez

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

En C99, vous pouvez faire quelque chose comme

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

où la main droite est un soi-disant littéral composé. Tout compilateur moderne devrait implémenter ceci de la manière la plus efficace.

Mais il serait sans doute préférable d'être un peu plus systématique

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

puis il suffit d'écrire

 
*quad = (quad_t const)RGBA_INITIALIZER; 
Questions connexes