Pour une application embarquée, j'essaie d'implémenter une file d'attente FIFO (first-in, first-out) à l'aide de ANSI C. La façon la plus directe de le faire semble être linked-list, de sorte que chaque structure contienne un pointeur vers le suivant dans la file d'attente. Par conséquent je définis la structure elle-même comme:Implémentation d'une file d'attente FIFO en C
typedef enum { LED_on, LED_off, etc } Action;
typedef struct Queued_Action QueuedAction;
struct Queued_Action
{
Action action;
int value;
QueuedAction *nextAction;
};
Jusqu'ici tout va bien. Si je définis des pointeurs vers les premier et dernier éléments dans la file d'attente:
QueuedAction *firstAction;
QueuedAction *lastAction;
... je voudrais être en mesure d'ajouter une nouvelle action à la file d'attente en déclarant (par exemple):
if (!add_action_to_queue(LED_on, 100, &lastAction))
printf("Error!\n);
... donc, à son retour, lastAction serait un pointeur vers la dernière action nouvellement créée dans la file d'attente. D'où la routine pour ajouter l'action à la file d'attente ressemblerait à ceci:
int add_action_to_queue(Action newAction, int newValue, QueuedAction **lastAction)
{
QueuedAction *newQueuedAction;
// Create a new action in memory
if ((newQueuedAction = (QueuedAction *)malloc(sizeof(QueuedAction))) == NULL)
return 0;
// Make the old 'lastAction' point to the new Action,
// and the new Action to point to NULL:
*lastAction -> nextAction = newQueuedAction;
newQueuedAction -> nextAction = NULL;
newQueuedAction -> action = newAction;
newQueuedAction -> value = newValue;
// Designate the new Action as the new lastAction:
*lastAction = newQueuedAction;
return 1;
}
tout irait bien et dandy, à l'exception de ce code ne compilera pas. L'erreur est à la ligne en disant
*lastAction -> nextAction = newQueuedAction;
... où le compilateur prétend l'élément à gauche du « -> » est pas un struct valide. Sûrement, cependant, cela doit être. Si en fait je fais ce qui devrait être une distribution entièrement redondante:
fakeAction = (QueuedAction *)(*lastAction);
fakeAction -> nextAction = newQueuedAction;
... alors le compilateur est plutôt content. Cependant, je suis inquiet que le message d'erreur fasse allusion à quelque chose de subtil que je puisse faire mal ici. Donc (pour arriver au point), quelqu'un peut-il me dire pourquoi le compilateur n'est pas content, et s'il y a une meilleure façon de faire ce que j'essaie de faire ici.
Je ne peux même pas lire aussi vite que vous répondez ;-) Merci – frast
vous tous les deux; c'était en effet un problème de priorité d'opérateur, et mettre les parenthèses autour (* lastAction) résout le problème. –