3
votes

Que signifient les crochets autour d'une énumération? [valeur enum]

Je tourne actuellement ma tête autour des machines à états appropriées , et j'ai trouvé cet article qui semble être exactement ce que je cherchais: https://aticleworld.com/state-machine-using-c/ Dans le processus de compréhension de la table de la machine à états basée sur une table, je suis tombé sur ce morceau de code qui, à mon avis, est assez difficile à lire.

Donc, c'est aussi loin que je peux venir:

  • eSystemState est une énumération typée qui indique l'état actuel.

  • eSystemEvent est une énumération typée qui indique l'événement en cours.

  • pfEventHandler est un pointeur de fonction typé renvoyant eSystemState.

  • afEventHandler est un tableau bidimensionnel à défilement typé (limité par "last_State" et "last_Event") de pointeurs de fonction renvoyant eSystemState.

Ensuite, quelques gestionnaires d'événements pour chaque type d'événement. Puis début de main, un peu d'initialisation et le tour est joué.

Le type afEventHandler précédemment défini est rempli de contenu, mais les opérations qui y sont utilisées sont un grand mystère pour moi.

Je sais que pour chaque accolade, une nouvelle «ligne» est remplie, mais que signifient les crochets autour des énumérations, et pourquoi peut-on apparemment attribuer une valeur à tout ce qui en sort?

Je sais que les énumérations sont essentiellement des nombres, et je soupçonne que c'est une manière (pour moi) super obscure d'adresser un élément spécifique dans un tableau.

Ai-je tort?

 // Table to define valid states and event of finite state machine
 static afEventHandler StateMachine = {
 [Idle_State] ={[Card_Insert_Event]= InsertCardHandler },
 [Card_Inserted_State] ={[Pin_Enter_Event] = EnterPinHandler },
 [Pin_Eentered_State] ={[Option_Selection_Event] = OptionSelectionHandler},
 [Option_Selected_State] ={[Amount_Enter_Event] = EnterAmountHandler},
 [Amount_Entered_State] ={[Amount_Dispatch_Event] = AmountDispatchHandler}, 
 };


2 commentaires

La différence entre ma question et ce "doublon" est que je n'avais aucune idée de ce que fait le code et le train de la pensée est l'inverse. Les gens qui font face à la même situation que moi ne chercheront certainement pas au hasard "initialiseur désigné".


Ainsi, votre question survivra et fournira du matériel de recherche utile tandis que le lien en double mènera le chercheur à une réponse complète.


3 Réponses :


6
votes

Cette syntaxe est destinée à un initialiseur désigné . Il vous permet d'initialiser des éléments spécifiques d'un tableau.

La valeur entre crochets est l'index de l'élément du tableau à initialiser. Dans ce cas, il s'agit d'une valeur d'énumération, mais il peut s'agir de n'importe quel entier.


0 commentaires

1
votes

Les crochets marquent les indices du tableau. Les identificateurs enum qu'ils contiennent sont simplement des expressions ordinaires, remplacées par les valeurs enum .

C vous permet d'initialiser des tableaux en utilisant des indices explicites, appelés désignateurs em>. Par exemple, cela initialise A [1] à 4:

int B[3][4] =
{
    [1] = { [3] = 7 }
};

(Les autres éléments par défaut à zéro.)

Avec un tableau à deux dimensions, la syntaxe se complique:

int A[3] = { [1] = 4 };

Cela initialise B [1] [3] à 7. C'est le syntaxe que vous voyez dans le code auquel vous faites référence. Il utilise ensuite des identifiants enum comme Idle_State au lieu des exemples de constantes 1 , 3 et 7 illustré ci-dessus.


0 commentaires

0
votes

Je l'ai trouvé moi-même, c'est un " initialiseur désigné " qui spécifie en effet quel élément doit être défini par une valeur choisie.

Il a été introduit dans C99 ce qui explique pourquoi je ne l'ai pas fait ' Je ne sais pas. D'autres éléments sont initialisés à 0.

Je vais laisser la question ici à d'autres qui pourraient s'interroger sur la même chose. Comment initialiser seulement quelques éléments d'un tableau avec quelques valeurs?

int a[10][10] = {
{},
{[5] = 8}
};

Signifie que dans la deuxième ligne, l'élément 5 va être initialisé à huit, les autres seront à zéro.


0 commentaires