Accès les membres de la structure, comme si ils sont un seul tableau?

J'ai deux structures, avec des valeurs de calcul réfléchi à un moyen, comme cette version simplifiée:

typedef struct
{
  int v_move, v_read, v_suck, v_flush, v_nop, v_call;
} values;

typedef struct
{
  int qtt_move, qtt_read, qtt_suck, qtd_flush, qtd_nop, qtt_call;
} quantities;

Puis-je les utiliser pour calculer:

average = v_move*qtt_move + v_read*qtt_read + v_suck*qtt_suck + v_flush*qtd_flush + v_nop*qtd_nop + v_call*qtt_call;

Chaque maintenant et eux j'ai besoin d'une autre variable. Maintenant, par exemple, j'ai besoin d'inclure v_clean et qtt_clean. Je ne peux pas changer les structures de tableaux:

typedef struct
{
    int v[6];
} values;
typedef struct
{
    int qtt[6];
} quantities;

Qui simplifierait beaucoup mon travail, mais ils font partie d'une API qui ont besoin de noms de variables pour être clair.

Donc, je suis à la recherche d'un chemin pour accéder aux membres de que les structures, peut-être à l'aide de sizeof(), afin que je puisse les traiter comme un tableau, mais toujours garder l'API immuable. Il est garanti que toutes les valeurs sont int, mais je ne peux pas garantir de la taille d'un int.

Écrit la question est venu à mon esprit... Peut un union faire le travail? Est-il un autre moyen astucieux pour automatiser la tâche de l'ajout d'un autre membre?

Grâce,
Beco

  • Afin de mieux vous aider, nous devons savoir comment l'api est...
  • De l'extérieur, le programmeur doit être autorisé à conserver l'ancien code en cours d'exécution. Que le code à utiliser des lignes comme: v. v_move=1. Cela ne peut pas briser.
  • Un peu compliqué, mais vous pouvez effectuer une itération sur struct champs... regardez cette réponse
  • merci! Très beau travail avec #define. Je pense que ma question est plus facile, car ils sont tous garantis int. Mais néanmoins, il est une astuce il faut garder à l'esprit.
  • Pourquoi ne puis-je pas utiliser const int *qt = &(quantities.qtt_move);? Lors de la compilation de la ligne: qt[i]=3; il retourne une erreur: assignment of read-only location ‘*(qt + (long unsigned int)((long unsigned int)i * 4ul)). Ce n'est pas que je vais changer le pointeur lui-même, mais le déréférencement de certains index!
  • La réponse pour le commentaire ci-dessus (const pointer) peut être trouvé here.

InformationsquelleAutor Dr Beco | 2011-04-02