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



Teraz jest 27 sty 2025, o 18:06


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 24 gru 2014, o 12:41 
Offline
Użytkownik

Dołączył(a): 07 paź 2014
Posty: 28
Pomógł: 0

Witam

Próbuję napisać jakieś proste menu na wyświetlacz LCD, które chciałbym zbudować na wskaźnikach i strukturach. Mam problem z wyświetleniem w pętli while części składowych struktury. Funkcja, którą chciałbym zbudować wygląda na obecną chwilę tak:


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


Struktura:


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


Definicja tablicy:


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

Funkcja wywołująca wyświetlanie menu:

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


Mam dwa problemy:

1. Pętla while nie przyjmuje typu "struct" - ogólnie chciałbym wyświetlić po sobie kolejne struktury, dokładnie wartości m_name dla każdej struktury z tabeli i żeby pętla się skończyła przy końcu tabeli NULL/0 - tak samo jak dla typu "char" przy stringach. Czy jest to w ten sposób możliwe?

2. Jeśli ręcznie zrobię coś takiego:

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

To wynik też nie jest taki jakiego bym się spodziewał:
Pierwsze wyświetlenie jest prawidłowe czyli "jedn", po 500ms tylko dwie literki z drugiej struktury w tabeli "dn" następnie czysty ekran i później "rug" i po następnych 500ms samo "g" z drugiej struktury... następnie już same śmieci bo wskaźnik wybiega gdzieś dalej (to na razie do testów). Co robię źle dlaczego wskaźnik++ nie przeskakuje po prostu do następnego miejsca w tabeli struktur?


EDIT:
Sorki poprawione.
Wesołych Świąt! :)
//holo



Ostatnio edytowano 24 gru 2014, o 13:12 przez holo, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 12:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

kod w syntax=c zamieszczamy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zastanów się, czy to można w ogóle użyć do sprawdzania pętli oraz czy gdyby można było to ta pętla się kiedyś kończy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:13 
Offline
Użytkownik

Dołączył(a): 07 paź 2014
Posty: 28
Pomógł: 0

W przypadku "stringów" coś takiego działało.

np.:

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


W tym przypadku ostatnia "struktura z tabeli byłaby wypelniona 0.

//holo



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

*str jest liczbą, więc zadziała, ale struktura jest czym: true czy false?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:18 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

holo napisał(a):
1. Pętla while nie przyjmuje typu "struct" - ogólnie chciałbym wyświetlić po sobie kolejne struktury, dokładnie wartości m_name dla każdej struktury z tabeli i żeby pętla się skończyła przy końcu tabeli NULL/0 - tak samo jak dla typu "char" przy stringach. Czy jest to w ten sposób możliwe?

Oczywiście, że jest to możliwe tylko, że to NULL/0 musisz sam wstawić, nic tu się nie zrobi automatycznie. Bez tego pętla się nigdy nie zatrzyma. W tym przypadku, ostatni element tablicy main_menu , a konkretnie pole i musi być równe 0 oraz test pętli powinien sprawdzać to pole czyli jakoś tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

albo chociaż tak (gorzej)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
.
Alternatywnie w argumencie funkcji przekazać można ilość elementów tablicy, i operować na tym. To chyba lepsze rozwiązanie bo unika się wstawiania do tablicy ostatniego, w gruncie rzeczy niepotrzebnie zajmującego miejsce, elementu.
To załatwia sprawę pętli while. Ale oprócz tego masz pewien błąd: źle inicjujesz tablicę. Zapoznaj się z tym: http://forum.atnel.pl/topic8673.html#p97182
Sprawa nr 3, w tej chwili tylko o tym wspomnę: tej tablicy nie da się umieścić w PROGMEM (a pewnie prędzej czy później będziesz chciał to zrobić)


Autor postu otrzymał pochwałę

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

a mozna by tak ?

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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

Sprawdź co zwraca samo: sizeof(tablica) (nie jest to liczba elementów tablicy)
I hint: sizeof(tablica) / sizeof(*tablica)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Czlowiek sie caly czas uczyc :) Fajnie to jest to wyjasnione http://stackoverflow.com/questions/1517 ... 9#15177499

A wracajac do pytania to moze podobnie jak Mirek ma w GB ? zadeklarowac sobie przez

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


A pozniej sie do tego odwolywac w kodzie. No i jak sobie zwiekszymy to jest tylko jedno miejsce w kodzie gdzie musimy zrobic poprawke.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 14:53 
Offline
Użytkownik

Dołączył(a): 07 paź 2014
Posty: 28
Pomógł: 0

Dziękuję za podpowiedzi. Sizeof + dodatkowy argument wydają się rozwiązywać mój problem.

Co do rozwiązania RafPe:

http://pl.wikibooks.org/wiki/C/Tablice_-_wi%C4%99cej "Definicja rozmiaru tablicy"

