2010-08-20 6 views
24

Existe-t-il un moyen de le faire sous une forme condensée?Attribuer plusieurs valeurs à un tableau dans C

GLfloat coordinates[8]; 
... 
coordinates[0] = 1.0f; 
coordinates[1] = 0.0f; 
coordinates[2] = 1.0f; 
coordinates[3] = 1.0f; 
coordinates[4] = 0.0f; 
coordinates[5] = 1.0f; 
coordinates[6] = 0.0f; 
coordinates[7] = 0.0f; 
return coordinates; 

Quelque chose comme coordinates = {1.0f, ...};?

+0

Retournez-vous un pointeur vers une variable locale, il? Certaines des choses que les gens ont dites dans les réponses/commentaires ci-dessous supposent soit que les variables impliquées sont automatiques, soit qu'elles ne le sont pas. Pourrait aider si vous spécifiez. –

+0

Une fois la structure initialisée, il n'y a pas de moyen facile d'assigner en masse des membres (autre que de faire une copie d'une autre structure avec 'memcpy'). Je me retrouve souvent en souhaitant avoir cette fonctionnalité. – bta

+0

Je pense que votre réponse originale est la meilleure - elle est intuitive, quoique un peu verbeuse, mais ce n'est pas un problème pour les compilateurs modernes. –

Répondre

20

Si vous vraiment attribuer des valeurs (par opposition à initialiser), vous pouvez le faire comme ceci:

GLfloat coordinates[8]; 
static const GLfloat coordinates_defaults[8] = {1.0f, 0.0f, 1.0f ....}; 
... 
memcpy(coordinates, coordinates_defaults, sizeof(coordinates_defaults)); 

return coordinates; 
+0

C'est une bonne idée, peut-être que je vais le faire de cette façon. – UnstableFractal

+0

Mieux encore, faites-le "statique const" et les compilateurs peuvent optimiser la variable dès la sortie du code. –

+0

@Zan: Bon point! –

3

Exactement, vous avez failli l'avez:

GLfloat coordinates[8] = {1.0f, ..., 0.0f}; 
+0

Que se passe-t-il si je l'ai fait et que je veux réaffecter après? – UnstableFractal

+3

@smsteel Cette syntaxe ne s'applique qu'aux déclarations –

+0

Ceci est mauvais .. Y at-il un autre moyen de le simplifier? :) – UnstableFractal

3

Vous peut utiliser:

GLfloat coordinates[8] = {1.0f, ..., 0.0f}; 

mais il s'agit d'une initialisation à la compilation - vous ne pouvez pas utiliser cette méthode dans la norme actuelle pour la réinitialiser (bien que je pense qu'il y ait des façons de le faire dans la prochaine norme, ce qui peut ne pas vous aider immédiatement).

Les deux autres moyens qui viennent à l'esprit sont à Blat le contenu s'ils sont fixés:

GLfloat base_coordinates[8] = {1.0f, ..., 0.0f}; 
GLfloat coordinates[8]; 
: 
memcpy (coordinates, base_coordinates, sizeof (coordinates)); 

ou fournissent une fonction qui ressemble à votre code d'initialisation de toute façon:

void setCoords (float *p0, float p1, ..., float p8) { 
    p0[0] = p1; p0[1] = p2; p0[2] = p3; p0[3] = p4; 
    p0[4] = p5; p0[5] = p6; p0[6] = p7; p0[7] = p8; 
} 
: 
setCoords (coordinates, 1.0f, ..., 0.0f); 

tenue à l'esprit ces ellipses (...) sont des espaces réservés, pas des choses à insérer littéralement dans le code.

4

Il y a un truc pour envelopper le tableau dans un struct (qui peut être initialisé après la déclaration).

ie.

struct foo { 
    GLfloat arr[10]; 
}; 
... 
struct foo foo; 
foo = (struct foo) { .arr = {1.0, ... } }; 
+0

Oh, vous n'aviez pas besoin de ça, juste une initialisation simple ferait l'affaire. Ne tenez pas compte de ma réponse. – domen

+0

Vous pouvez cliquer sur "supprimer" en bas à gauche de votre message si vous le souhaitez.= P –

+2

Oh, eh bien ... peut-être que quelqu'un le trouve utile :-) – domen

6

l'ancienne école:

GLfloat coordinates[8]; 
... 

GLfloat *p = coordinates; 
*p++ = 1.0f; *p++ = 0.0f; *p++ = 1.0f; *p++ = 1.0f; 
*p++ = 0.0f; *p++ = 1.0f; *p++ = 0.0f; *p++ = 0.0f; 

return coordinates; 
Questions connexes