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



Teraz jest 20 kwi 2024, o 09:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 23 mar 2018, o 08:02 
Offline
Użytkownik

Dołączył(a): 24 lut 2014
Posty: 28
Pomógł: 0

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


Generalnie jest tak, że gdy mam dokładnie ten kod, to pierwszy przycisk działa bardzo średnio tzn. po pierwszym wciśnięciu przycisku od razu pojawia się C, żeby się zmieniła na inną to trzeba kliknąć parę razy, ilość tych razów raczej losowa, ale pokazują się wszystkie literki.
Drugi przycisk działa bardzo dobrze, tak jak powinien. Jeden klik, jedna zmiana literki.

Jeżeli wywalę ten drugi przycisk to pierwszy działa tak jak powinien, czyli zaczyna od A i po każdym kliku zmienia literkę. Co zrobiłem źle?
goto jest tylko po to, żeby nie przepisywać znów tego case i nie wydłużać kodu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 08:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2013
Posty: 45
Pomógł: 2

dla jednego przycisku daj key_lock1 a dla drugiego daj key_lock2



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 10:13 
Offline
Użytkownik

Dołączył(a): 24 lut 2014
Posty: 28
Pomógł: 0

Dobry pomysł. Nie pomyślałem o tym. Wrócę do domu to sprawdzę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 15:16 
Offline
Użytkownik

Dołączył(a): 24 lut 2014
Posty: 28
Pomógł: 0

To i tak nic nie dało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 18:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

jakiego typu masz te zmienne key_lock?
Jeśli uint8_t to spróbuj zmienić na uint16_t. Jeśli masz wysokie taktowanie i/lub kiepskie switche i/lub masz to wszystko na stykówce to czas tzw drgań styków (na który się składa nie tylko przysłowiowe drgania styków ale wszystkie "niestabilne" połączenia pomiędzy wejściem uC a przyciskiem) może być za długi i zmienna uint8_t zdąży się przepełnić i if wykona się ponownie (może nawet kilka razy podczas jednego naciśnięcia).

------------------------ [ Dodano po: 4 minutach ]

Jeśłi z kolei uint16_t będzie za duży (czyli na zbyt długo zablokuje przycisk) możesz po wejściu w ifa inicjować go wartością nie 1 a jakąś większą dobraną doświadczalnie.

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

Dodatkowo instrukcja goto która skacze do wnętrza ifa? To już lepiej tego switch/case wyrzuć do zewnętrznej funkcji i wywołuj w obu ifach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 18:54 
Offline
Użytkownik

Dołączył(a): 24 lut 2014
Posty: 28
Pomógł: 0

Cytuj:
Dodatkowo instrukcja goto która skacze do wnętrza ifa?


Czemu nie? Wydaje mi się, że ona działa poprawnie, bo gdy wciskam drugi przycisk to faktycznie wyświetla litery w odwrotnej kolejności.
key_locki są zwykłymi intami. Ale czemu jeżeli dla jednego przycisku działa poprawnie to dla dwóch już nie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 19:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

A gdzie masz break; w case? Może byś je dodał?

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 19:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

Dzonzi napisał(a):
Ale czemu jeżeli dla jednego przycisku działa poprawnie to dla dwóch już nie?
A próbowałeś fizycznie zamienić przyciski? Być może ten drugi ma nieco gorsze styki i generuje więcej zakłóceń...

Dzonzi napisał(a):
Czemu nie? Wydaje mi się, że ona działa poprawnie, bo gdy wciskam drugi przycisk to faktycznie wyświetla litery w odwrotnej kolejności.
no może wyświetla dobrze ale pomyślałeś o tym że if jest nierozerwalnie połączony z else jeśli to drugie istnieje. Przecież else nie ma sprawdzania warunku a jest wykonywane w momencie gdy if jest niespełniony. A u ciebie warunek if po skoku goto nie jest wogule sprawdzany...
Widzisz nie od parady instrukcję goto zaleca się używać z dużą rozwagą, a najlepiej jej unikać...



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

Dołączył(a): 24 lut 2014
Posty: 28
Pomógł: 0

