Stránka 1 z 1
Zjednodušení podmínky
Napsal: 12 bře 2023, 00:09
od PetrB
Ahoj,
mám cyklus, který má projít maximálně pro vSize-5 a nebo když na razí na jeden ze znaků CR/LF/=
cyklus mám definovaný takto:
Kód: Vybrat vše
for (parametrySize = 0; parametrySize < vSize - 5 && parametry[parametrySize] != charCR && parametry[parametrySize] != charLF && parametry[parametrySize] != charRovno ; parametrySize++) {
}
Cyklus funguje správně, ale nelíbí se mi, jak je zapsaný.
Představoval bych si to nějak takto:
Kód: Vybrat vše
for (parametrySize = 0; parametrySize < vSize - 5 && parametry[parametrySize] není prvkem {charCR,charLF,charRovno}; parametrySize++) {
}
Hledal jsem na netu, ale moc mi to nepomohlo. Umíte to někdo zjednodušit?
Re: Zjednodušení podmínky
Napsal: 12 bře 2023, 07:09
od kiRRow
Příkaz break a continue. Pokud v cyklu použiješ break, přeruší se a ukončí. Pokud v cyklu použiješ continue, přeruší se, ale vrátí se na začátek a bude pokračovat od začátku.
Re: Zjednodušení podmínky
Napsal: 12 bře 2023, 08:48
od peterple
A čo pomocou C klasiky?
Kód: Vybrat vše
for (parametrySize = 0; parametrySize < vSize - 5 && !strchr(parametry[parametrySize], "\r\n=")}; parametrySize++) {
}
Popis funkcie strchr
https://linux.die.net/man/3/strchr
Re: Zjednodušení podmínky
Napsal: 12 bře 2023, 14:42
od kiRRow
Já myslel že šlo tak nějak o zpřehlednění
Kód: Vybrat vše
for (parametrySize = 0; parametrySize < vSize - 5; parametrySize++) {
if(parametry[parametrySize] == charCR || parametry[parametrySize] == charLF || parametry[parametrySize] == charRovno){
//výhodou je že před předčasným ukončením cyklu mohu ještě něco vykonat
break;
}
}
Re: Zjednodušení podmínky
Napsal: 12 bře 2023, 15:36
od gilhad
On je problém, že tu podmínku nejde zjednodušit, jen zapsat různým způsobem.
Ten strchr je sice kratší zápis, ale víc kódu a delší výpočet
Re: Zjednodušení podmínky
Napsal: 12 bře 2023, 23:04
od PetrB
gilhad píše: ↑12 bře 2023, 15:36
On je problém, že tu podmínku nejde zjednodušit, jen zapsat různým způsobem.
Ten strchr je sice kratší zápis, ale víc kódu a delší výpočet
No, myslel jsem si to.
Já jsem z Delphi/Pascalu zvyklý psát to stylem
Tak jsem si říkal, jestli tady není něco podobně přímočarého. (ale je fakt, že jsem se nikdy nedíval, jak se to překládá do ASM)
Díky za reakce, nechám to, jak to je.
Re: Zjednodušení podmínky
Napsal: 12 bře 2023, 23:27
od peterple
Ono to robí prene to čo si chcel. Operátor '!' je not a funkcia strchr vráti true ak znak je obsiahnutý v množine znakov a false ak nie.
Akurát som prehodil parametre. Takže správny zápis je
Kód: Vybrat vše
for (parametrySize = 0; parametrySize < vSize - 5 && !strchr("\r\n=", parametry[parametrySize])}; parametrySize++) {
}
S dĺźkou to nemusí byť tak hrozné ak to použiješ viackrát. Pomalšie vykovnávanie by ma tiež moc netrápilo. Ale je fajn že začínaš myslieť ako to kompilátor kompiluje. Ako to robí pascal nemám ani šajnu. Či to prevedie na sériu testov, alebo si vytvorí pole a volá podobnú funkciu ako je strchr alebo memchr. Obe cesty sú možné pripadne sa môže rozhodovať optimálne podľa dĺžky poľa.
Vždy je niečo za niečo. Za použitie abstraktnejších konštrukcií sa platí cyklami navyše a nabalovaním knižničných funkcií.
Re: Zjednodušení podmínky
Napsal: 13 bře 2023, 23:57
od PetrB
Tak pro zajímavost jsem to v Delphi napsal oběma způsoby a podíval se na ASM překlad.
Mám kód
I : Byte;
For I=0 To 255 do
varianta1: If I in [1,3,4] Then Něco udělej;
varianta2: If (i=1) Or (I=3) Or (I=4) Then Něco udělej;
varianta1:
Kód: Vybrat vše
xor ebx,ebx
Začátek: mov eax,ebx
sub al,$01
jz vyvolej
add al,$fe
sub al,$02
jnb pokračuj
vyvolej: call něco udělej
pokračuj: inc ebx
test bl,bl
jnz Začátek
varianta2:
Kód: Vybrat vše
xor ebx,ebx
Začátek: cmp bl,$01
jz vyvolej
cmp bl,$03
jz vyvolej
cmp bl,$04
jnz pokračuj
vyvolej: call něco udělej
pokračuj: inc ebx
test bl,bl
jnz Začátek
Varianta 1 vypadá jako magie (odečti 1, přičti 254, odečti 2). Dvojka je čitelnější, porovnávají se jednotlivé hodnoty a kratší zápis asi být nemůže.
Předpokládám, že C++ to pro Arduino přeloží dost podobně a nic lepšího nevymyslím.