Zjednodušení podmínky

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Odpovědět
PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Zjednodušení podmínky

Příspěvek od PetrB » 12 bře 2023, 00:09

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?

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zjednodušení podmínky

Příspěvek od kiRRow » 12 bře 2023, 07:09

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.

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Zjednodušení podmínky

Příspěvek od peterple » 12 bře 2023, 08:48

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

Uživatelský avatar
kiRRow
Příspěvky: 1151
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Zjednodušení podmínky

Příspěvek od kiRRow » 12 bře 2023, 14:42

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;
	}
}

Uživatelský avatar
gilhad
Příspěvky: 778
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Zjednodušení podmínky

Příspěvek od gilhad » 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

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Zjednodušení podmínky

Příspěvek od PetrB » 12 bře 2023, 23:04

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.

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Zjednodušení podmínky

Příspěvek od peterple » 12 bře 2023, 23:27

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

PetrB
Příspěvky: 141
Registrován: 20 čer 2018, 13:39
Reputation: 0

Re: Zjednodušení podmínky

Příspěvek od PetrB » 13 bře 2023, 23:57

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.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 20 hostů