4

組み込みアプリケーションの場合、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;

...その後、コンパイラは非常に満足しています。ただし、エラーメッセージが、ここで間違っている可能性がある微妙な何かを示唆しているのではないかと心配しています. ですから (要点を言えば)、なぜコンパイラが満足していないのか、そして私がここでやろうとしていることを行うためのより良い方法があるかどうか、誰か教えてもらえますか?

4

4 に答える 4

5

やってみました:

(*lastAction) -> nextAction = newQueuedAction;
于 2010-10-18T07:26:27.290 に答える
3

これを行うこともできます:

(*lastAction)->nextAction

オペレーターの身だしなみの問題だと思います。

于 2010-10-18T07:29:24.547 に答える
1

キューを処理できる小さなライブラリを作成しました。「ウルトラキュー

C++ で書かれていますが、ANSI C と完全に互換性があります。必要に応じて、ANSI C に簡単に変換できます。

ソースコードは GIT から入手できます。

グルツ

于 2010-12-11T16:02:57.137 に答える