Freebsdのキュー(3)マクロの内部動作を理解しようとしています。同じトピックについて以前に質問しましたが、これはフォローアップの質問です。
要素をキューに挿入する関数を定義しようとしています。queue(3)STAILQ_INSERT_HEAD
は、キューの先頭へのポインター、キュー内のアイテムのタイプ、および挿入されるアイテムを必要とするマクロを提供します。私の問題は私が得ているということです
stailq.c:31: warning: passing argument 1 of 'addelement' from incompatible pointer type
のアドレスを関数に渡そうとするとエラーが発生しhead
ます。完全なソースコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>
struct stailq_entry {
int value;
STAILQ_ENTRY(stailq_entry) entries;
};
STAILQ_HEAD(stailhead, stailq_entry);
int addelement(struct stailhead *h1, int e){
struct stailq_entry *n1;
n1 = malloc(sizeof(struct stailq_entry));
n1->value = e;
STAILQ_INSERT_HEAD(h1, n1, entries);
return (0);
}
int main(void)
{
STAILQ_HEAD(stailhead, stailq_entry) head = STAILQ_HEAD_INITIALIZER(head);
struct stailq_entry *n1;
unsigned i;
STAILQ_INIT(&head); /* Initialize the queue. */
for (i=0;i<10;i++){
addelement(&head, i);
}
n1 = NULL;
while (!STAILQ_EMPTY(&head)) {
n1 = STAILQ_LAST(&head, stailq_entry, entries);
STAILQ_REMOVE(&head, n1, stailq_entry, entries);
printf ("n2: %d\n", n1->value);
free(n1);
}
return (0);
}
私が知る限り、head
は型struct stailhead
であり、addelement
関数はへのポインタも期待していますstruct stailhead
。
STAILQ_HEAD(stailhead, stailq_entry);
に展開:
struct stailhead {
struct stailq_entry *stqh_first;
struct stailq_entry **stqh_last;
};
ここで何が欠けていますか?
ありがとう。