0

私が調べたところ、私を助けることができる資料が見つからなかったので、尋ねなければなりませんでした. これはコードです:

list.h:

typedef struct List_t *List;

list.c:

#include "list.h"
#include <stdlib.h>
#include <stdio.h>


typedef struct Item_t
{
    struct Item_t* next;
    ListElement data;
}*Item;

typedef struct List_t
{
    Item head;
    Item iterator;
    CopyListElement copyFunc;
    FreeListElement freeFunc;
};

list_example_test.c:

#include "list.h"
#include <stdlib.h>
#include <stdio.h>
ListElement copyA(ListElement a)
{
    return a;
}
void destroyA(ListElement a)
{
}
bool testListCreate();
bool testListCopy()
{
    List list1=listCreate(copyA,destroyA);
    listInsertFirst(list1,(void*)6);
    listInsertFirst(list1,(void*)2);
    listInsertFirst(list1,(void*)1);
    List list2=listCopy(list1);
    listClear(list1);
    if(list2->head==NULL) //here is the error!!
    {
        return false;
    }
    return true;
}

コードの最後の部分は、listCopy() 関数が機能するかどうかをチェックすることになっています。コンパイラは List という名前を認識し、「list2->」と入力すると、List のフィールドをオートコンプリートするように提案されます (この例では、「list2->head」を選択しました。問題の原因とその修正方法を教えてください。ありがとう!

4

2 に答える 2

2

structList_tの定義を.hファイルに移動します。

list_example_test.cにはstructList_tの定義がなく、それが(.hファイルからの)structであることを知っているだけなので、コンパイラーはList_tの「head」メンバーへのオフセットを計算する方法がありません。

于 2011-04-26T10:18:18.167 に答える
1

List_tに関する限り、不完全なタイプlist_example_test.cです。これは実際には、データをカプセル化するための C の一般的なイディオムです。リストの内部に直接アクセスせずに List_t 型の項目を操作できるように、どこかに関数を定義する必要があります。listNext(List_t)おそらく、どこかに似たようなものやlistIterate(List_t)定義されたものがあることに気付くでしょう。wherelistCopy()が宣言されているのと同じファイルを調べます。

于 2011-04-26T10:42:39.093 に答える