funkce utoa v XC8

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

funkce utoa v XC8

#1 Příspěvek 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

Uživatelský avatar
berk
Příspěvky: 107
Registrován: 07 úno 2014, 01:00

#2 Příspěvek 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;
}

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#3 Příspěvek 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?

Uživatelský avatar
berk
Příspěvky: 107
Registrován: 07 úno 2014, 01:00

#4 Příspěvek 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);

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#5 Příspěvek 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).

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#6 Příspěvek 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í?

Uživatelský avatar
mikollar
Příspěvky: 1406
Registrován: 26 pro 2004, 01:00
Bydliště: Košice - okolie

#7 Příspěvek 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

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#8 Příspěvek od Ladin »

Trochu jsem se bál, že to budu muset takle nějak udělat :lol:

Uživatelský avatar
Ladin
Příspěvky: 32
Registrován: 07 dub 2015, 02:00

#9 Příspěvek 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);

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“