еще один вопрос "разыменование точки неполного типа" - PullRequest
0 голосов
/ 26 апреля 2011

Я проверил и не нашел никаких материалов, которые могут мне помочь, поэтому мне пришлось спросить.это код:

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». что является причиной проблемы и как ее исправить? спасибо!

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Переместите определение struct List_t в файл .h.

У list_example_test.c нет определения структуры List_t, он знает только, что это структура (из файла .h), поэтомуу компилятора нет возможности вычислить смещение элемента "head" в List_t.

1 голос
/ 26 апреля 2011

List_t является неполным типом в отношении list_example_test.c. На самом деле это распространенная идиома в Си для инкапсуляции данных. Где-то должны быть определены функции, позволяющие вам манипулировать элементами типа List_t без прямого доступа к внутренним элементам списка. Возможно, вы обнаружите, что где-то определено что-то вроде listNext(List_t) или listIterate(List_t). Посмотрите в том же файле, где объявлено listCopy().

...