definicje konstrukcji zależnej

0

Szanowni koledzy,

Zwracam się z takim pytaniem, załóżmy że chcę zrobić tak:

typedef element_t * ptr_t;

typedef struct y
{
    uint8_t id;
    char imie[20];
    char nazwisko[30];
} dane_t;

typedef struct x
{
    dane_t osoba;
    ptr_t nast;
    ptr_t pop;
} element_t;

i wszystko byłoby ok, gdyby tylko kompilator potrafił analizując to : typedef element_t * ptr_t; przyjąć do wiadomości że ma to poniżej zdefiniowane.
Jednak nie potrafi on utworzyć nowego typu z czegoś czego nie zna (poznaje to niżej dopiero). Natomiast zamiana kolejnością nic nie da ponieważ nie znałby z kolei tego: ptr_t. Jak to rozwiązać? Wiem że po to tworzy się np. prototypy funkcji jednak tutaj sprawa jest trochę inna bo mamy do czynienia z definicjami nowych typów. Pomocy please!

0

W zasadzie sprowadza się to do pytania jak zrobić takie coś żeby się kompilowało:

typedef struct
{
    element_t * nast;
    element_t * pop;
} element_t;

Musi przecież być jakiś sposób bo to podstawa programowania obiektowego bo przecież na tym bazują wszystkie listy. Pomocy!

1

Masz strukturę bez nazwy, więc nie możesz jej nawet zaforward-deklarować.

struct foo;
typedef struct foo* foo_ptr;
typedef struct foo {
    foo_ptr next;
} foo;

albo mniej kombinując:

typedef struct bar {
    struct bar* next;
} bar;
0

Dziękuję, to wyjaśnia sprawę. Mam jeszcze tylko takie pytanie:

Dlaczego w tym wypadku:

typedef struct bar {
    struct bar* next;
} bar;

błędem nie jest użycie dwukrotnie tej samej nazwy bar , raz do zdefiniowania typu (na końcu po klamrze) , a raz do deklaracji struktury (za słowem kluczowym struct) ? I to by było na tyle. Z góry dziękuję.

1

Gdyby było błędem to bym tak nie radził ;​)

W C struktury i enumy mają osobne "tagi" nazewnictwa, dlatego definiując

struct bar{ int a; };

Nie mógłbyś zadeklarować zmiennej w ten sposób:

bar baz; // error
struct bar qux; // ok

Natomiast definicja

typedef struct { int a; } bar;

wprowadza alias bar do głównej przestrzeni nazw, ale jest to alias nienazwanej struktury. Wobec tego wewnątrz niej nie możesz się do niej odnieść.

0

Po stokroć dzięki. Jasna sprawa. Pozdrawiam i życzę przyjemnego dnia!

0

Innym rozwiązaniem jest rezygnacja całkowicie z typedef struct a używanie samego struct.

1

forward declaration:

struct x;
struct y;

typedef struct x element_t;
typedef struct y dane_t;

struct y
{
    uint8_t id;
    char imie[20];
    char nazwisko[30];
};
 
struct x
{
    dane_t osoba;
    ptr_t nast;
    ptr_t pop;
};

1 użytkowników online, w tym zalogowanych: 0, gości: 1