Re: Problem z obliczeniami w AVR-GCC

Jul 31, 2003 11 Replies

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


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.

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

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

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

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

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

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

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

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

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required