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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 17 maja 2025, o 01:07


    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 ] [ Zaznacz wszystko ]
    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: 1034
    Lokalizacja: Trójmiasto
    Pomógł: 190

    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: 1034
    Lokalizacja: Trójmiasto
    Pomógł: 190

    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: 1034
    Lokalizacja: Trójmiasto
    Pomógł: 190

    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: 27396
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


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