Johnnie
Guest
Sun Jun 15, 2008 3:49 pm
Na stronie Sensiriona:
http://www.sensirion.com/pdf/product_information/Sample_Code_humidity_sensor_SHTxx.pdf
jest przykladowy program w C (Keil) na 8051 do obslugi czujnika temperatury
i wilgotnosci SHTxx. Przerabiam go na AVR (GCC) i mam problem z konwersja:
// definicje
typedef union
{ unsigned int i;
float f;
} value;
value humi_val,temp_val;
// krytyczna konwersja
humi_val.f=(float)humi_val.i;
GCC zle oblicza humi_val.f, Keil nie ma tego problemu. Sprawe rozwiazuje
zastosowanie dodatkowej zmiennej:
// rozwiazanie
float temp=(float)humi_val.i;
humi_val.f=temp;
Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?
J.
Zbych
Guest
Sun Jun 15, 2008 4:00 pm
Johnnie przemówił ludzkim głosem:
Quote:
Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?
Prawdopodobnie problem leży w tym, że zmienna źródłowa i docelowa
zajmują ten sam adres i w trakcie konwersji zmienna int jest modyfikowana.
J.F.
Guest
Sun Jun 15, 2008 6:24 pm
On Sun, 15 Jun 2008 16:49:13 +0200, Johnnie wrote:
Quote:
typedef union
{ unsigned int i;
float f;
} value;
value humi_val,temp_val;
// krytyczna konwersja
humi_val.f=(float)humi_val.i;
GCC zle oblicza humi_val.f, Keil nie ma tego problemu. Sprawe rozwiazuje
zastosowanie dodatkowej zmiennej:
Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?
Bo ja wiem czy blad kompilatora .. chyba nie do tego unia sluzy.
trzeba by zajrzec w kod, ale owszem - optymalizujacy kompilator moglby
przekazac dwa adresy procedurze konwersji, zajechala by sobie dane
w trakcie pracy ..
J.
JS
Guest
Sun Jun 15, 2008 7:52 pm
W artykule <g33ajk$itf$1@nemesis.news.neostrada.pl> Johnnie napisalu:
Quote:
// definicje
typedef union
{ unsigned int i;
float f;
} value;
value humi_val,temp_val;
// krytyczna konwersja
humi_val.f=(float)humi_val.i;
Czy to jest blad GCC, czy taka operacja moze dawac rozne wyniki w zaleznosci
od kompilatora?
IMO jest to poprawny program w C. GCC realizuje "nieelementarne" przekształcenia
jako wywołania funkcji bibliotecznych i prawdopodobnie tam jest błąd - funkcja
zakłada, że źródło i wynik się nie nakładają. Może być jednak i tak, że ma
prawo tak przyjąć, a to kompilator nie wywiązuje się z obowiązku utworzenia
kopii danych.
--
Pozdrawiam!
Jarosław Szynal