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



Teraz jest 1 mar 2026, o 00:28


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 1 maja 2015, o 09:58 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

Witam.
Do tej pory raczej nie używałem rzutowania na inny typ i chciałbym się upewnić, czy dobrze to robię.

Tutaj mam zmienne z biblioteki do DS3231 datetime.hh oraz datetime.mm, czyli godzinę i minuty:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


I w końcu sedno sprawy, w pętli głównej przepisuję aktualny czas do tej zmiennej, aby porównywać ustawione
alarmy, które również zapisuję do zmiennych 16-bitowych:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wszystko działa jak należy, ale czy jest poprawnie zapisane i czy w pewnych sytuacjach o których nie pomyślałem
nie nastąpi jakiś błąd? Czy zmienną datetime.mm również należy rzutować?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2015, o 12:11 
Offline
Moderator
Avatar użytkownika

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

Rafał555 napisał(a):
alarm_czas = (uint16_t)datetime.hh ...


A po co to rzutowanie ? nie jest tu potrzebne bo nastąpi niejawne rzutowanie, to tak jakbyś zrobił np 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.


tu nie trza żadnego rzutowania ;) załatwia to sam kompilator niejawnie


Autor postu otrzymał pochwałę

_________________
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: 1 maja 2015, o 13:30 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

A już myślałem, że nastąpił ten moment, że potrzebne mi rzutowanie w programie :)
Dzięki panie Mirku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2015, o 13:51 
Offline
Moderator
Avatar użytkownika

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

Zobacz, gdybyś miał tylko taką strukturę:

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


(bez unii) ;) ... i taką zmienną

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


i teraz sobie wyobraź że chciałbyś skasować szybko w jednej pętli for() po kolei wszystkie zmienne w tej strukturze ? to jak ? np tak:

powołujemy sobie zmienną wskaźnikową

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


a teraz dokonujemy rzutowania wskaźnikowego

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


ZONK! to nie wychodzi bo kompilator strasznie płacze ... i ma rację boć przecież kasownik to wskaźnik typu uint8_t a wskaźnik &czas jest typu TDATETIME

no ale my wiemy co chcemy dalej zrobić - więc zróbmy rzutowanie - jak ?

hmmm no to co po prawej stronie musi być takiego samego typu jak to po lewej stronie tak ? no to siup!

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


TA DAAA!!! ... kompilator nie płacze - więc zabierzmy się do kasowania ochoczo

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


i tym sposobem wyzerowaliśmy wszystkie pola struktury ;) A co by było gdyby zmienna year była typu uint16_t ? ... żadna tragedia, wtedy pętla wyglądałaby tak:

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


mam nadzieję, że wiesz dlaczego taka różnica ?

_________________
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: 1 maja 2015, o 15:08 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

Czy rozumiem to pewny nie jestem. Najogólniej powiedziawszy jeżeli z prawej mamy "większy" typ zmiennej to należy ją rzutować.
W tym przypadku "lecimy" po strukturze bajt po bajcie to kasownik musi być jedno bajtowy. Jak zmienna year się zwiększy o 1 bajt to dodajemy w pętelce jeden obieg. W pętli "for" adres powinien być zwiększany o 1. Nie powinno być "kasownik+i" lub "kasownik +=1" zamiast "kasownik+1" ?
Najważniejsze, że wiem co to w ogóle jest rzutowanie. Myślę, że zasadności jego stosowania nauczę się podczas pisania programów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2015, o 15:10 
Offline
Moderator
Avatar użytkownika

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

Rafał555 napisał(a):
Najogólniej powiedziawszy jeżeli z prawej mamy "większy" typ zmiennej to należy ją rzutować.

Dlaczego większy ? ;) inny ... to dobre słowo. Inny a nie większy

Rafał555 napisał(a):
Nie powinno być "kasownik+i"

Oczywiście że powinno ;) sorki walnąłem się - już poprawiam - na szybko pisałem..... ;)

_________________
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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