web-dev-qa-db-fra.com

Attribuer plusieurs valeurs au tableau en C

Est-il possible de le faire sous une forme condensée?

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, ...};?

27
UnstableFractal

Si vous voulez vraiment assigner valeurs (par opposition à initialize ), 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; 
23
James Curran

Le chemin de la vieille é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;
10
Pavel Minaev

Il y a une astuce pour envelopper le tableau dans une structure (qui peut être initialisée après la déclaration).

c'est à dire.

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

Exactement, vous l'avez presque eu:

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

Vous pouvez utiliser:

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

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

Les deux autres façons qui me viennent à l’esprit sont de blasser le contenu s’il est corrigé:

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

ou fournissez une fonction qui ressemble quand même à votre code d'initialisation:

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);

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

3
paxdiablo

Si vous faites beaucoup les mêmes tâches dans votre programme et que vous voulez un raccourci, la solution la plus simple pourrait être simplement d'ajouter une fonction.

static inline void set_coordinates(
        GLfloat coordinates[static 8],
        GLfloat c0, GLfloat c1, GLfloat c2, GLfloat c3,
        GLfloat c4, GLfloat c5, GLfloat c6, GLfloat c7)
{
    coordinates[0] = c0;
    coordinates[1] = c1;
    coordinates[2] = c2;
    coordinates[3] = c3;
    coordinates[4] = c4;
    coordinates[5] = c5;
    coordinates[6] = c6;
    coordinates[7] = c7;
}

et ensuite simplement appeler

GLfloat coordinates[8];
// ...
set_coordinates(coordinates, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f);
0
dpi