2011-11-16 6 views
5

mam coś takiego:typedef stuct z deklaracją do przodu w C

typedef struct Data DATA, *DATA_PTR; 
typedef struct Units UNITS, *UNITS_PTR; 

struct Data 
{ 
    double miscData; 
    UNITS units; 
}; 

struct Units 
{ 
    double x[2]; 
    double y[2]; 
    double z[2]; 
}; 

w moim pliku project_typedef.h.

w innym pliku, mam coś takiego:

void fileInput(DATA_PTR data) 
{ 
    //usual declarations and other things 
    data->miscData = 0; //Works! 
    data->units.x[0] = 5; //Doesn't work 
    //etc... 
} 

Jednak to nie działa, ponieważ jednostki jest zadeklarowana po danych w project_typedef.h (jeśli mogę zmienić kolejność to działa). Błąd, który dostaję, jest "po lewej stronie" .x 'musi mieć typ struct/union ". Myślałem, że deklaracja terminowa rozwiąże ten problem. Dlaczego nie?

+3

Po pierwsze, że == wygląda dziwnie ... – Tudor

+0

@Dziewczyna, literówka, ale to nie tak jest w moim kodzie. Jest teraz edytowany. – user1007692

+3

Po prostu chcę powiedzieć, że nienawidzę, gdy widzę typy wskaźników używane jako normalny typ. DATA_PTR nie upraszcza pisania kodu w jakikolwiek sposób, ponieważ nadal jest wskaźnikiem i nadal musisz użyć operatora ->. –

Odpowiedz

10

Po zdefiniowaniu zdefiniowaćData, wszystkie elementy muszą być pełne typy. Ponieważ UNITS nie jest w tym momencie pełnym typem, to nie działa. (Natomiast UNITS_PTRbyłoby być w porządku, ponieważ wskaźniki niepełnych typów są kompletne typy).

Wystarczy umieścić definicję Units powyżej definicji Data i powinno być w porządku.

(Jak @cnicutar już wspomniano, używasz również tablicę x źle).

5

Deklaracja przekazania umożliwia użycie jej nazwy w kontekście, w którym niedozwolony typ jest dozwolony. Deklarowanie elementu struct nie jest jednym z takich przypadków, pełna definicja musi być znana, ponieważ przyczynia się do układu strukturalnego.

1

Nie ma prototyp struktury. Dzieje się tak dlatego, że przed użyciem kompilator musi znać rozmiar struktury. Możesz użyć wskaźnika na struct, ponieważ wskaźniki znają rozmiar niezależnie od typu, na który wskazują.

0

definicję struct zawsze należy wykorzystać kompletnych typów dla wszystkich członków w struktury ... ale to nie jest przypadek z UNITS units w struct Data, który deklaruje zmienną o nazwie units typu struct Units który nigdy nie jest zadeklarowane przed struct Dane ... to odzwierciedla błąd. Powinieneś umieścić definicję Units powyżej Data definicji .. i wszystko będzie działać dobrze ..

i dotyczące przekazania deklaracji to nie działa, ponieważ zawsze, gdy zdefiniowana jest zmienna struct, kompilator najpierw przydziela pamięć wymaganą do struct (członkowie struktury donot mają przydzieloną im pamięć, chyba że są e połączony ze strukturą typu zmiennej .. to dlatego zmienne strukturalne nie mogą być inicjowane wewnątrz szablonu szablonu) .. :)