- sabe blogja
- A hozzászóláshoz be kell jelentkezni
- 794 megtekintés
Hozzászólások
Ez jó!
- A hozzászóláshoz be kell jelentkezni
mindig beleborzongok amikor egy while true loopot látok
- A hozzászóláshoz be kell jelentkezni
Miért? A main() nálam jellemzően valami init(), aztán while (true) { /* folyamatok */ }.
Szerk.: Már persze MCU-n, ahol reset után hardware init, IT vektorok inicializálása, aztán hadd szóljon. :)
Más kontextusban break-kel is ki lehet szállni belőle. Szóval?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Valahogy úgy. Csak magas szintű nyelveknél rugóznak rajta. Gyanítom soha nem nézték meg mit fordít belőle a fordító.
- A hozzászóláshoz be kell jelentkezni
Egyesek berzenkednek attól is, hogy függvény belsejében legyen return. Márpedig simán csinálok ilyesmit:
int8_t func(uint8_t *p) {
if (p == NULL) return -1;
/* ... */
*p = foo();
/* ... */
return 0;
}
Érezzem magam ezért rosszul?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem gondolnám hogy szarul kellene érezd magad emiatt. Gyanítom ebből is ugyanolyan hatékony kódot fordít a fordító.
- A hozzászóláshoz be kell jelentkezni
Szerintem a sírás nem a hatékonytalanság miatt van, hanem azon megy az aggódás, hogy jaj, mi lesz, ha nem veszed észre a függvény belsejében lévő return-t, és akkor valamit majd rosszul csinálsz, amitől mind meghalunk.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem halunk meg mind, csak max aki írta a kódot, ha az aki majd tovább fejleszti, túl sok időt pocsékol egy könnyen benézett hibára, és hirtelen felindulásból cselekszik :)
- A hozzászóláshoz be kell jelentkezni
Guard clause a neve. Szeretem, sokkal olvashatobba teszi a kodot, mint ha if es behuzas hegyekkel pakolod tele a kododat.
Ez az "1 darab return lehet" valami olyan nyelvet hasznaloktol johet, ami nem kezeli rendesen. Ha jol emlekszem, a Pascalnak volt ilyen tervezesi hibaja.
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Na igen, mert ahogy írod is, az alternatívája az, hogy az egész függvény egy if (p) {} belsejében lenne.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Triviális hibaesetek kezelésére elmegy, de egyébként egy `goto RETURN` jobb, mert a RETURN címkére lehet majd tenni a breakpointot, debugkiírást, erőforrásfelszabadítást.
- A hozzászóláshoz be kell jelentkezni
debugkiírást, erőforrásfelszabadítást
Ez rendben, ha nincs más megoldás, ezt csinálom, de amúgy utálom a goto-t C-ben.
breakpointot
Még sohasem használtam ilyesmit. Szoktam valami log lehetőséget írni, de ha valamiért ez nem járható út, akkor ott van az oszcilloszkóp.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Meg ragaszthatsz ragot a lyukkartyara, hogy megakadjon az olvasoban :) . Azert goto-t inkabb ne..
Egyebkent en is inkabb a log hive vagyok, a debugger hatranya, hogy latod a hibas mukodest, de azt nem, hogy mi okozta, es hogy kerult oda. A naploban meg vissza tudsz tekerni, hogy mi okozta a bajt.
Mikrokontrolleren meg logikai analizator a megfelelo labakra, ha a print elrontana az idoziteseket.
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Lehetőleg gyors, aszinkron logolást használok. A logolós függvényem ugyanúgy paraméterezhető, mint a printf(), viszont ring bufferbe ír, amit majd egy ráérős helyen a bufferből a fizikai eszközre, pl. aszinkron soros interface-re írok. Ezt még PIC16-on is meg tudtam csinálni, bár csak néhány száz byte bufferrel. PIC32-n 16 kiB a logbufferem a soros interface felé, USB felé 32 kiB.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem gondoltam annyira mely ertelmet a hozzaszolasba, csak konstanshoz kotni egy ciklust szamomra furan nez ki, en valami while (xy.IsOpen()) vagy ilyesmit hasznalnek ha fajlon dolgozik a processz. Fogalmam sincs oszinten szolva mi mire fordul vagy mi optimalis, foleg ugy hogy nem adott nyelvrol beszelunk eppen, egyszeruen csak furcsa szamomra.
- A hozzászóláshoz be kell jelentkezni
Na jó, és hogyan csinálnál végtelen ciklust? Valami label:, majd a végén goto label? Az szerintem még rondább.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Nem tudom mikor használtam utoljára, lehetséges hogy azok a main függvények amiket könyvtárakból vagy frameworkökből használtam és nem determináltan futottak ugyanigy while true dolgok voltak a forrásban, de én valószínűleg olyan változóhoz kötném aminek tudok akár cikluson belülről feltételeket adni, pl. a végén egy kilépésre szolgáló gombnyomás ellenőrzéssel, ilyesmi. Elhiszem nektek, hogy a while true is megfelelő exit code-al lép ki és hogy akár a fordítónak sem számít, nekem minden esetre logikailag furcsa.
- A hozzászóláshoz be kell jelentkezni
Sejtem, mi a nézeteltérés közöttünk. Vélhetően te mindig operációs rendszer fölött írtál alkalmazást, ami valamikor befejezi a működését, átadja lelkét a Teremtőnek, majd a process meghal, az oprendszer meg megy tovább.
Én viszont sokszor mikrokontroller firmware-ét írom C-ben, ahol a main()-ből nem térünk vissza, mert nincs hova. Ha kilépnénk, hova kerülne a vezérlés? Tudniillik a main() hívása után nincs semmi, ott memória szemét van, tehát csak fejreállás lehet belőle. Igazából a main() hívásának ebben az esetben nem is kellene call-nak lennie, mert semmi szükség a visszatérési címre, teljesen jó lenne ott egy jmp is. Tehát még billentyűnyomás, vagy bármilyen esemény sem léptetheti ki.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Teljesen igazad van, nincs sok közöm sajnos a hardware közeli dolgokhoz. Valószínűleg ez okozhatja hogy kissé értetlenül állok a téma előtt.
- A hozzászóláshoz be kell jelentkezni
Mit ajanlasz helyette ilyen esetekre? A KeyboardInterrupt-os resz elkapja a ctrl-c-t, alapvetoen meg azt szeretne, hogy a program a gep leallitasaig vagy a program kiloveseig fusson. Az esemenyvezerelt programok is egy loopban dolgozzak fel a bejovo esemenyeket (aztan azok kozt majd lesz olyan, amitol egyszer bezarodik). Service-ek is hasonloan mukodnek. A programok jelentos resze valami hasonlot csinal a melyen, legfejlebb nem latod. Mikrokontrolleren meg kozel 100%-uk.
Ez persze nem vonatkozik arra, amikor van benne egy if break valahol, amit siman ki lehetne tenni a while feltetelebe. Par algoritmusnal mondjuk van olyan, amikor nem trivialis kitenni, de az esetek tobbsegeben kiteheto, es olvashatobba valik a kod.
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Igen, csak sok esetben, ha ki akarod tenni a while ()-ba a kilépés feltételét, kétszer kell tesztelni. Már a ciklusmag második részében kell egy if (), hogy ne fusson az a rész, majd a while () újra tesztel, hogy kilépjen. Ilyenkor sokkal egyszerűbb egy if () break; szerintem.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Le a kalappal.
Saying a programming language is good because it works on all platforms is like saying anal sex is good because it works on all genders....
- A hozzászóláshoz be kell jelentkezni
Marvin jutott eszembe, a paranoid android.
- A hozzászóláshoz be kell jelentkezni
Talán rossz helyen dolgozik?
- A hozzászóláshoz be kell jelentkezni
Ugy erted, masik munkahelyen a kollegaktol megkapna ugyanezt? :D
A strange game. The only winning move is not to play. How about a nice game of chess?
- A hozzászóláshoz be kell jelentkezni
Hát ahol ilyen juniorokat vesznek fel ott azért gond van a felvételi folyamattal
- A hozzászóláshoz be kell jelentkezni