Mise en œuvre d'une file d'attente FIFO en C

Pour une application embarquée, je suis en train de mettre en œuvre une méthode du premier entré, premier sorti (FIFO) de la file d'attente de structures à l'aide de la norme ANSI C. la façon La plus simple de faire ce qui semble être par la mise en œuvre d'une liste liée, de sorte que chaque structure contient un pointeur vers le suivant dans la file d'attente. J'ai donc définir la structure elle-même:

typedef enum { LED_on, LED_off, etc } Action;
typedef struct Queued_Action QueuedAction;

struct Queued_Action
{
    Action       action;
    int          value;
    QueuedAction *nextAction;
};

So far So good. Si je définir des pointeurs vers les premier et dernier éléments de la file d'attente comme:

QueuedAction *firstAction;
QueuedAction *lastAction;

...alors, je voudrais être en mesure d'ajouter une nouvelle action à la file d'attente en indiquant (par exemple):

if (!add_action_to_queue(LED_on, 100, &lastAction))
     printf("Error!\n);

...donc sur le retour, lastAction serait un pointeur vers la nouvellement créée, la dernière action dans la file d'attente. D'où la routine pour l'ajout de l'action à la file d'attente ressemblerait à:

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 dans le meilleur des mondes, sauf que ce code ne compile pas. L'erreur est à la ligne en disant

*lastAction -> nextAction = newQueuedAction;

...où le compilateur revendications de l'élément à gauche de la '-> " n'est pas valide struct. Certes, toutefois, il doit l'être. Si, en fait, je fais ce que devrait être une filiale redondant cast:

fakeAction = (QueuedAction *)(*lastAction);
fakeAction -> nextAction = newQueuedAction;

...puis le compilateur est assez heureux. Cependant, je suis inquiet que le message d'erreur est faire allusion à quelque chose de subtil que j'ai fait de mal ici. (À venir au point), quelqu'un peut me dire pourquoi le compilateur n'est pas heureux, et si il ya une meilleure façon de faire ce que j'essaie de faire ici.

OriginalL'auteur Eos Pengwern | 2010-10-18