Nie ma powodu, żeby po goto był sprawdzany if. Widocznie nie za bardzo rozumiesz co tam się dzieje, być może słabo wyjaśniłem.
Nie mniej jednak program już działa. Dodałem tego drugiego keylocka, breake; w każdym case i co najważniejsze odpaliłem od nowa AS7 i stworzyłem nowy projekt, bo czasamio tak się dzieje, że mimo że zmienie coś w programie to i tak te zmiany jakoś się nie zatwierdzają po buildzie.

Teraz muszę dodać przycisk zatwierdzający opcję i cofający. Cofający też chyba zrobię na goto, jak myślisz?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 19:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2013
Posty: 45
Pomógł: 2

Ja unikam instrukcji goto jak zarazy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 20:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1021
Lokalizacja: Trójmiasto
Pomógł: 188

Dzonzi napisał(a):
Widocznie nie za bardzo rozumiesz co tam się dzieje
rozumiem że Ty wiesz, i znasz na wylot zasady jakimi się rządzi kompilator GCC i potrafisz przewidzieć co on zrobi gdy napotka taki twór w którym instrukcje w if są wykonywane "na siłę" bez sprawdzania warunku nie wspominając już co zrobi z instrukcjami warunku przeciwstawnego... Zapominasz że instrukcje języka C nie są bezpośrednio wykonywane przez uC tylko tłumaczone na assembler, a potem na kod maszynowy. Tak jak w realnym życiu każde niedopowiedzenie prowadzi do plotek których końcowe znaczenie nijak się ma do rzeczywistości, tak i nie da się przewidzieć co za twór powstanie na podstawie niejednoznacznych instrukcji napisanych w języku wysokopoziomowym.
Być może program Ci teraz działa jak chcesz, być może tylko się tak wydaje, a po dłuższym działaniu program zacznie "żyć własnym życiem" - poprostu próbuje Ci uświadomić że takie postępowanie się zemści przy bardziej rozbudowanym projekcie, bo jak się program zacznie sypać, wiele wody upłynie zanim dojdziesz dla czego.
No chyba że assembler masz w małym palcu i potrafisz zweryfikować czy kod assemblera wygenerowany na podstawie niejednoznacznych instrukcji C jest dokładnie tym co zamierzałeś osiągnąć.



Ostatnio edytowano 23 mar 2018, o 20:42 przez xentis, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 20:40 
Offline
Moderator
Avatar użytkownika

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

xentis napisał(a):
rozumiem że Ty wiesz, i znasz na wylot zasady jakimi się rządzi kompilator GCC i potrafisz przewidzieć co on zrobi


no pewnie, że zna i potrafi przewidzieć ;)

Dzonzi napisał(a):
bo czasamio tak się dzieje, że mimo że zmienie coś w programie to i tak te zmiany jakoś się nie zatwierdzają po buildzie.


po prostu miodna wypowiedź :D

_________________
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: 23 mar 2018, o 22:22 
Offline
Użytkownik

Dołączył(a): 24 lut 2014
Posty: 28
Pomógł: 0

To co proponujecie? Wywalić tego całego case do funkcji i tych ifach od przycisków tylko ją wywoływać?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 mar 2018, o 22:35 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 63
Pomógł: 1

Dzonzi napisał(a):
To co proponujecie? Wywalić tego całego case do funkcji i tych ifach od przycisków tylko ją wywoływać?


gdy ja miałem swoją przygodę z obsługą przycisków to bardzo pomógł mi temat Pana Mirka umieszczonym na blogu: http://mirekk36.blogspot.com/2012/10/ob ... a-cd3.html

a dodatkowo podzielę się kodem który na podstawie tego artykułu napisałem

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.


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


kodu dawno nie uruchamiałem, ale z tego co pamiętam działał na zestawie ATB-1.04b

P.S. Jak widać w pliku main.c w pętli while jest funkcja do której przekazuje się wskaźnik do struktury TBUTTON, a wniej jest wskaźnik na funkcję jaką chcemy uruchomić. Co ważne te funkcje możemy w locie zmienić, w tak zwanym między czasie :) raz wywołamy funkcję A a raz B.

Pozdrawiam,
Tomek



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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