Stránka 1 z 1

funkce utoa v XC8

Napsal: 21 dub 2015, 16:11
od Ladin
Ahoj, mám funkci utoa, která převádí číslo na jednotlivá čísla(ASCII znaky):

Kód: Vybrat vše

unsignet int cislo = 123;
char buf[10];
utoa(buf, cislo, 10);


takto bude BUF[] = 1,2,3

ale já potřebuji aby BUF[] = 0,0,0,0,0,0,0,1,2,3

pomooooc!

8O

Napsal: 21 dub 2015, 16:53
od berk
Myslíš takto?

Kód: Vybrat vše

int main(void)
{
        unsigned int cislo = 123;
        char buf[10];
        snprintf(buf, 9, "%09d", cislo);

        printf("%s\n",buf);         
        getchar();
        return 0;
}

Napsal: 22 dub 2015, 08:31
od Ladin
No.... nejsem si jistý, snprintf to nezná, co je to za knihovnu?
Můj případ.... mám funkci pro zobrazení čísla na lcd:

Kód: Vybrat vše

void writenum (unsigned int cislo, size_t size, unsigned int x1, unsigned int y1,unsigned char col1, unsigned char col2){
     char buf[10];
     utoa(buf, cislo, 10);
     writetxt(buf,size,x1,y1,col1,col2);
}


a pokud klesne např. číslo ze 100 na 99, zobrazí to 990, proto potřebuji, aby se zobrazovalo číslo s nulami před... 001,002,099,100

jde to nějak?

Napsal: 22 dub 2015, 09:16
od berk
Měla by to být knihovna

Kód: Vybrat vše

#include <stdio.h>


zná alespoň sprintf ?

Kód: Vybrat vše

snprintf(buf, "%09d", cislo);

Napsal: 22 dub 2015, 09:34
od AB1
pokud klesne např. číslo ze 100 na 99, zobrazí to 990

Ta nula ti tam zbude po předešlém čísle.
Před zobrazením vymaž řádek (vyplň mezerama).

Napsal: 22 dub 2015, 10:30
od Ladin
...tak knihovnu stdio mam, ale zna pouze sprintf... :?

...to já vím, že to zobrazuje 990, protože tam zbyla nula ze 100, ale mazat před každým zobrazením to nechci, ptže to snižuje rychlost zobrazení na polovinu a ta je v mém případě klíčová... navíc potřebuji aby jednotky, desítky i stovky byly stále na stejné pozici...

myslel jsem(a h.... věděl) ... neexistuje matematické řešení?

Napsal: 22 dub 2015, 11:12
od mikollar
sprintf je nenazrana funkcia na pamat a rychlost. Ak vies max rozsah cisla a nie je nejako velky, riesil som to tak ze som postupne odcitaval od cisla - 1000, 100, 10, 1. Potom pocet odcitavani + '0' ti da znak v ascii a ten som rovno vykreslil na LCD.

Ak som chcel pevne pozicie tak som len dal podmienku napr pri 1000 mieste ak je stovkova pozicia 0 zobraz namieste tisicok medzeru atd...

Je to o dost rychlejsie ako sprintf a menej narocne na pamat

Napsal: 22 dub 2015, 11:33
od Ladin
Trochu jsem se bál, že to budu muset takle nějak udělat :lol:

Napsal: 22 dub 2015, 11:50
od Ladin
Tak dobrý už jsem to :uri: ... pro čísla od 0 do 9999 stačí:

Kód: Vybrat vše

void writenum (unsigned int cislo, size_t size, unsigned int x1, unsigned int y1,unsigned char col1, unsigned char col2){
     unsigned char buf[10];
     cislo = cislo + 10000;
     utoa(buf, cislo, 10);
     buf[0] = ' ';
     writetxt(buf,size,x1,y1,col1,col2);