Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 12:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 28 wrz 2020, o 21:31 
Offline
Nowy

Dołączył(a): 30 sie 2020
Posty: 2
Pomógł: 0

Witam ! Jestem tu nowy więc kilka śłów o sobie. Z zawodu , wykształcenia i hobby jestem elektronikiem. Przepracowałem w tym zawodzie 50 lat.
Od początku lat 90-tych kiedy to postawiłem na biurku pierwszego PC-eta zabawiam się komputerami i mikrokontrolerami. Napisalem wiele programów na 8051 w języku asembler a także wiele programów na PC-eta. Ostatnio dkryłem arduino a z nim AVR-y. Arduino to znakonita platforma do pisania programów w C i służy mi znakomicie. Język arduino to trochę tak jak Bascom. Daje wrazenie że się coś umie zrobić a tak naprawdę niczego nie uczy. Jedyna zresztą moim zdaniem niewielka wada to ograniczenie do jednego typu mikrokontrolera. Ale do rzeczy. W ramach cwiczeń napisałem sobie bibliotekę która tworzy menu dwupoziomowe na LCD. Wszystko działa. Prawdopodobnie ktoś biegły znalazłby tam sporo dziwnych wynalazków ale jako ćwiczenie jest ok. Aby max. zautomatyzować tworzenie menu ilość pozycji w poszcz. menu jest obliczana przez program.
W programie są dwa typy strukturalne: menu głownego i menu rozwijanych. różnią się tylko jednym elementem. Każde menu jest zawarte w tablicy .Aby obliczyć ilość pozycji musiałem napisać dwie funkcje oddzielnie dla menu głównego i rozwijanego a to mi się nie podoba. Wyczytałem z niebieskiej ksiązki (zieloną dopiero zamówiłem) że można użyć typu void a potem rzutować na typ docelowy. Wtedy byłaby tylko jedna uniwersalna funkcja. Napisałem coś takiego ale nie działa tzn. kompilator się bardzo denerwuje. Poświęciłem wiele godzin na przekopywanie internetu (to forum też) i nic. W sumie nie wiem czy robię coś nie tak czy takie działanie jest w ogóle możliwe. Liczę na to że ktoś na forum mnie oświeci. Z góry dziękuję i pozdrawiam wszystkich. Myślę że ten kod który zamieszczam wystarczy. Piszę pierwszy post więc jeśli coś nie tak wybaczcie.

Definicja menu

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wywołanie funkcji obliczającej

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


kod funkcji

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2020, o 07:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2019
Posty: 147
Pomógł: 37

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
Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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
Składnia: [ Pobierz ] [ Ukryj ]
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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 wrz 2020, o 18:11 
Offline
Nowy

Dołączył(a): 30 sie 2020
Posty: 2
Pomógł: 0

Dzięki za tak szybką i wyczerpującą odpowiedź.
Na pierwszy pomysł to sam wpadłem ale tak mi się spodobała wersja z typem void że koniecznie chciałem go zastosować no i przy okazji się nauczyć. Pomysł z dziedziczeniem i w C to dla mnie co najmniej za wcześnie. Znam programowanie obiektowe ale w innych językach i na PC.. Do nauki C podchodziłem kilka razy ale to nie jest język łatwy do nauki nawet gdy zna się nieźle inne języki. Może tym razem dzięki książkom p. Kardasia i temu forum opanuję ten język choć w zakresie programowania AVR-ów dla własnej przyjemności.
Jeszcze raz dzięki - pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 11 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO