Re: Problem z obliczeniami w AVR-GCC

Skróci³em program do minimum i nadal ¼le dzia³a:

//program testowy #include

void main(void) { unsigned char y = 5; unsigned long x = 56789;

x-=(y*10000); }

W x powinno byæ po dzia³aniu 6789 a jest 72325 O co tu chodzi!

Pozdrawiam EM

Reply to
EM
Loading thread data ...

Proponuje zrobiæ dodatkow± znmienn± temp dla dzia³ania: temp = y*10000 Potem zrobiæ x-=temp. Potem zobaczyæ dok³adnie które dzia³anie jest ¼le wykonywane.

-- Marcin.

Reply to
Marcin

U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgalio$ssp$ snipped-for-privacy@news.onet.pl...

Witam! Nie wiem dok³adnie w czym problem ale wyliczony wynik to 2^16 + 6789. Za problem s± pewnie odpowiedzialne niejawne kontersje typów, szczególnie z unsigned char na jaki¶ inny. Spróbuj rozbiæ t± operacjê na dwie: najpierw * potem -= i zobacz gdzie pojawia siê z³y wynik. Mo¿esz te¿ spróbowaæ tak: x -= ((unsigned long)y * 10000); To pewnie pomo¿e ale nie da odpowiedzi dlaczego wystêpowa³ b³±d. Napisz co z tego wysz³o. Sam nie u¿ywam AVR-GCC ale mam trochê do¶wiadczeñ z komputerów PC... Pozdrawiam Wojtek

Reply to
Wojtek

Jak siê teraz domy¶lam wsytêpuje rzeczywi¶cie jaki¶ b³±d w konwersji typów. Czyli zawsze jak u¿ywam dzia³añ arytmetycznych powinienem pilnowaæ siê typów? Przytoczony przyk³ad dzia³a ok. Dziêkujê za szybkie podpowiedzi i pozdrawiam. EM

Reply to
EM

Tutaj jest mno¿enie liczb ca³kowitych wiêc trudno siê spodziweaæ zafa³szowania wyniku poprzez utratê czê¶ci u³amkowej... Tak mi siê wydaje Pozdr EM

Reply to
EM

U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgalio$ssp$ snipped-for-privacy@news.onet.pl...

Tu z kolei przekraczasz zakresy zadeklarowanych zmiennych co prowadzi do nieprzewidywalnych rezultatów. C nie uprzedza o tym i trzeba siê pilnowaæ. Jak zrobisz x -= ((unsigned long) y * 10000); to wyjdzie dobrze.

-- Pozdrowienia Jurek Szczesiul

Reply to
Jerzy Szczesiul

U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgapa1$8sv$ snipped-for-privacy@news.onet.pl...

Z typami nale¿y uwa¿aæ. Zwykle jest tak, ¿e wynik operacji (np. u Ciebie mno¿enia y * 10000) jest takiego typu jak pierwszy operand (czyli u Ciebie unsigned char ) i nie jest to b³±d a po prostu cecha jêzyka C. W przytoczonym przyk³adzie kompilator zachowa³ siê jeszcze inaczej i byæ mo¿e to zachowanie to jest b³êdne lub przynajmniej "niestandardowe".

No to siê cieszê.

Pozdrawiam równie¿ Wojtek

Reply to
Wojtek

U¿ytkownik "EM" napisa³ w wiadomo¶ci news:bgapik$9lf$ snipped-for-privacy@news.onet.pl...

Kolega Jerzy mia³ z pewno¶ci± na my¶li Twój pierwszy przyk³ad... Wojtek

Reply to
Wojtek

Akurat tam chodzi o odrzucenie czê¶ci u³amkowej...

mno¿enia

char )

Próbowa³em jeszcze x -= (10000*y);

Ale tak te¿ nie jest dobrze EM

Reply to
EM

Jeszcze jedna my¶l Najgorsze jest to, ¿e przyk³ad zaci±gn±³em z jakiego¶ gotowego pliku

/*********************************************************** * Program: LCD driver * Created: 28.8.99 21:32 * Author: Brajer Vlado * snipped-for-privacy@kks.s-net.net * Comments: HITACHI LCD driver ************************************************************/

Trzeba czasmi uwa¿aæ, co siê wykorzystuje... Pozdr EM

Reply to
EM

U¿ytkownik "Wojtek" napisa³ w wiadomo¶ci news:bgaogn$9g0$ snipped-for-privacy@atlantis.news.tpi.pl...

6789.

szczególnie z unsigned char na jaki¶ inny.

gdzie pojawia siê z³y wynik.

W zasadzie to wiadomo : avr-gcc gdy warto¶æ siê nie zmie¶ci³a uzy³ domyslnego typu int, wpisanie tam po¶redniego 50000 czyli 0xC350 zostaje interpretowane ( najstarszy bit okre¶la znak ) jako

-(~0xc350 + 1) = - 15536 i wtedy rzeczywi¶cie 56789 - (-15536) = 72325

-- Pozdrowienia Jurek Szczesiul

Reply to
Jerzy Szczesiul

U¿ytkownik "Jerzy Szczesiul" napisa³ w wiadomo¶ci news:bgarv0$f1q$ snipped-for-privacy@nemesis.news.tpi.pl...

Zgadza siê. Tak w³a¶nie musia³o siê staæ. Wojtek

Reply to
Wojtek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.