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



Teraz jest 16 wrz 2024, o 20:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 5 cze 2024, o 05:34 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27290
Lokalizacja: Szczecin
Pomógł: 1041

1. zadajesz jakieś zagadki bo nikomu nawet nie pokazujesz co to za jakiś twój typ: LedHandlerType
2. używane przez ciebie w tym kodzie typy "unsigned char" wyglądają po prostu paskudnie, pomijam już że w AVR GCC nie używa się unsigned char w kodzie tylko sam char (dlatego że w domyślnych opcjach kompilatora jest on traktowany z automatu jako char) ale w twoim kodzie w każdym miejscu gdzie go użyłeś i tak powinien być użyty przez ciebie typ uint8_t. Typu char używamy w innych sytuacjach.
3. tworzenie tak przewskaźnikowanej funkcji że tak powiem do obsługi pinów/portów w avr co i tak się kiedyś zemści i nie będziesz tworzył takich potworków bo to nie ma najmniejszego sensu ale ok tu tworzysz taką rozbudowaną funkcję a w niej korzystasz ze zmiennej globalnej ??? initializeLED ? to już zupełne nieporozumienie

moje uwagi nie odnoszą się do błędów w kodzie przez które program miałby nie działać ale to dlatego głównie że nie lubię zagadek a bez kodu tego typu: LedHandlerType to można się tylko w zgadywanki bawić niestety. Dlatego odniosłem się do innych kwestii, które niestety mocno rażą i warto je poprawić i zapamiętać.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2024, o 14:49 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27290
Lokalizacja: Szczecin
Pomógł: 1041

ord napisał(a):
W embedded unika się alokacji dynamicznej jak ognia, a już szczególnie realloc zwiększającej obszar. Można to uznać za błąd i to kardynalny.

A co to za jakieś teorie spiskowe - używa się używa i to każdej funkcji i do alokacji i do realokacji - tylko jak wszystko w C zawsze trzeba "z głową" i pamiętać o odpowiednim zwalnianiu. Więc to jest totalnie zła porada i podpowiedź.

------------------------ [ Dodano po: 8 minutach ]

MarekSz napisał(a):
Intencją było to, abyśmy nie skupiali się, jakie pola zawiera ww struktura lecz tylko jak ładniej zapisać dostęp do jej pól.

Ty masz intencje a innym robisz zagadki, już w ramach takiego typu złożonego możesz popełnić babole, więc dalsza szczegółowa analiza reszty kodu pod tym względem szczególnie z alokacją i realokacją nie ma sensu kompletnie

MarekSz napisał(a):
Czy mógłbyś przybliżyć temat? Zamiast uint8_t używam unsigned char ponieważ środowisko IDE jakiego używam podpowiada mi te typy (Microchip Studio), a uint... muszę z palca zawsze wpisywać. Czy uint8_t nie odpowiada unsigned char? Zaglądałem do stdint.h i tam znalazłem:

To daj sobie spokój z tym MEGA KOCIM tragicznym środowiskiem, które zostało totalnie bezlitośnie przerobione i to na wariackich papierach pod procki atmelowskie AVR z AVR GCC - to jest kolejny etap szaleństwa - właśnie te podpowiedzi unsigned char - ale jak chcesz to oczywiście się męcz - kto ci zabroni.

Zamiast tego badziewia używaj Eclipse z AVR GCC - no chyba że korzystasz z tych najnowszych procków hybryd majkerczipa z atmelem wtedy ok - rozumiem, nie masz wyjścia i musisz się męczyć z majkerczipowym super kocim środowiskiem.
generalnie GCC uporządkował typy i stąd są mega jasne i czytelne
uint8_t
int8_t
uint16_t
int16_t
uint32_t
int32_t

no i

char

