Dalsi zahada v C -> Prevod long int na string

Michal Gregor a2x1nptda8 na email.cz
Pondělí Červenec 25 17:11:37 CEST 2011


A jeste prevod byte na string (ted jsem to dopsal, nemam to vyzkousene). Bez 
deleni, bez cyklu:
//***********************************************************
// Převod čísel na řetězec, pracuje v rozsahu 0-255
// Počateční nuly zahazuje

static void Vypis_Byte( u08 Vstup_Byte, * u08 p_Vstup_Retezec, Boolean 
Vstup_Je_Signed) {

 auto Boolean Je_Prvni_Cislice;

 // Znaménko

 if ( Vstup_Je_Signed ) {

  Vstup_Byte = -Vstup_Byte;
     *p_Vstup_Retezec = '-';
  ++p_Vstup_Retezec;
 }


 // Stovky
 if (Vstup Byte >= 200) {

     Vstup_Byte -= 200;
     *p_Vstup_Retezec = '2';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 100) {

     Vstup_Byte -= 100;
     *p_Vstup_Retezec = '1';
  ++p_Vstup_Retezec;
     Je_Prvni_Cislice = True;
 }
 else {
     Je_Prvni_Cislice = False;
 }

    // Desítky
 if (Vstup Byte >= 90) {

     Vstup_Byte -= 90;
     *p_Vstup_Retezec = '9';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 80) {

     Vstup_Byte -= 80;
     *p_Vstup_Retezec = '8';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 70) {

     Vstup_Byte -= 70;
     *p_Vstup_Retezec = '7';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 60) {

     Vstup_Byte -= 60;
     *p_Vstup_Retezec = '6';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 50) {

     Vstup_Byte -= 50;
     *p_Vstup_Retezec = '5';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 40) {

     Vstup_Byte -= 70;
     *p_Vstup_Retezec = '40';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 30) {

     Vstup_Byte -= 30;
     *p_Vstup_Retezec = '3';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 20) {

     Vstup_Byte -= 20;
     *p_Vstup_Retezec = '2';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if (Vstup Byte >= 10) {

     Vstup_Byte -= 10;
     *p_Vstup_Retezec = '1';
  ++p_Vstup_Retezec;
  Je_Prvni_Cislice = True;
 }
 else if ( Je_Prvni_Cislice ) {

  // Menší než deset a už máme číslici ve výstupu, vypsat nulu
     *p_Vstup_Retezec = '0';
  ++p_Vstup_Retezec;
 }

 // Jednotky
    *p_Vstup_Retezec = Vstup_Byte + 48;
 ++p_Vstup_Retezec;
}


Michal Gregor





----- Original Message ----- 
From: "Michal Gregor" <a2x1nptda8 na email.cz>
To: "HW-News" <hw-list na list.hw.cz>
Sent: Monday, July 25, 2011 4:56 PM
Subject: Re: Dalsi zahada v C -> Prevod long int na string


Takze jsem si nasel par prikladu na prvod cisel do retezce. Je to hruza,
nedivim se ze jsou dnesni programy tak pomale. Nechapu proc se pouziva jedna
funkce pro desitkove a hexa cisla. Prevod hex. cisel je jednoduchy. Je
zbytecne do toho cpat nejake cykly, nebo dokonce deleni. V asembleru to mam
takto:
;*********************************************************
;Tady se vypíše na LCD spodní půlka W
;Vstup W
; Výstup LCD přes W

Spodni_Pulka_Byte_Na_LCD
     andlw 15
     addlw -10
     skpnc
     goto Hexa_Znaky
     addlw 58
     goto Lcd
Hexa_Znaky
     addlw 65
     goto Lcd

Spotreba datove pameti nula, program par byte, cyklu minimum.

(Zlaty asembler.) Dnes rano jsem se rozhodl ze se vykaslu na printf a nejak
to optimalizuji. To jsem nemel delat. V jinem programu jsem dopsal par radek
a po kompilaci jsem zjistil ze prestaly fungovat nekter funkce printf(),
program se nekam zahadne zabiha ve funkci printf. Kompilace probehne, ale
pri krokovani pogramu se program nekam zatoula na radku s sprintf(). Upravy
jsem pritom provadel v jine casti programu. PIC18 STD me asi nema rad....

Michal Gregor

_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list 



Další informace o konferenci Hw-list