Stránka 2 z 3

Napsal: 05 črc 2012, 12:58
od WLAB
I tak je to zvosleny, ponevadz mi prijde, ze to neni schopno vypsat samostatne znak '%';

co tohle:

Kód: Vybrat vše

..........................
uint8_t sc = 0;

while(*msg)
{
    if(!sc)
    {
        if(*msg == '%') sc = 1;
        else LCDData(*msg);
    }
    else
    {
        char usr = *msg-'0';
        if( (uint8_t) usr > 7 )
        {
             usr+='0';
            if(usr != '%') LCDData('%');
        }
        LCDData(usr);
        sc = 0;
    }
    msg++;
}
..............................

Napsal: 05 črc 2012, 13:29
od Andrea
WLAB píše:I tak je to zvosleny, ponevadz mi prijde, ze to neni schopno vypsat samostatne znak '%';

Proč ne? Sám to máš zvoslený.

Napsal: 05 črc 2012, 13:46
od WLAB
Jo, a jak vypisu treba retezec "99% abcd"? tedy pokud se bavime o puvodnim kodu, eventuelne (doplnenem) opravenem msg--;

edit: nemam na mysli vypis retezce "%\0" eventuelne "xxxx%\0";

Co mam zvosleny ja?

Napsal: 05 črc 2012, 13:53
od Andrea
Já jsem se ptala první, tak neodpovídej otázkou.

Napsal: 05 črc 2012, 13:59
od WLAB
No, mel jsem pocit, ze tvrdis, ze umi, pokud to tak neni, neni co resit.

A stale jsem se jeste nedozvedel, kde je chyba u mne.

Nakonec je tezke se bavit o chybach, kdyz neni specifikace :-).

Napsal: 05 črc 2012, 14:05
od Andrea
Ty jsi pořád nevysvětlil, proč to podle tebe neumí.

Napsal: 05 črc 2012, 14:20
od WLAB
No dobre, tak vypisu, vychazel jsem z toho, ze % mel byt specialni znak a "%%" obvykly zapis pro '%'.

Bral jsem "specifikaci" tak, ze "%x" je uzivatelsky znak a "%%" je "%", pokud x neni platne vypise se "%x".

Napsal: 05 črc 2012, 14:33
od Andrea
Nevím, co ty sis vymyslel, ale řešila se tu chyba v té zmíněné knihovně. A pořád čekám na to, proč to podle tebe nevypíše správně řetězec "99% abcd".

Napsal: 05 črc 2012, 14:40
od WLAB
Ano resila se tu chyba v knihovne. A co tedy budeme nazyvat chybou?

Ok, retezec "99% abcd" vypsat lze (plyne to z toho, co pisi vyse), pokud ho takto i zadame. Je to chyba nebo neni?

A co "a%3"? Bude to zde chyba, nebo ne?

Nakonec muzeme rici, ze puvodni kod je v poradku, jen byl nevhodne pouzit :-).

Napsal: 05 črc 2012, 15:13
od Andrea
Ne, původní kód není v pořádku, je v něm ta chyba, která se projeví, pokud je % poslední v řetězci.
"99% abcd" i "a%3" se vypíší, přesně jak autor knihovny zamýšlel.
http://extremeelectronics.co.in/avr-tut ... eric-lcds/

Napsal: 05 črc 2012, 15:29
od WLAB
Jak dostanu na displej "a%3"? Kdyz "%3" je nahrazeno custom znakem?

Napsal: 05 črc 2012, 15:32
od Andrea
Autor knihovny to pojal tak, jak to pojal, to si vyřeš s ním, já jen upozornila na faktickou chybu v kódu a navrhla její řešení. Víc se o tom nehodlám dohadovat.

Napsal: 05 črc 2012, 15:40
od WLAB
Jaky mel autor zamer nevime, vidime jen vysledek.

Vidim chybu jak v tom, ze retezec nesmi koncit '%', tak v tom, ze s '%' nelze dostatecne volne nakladat a jsem zbytecne omezen tim, co mohu vypsat (ac ten muj uvodni priklad s "99% abcd" byl nevhodny. Proto jsem navrhl upravu, ktera by i toto mela odstranit (netvrdim, ze v ni nemuze byt chyba, ale kde je, jsi nesdelila).

Napsal: 05 črc 2012, 23:08
od AB1
WLAB:
Autor zamýšlel tuto funkci jako normální funkci pro výpis stringu na LCD, s tou vyjímkou, že sekvence %1, %2, %3, %4, %5, %6 zobrazí uživatelem definované znaky. Všechny ostatní kombinace znaků jsou zobrazeny normálně.
V původním kódu ale byla chyba.
Po jejím odstranění (msg--) funguje kód přesně jak popsáno výše.

Naopak tvoje úprava nejde dobře.

Kód: Vybrat vše

//                         tvůj kód        původní opravený

LCDWriteString("%");       // nic          %
LCDWriteString("cd%8ef");  // cd%8ef       cd%8ef
LCDWriteString("100%");    // 100          100%
LCDWriteString("%%");      // %            %%
LCDWriteString("%3");      // uživ.3       uživ.3   


Celkem se mi zdá ta funkce překombinovaná.
Já bych použil normální funkci pro string

Kód: Vybrat vše

void LCDWriteString(const char *msg)
{
    while(*msg)
    {
         LCDData(*(msg++));
    }                         
}

a uživatelské znaky bych vkládal pomocí Escape sekvence.
Např. znak 'š' je na adrese 4.

Kód: Vybrat vše

LCDWriteString("\x04kola");

Napsal: 06 črc 2012, 08:58
od Andrea
Ty uživatelské znaky jsou 0x0 až 0x7 a 0x0 je konec řetězce. Šly by použít třeba znaky z rozsahu 0x80 - 0x87, tam nic k vidění nebývá.