我正在为一个嵌入式应用程序尝试使用 ANSI C 实现结构体的先进先出 (FIFO) 队列。实现这一目标最直接的方法似乎是通过实现链表,使得每个结构体都包含指向队列中下一个结构体的指针。因此,我将结构体本身定义为:
typedef enum { LED_on, LED_off, etc } Action;
typedef struct Queued_Action QueuedAction;
struct Queued_Action
{
Action action;
int value;
QueuedAction *nextAction;
};
到目前为止一切顺利。如果我将指针定义为队列中第一个和最后一个项目:
QueuedAction *firstAction;
QueuedAction *lastAction;
如果涉及到添加新的操作到队列中,可以通过以下方式进行说明:
if (!add_action_to_queue(LED_on, 100, &lastAction))
printf("Error!\n);
...因此,当返回时,lastAction将指向队列中新创建的最后一个动作的指针。因此,将动作添加到队列的例程将如下所示:
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;
}
除了这段代码无法编译之外,一切都很好。错误出现在这行代码:。
*lastAction -> nextAction = newQueuedAction;
......编译器声称“->”左侧的项目不是有效的结构体。但是,它肯定是有效的。如果我实际上进行了本应该是完全多余的强制转换:
fakeAction = (QueuedAction *)(*lastAction);
fakeAction -> nextAction = newQueuedAction;
如果编译器没有报错,那么一切都很顺利。但是,我担心错误信息暗示了我可能做错了一些微妙的事情。所以(言归正传),有人能告诉我为什么编译器不满意,以及是否有更好的方法来实现我在这里尝试做的事情吗?