Rzutowanie zrobiłeś źle. W wywołaniu funkcji nie musisz rzutować bo każdy typ można przypisać do void. Konieczne jest rzutowanie albo wewnątrz funkcji albo nadanie konkretnego typu w nagłówku. Tak czy inaczej przy takim ukształtowaniu typów nie obejdzie się bez dwóch funkcji.
Typ void to proteza, której należy unikać i stosować w przypadkach absolutnie niezbędnych. Ten przypadek taki nie jest.
dinosaurus napisał(a):
różnią się tylko jednym elementem
To dlaczego nie zastosować jednego typu z polami next_menu dla drugiego poziomu równymi NULL? Kosztem większego zużycia pamięci zyskuje się spore uproszczenie. Na początkowym etapie zmagań z językiem ma to swoją wartość.
Inną opcją, która tu doskonale pasuje, jest zastosowanie dziedziczenia. Wtedy ma się niemal pełną kontrolę typów (upcasting jest całkowicie w gestii kompilatora, downcasting wymaga nadzoru programisty), a jednocześnie jest możliwość dowolnego ukształtowania typów i podtypów danych.
------------------------ [ Dodano po: 27 minutach ]Jak by to mogłowyglądać?
Typy danych
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Funkcja operuja wyłącznie na typie nadrzędnym
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Wywołanie funkcji dla danych o typie roszerzonym wymaga albo rzutowania do typu bazowego albo podania wskaźnika na pole zawierajace typ bazowy
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wywołanie dla typów bazowych bez rzutowania
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
_________________
Think for yourself and question authority
.