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



Teraz jest 28 lis 2024, o 20:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 25 wrz 2018, o 15:24 
Offline
Moderator
Avatar użytkownika

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

zubik napisał(a):
if(a <= sizeof &tab_menu)a++;

A co to tutaj sobie kolega wymyślił ? Co to ma niby wg ciebie oznaczać to sizeof w tej linijce ?

_________________
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: 25 wrz 2018, o 16:26 
Offline
Użytkownik

Dołączył(a): 10 lip 2015
Posty: 334
Pomógł: 32

sizeof(tab_menu) - wyliczy wielkość tablicy.
Nazwa tablicy jest wskaźnikiem na nią.



Ostatnio edytowano 25 wrz 2018, o 16:41 przez HomoChemicus, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2018, o 16:30 
Offline
Moderator
Avatar użytkownika

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

zubik napisał(a):
Hmmmm myślałem że jak pobiorę adres tablicy to sizeof bez problemu wyliczy jej koniec. Czyli trzeba na nią ustawić wskaźnik i dopiero wtedy wyliczać rozmiar

Troszkę karkołomnie jak dla mnie podchodzisz do tematu. Z jednej strony tablica jest wielowymiarowa - więc nie ma tak hej-hop z sizeof a szczególnie jak chodzi o stringi - a jak domniemuję ty tak w ogóle chcesz sizeo'em dostać jeszcze "gwiazdkę z nieba" czyli rozmiar jednego z wymiarów tej tablicy - pewnie się da ale nie tak.

Zamiast tego powołaj że sobie pan zmienną idx i za jej pomocą chodź po tablicy, uprzednio definiując sobie jakąś stałą mówiącą o tym ile masz pozycji menu

_________________
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: 25 wrz 2018, o 19:05 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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

Po pierwsze chciałbym zwrócić uwagę, że ustalając wartość MAX_TAB_STR nie uwzględniłeś znaku terminującego ('\0'), który jest automatycznie dołączany przez kompilator. MAX_TAB_STR powinno być w Twoim przypadku równe 18 (chyba, że ta spacja na końcu "AUTO FULL POMIAR " to pomyłka).
Po drugie, definiując w ten sposób tablicę uzyskasz taki efekt, że kiedy dodasz bardzo krótki ciąg znaków, i tak zajmie on 18 bajtów.

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


W ten sposób uzyskasz tablicę tab_menu umieszczoną we FLASH zawierającą wskaźniki do ciągów znaków we FLASH.
Przykładowe użycie tej tablicy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie musisz obliczać, jaką wartość przypisać do MAX_TAB_STR i dodatkowo każdy ciąg znaków zajmuje tylko tyle miejsca we FLASH ile jest konieczne. Wadą jest to, że tracisz dodatkowe 2 bajty (potrzebne na wskaźnik) na każdy dodany ciąg znaków.



Ostatnio edytowano 25 wrz 2018, o 19:26 przez andrews, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2018, o 19:23 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Jak chcesz mogę spróbować odtworzyć ten usunięty post. Nie chciałem Ci psuć zabawy ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2018, o 19:45 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

zubik napisał(a):
Pewnie będę chciał zobaczyć twoją funkcję ale wpierw pokażę swoje wypociny

..a ja się już pospieszyłem i przywróciłem...
Może już tak zostawmy, po prostu tego nie czytaj :)

zubik napisał(a):
Cytuj:
Po drugie, definiując w ten sposób tablicę uzyskasz taki efekt, że kiedy dodasz bardzo krótki ciąg znaków, i tak zajmie on 18 bajtów.


Hmm w sumie wiedziałem o tym ale uznałem że flascha mam pod dostatkiem jednak nie jest to eleganckie rozwiązanie


Niezupełnie o to mi chodziło, że to nieeleganckie rozwiązanie. To, które rozwiązanie jest lepsze, zależy od tego, na jakich danych operujesz.
Jeśli masz ciągi znaków o bardzo zbliżonej długości, to Twoje rozwiązanie może być lepsze, bo nie potrzebujesz tablicy dodatkowych wskaźników.
Jeśli ciągi znaków znacznie różnią się długością, lepiej zrobić tak jak pokazałem. Trzeba to po prostu przekalkulować...

Jeśli masz mało ciągów i dużo FLASHa, to obydwa rozwiązania są dobre ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2018, o 23:37 
Offline
Moderator
Avatar użytkownika

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

nie obraź się ale hmmm masakra trochę ..... to IF'owanie nazw

posługiwanie się indeksami jest nie tylko szybsze, wygodniejsze ale i optymalniejsze ;)

Nie wspominając o tym, że wciąż popełniasz karygodne błędy o których wspomniał andrews - ten twój sposób definiowania napisów ....

_________________
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: 26 wrz 2018, o 05:50 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Zdecydowanie przekombinowałeś ;)

Kod, który napisałeś ma za zadanie obliczyć ilość ciągów w tablicy, czyli jej pierwszy wymiar. Miałoby to sens, gdyby rozmiar tablicy zmieniał się w trakcie wykonywania programu, a przecież tak nie jest. W tym przypadku ilość ciągów można obliczyć na etapie kompilacji, nie trzeba angażować do tego celu mikrokontrolera.

zubik napisał(a):
Cytuj:
sizeof(tab_menu) - wyliczy wielkość tablicy.
Nazwa tablicy jest wskaźnikiem na nią.

Tak ale moja tablica jest dwuwymiarowa


W niczym to nie przeszkadza. Nadal możesz zlecić kompilatorowi, aby obliczył pierwszy wymiar (czyli ilość ciągów w tablicy) na etapie kompilacji na przykład tak:
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: 26 wrz 2018, o 10:04 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

To oczywiste, że masz taki błąd, bo masz definicję tablicy w jednym pliku, a sizeof pewnie używasz w innym pliku źródłowym, w którym widoczna jest jako typ niekompletny (extern).
Możesz sobie np. stworzyć doidatkową zmienną w pliku, w którym masz zdefiniowaną tablicę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


a w pliku nagłówkowym "napisy.h" dodać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Stała strings_count będzie wtedy zwierać wartość oznaczającą pierwszy wymiar tablicy tab_menu, czyli liczbę ciągów i będzie dostępna w innych plikach źródłowych.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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