"

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


Powyżej sizeof tab zwraca cały rozmiar pamięciowy tablicy, natomiast sizeof *tab poda nam jaki jest rozmiar typu int (ponieważ takiego typu jest element tablicy, *tab). Dzieląc rozmiar pamięciowy tablicy przez rozmiar pojedynczego elementu uzyskujemy ilość elementów. (Np. przy rozmiarze 44B oraz rozmiarze sizeof(int) równym 4 otrzymujemy, że tablica zawiera 11 elementów.)

Należy pamiętać, że sposób działa tylko dla tablic, a nie wskaźników (mimo że wskaźniki traktujemy w pewnym stopniu podobnie jak tablice)."

Coś takiego jak poniżej wydaje się najlepsze i nie trzeba nic zmieniać w kodzie w przypadku większego "stringa".

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


Jednego jednak nie rozumiem. Zawsze myślałem, że wskaźnik to po prostu numer/adres pamięci, w takim razie jakim cudem "sizeOf(tablica)" dla różnych tablic zwróci różne jej wielkości? Przecież czy tablica będzie miała 10 czy 100 komórek to jej adres/wskaźnik początku tej tablicy będzie miał tą samą wielkość (w przypadku systemów 32bit powinno to być zawsze 32bity i nic więcej nic mniej). Gdzie źle rozumuję?

Co do mojego drugiego pytania. Czy jeśli stringi do tabeli będę podstawiał za pomocą funkcji strcpy rozwiąże to mój drugi problem, z dziwnym wyświetlaniem/cięciem stringów? Na wielu przykładach na forach definicje tabeli struktur widziałem podaną właśnie w ten sposób jaki ja zastosowałem.


EDIT:

Niestety rozwiązanie z sizeof nie działa, kod testowy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Obydwie wartości zawsze wychodzą 2.

Czy jednak będzie trzeba wielkość tabeli zawsze podawać "ręcznie"/przez definicje?


Co do drugiego problemu nijak użycie funkcji strcpy nie chce zadziałać. Jedyne co działa to przypisanie wartości razem z definicją niestety są one wypisywane błędnie na wyświetlaczu jak opisałem w pierwszym poście.

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


Kod:
||=== Build: Release in test (compiler: GNU GCC Compiler for AVR) ===|
main.c|12|error: expected declaration specifiers or '...' before 'main_menu'|
main.c|12|error: expected declaration specifiers or '...' before string constant|
main.c|13|error: expected declaration specifiers or '...' before 'main_menu'|
main.c|13|error: expected declaration specifiers or '...' before string constant|
main.c|11|warning: array 'main_menu' assumed to have one element|
||=== Build failed: 4 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|


Probowałem również tak:

t_menu_item main_menu[] = {{.i = 1,.m_name = "test"},{.i = 2,.m_name = "tes2"}};

efekt ten sam.

Także pytanie drugie caly czas pozostaje aktualne. W jaki sposób wyświetlić prawidłowo stringi? Co robię źle. Wygląda na to, że pierwszy jest prawidłowo wyświetlany a w drugiej pętli są wyświetlane tylko jego dwa ostatnie znaki zamiast drugiego stringa.

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


EDIT2:

Drugi problem rozwiązany :) w strukturze musi być zdefiniowana wielkość tablicy char (dlugość stringa + 1 na null) aby wskaźnik++ przesuwał się o odpowiednią ilość pól. Myślałem, że kompilator sam dobierze wielkości na podstawie wprowadzonych danych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 19:34 
Offline
Użytkownik

Dołączył(a): 07 paź 2014
Posty: 28
Pomógł: 0

Dziękuję wszystkim za pomoc.. obydwa problemy rozwiązane..

Pierwszy przez zastosowanie definicji ilości pozycji w menu a drugi (pocięte stringi) przez ustawienie "na sztywno" wielkości tablicy m_name. Wszystko juz dziala jak powinno a przy okazji dowiedziałem się kilku nowych rzeczy. :)

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


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





//holo



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 20:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 paź 2014
Posty: 42
Pomógł: 5

holo napisał(a):
a drugi (pocięte stringi) przez ustawienie "na sztywno" wielkości tablicy m_name

Ciekawostka jeszcze, testowałem Twój kod pod Dev-C++ 4.9.9.2 i kompilator w ogóle "nie puszczał" kodu bez ustawienia długości m_name.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 gru 2014, o 15:31 
Offline
Użytkownik

Dołączył(a): 07 paź 2014
Posty: 28
Pomógł: 0

GCC (linux) też tego nie przepuszczało jeśli nie dałem nie zdefiniowanej tablicy jako ostatnią zmienną w strukturze. O tak:

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


Stąd właśnie wynikał błąd, że kompilator/program nie wiedział o ile przesunąć wskaźnik i wyszły z tego poszatkowane stringi.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 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