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.
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á.