2010-10-28 5 views
20

ich diesen Fehler erhalten, während diese .c Quelldatei kompilierenSpeichergröße von ‚Namen‘ ist nicht bekannt

/INIT_SOURCE_BUILD/src/names_list.c:7: error: storage size of ‘names’ isn’t known

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

int main(){ 

    struct List names; 
    names->size = 3; 

    struct ListElmt michael; 
    struct ListElmt john; 
    struct ListElmt adams; 

    names->head = michael; 

    michael->data = 12; 
    michael->next = john; 
    john->data = 14; 
    john->next = adams; 
    adams->data = 16; 

    struct ListElmt pointer = List->head; 
    for(int x = 0; x < 3 ; x++){ 
     printf("Iteration.%d data: %d", x, pointer->data); 
     pointer->next = pointer->next->next; 
    } 
} 

und hier ist Header dieser verketteten Liste

#ifndef LIST_H 
#define LIST_H 

#include <stdio.h> 

/*          Define linked list elements*/ 

typedef struct _ListElmt{ 

void    *data; 
struct _ListElmt  *next; 

} ListElmt; 

/*          Define a structure for the list*/ 

typedef struct _List{ 

int     size; 
int     (*match)(const void *key1, const void *key2); 
void    (*destroy)(void *data); 

ListElmt    *head; 
ListElmt    *tail; 

} List; 

void list_init(List *list, void (*destroy)(void *data)); 

void list_destroy(List *list); 

int list_ins_next(List *list, ListElmt *element, const void *data); 

int list_rem_next(List *list, ListElmt *element, void **data); 

int list_size(const List *list); 

ListElmt *list_head(const List *list); 

ListElmt *list_tail(const List *list); 

int list_is_head(const ListElmt *element); 

int list_is_tail(const ListElmt *element); 

void *list_data(const ListElmt *element); 

ListElmt *list_next(const ListElmt *element); 
#endif 

Antwort

36

Wenn Sie typedef ein struct so, Sie müssen struct nicht verwenden, wenn es erklärt:

List names; 

statt

struct List names; 

Es ist auch kein Zeiger, so sollte names->size sein names.size.

+4

+1 Nur ein Kommentar, um es klarer zu machen: die 'struct List' existiert nicht. Es gibt eine 'struct _List' und eine typedef' List', die denselben Typ wie 'struct _List' identifizieren. * (Ich hasse typedefs!) * – pmg

+0

Ich habe einen anderen Fehler names_list.c: 14: Fehler: ungültiger Typ Argument von '->' (haben 'Liste') –

+0

@Sam: Zeiger nehmen Sie die '->' Verknüpfung, um Mitglieder zugreifen , plain Strukturen greifen auf sie mit '.' zu. – pmg

3

struct List names; deklariert keinen Zeiger, aber Sie versuchen, den Zeiger zu dereferenzieren (->). Verwenden Sie stattdessen names.size.

3

Die Struktur heißt _List. Der Typdef ist List. So möchten Sie

List names; 

oder

struct _List names; /* probably not, the _ is convention for internal names */ 

Ihre Linie ist eine "struct List" erklärt, die noch nicht definiert ist.

Die anderen Antworten sind ziemlich korrekt über die. vs -> Ausgabe