Jihokorejská kryptoměnová burza Bithumb přiznala vážné selhání interních systémů, které ji vystavilo riziku sabotáže a nezabránilo chybné transakci v hodnotě přes 40 miliard dolarů (814 miliard Kč). Druhá největší kryptoměnová burza v Koreji minulý týden při propagační akci omylem rozeslala zákazníkům zhruba 620 000 bitcoinů místo 620 000 wonů (8700 Kč). Incident vyvolal pokles ceny bitcoinu o 17 procent. Většinu
… více »Google Chrome 145 byl prohlášen za stabilní. Nejnovější stabilní verze 145.0.7632.45 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Zpátky je podpora grafického formátu JPEG XL, viz Platform Status. Odstraněna byla před třemi lety. Nový dekodér JPEG XL jxl-rs je napsán v Rustu. Zobrazování JPEG XL lze vyzkoušet na testovací stránce. Povolit lze v nastavení chrome://flags (Enable JXL image format).
Byla vydána nová verze 1.26 programovacího jazyka Go (Wikipedie). Přehled novinek v poznámkách k vydání.
CrossOver, komerční produkt založený na Wine, byl vydán ve verzi 26. Přehled novinek v ChangeLogu. CrossOver 26 vychází z Wine 11.0, D3DMetal 3.0, DXMT 0.72, Wine Mono 10.4.1 a vkd3d 1.18. Do 17. února lze koupit CrossOver+ se slevou 26 %.
KiCad je nově k dispozici také jako balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit [Mastodon, 𝕏].
Šenčenská firma Seeed Studio představila projekt levného robotického ramena reBot Arm B601, primárně coby pomůcky pro studenty a výzkumníky. Paže má 6 stupňů volnosti, dosah 650 mm a nosnost 1,5 kilogramu, podporované platformy mají být ROS1, ROS2, LeRobot, Pinocchio a Isaac Sim, krom toho bude k dispozici vlastní SDK napsané v Pythonu. Kompletní seznam součástek, videonávody a nejspíš i cena budou zveřejněny až koncem tohoto měsíce.
… více »Byla vydána nová verze 36.0, tj. první stabilní verze nové řady 36, svobodného multimediálního centra MythTV (Wikipedie). Přehled novinek a vylepšení v poznámkách k vydání.
Byl vydán LineageOS 23.2 (Mastodon). LineageOS (Wikipedie) je svobodný operační systém pro chytré telefony, tablety a set-top boxy založený na Androidu. Jedná se o nástupce CyanogenModu.
Od března budou mít uživatelé Discordu bez ověření věku pouze minimální práva vhodná pro teenagery.
Evropská komise (EK) předběžně shledala čínskou sociální síť pro sdílení krátkých videí TikTok návykovým designem v rozporu s unijním nařízením o digitálních službách (DSA). Komise, která je exekutivním orgánem Evropské unie a má rozsáhlé pravomoci, o tom informovala v tiskovém sdělení. TikTok v reakci uvedl, že EK o platformě vykreslila podle něj zcela nepravdivý obraz, a proto se bude bránit.… více »
if ($url == 'foo'){
$a = 10;
return;
}
Řešení dotazu:
return slouží pro návrat z funkce, nikoliv pro ukončení cyklu. Pokud je ten kód součástí funkce, return tam použít můžeš.
if(x>0) printf("Cislo je vetsi nez nula.\n");
else printf("Cislo neni vetsi nez nula.\n");
printf("A pokračujem společným kodem.\n")
if(x>0) printf("Cislo je vetsi nez nula.\n");
else printf("Cislo neni vetsi nez nula.\n");
return;
Podle mě je to takto přehlednější, ale samozřejmě každý má jiné zvyky.
Spíš jde o tohle:
void napi_consume_skb(struct sk_buff *skb, int budget)
{
if (unlikely(!skb))
return;
/* dalších 20 řádků vlastního kódu funkce */
}
Samozřejmě můžete celý ten zbytek těla funkce, tj. celou její podstatu, odsadit a dát do else větve (nebo spíš rovnou otočit tu podmínku), ale čitelnosti to rozhodně neprospěje.
return je návrat z procedury/funkce. Dokonce se taková struktura poměrně často i používá. V testu if se posoudí, jestli parametry funkce, nebo jiná data, jsou chybně. Pokud jsou, tak nemá smysl ve funkci dále pokračovat, ošetří se chybový návratový stav a returnem se vrací.
ifů…
returnů sekat goto na něj. :-)
IF proměnná negativ,zero,positivese třemi labely. kdy kód za žádné podmínky nemusel pokračovat za IF.
s oblibou jsem s tím na VŠ provokoval.
Dokonalý chaos ovšem přinášejí interpretované jazyky. Např. "oblíbené"
ON <expr> GOTO <num> [, <num>... ]
v řadě dialektů BASICu a v některých dokonce
GOTO <expr>
Z toho se teoretikům programovacích stylů ježily chlupy i tam, kde netušili, že nějaké mají. :-)
Snad jsem Vám odpověděl.
Mám-li být upřímný, za sebe musím říct, že moc ne. Co se týká review kódu, osobně mnohem radši na začátku funkce uvidím
mp = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
if (unlikely(!mp))
return -ENOMEM;
než aby tam bylo formální "goto out" a já se musel ještě podívat dolů, jestli se v tom případě nedělá něco dalšího. To má naopak dobrý smysl, pokud na konci bude něco jako
err:
kfree(mp);
return -EINVAL;
}
a bude se tam skákat z víc různých míst. Nebo třeba u kaskád jako tady
void copy(source, target) {
if (!file_exists(source)) {
throw "Zdrojový soubor neexistuje.";
}
if (!is_dir(source)) {
throw "Zdroj nemůže být adresář.";
}
if (!is_readable(source)) {
throw "Zdrojový soubor nelze číst.";
}
if (!is_dir(target)) {
throw "Cíl nemůže být adresář.";
}
parent = parent_dir(target);
if (!file_exists(parent)) {
throw "Neexistuje adresář pro cílový soubor.";
}
if (exists(target)) {
throw "Cílový soubor již existuje.";
}
if (!is_writable(parent)) {
throw "Do cílového adresáře nelze zapisovat.";
}
if (get_free_space(parent) < get_file_size(source)) {
throw "V cílovém adresáři není dost volného místa.";
}
buffer, offset;
do {
buffer = read(source, offset, size(buffer));
write(target, offset, buffer);
offset += size(buffer);
} while(size(buffer) > 0);
}
Když to přepíšu na jediný výstupní bod, dostanu:
void copy(source, target) {
error = null;
if (file_exists(source)) {
if (is_dir(source)) {
if (is_readable(source)) {
parent = parent_dir(target);
if (file_exists(parent)) {
if (is_dir(target)) {
if (is_writable(parent)) {
if (!exists(target)) {
if (get_free_space(parent) >= get_file_size(source)) {
buffer, offset;
do {
buffer = read(source, offset, size(buffer));
write(target, offset, buffer);
offset += size(buffer);
} while(size(buffer) > 0);
} else {
error = "V cílovém adresáři není dost volného místa.";
}
} else {
error = "Cílový soubor již existuje.";
}
} else {
error = "Do cílového adresáře nelze zapisovat.";
}
} else {
error = "Cíl nemůže být adresář.";
}
} else {
error = "Neexistuje adresář pro cílový soubor.";
}
} else {
error = "Zdrojový soubor nelze číst.";
}
} else {
error = "Zdroj nemůže být adresář.";
}
} else {
error = "Zdrojový soubor neexistuje.";
}
throw error;
}
Pro mne je tedy ten druhý kód daleko nepřehlednější, a porušuje například jednu velmi dobrou zásadu omezující počet vnoření bloků. Nebo jak byste ten kód přepsal na jediný výstupní bod bez těch vnořených ifů? Počet vnoření by se samozřejmě dal zredukovat sloučením několika testů do jednoho a vytknutím do samostatné funkce, ale to neřeší princip problému.
Možná je rozdíl v programování triviálních funkcí přímo nad procesorem, kde máte jasně definované podmínky běhu, a pokud se náhodou dostanete mimo ně, zastavíte procesor a nějaký watchdog rozsvítí červenou kontrolku, že je všechno špatně (a mimochodem reset procesoru podle mne je výstupní bod, je to obdoba vyhození výjimky ve vyšších programovacích jazycích a způsob, jakým se ukončí provádění dané funkce). A v programování pro počítače, tablety, mobily, televize apod., kde uživatel pracuje přímo s programem, podmínky jsou velmi různorodé a každý očekává, že se z nečekaných situací dokáže program zotavit.
Tiskni
Sdílej: