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



Teraz jest 17 lip 2018, o 16:13


Strefa czasowa: UTC + 1





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

Dołączył(a): 06 wrz 2017
Posty: 63
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 ]
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 ]
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 ]
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
Tech-support
Avatar użytkownika

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

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 10:57 
Offline
Użytkownik

Dołączył(a): 25 wrz 2015
Posty: 317
Lokalizacja: Rypin/Flekkefjord
Ostrzeżenia: 1
Pomógł: 1

W wywołaniu funkcji musisz podać parametry bo zadeklarowałeś, że funkcja wymaga takich parametrów. Tak sobie wymyśliłeś pisząc funkcję więc kompilator "trzyma się" tego czego od niego wymagasz.
Jeśli chodzi o obliczenia to parametry podane przy wywołaniu funkcji nie są pomijane tylko nadpisywane już wewnątrz niej samej przez co w tym konkretnym wypadku nie ma znaczenia jakie one są.

Wysłane z mojego Moto G (5S) przy użyciu Tapatalka



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

Dołączył(a): 06 wrz 2017
Posty: 63
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
Tech-support
Avatar użytkownika

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

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: 63
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: 1369
Pomógł: 153

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: 63
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: 686
Lokalizacja: Trójmiasto
Pomógł: 128

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 ]
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: 1369
Pomógł: 153

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: 63
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
Tech-support
Avatar użytkownika

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

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: 63
Pomógł: 0

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



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

Dołączył(a): 25 wrz 2015
Posty: 317
Lokalizacja: Rypin/Flekkefjord
Ostrzeżenia: 1
Pomógł: 1

Wywołując funkcję musisz podać odpowiednią ilość i rodzaj parametrów jakie ta funkcja wymaga. Przy deklaracji funkcji jest to określone. Zasada jest taka:
typ_zwracanej_wartości nazwa_funkcji (parametry). Specjalna nazwa to "void" co oznacza brak parametrów lub zwracanej wartości.
void super_funkcja (void) oznacza, że funkcja "super_funkcja" nie zwraca nic i nie wymaga parametrów.
uint8_t super_funkcja (void) oznacza, że funkcja zwraca wartość uint8_t ale nie przyjmuje parametrów
void super_funkcja (uint16_t a) oznacza, że funkcja nie zwraca wartości ale przyjmuje dokładnie jeden parametr typu uint16_t i wewnątrz funkcji będzie on dostępny pod zmienia "a"

Wysłane z mojego Moto G (5S) przy użyciu Tapatalka



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

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

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


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: 28 cze 2018, o 22:21 
Offline
Tech-support
Avatar użytkownika

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

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
Tech-support
Avatar użytkownika

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

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: 63
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: 41
Pomógł: 2

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: 63
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: 283
Lokalizacja: Szczecin
Pomógł: 45

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
Tech-support
Avatar użytkownika

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

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 ]
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: 283
Lokalizacja: Szczecin
Pomógł: 45

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: 337
Pomógł: 79

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 ;)

_________________
Miksowanie kodu C i ASM przy użyciu GCC



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

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

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
Tech-support
Avatar użytkownika

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

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

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO