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



Teraz jest 19 mar 2026, o 08:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 16 lut 2016, o 14:25 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

Witajcie. Mam kilka pytań co do rzutowania.

1. Posiadam funkcję, która zwraca mi wartość int16_t, natomiast zmienna, którą zwraca jest typu uint16_t, czy przy zwracaniu powinno się wykonać rzutowanie typu ?
Funkcja wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Jaka jest w sumie różnica przy zmianie takiego typu ?

2. Pewna funkcja zwraca mi wartość w postaci :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W jaki sposób mogę ją zamienić na zmienną typu uint16_t z zakresu 0-1023 ? Chodzi mi o sposób przeliczenia tych wartości. Czy w tym przypadku przy konwersji typów zostanie ucięta część ujemna liczby (int16_t)ret ? Tzn jeżeli będę miał np ret=-100 to po konwersji wyświetli 0 ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2016, o 14:44 
Offline
Moderator
Avatar użytkownika

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

po pierwsze zamiast pisać int16_t łatwiej chyba pisać int ;) ale to taka tylko kosmetyczna uwaga

czy trzeba rzutować w takim przypadku ? .... sprawa jest banalnie prosta ;) .... zdaj się na kompilator - jeśli on nie krzyczy żadnym warningiem, to znaczy że sam dokonał niejawnego rzutowania i wcale nie musisz się tym przejmować ;) (w większości wypadków)

Zaś w twoim konkretnym przypadku - to nie wiem do końca po co chcesz robić takie sztuczki cyrkowe z rzutowaniem zamiast zmienić typ swojej zmiennej get_tem właśnie na int czyli zgodny z typem zwracanego rezultatu .... no sam powiedz ? po co sobie kładziesz że tak powiem kłody pod nogi ? czy nie lepiej tę funkcję napisać tak?

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


i masz po zawodach ;) bez żadnego rzutowania .... a jeszcze lepiej (akurat w przypadku konkretnie int16_t) tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
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: 16 lut 2016, o 15:23 
Offline
Użytkownik
Avatar użytkownika

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

A dlaczego w obliczaniu wartości get_temp jest "*100UL"? Mnożysz przez liczbę typu unsigned long int. Jeżeli później zapisujesz to w zmiennej typu int, może wystarczy pomnożyć przez zmienną typu int?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2016, o 22:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 237
Lokalizacja: Rzeszów
Pomógł: 11

Dlatego, że wynik danej operacji zapisywany jest z precyzją największego z argumentów. I tak - mnożąc dwie liczby int wynik będzie zapisany jako int i może on łatwo przekroczyć zakres tego typu i zostanie zapisany błędnie (pomniejszony o wartość maksymalną - dojdzie do przepełnienia i zapisany zostanie "ogonek").

Powiem szczerze, nie wiem jak zachowa się wynik, gdy funkcja pomiar(5) zwróci wartość ujemną i to dużą - w granicach swojego zakresu, skoro kompilator ma 100 traktować jaku uint - bez znaku.

Nie ważne, że potem dzielisz - pierwsze wykonywane jest mnożenie i ten wynik trzeba jakoś przechować.
Kolejna sprawa uint ma zakres 0 - ‭65535‬. Nie wiem do końca jak przebiegnie rzutowanie np. wartości 65000 na int, którego zakres wynosi: ‭-32768‬ do ‭32767‬ (???). Na pewno nie otrzymasz 65000, bo jest to poza zakresem tego typu.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2016, o 09:07 
Offline
Użytkownik

Dołączył(a): 08 lut 2015
Posty: 132
Pomógł: 4

APAP75 napisał(a):
Powiem szczerze, nie wiem jak zachowa się wynik, gdy funkcja pomiar(5) zwróci wartość ujemną i to dużą - w granicach swojego zakresu, skoro kompilator ma 100 traktować jaku uint - bez znaku.

Zdecydowałem się na taki zapis ponieważ funkcja pomiar(5) to odczyt ADC i najmniejszą zwróconą wartością może być 0 :)

APAP75 napisał(a):
Nie ważne, że potem dzielisz - pierwsze wykonywane jest mnożenie i ten wynik trzeba jakoś przechować.
Kolejna sprawa uint ma zakres 0 - ‭65535‬. Nie wiem do końca jak przebiegnie rzutowanie np. wartości 65000 na int, którego zakres wynosi: ‭-32768‬ do ‭32767‬ (???). Na pewno nie otrzymasz 65000, bo jest to poza zakresem tego typu.


Z tym poradziłem sobie sprawdzaniem warunków aby liczba nie przekroczyła danego zakresu :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2017, o 00:59 
Offline
Użytkownik

Dołączył(a): 02 cze 2014
Posty: 123
Pomógł: 0

Chciałem odświeżyć watek rzutowania bo mam problem z przekazaniem do pewnej funkcji wskaźnika na zmienna bajtowa.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Można poprosić o poprawienie błedu.

_________________
http://mojekonstrukcje.pl/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 lut 2017, o 08:20 
Offline
Moderator
Avatar użytkownika

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

No bo ty chcesz zrobić wskaźnik z wartości zmiennej i ... a przecież masz tylko przekazać wskaźnik na zmienną czyli jej adres

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


i kompilator już nie krzyczy, bo przekazałeś właśnie adres do pamięci do komórki w której znajduje się wartość

_________________
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: 8 lut 2017, o 23:20 
Offline
Użytkownik

Dołączył(a): 02 cze 2014
Posty: 123
Pomógł: 0

Ok o to chodziło dzieki

_________________
http://mojekonstrukcje.pl/



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] 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