który domyślnie jest kompilowany tak że wpisywany sam jako char jest zamieniany na unsigned char żeby właśnie nie trzeba było tyle tego durnego pisania "uuuunsssigneed char" zamiast tego KRÓTKO "char" tyle że typ char stosujemy do zmiennych przechowujących kody ASCII a nie Qurczę do wartości liczbowych - to oczywiście nie wymóg a styl dobrego pisania programów i aż się dziwię że o to pytasz skoro w podpisie na forum masz info że masz wszystkie moje książki to skąd takie podejście jak twoje - ja wciąż w książkach i mówię o typach i pokazuję setki przykładów i kodów źródłowych

------------------------ [ Dodano po: 9 minutach ]

MarekSz napisał(a):
Czy uint8_t nie odpowiada unsigned char?

oczywiście, że odpowiada - ale zanim zabrniesz dalej to przeczytaj co wyżej napisałem i sam się troszeczkę chociaż zastanów - po choinkę GCC wprowadziło uint8_t - tak dla zabawy wg ciebie ?

------------------------ [ Dodano po: 14 minutach ]

MarekSz napisał(a):
Tu też bym poprosił o rozwinięcie myśli. Nie mam pojęcia jak bez użycia programowania obiektowego stworzyć zmienną,

hmmm to wg ciebie ty programujesz obiektowo ????? zaraz zaraz - mówimy o języku C czy C++ bo to jest ogromna różnica i niestety albo nie wiesz co to znaczy programowanie obiektowe i dlatego używasz niewłaściwego określenia - albo może ty jednak zadałeś pytanie o swój kod pisany w C++ ???? chociaż w to wątpię - ale może się mylę to wyjaśnij

w C nie ma programowania OBIEKTOWEGO - to musisz sobie zapamiętać

MarekSz napisał(a):
stworzyć zmienną, którą będę używał np. w 2 funkcjach. W powyższym przypadku jest ona wyciągnięta do globalnej, gdyż planuję jej w innej funkcji modułu obsługi LED.

Tu nie masz co się martwić - na razie zaczynasz przygodę z programowaniem i dlatego masz prawo jeszcze tak do tego podchodzić żeby nadużywać zmiennych globalnych ale uwierz mi będziesz musiał jak najszybciej tak pisać programy żeby się ich pozbywać albo ograniczać do niezbędnego minimum.

------------------------ [ Dodano po: 17 minutach ]

poza tym jak dajesz specyfikator static takiej zmiennej:

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


to już nie do końca można nazwać ją globalną - poczytaj chociaż w Bluebooku co robi specyfikator static z takimi zmiennymi i dlaczego używa się go do hermetyzacji zmiennych wewnątrz bibliotek żeby właśnie nie mogły być globalne dla całego projektu.

------------------------ [ Dodano po: 22 minutach ]

MarekSz napisał(a):
Domyślam się, że chodzi o to, że tracimy kontrolę nad ilością rezerwowanej pamięci, więc istnieje możliwość wyjścia poza limit? Czy jeszcze o coś?


Poza "limit" jak to nazywasz to można i wyjść nawet bez używania dynamicznej alokacji i realokacji - wystarczy właśnie nie dbać o typy szczególnie zmiennych automatycznych wewnątrz funkcji, o złe działania na tablicach itp itd.... tego zawsze w C trzeba mega pilnować.

Pisałem wyżej że ta porada od Ord jest totalnie bez sensu i wcale się nie unika ani alokacji ani realokacji w embedded - to wręcz jakaś fantasmagoria. Oczywiście, że się używa tylko trzeba rozumieć po pierwsze jak to działa? co to jest sterta (heap) a w przypadku niektórych mikrokontrolerów o nieliniowym adresowaniu pamięci ram trzeba również na to uważać - jest to szeroki temat - ale kompletnie nie do omówienia na tak prostym przykładzie. W takim prostym kodzie jak najbardziej można używać tylko też trzeba sprawdzać wynik działania funkcji malloc a szczególnie!!! realloc czyli czy przypadkiem zwracany wskaźnik nie jest pusty NULL .... dużo szerzej mówię o tym w moim Kursie języka C Online którego ci polecam a przy okazji którego zapoznasz się i polubisz ECLIPSE ;)

zajrzyj sobie na stronę:

https://akademia.atnel.pl/

ale też poczytaj komentarze uczestników w internecie tego kursu

