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

Kód: Vybrat vše

if not (i in [13,10,60]) Then ...
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.