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 21 kwi 2025, o 03:59


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 24 ] 
    Autor Wiadomość
    PostNapisane: 25 cze 2018, o 10:32 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Witam.Mam pytanko odnośnie parametrów.Dlaczego w wywołaniu funkcji muszę wpisywać (0,0) żeby kompilator nie wyrzucał błędu?Podam przykład:

    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.


    A jak zrobię tak to funkcja oblicza wartość.

    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.

    Pozdrawiam.

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

    A jak wpisze tak to wartości są brane z wewnątrz funkcji?A wartości są pomijane(100,100).

    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 10:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1168
    Lokalizacja: Kraków
    Pomógł: 93

    wrctomi napisał(a):
    Dlaczego w wywołaniu funkcji muszę wpisywać (0,0) żeby kompilator nie wyrzucał błędu?
    Ponieważ funkcja przyjmuje dwa argumenty (oba typu uint8_t). A jeżeli funkcja jest zadeklarowana z argumentami, więc musisz je podać przy wywołaniu funkcji.
    wrctomi napisał(a):
    A jak wpisze tak to wartości są brane z wewnątrz funkcji?A wartości są pomijane(100,100).
    Tak się dzieje, ponieważ przy wywołaniu funkcji zmienne a i b mają wartości 100 i 100. Natomiast niżej przypisujesz tym zmiennym nowe wartości. Więc te nowe będą brane pod uwagę przy obliczeniu wyniku.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 11:27 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Czyli jeśli chcę wywołać funkcje która posiada wewnątrz jakieś parametry np.2 to wywołuje ją tak funkcja(0,0);??Żeby zwróciła to co ma w środku?.
    A jeśli wewnątrz nie ma żadnych innych wartości np.przy dodawaniu funkcja(100,100).Przy wywołaniu funkcja zwróci wartość 200 ?

    ------------------------ [ Dodano po: 19 minutach ]

    Czy dobrze rozumuje?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 12:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1168
    Lokalizacja: Kraków
    Pomógł: 93

    Chyba nie do końca. Jeśli chcesz, żeby funkcja coś zwróciła, to w funkcji używasz "return" (w Twoim przypadku return a+b -> zwraca sumę a i b)
    Jeżeli chcesz przekazać do funkcji jakieś zmienne, na których będziesz wykonywał obliczenia, to wtedy przy deklaracji funkcji zaznaczasz, ile i jakiego typu zmiennych chcesz używać. A potem wywołujesz funkcję z wartościami, na których chcesz operować.
    Spróbuj jaśniej opisać, jak to widzisz



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 14:58 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Jeśli chcę przekazać jakieś zmienne do funkcji muszą to być zmienne globalne tak?I je można użyć jako parametry funkcji?

    ------------------------ [ Dodano po: 12 minutach ]

    uint8_t funkcja(uint8_t,uint8_t);
    Funkcja która zwraca uint8_t a parametry do czego służą?Mógłby ktoś napisać przykład?I wyjaśnić.Z góry dziękuje za cierpliwość.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 15:32 
    Offline
    Użytkownik
    Avatar użytkownika

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

    wrctomi napisał(a):
    Jeśli chcę przekazać jakieś zmienne do funkcji muszą to być zmienne globalne tak?I je można użyć jako parametry funkcji?
    Nie. Zmienne globalne są widoczne w całym projekcie, więc ich nie musisz przekazywać (choc to nie jest zabronione). Przekazuje się zmienne lokalne.
    wrctomi napisał(a):
    uint8_t funkcja(uint8_t,uint8_t);
    Funkcja która zwraca uint8_t a parametry do czego służą?Mógłby ktoś napisać przykład?I wyjaśnić.Z góry dziękuje za cierpliwość
    To jak z obiadem. Masz wyjście (zwracany parametr), czyli coś co uzyskałeś w garnku. Ale aby funkcja mogła robić coś co nie jest zawsze tym samym obiadem, to musisz móc wkładać jej dane wejściowe poprzez parametry.
    Przekazując składniki jako parametry do funkcji gotuj obiad, dostajesz z niej wynik czyli obiad na talerzu :).

    --
    Pozdrawiam,
    Robert

    ------------------------ [ Dodano po: 2 minutach ]

    Jak nie przekazujesz parametrów przy wywołaniu funkcji nie ma wejściowych parametrów. Czyli przy wywołaniu nie dostarczasz jej zmiennych danych do działania. Oczywiście funkcja może bazować na zmiennych globalnych, ale nie jest to porządne rozwiązanie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 15:59 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    wkładać jej dane wejściowe poprzez parametry. A skąd te dane spływają.Proszę o jakiś praktyczny przykład .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 16:29 
    Offline
    Użytkownik
    Avatar użytkownika

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

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


    Teraz gdy chcemy zapalić diodę led o numerze 2 poprostu wywołujemy funkcję z numerem tej diody, wywołana funkcja porówna przekazany parametr z warunkami, i jeśli któryś warunek będzie spełniony wykona instrukcję czyli zapali diodę.

    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.

    Tu masz z kolei bardziej rozbudowaną funkcję do której przekazujesz dwa parametry - numer diody i czy ma zostać zapalona czy zgaszona (0 zgaś, 1 i więcej - zapal), natomiast przed nazwą funkcji nie ma void tylko jest uint8_t co oznacza że funkcja coś zwraca - w tym wypadku stan całego portu - czyli podłączonych wszystkich ledów.



    Ostatnio edytowano 25 cze 2018, o 16:39 przez xentis, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 16:32 
    Offline
    Użytkownik
    Avatar użytkownika

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

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


    --
    Pozdrawiam,
    Robert



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 17:36 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Zaczynam rozumieć. A jak zrobić żeby funkcja jeśli się wykona dała jak gdyby potwierdzenie wykonania,zakończenia np do zmiennej globalnej w postaci np 1.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 17:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    witam,
    albo funkcja która nic nie zwraca, ale na podstawie parametrów coś wykonuje.

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

    wkodzie wpis

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

    taki przykład. :)

    albo np. funkcja zwracająca stan na porcie B, funkcji nie podajemy parametrów.

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


    albo funkcja zwracająca stan bitu 0 na porcie B, funkcji nie podajemy parametrów bo np. nie potrzebujemy.

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


    ......................................................
    wrctomi napisał(a):
    A jak zrobić żeby funkcja jeśli się wykona dała jak gdyby potwierdzenie wykonania,zakończenia np do zmiennej globalnej w postaci np 1.


    a można w funkcji przecież zmienić jakąś zmienną globalną na 1. np. flaga_mojej_funkcji.

    pozdrawiam.

    ------------------------ [ Dodano po: kilkunastu sekundach ]

    dopiszę................w ostatnim przykładzie.



    Ostatnio edytowano 25 cze 2018, o 18:26 przez Daro69, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 cze 2018, o 18:16 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Muszę poćwiczyć.Dziękuje Wszystkim za podpowiedzi.Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 cze 2018, o 18:24 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Witam.Czy można w tej funkcji zrobić while (ms++). Jak to zrobić?


    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 cze 2018, o 22:21 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    Witam,
    Tak zetknąłem na kod i ...
    Po pierwsze primo:
    Z tego co pamiętam to funkcji _deay_ms nie podajemy parametrów z przecinkiem.
    Po drugie primo:
    Czy kolega ma świadomość że w funkcji bodajże "licz", blokuje pętlę główna pętlą while.?
    Po trzecie primo:
    ... hmm... Z uwagi na te delaye ...
    Chyba czas zainteresować się timerami i przerwaniami. :) Powaga. :)
    I wszystko stanie się prostsze. ;)
    Pozdrawiam.

    Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 cze 2018, o 22:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    W drugim primo,
    chodziło mi i funkcję "moja_fun" a nie o licz.

    Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lip 2018, o 07:39 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Witam.A jak zrobić żeby funkcja nie blokowała głównej pętli (while).A co do przecinka to tam go nie ma.Jest makro definicja
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    Chyba nazwa może być z _ ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lip 2018, o 09:34 
    Offline
    Użytkownik

    Dołączył(a): 20 sty 2014
    Posty: 56
    Pomógł: 4

    Kolega wyżej napisał: przerwania, timery.
    Co do przecinka to chodzi o tą linię:
    _delay_ms(0.95); -> zły argument funkcji
    Tak nazwa makra może zawierać '_'

    Proponuję zacząć od nauki języka, jakaś książka, tutorial :D



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lip 2018, o 09:56 
    Offline
    Użytkownik

    Dołączył(a): 06 wrz 2017
    Posty: 94
    Pomógł: 0

    Dzięki.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lip 2018, o 19:06 
    Offline
    Użytkownik

    Dołączył(a): 22 gru 2013
    Posty: 296
    Lokalizacja: Szczecin
    Pomógł: 47

    Panowie nie wprowadzajcie w błąd.
    Funkcja _delay_ms() może przyjmować argumenty z "przecinkiem"
    Taki jest prototyp (deklaracja): void _delay_ms(double __ms).
    https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__util__delay_1gad22e7a36b80e2f917324dc43a425e9d3.html



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lip 2018, o 20:12 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    krish napisał(a):
    Panowie nie wprowadzajcie w błąd.

    no tak, :) double.
    z tym że w tym przypadku i tak potraktuje to 0.95 jako 1. :P
    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.

    ale fakt, przyjmuje parametr double. czyli źle pamiętałem , a zapis "_delay_ms(0.95);" jest poprawny. 8-)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 1 lip 2018, o 22:09 
    Offline
    Użytkownik

    Dołączył(a): 22 gru 2013
    Posty: 296
    Lokalizacja: Szczecin
    Pomógł: 47

    Faktem jest, że później te funkcje mogą się różnie zachowywać (np. różna dokładność) i nie informować o tym.
    W pewnych szczególnych przypadkach dokumentacja wskazuje, że nawet nie będzie opóźnienia.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 lip 2018, o 09:18 
    Offline
    Użytkownik

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

    Daro69 napisał(a):
    z tym że w tym przypadku i tak potraktuje to 0.95 jako 1.

    Chyba niekoniecznie. Zwróć uwagę, że w miejscu, które zaznaczyłeś w kodzie, to __tmp jest porównywane z wartością1.0, a __tmp != __ms, chyba że F_CPU=4000, co jest raczej rzadko spotykane ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 lip 2018, o 10:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    O kurczaki, ...
    Racja!!!
    dzięki @andrews. :)

    Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 lip 2018, o 16:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    Korekta do pierwszego primo. :oops:
    Po przeanalizowaniu na spokojnie. :)
    założenia: taktowanie 8MHz,

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

    __tmp = (8e6 / 4e3) *1 = 2000.
    ticks = __temp.
    _delay_loop_2(2000) , trwa 4cykle razy 2000, = 8000 cykli. 8000/8000000 = (0,001 s).

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

    __tmp = (8e6 / 4e3) * 0.95 = 1900.
    ticks = __tmp.
    _delay_loop_2(1900) , trwa 4cykle razy 1900, = 7600 cykli. 7600/8000000 = (0,00095 s).

    dzięki @krish, dzięki @andrews,
    sorka @wrctomi.
    musiałem naprostować.
    :mrgreen:



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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