koniecznie obejrzyj sobie i ten filmik:
https://www.youtube.com/watch?v=UnG-dgVgdMQ

i poczytaj komentarze pod nim

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2024, o 15:28 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27290
Lokalizacja: Szczecin
Pomógł: 1041

Cytuj:
Nie nie - nie to miałem na myśli. Wręcz przeciwnie. Napisałem, że bez programowania obiektowego (którego C nie ma) muszę czasem jakąś zmienną globalną utworzyć i zawsze ograniczam jej używanie do jednego pliku. Generalnie od lat programuję obiektowo, ale w zupełnie innej dziedzinie i w zupełnie innym języku. Strasznie trudno jest przestawić myślenie na C (bez ++), stąd pewnie podejście.

A to może źle zrozumiałem - przepraszam ... tak masz rację, tu w C trzeba się przestawić - ale jednak można tworzyć takie hmmm namiastki programowania ala obiektowego w C, pokazuję to w niektórych swoich poradnikach wideo na YT - których jest pełno i za free - kiedyś pokazywałem grę SNAKE - warto popatrzeć co tam się działo z ala obiektowością w C ;)

MarekSz napisał(a):
A co do uint8_t - nie mam pojęcia po co ten typ w GCC został utworzony. Liczę na wyjaśnienie.

No właśnie dla uporządkowania typów - czy ty wciąż chcesz używać np w C typów

Cytuj:
long long int


albo

Cytuj:
unsigned long long int


????? zamiast Qurna

uint32_t albo int32_t ??? nie widać różnicy?

co do char gdzie avr gcc od razu konwertuje przy kompilacji unsigned char do char jak mówiłem - to dobra praktyka programowania mówi żeby typu char używać (też pisałem wyżej) do wszelkich zmiennych i tablic gdzie przechowujesz kody ASCII rozumiesz? A tam gdzie chcesz przechowywać w zmiennych czy tablicach wartości liczbowe to stosuje się typy uint_ rozumiesz?

co to daje pomimo że char równa się uint8_t w GCC ???

ano dużo daje - bo jak w dużym kodzie źródłowym którego analizuję po kimś widzę:

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


to bez większego problemu spodziewam się, bez wielkiej analizy kodu, że tablica data będzie służyła do przechowywania właśnie znaków, tekstów - jakiś bufor dla uarta, lcd itp

a jak widzę tablicę tab to spodziewam się danych liczbowych np generator fontów, jakichś wzorców itp itd

na małych przykładach tego nie czuć - na dużych zaczyna być to mega ważne nie tylko dla analizy cudzych kodów ale również dla szybkiej analizy własnych kodów po kilku latach

i to nie są moje wymysły czy fantasmagorie

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2024, o 04:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27290
Lokalizacja: Szczecin
Pomógł: 1041

MarekSz napisał(a):
widziałeś jak np. w Java używa się nazw klas? Powstają tasiemce jak w języku niemieckim. Czyli zamiast powiedzieć "młotek" mówimy "żalastwoNaPatykuDoWbijaniaGwoździ".

Oczywiście, że tak jest a co w C# inaczej - też coraz dłuższe konstrukcje ale to zaczęło się odkąd pojawiła się obiektowość ;) po C

MarekSz napisał(a):
Ale z drugiej strony nie mam czegoś takiego jak najbardziej podstawowy typ boolean w GCC

ależ jest można go używać jak najbardziej tyle że ja wolę w embedded patrzeć przez pryzmat bajtów a tu bitów i wolę albo zwykły uinnt8_t jako boolean albo po prostu struktury z polami bitowymi ;)

MarekSz napisał(a):
Na tę okoliczność enuma stworzyłem

Po co? No widzisz - jest boolean i śmiało można go używać w GCC ;)

MarekSz napisał(a):
Nie ma też domyślnych wartości parametrów przekazywanych do funkcji. Nie ma możliwości przypisywania NULL do np. int'a. Kurde - nic nie ma.

No panie - na to narzekać to jak narzekać na różnice między różnymi innymi językami programowania - toż KAŻDY ma swoją specyfikę

