angel
Guest
Mon Apr 05, 2004 3:04 pm
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 ?
--
GG: 833104
Mariusz, MMX
Andy
Guest
Mon Apr 05, 2004 3:16 pm
Użytkownik "angel" <mmxREMOVEME@szas.z.pl> napisał w wiadomości news:c4s07g$5ct$1@nemesis.news.tpi.pl...
Quote:
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.
...
moze jest sprintf ?
a moze nie potrzebujesz floata ?
--
Andrzej
Przemysław Szeremiota
Guest
Mon Apr 05, 2004 4:04 pm
Użytkownik "angel" <mmxREMOVEME@szas.z.pl> napisał w wiadomości
news:c4s07g$5ct$1@nemesis.news.tpi.pl...
Quote:
unsigned char buffer[2];
int temp;
(...)
buffer[0] = (temp/100)+48;
buffer[1] = (temp/10)+48;
buffer[2] = (temp%10)+48;
?????
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
Alek
Guest
Mon Apr 05, 2004 4:30 pm
Użytkownik "angel" <mmxREMOVEME@szas.z.pl> napisał w wiadomości
news:c4s07g$5ct$1@nemesis.news.tpi.pl...
Quote:
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;
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.
Quote:
putch_lcd(buffer[0]);
putch_lcd(buffer[1]);
putch_lcd(buffer[2]);
}
BLE_Maciek
Guest
Mon Apr 05, 2004 4:42 pm
Mon, 5 Apr 2004 19:04:28 +0200 jednostka biologiczna o nazwie
"Przemysław Szeremiota" <przemeksWYWALTO@WYWALTO.icpnet.pl> wyslala do
portu 119 jednego z serwerow news nastepujace dane:
Quote:
unsigned char buffer[2];
int temp;
buffer[2] = (temp%10)+48;
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!
Najprawdopodobniej. Tak czy inaczej buffer[2] wyjezdza za tablice
Quote:
Słowem, albo ktoś oszczędza na każdym bajcie, albo kod jest ewidentnie
błędny!!
Zgadza sie.
Zbych
Guest
Mon Apr 05, 2004 4:48 pm
Pewnego dnia angel przemówił ludzkim głosem:
Quote:
ale co do float na char nie mam pomyslu, ktos moze mi podpowie jak ogarnac
floata ?
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';
--
*Warning*: Dates in Calendar are closer than they appear.
### /mail: bzb<at>poczta<dot>onet<dot>pl/ ###
Zbych
Guest
Mon Apr 05, 2004 4:52 pm
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.
--
*Warning*: Dates in Calendar are closer than they appear.
### /mail: bzb<at>poczta<dot>onet<dot>pl/ ###
J.F.
Guest
Mon Apr 05, 2004 6:35 pm
On Mon, 5 Apr 2004 18:04:06 +0200, angel wrote:
Quote:
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.
A nie masz w bibliotece funkcji ftoa() ?
Quote:
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]);
}
Po co ci ten buffer ? [zreszta za krotki]
No i chyba sobie nie radzisz, bo co sie pokaze w srodku 123 ?
Quote:
ale co do float na char nie mam pomyslu, ktos moze mi podpowie jak ogarnac
floata ?
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.
angel
Guest
Mon Apr 05, 2004 10:38 pm
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.
J.F.
Guest
Mon Apr 05, 2004 11:57 pm
On Tue, 6 Apr 2004 01:38:32 +0200, angel wrote:
Quote:
Dziwne ze kompilator nie naplul ze element wyjezdza poza rozmiar no ale
mniejsza o wiekszosc.
Kompilator C tego z zalozenia nie robi ! To programista ma wiedziec co
robi :-)
Quote:
ale sama czesc do pokazania floata dziala

bynajmniej widze znak za
zankiem na uarcie.
printf("%c",*znak); //Na uart test
Uprzedzam ze printf jest funkcja dosc wielka - pewnie pare kB zajmuje
...
J.
angel
Guest
Tue Apr 06, 2004 7:14 am
"J.F." <jfox_nospam@poczta.onet.pl> wrote in message
news:8hv3701cnhkbadpa52stpg1479jeivncfo@4ax.com...
Quote:
Uprzedzam ze printf jest funkcja dosc wielka - pewnie pare kB zajmuje
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.
Krzysztof Rudnik
Guest
Tue Apr 06, 2004 8:12 am
angel wrote:
Quote:
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++;
Chyba lepiej znak++; //- bez tej *
Gwiazdka w zasadzie nie przeszkadza,
ale troche zaciemnia.
Krzysiek Rudnik
J.F.
Guest
Tue Apr 06, 2004 11:02 am
On Tue, 6 Apr 2004 01:38:32 +0200, angel wrote:
Quote:
char buff[80];
51 czy 52 ? Bo na dzien dobry dosc spora ilosc ram zuzywasz :-)
Quote:
void piszznak(char *znak) {
while( *znak ) {
t6963data=*znak;
printf("%c",*znak); //Na uart test
na test moze byc, ale jeden znak to putc,putch lub putchar
J.
Marcin E. Hamerla
Guest
Thu Apr 08, 2004 7:12 am