Jak můžu opustit funkci

PetrM

Re:Jak můžu opustit funkci
« Odpověď #195 kdy: 17. 07. 2018, 09:54:41 »
Minimalne je fajn mat moznost taku slucku rozpojit. Vzdy sa tam da dopisat boolean, ked treba.  Ale chapem, ze asi kompilator nekonecnu slucku asi vidi a patricne zoptimalizuje.

Ne. Pokud je taková smyčka ve frameworku a změníš ji na "konečnou" jinak, než pomocí DI, tak si to rozbiješ při aktualizacích.

Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}


balki

Re:Jak můžu opustit funkci
« Odpověď #196 kdy: 17. 07. 2018, 10:02:01 »
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Re:Jak můžu opustit funkci
« Odpověď #197 kdy: 17. 07. 2018, 10:25:58 »
Boolean se dopsat nedá, teda aspoň ne v C.

Problém je třeba v tom, že žádný true není v C definováno. A testovat v C proti true je sebevražda. Proč by to  měl člověk dělat při nekonečné smyčce?

Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)
Protože by chtěl, aby byla nekonečná? O.o Mimo to zrovna pokud jde o to "testování", tak to kompilátor "zoptimalizuje", tudíž je úplně jedno jestli píšu while(1), nebo for(;; ).

Navíc pokud předpokládáme, že se funkce isExit() zabývá nějak vnitřním stavem hlavní smyčky, je nesmysl to volat hned na vstupu. Pokud nevybleješ průchod smyčkou ještě jednou před ni. Takže pokud chceš opravdu testovat isExit() na okraji smyšky, je vhodnější do-while podle principu DRY.

To jsi předpokládal ty. Jinak samozřejmě do-while to řeší.

Každopádně endless loop + break má výhodu v tom, že můžeš testovat kdekoliv - na začátku smyčky zpracuješ události, aktualizuješ stav a můžeš testovat, jestli je to stav pro ukončení. Zbytek logiky smyčky nemusíš při ukončení brát v potaz...

Nevidím důvod, proč psát
Kód: [Vybrat]
  ...
  updateSa();
  while(s != STATE_EXIT) {
    updateSa();
    if(s != STATE_EXIT) {
      ...
    }
  }

když můžu napsat

Kód: [Vybrat]
  for(;;) {
    updateSa();
    if(s == STATE_EXIT) {
       break;
    }
    ... // Neprovede se pri ukonceni
  }

a mít tam jednu podmínku místo dvou (2 stejný podmínky bez optimalizace = 2x zahazování pipeline, rozhození dvoubitovýho prediktoru skoků,...)

Ano, to by šlo, v těchto případech to píši stejně (vyjma while(1) místo for(;; ), ale to je jen konvence).
« Poslední změna: 17. 07. 2018, 10:27:44 od Cikáda »

PetrM

Re:Jak můžu opustit funkci
« Odpověď #198 kdy: 17. 07. 2018, 11:17:48 »
Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)

Nemůžeš definovat ani makro, ani enum. A to je ten chyták. V C nejde definovat plnohodnotná hodnota TRUE. To tvoje makro bude použitelný maximálně jako předdefinovaná návratová hodnota pro tvoje funkce, nic víc. A stejně se pak nemůžeš spolehnout, že bool f() bude vracet jenom TRUE a FALSE.

Protože by chtěl, aby byla nekonečná? O.o Mimo to zrovna pokud jde o to "testování", tak to kompilátor "zoptimalizuje", tudíž je úplně jedno jestli píšu while(1), nebo for(;; ).

Kompilátoru to jedno je, ale není to jedno těm, kdo ten kód čtou.
for(;;) - nekonečný cyklus
for(i = 1; i < 10; i++) - cyklus od jedné do deseti s krokem 1
for( i= 1; i < 100; i+= 5) - cyklus od 1 do 100 s krokem 5
for(i = 0; i <  sizeof(x) / sizeof(x[0]); i++)  - cyklus procházející statické pole
for(item = root; item != NULL; item = item->next) - cyklus procházející seznam

while(x) - opakování, dokud x != 0
while(1) - opakování, dokud 1 != 0
while(true) - opakování, dokud true != 0 - oh wait, co je to true?

To jsi předpokládal ty. Jinak samozřejmě do-while to řeší.

Tak předpoklad je, že pokud to jde ukončit jinak, než zabitím natvrdo přes kernel, bude tam nějaký příjem zpráv nebo kontrola dat. A z toho se vyhodnotí, kdy končit. A příjem zpráv je přece vždycky součást hlavní smyčky / smyčky ve vlákně. Je fajn, pokud není chyba v parametrech, napřed přijmout zprávy a prubnout jednu iteraci / inicializaci. Nebo inicializovat stavový automat, který má stav EXIT. Situace se může dost lišit a napsat, že while(něco) je univerzální řešení, je na kopanec do zadku zepředu.

PetrM

Re:Jak můžu opustit funkci
« Odpověď #199 kdy: 17. 07. 2018, 11:20:42 »
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Takže nevíš? Prubni to znovu. Lidi na tvé úrovni to často používají.

Btw, teď jsem viděl od kontraktora

Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}

Nezabil bys ho za ty dvě chyby?


balki

Re:Jak můžu opustit funkci
« Odpověď #200 kdy: 17. 07. 2018, 11:21:43 »
Nekonecne slucky su nesvar.

Jak uděláš thread v RTOSu bez nekonečné smyčky? (jinde než v threadech na RTOSu a v main() jsem ještě nekonečnou smyčku nepoužil)