MarekSz napisał(a):
emu językowi bliżej do Basic'a

To jest ogromna przesada ;) i po tym co piszesz widać z kolei, że chyba nigdy w życiu nie liznąłeś na żadnej platformie nawet na PC takiego języka jak Asembler ;) A gdybyś to zrobił - nawet tak z ciekawości to byś po jakimś czasie zobaczył i powiedział, że językowi C bliżej jest do asemblera niż do takich wytworów jak Basic. Zresztą spójrz na historię powstawania języków. Asembler to natywny język procesorów - żeby ułatwić sobie życie w 1972 drugim roku nie na darmo opracowano język C na którym panie masz oparte prawie wszystko na świecie u podstaw począwszy od systemów operacyjnych ... więc gdzież by tu można było porównać to do Basica - no chyba właśnie tylko wtedy gdy nie zna się i tej historii i specyfiki starszych języków.

Owszem DOKŁADNIE tak jak mówisz - w C nie ma tego i tamtego i jeszcze tego no i tego ;) ale już ten fakt pokazuje że to nie basic i tylko języki coraz wyższego rzędu zaczynają mieć to i tamto ale za to mają coraz większe ograniczenia do ich zastosowania w świecie embedded. Jak myślisz - dlaczego w 90% w embedded do dzisiaj się używa czystego języka C a nie C++ ? Pomimo że C++ już da się i na 8-bitowcach stosować ? no dlaczego ? ;)

Więc nie narzekaj tylko się naucz C a zobaczysz - że później takie podejście gdzie trzeba wyciskać soki w embedded przyda się też i do lepszej gospodarki w obiektówce ;)

MarekSz napisał(a):
Nie dziw mi się, że staram się przemycić w arsenale tego, co mogę - dobrych praktyk.

Ale ja się nie dziwię, ja znam to od lat i od dawna - dlatego staram się uczyć innych języka C, zarażać ich nim ale nie na zasadzie, że to jakiś najlepszy język na świecie - bo przy programowaniu na PC nie wyobrażam sobie życia bez języków obiektowych, a świecie web bez Java, php i innych

Tyle że nie ma JEDNEJ JEDYNEJ zasady dobrego programowania, tylko jednego zbioru dobrych praktyk jak piszesz - trzeba zrozumieć, że każdy język ma SWOJE WŁASNE dobre zasady programowania. I trzymanie się kurczowo tylko jednych zasad - przyzwyczajenia do jednego języka w którym się programowało - powoduje niestety zwykle spore problemy i dłuższe przyswajanie innych języków a szczególnie gdy schodzimy w dół z języków wysoko poziomowych do niskopoziomowych jak C albo na dno piekła do asemblera :)

------------------------ [ Dodano po: 6 minutach ]

MarekSz napisał(a):
Java używa się nazw klas? Powstają tasiemce jak w języku niemieckim. Czyli zamiast powiedzieć "młotek" mówimy "żalastwoNaPatykuDoWbijaniaGwoździ".

a jeszcze odnośnie tego ;) to jakbym miał napisać metodę jakiegoś obiektu:

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


zamiast:

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


to już by mnie szlag trafił - zresztą zauważ, że to właśnie w tych językach jak najszybciej może nie to że pozbyto się typów ale zaciera się różnica pomiędzy nimi stringa można przypisać do zmiennej innego typu i na odwrót - tak samo w pythonie ... więc jednak nie tylko mnie jak widzisz przeszkadzały i przeszkadzają typy long long long long very long int :) i przypominanie sobie ile to longów odpowiada na jakiej platformie z ilu bajtów składa się zmienna - bo w świecie embedded znowu - zaczyna być to mega istotne jak sam wiesz a w świecie języków wyższego rzędu - paaanie kogo to obchodzi i również w takich przypadkach wychodzą te mocne różnice i to z czym przychodzi się zmagać ludziom którzy znają te języki wyższego rzędu a muszą wrócić do staruszka C bo w embedded nie da się praktycznie inaczej ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



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: 4 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 12 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO