RTV forum PL | NewsGroups PL

Jak skutecznie skonwertować float na char w programowaniu dla '51?

'51 a konwersja typow

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak skutecznie skonwertować float na char w programowaniu dla '51?

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 Smile
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 Smile 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 Smile 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 Smile
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 Smile
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 Smile 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   





elektroda NewsGroups Forum Index - Elektronika Polska - Jak skutecznie skonwertować float na char w programowaniu dla '51?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map