1

二重リンクリスト内のノードを更新するために使用される関数について、次の宣言が与えられます。

uint8 dl_update(DL_LIST **node, uint16 new_tag, void *new_object,
    uint32 new_size, void (*destructor)(void*))

そして、その関数への次の呼び出し:

dl_update(&dlt_list, _TAG, zulu, sizeof(*zulu),
    (void(*)(void*)) &_free_dlt_object(delta));

最後の引数は、コンパイラが「単項'&'演算子として必要な左辺値」というエラーメッセージを出力する原因になるのでしょうか。私が渡しているデストラクタ関数(およびそれが動作する構造)は、次のように定義されています。

typedef struct DLT_OBJECT {
    char *word;
    uint8 number;
} DLT_OBJECT;

void _free_dlt_object(DLT_OBJECT *object) {
    free(object->word);
    free(object);
}

次の質問は、関数ポインターをキャストしても問題ないことを示唆しているようです。したがって、私のコードがベアメタル組み込みシステムで実行されていることを考えると、そうすることが問題の原因であるとは思われません(質問)わかりません。

これは単純な文法エラーの場合ですか、それとも構造的な問題ですか?私は、voidポインター引数を使用して関数ポインターを宣言することが、一般的な関数ポインターを他の関数に渡す良い方法であるという印象の下で操作してきました...

4

1 に答える 1

2

関数ポインタを使用する場合は、関数を渡すだけなので、次のように呼び出します。

dl_update(&dlt_list, _TAG, zulu, sizeof(*zulu), _free_dlt_object);
于 2013-02-19T21:06:40.620 に答える