Jo aha, multitasking a multithreading je nešvar. Špagety v main() rulezzz, ať je z toho Arduino style žumpa bez možnosti reuse a údržby...

Ak aplikaciu nepotrebujes civilizovane vypnut a ma to bezat "furt", potom je ta nekonecna slucka mozno aj ok. 

balki

Re:Jak můžu opustit funkci
« Odpověď #201 kdy: 17. 07. 2018, 11:26:27 »
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Takže nevíš? Prubni to znovu. Lidi na tvé úrovni to často používají.

Btw, teď jsem viděl od kontraktora

Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}

Nezabil bys ho za ty dvě chyby?

Noo, čo to robí, keď má x priradenu hodnotu -5 ?  :)   To akože "pravda", "nepravda" a "šicko v porádku tu maš banan"?

DogWithFleas

Re:Jak můžu opustit funkci
« Odpověď #202 kdy: 17. 07. 2018, 11:58:35 »
Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)

Nemůžeš definovat ani makro, ani enum. A to je ten chyták. V C nejde definovat plnohodnotná hodnota TRUE. To tvoje makro bude použitelný maximálně jako předdefinovaná návratová hodnota pro tvoje funkce, nic víc. A stejně se pak nemůžeš spolehnout, že bool f() bude vracet jenom TRUE a FALSE.

_Bool.
Ted pro zmenu rozumujes ty.

Kiwi

Re:Jak můžu opustit funkci
« Odpověď #203 kdy: 17. 07. 2018, 12:13:59 »
Boolean se dopsat nedá, teda aspoň ne v C. Kompilátor takový základní typ nezná a vždycky je to nebepečný rovnák na ohybák a těžký pasti. Schválně, co udělá tahle ukázka kódu? (Ostatní pls nenapovídat)
Kód: [Vybrat]
while(musiBezet() == true) {
  ...
}

 ::) Autizmus

Takže nevíš? Prubni to znovu. Lidi na tvé úrovni to často používají.

Btw, teď jsem viděl od kontraktora

Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}

Nezabil bys ho za ty dvě chyby?
Po pravdě, sice takový kód nesnáším, ale dám se podat. True a false naprosto běžně v C definuji přes makra a nikdy jsem s tím žádný problém neměl. Nějaké tušení, na co asi narážíš, sice mám, ale jestli je to skutečně ono, tak problém bude kapku jinde.

Re:Jak můžu opustit funkci
« Odpověď #204 kdy: 17. 07. 2018, 12:29:45 »
Po pravdě, sice takový kód nesnáším, ale dám se podat. True a false naprosto běžně v C definuji přes makra a nikdy jsem s tím žádný problém neměl. Nějaké tušení, na co asi narážíš, sice mám, ale jestli je to skutečně ono, tak problém bude kapku jinde.

A je `x == true` to same jako `x`? ;-)

Kit

Re:Jak můžu opustit funkci
« Odpověď #205 kdy: 17. 07. 2018, 12:34:15 »
Btw, teď jsem viděl od kontraktora
Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}
Nezabil bys ho za ty dvě chyby?

Tento zápis představuje třícestné rozbočení. Bez dalšího vysvětlení je obtížné pochopit, o co jde a proto je to špatně.

JSH

Re:Jak můžu opustit funkci
« Odpověď #206 kdy: 17. 07. 2018, 12:42:28 »
Ne, v C můžu použít "cokoliv" vyjma 0 a NULL. (případně si definovat makro)

Nemůžeš definovat ani makro, ani enum. A to je ten chyták. V C nejde definovat plnohodnotná hodnota TRUE. To tvoje makro bude použitelný maximálně jako předdefinovaná návratová hodnota pro tvoje funkce, nic víc. A stejně se pak nemůžeš spolehnout, že bool f() bude vracet jenom TRUE a FALSE.

_Bool.
Ted pro zmenu rozumujes ty.
No ale o tomhle přesně psal. Ten _Bool tam nikdo nedodefinoval prostředky C. Musel se přidat jako nové klíčové slovo na úrovni překladače. Jinak nebylo možné zaručit, že bude mít opravdu jen dva možné stavy. A těch pastí kolem intu předefinovaného na bool je víc. Že se pak _Bool předefinovává na příčetnější název je jenom kvůli kolizím se starým kódem.

balki

Re:Jak můžu opustit funkci
« Odpověď #207 kdy: 17. 07. 2018, 12:44:15 »
Btw, teď jsem viděl od kontraktora
Kód: [Vybrat]
if (x == true) {...} else if (x == false) {...}
Nezabil bys ho za ty dvě chyby?

Tento zápis představuje třícestné rozbočení. Bez dalšího vysvětlení je obtížné pochopit, o co jde a proto je to špatně.

O toto mu asi ide:
1.  v C nie je hodnota pre true definovana, moze byt vsetko okrem 0. To je prvy problem.  Ak pouzivas standardnu libku, alebo si normalny( das true = 1 a false = 0), tak nie je problem.  Alebo si predposraty a das tam if(x != false).
2. ozaj je to trojcestne rozhodovanie.

x14

  • ***
  • 182
    • Zobrazit profil
    • E-mail
Re:Jak můžu opustit funkci
« Odpověď #208 kdy: 17. 07. 2018, 12:52:31 »
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

balki

Re:Jak můžu opustit funkci
« Odpověď #209 kdy: 17. 07. 2018, 13:00:32 »
Ok, takže znovu: Prosím vás, už nekrmte ty trolly.

Bez ohladu, ze je to brutalne offtopic, clovek aspon pochopi niektore motivacie,
ktore vedu k spagetovemu kodu. To nie je krmenie trollov, ale edukacia.