'51 a konwersja typow

Apr 05, 2004 13 Replies

Witam, kolejny problem stanal na mojej drodze, przyzwyczajony jestem ze w C istnieja funkcje do konwersji typow jednakze w moim kompilatorze ich nie ma. Problem dotyczy konwersji floata na char. int na char robie w ten sposob:



LCDInt(int n) { unsigned char buffer[2];



int temp; temp = n;



buffer[0] = (temp/100)+48; buffer[1] = (temp/10)+48; buffer[2] = (temp%10)+48; putch_lcd(buffer[0]); putch_lcd(buffer[1]); putch_lcd(buffer[2]); }



ale co do float na char nie mam pomyslu, ktos moze mi podpowie jak ogarnac floata ?



U¿ytkownik "angel" snipped-for-privacy@szas.z.pl> napisa³ w wiadomo¶ci news:c4s07g$5ct$ snipped-for-privacy@nemesis.news.tpi.pl...

moze jest sprintf ?

a moze nie potrzebujesz floata ?

U¿ytkownik "angel" snipped-for-privacy@szas.z.pl> napisa³ w wiadomo¶ci news:c4s07g$5ct$ snipped-for-privacy@nemesis.news.tpi.pl...

(...)

?????

Wyprowad¼cie mnie z b³êdu, ale dwuelementowa tablica elementów typu unsigned char nie mo¿e byæ tak indeksowana! Przecie¿ buffer[2] najprawdopodobniej (bo to zale¿y jeszcze od wyrównania zmiennych a pamiêci) pokrywa siê z obszarem pierwszego bajtu zmiennej temp! Tutaj chyba fuksem to dzia³a, bo ten obszar jest nadpisywany wtedy, kiedy temp jest ju¿ nieu¿ywany.

S³owem, albo kto¶ oszczêdza na ka¿dym bajcie, albo kod jest ewidentnie b³êdny!!

Co s±dzicie?

Pozdrawiam, Przemys³aw Szeremiota

U¿ytkownik "angel" snipped-for-privacy@szas.z.pl> napisa³ w wiadomo¶ci news:c4s07g$5ct$ snipped-for-privacy@nemesis.news.tpi.pl...

I to dzia³a? Bo je¶li to jest C, to ciutek ¿e¶ za tablicê wyjecha³... Coprawda tu pewnie bêdzie dzia³aæ i nawet siê nie rozjedzie póki kompilator przydzieli pamiêæ na temp dok³adnie za buffer.

Mon, 5 Apr 2004 19:04:28 +0200 jednostka biologiczna o nazwie "Przemysław Szeremiota" snipped-for-privacy@WYWALTO.icpnet.pl> wyslala do portu 119 jednego z serwerow news nastepujace dane:

Najprawdopodobniej. Tak czy inaczej buffer[2] wyjezdza za tablice

Zgadza sie.

Pewnego dnia angel przemówił ludzkim głosem:

Najprościej będzie chyba przerzutować na zmienną bajtową (o ile liczba się zmieści) i dopiero z niej wydzielić poszczególne znaki.

unsigned char buf[3]; float a; char b;

a=5.0; b=a; buf[2]=b/100+'0'; buf[1]=b/10+'0'; buf[0]=b%10+'0';

Całość powinna działać pod warunkiem, że mamy liczbę nieujemną. W przeciwnym wypadku najpierw sprawdziłbym znak i ewentualnie wyświetlił minus, a potem zmienił znak liczby na dodatni i wydzielał z niej poszczególne cyfry.

A nie masz w bibliotece funkcji ftoa() ?

Po co ci ten buffer ? [zreszta za krotki]

No i chyba sobie nie radzisz, bo co sie pokaze w srodku 123 ?

tak na goraco:

tempint=floor(data) ; LCDint(tempint); // ale prawdziwy, a nie tylko 3 cyfry data = (data-tempint)*10000 //wstawic zalozona dokladnosc tempint=floor(data) ; if tempint>0 { lcdchar('.') ; lcdint(tempint) ;}

J.

No czlowiek uczy sie cale zycie, o dziwo dziala ale pewnie przypadkiem jak piszecie :) Dziwne ze kompilator nie naplul ze element wyjezdza poza rozmiar no ale mniejsza o wiekszosc. Posiedzialem podlubalem i wydlubalem oczywiscie nie ma jeszcze funkcji do przesuwania kursora etc ale sama czesc do pokazania floata dziala :) bynajmniej widze znak za zankiem na uarcie.

char buff[80]; int n;

void piszznak(char *znak) { while( *znak ) { t6963data=*znak; printf("%c",*znak); //Na uart test *znak++; } } void piszcyfry(float flo) { n = sprintf (buff, "%0.1f", flo); //dokladnosc do dziesietnej czesci piszznak(buff); }

piszznak("Pisze "); piszcyfry(312.2);

Dzieki za pomoc i wskazowki, walcze dalej i to pewnie nie ostatni problem na jaki trafilem :)

Reg, Mariusz.

Kompilator C tego z zalozenia nie robi ! To programista ma wiedziec co robi :-)

Uprzedzam ze printf jest funkcja dosc wielka - pewnie pare kB zajmuje ..

J.

Pozbede sie jej przed ladowaniem programu na procka, uzywam jej na symulatorze :) Zauwazylem ze ten nieszczesny float rowniez generuje spora ilosc kodu,jednakze w asm nie moglem sobie dac rady ze zmiennym przecinkiem. Zastanawiam sie jeszcze nad jednym, skoro uzyje wyswietlacza graficznego a nie chce korzystac z brzydkiego pokracznego generatora znakow to bede musial oprogramowac kazdy nie standardowy znak ktory ma pokazac wyswietlacz ? Tzn stworzyc mapy dla cyfr 0 - 9 i pozniej w odpowiedniej funkcji gdy odbierze ona dana cyfre pchnac na wyswietlacz odpowiednie komendy i mape zamiast samej cyfry?

Pzdr, Mariusz.

Chyba lepiej znak++; //- bez tej * Gwiazdka w zasadzie nie przeszkadza, ale troche zaciemnia.

Krzysiek Rudnik

51 czy 52 ? Bo na dzien dobry dosc spora ilosc ram zuzywasz :-)

na test moze byc, ale jeden znak to putc,putch lub putchar

J.

angel napisal(a):

A jestes pewien, ze potrzebujesz floatow? Z mojego doswiadczenia wynika, ze w znakomitej wiekszosci przypadkow mozesz je ominac....

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required