Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 166 (pdf).
Blíží se prázdniny a než se rozutečete k moři, je na čase se opět sejít na Virtuální Bastlírně - pravidelném setkání elektroniků, ajťáků, bastlířů a obecně nadšenců do techniky. Co si pro vás strahovští bastlíři připravili tentokrát? Určitě proberou blížící se Linux Days i další události. U softwaru se chvíli zdrží a poví si kupříkladu o tom, jak se zbavit Bambu Cloudu, ale nepřijít o možnost ovládat tiskárnu na dálku. Řeč dojde i na AI,
… více »Vývojáři postmarketOS vydali verzi 26.06 tohoto operačního systému pro chytré telefony vycházejícího z optimalizovaného a nakonfigurovaného Alpine Linuxu s vlastními balíčky. Přehled novinek v příspěvku na blogu. Na výběr jsou 4 uživatelská rozhraní: GNOME, KDE Plasma Mobile, Phosh a Sxmo.
Byla vydána nová verze 2.55.0 distribuovaného systému správy verzí Git. Přispělo 100 vývojářů, z toho 33 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.
Craig Loewen na blogu Microsoftu oznámil veřejnou preview verzi WSL kontejnerů, tj. linuxových kontejnerů ve Windows Subsystem for Linux (WSL). Spouští se příkazem wslc.exe.
Byla vydána (𝕏, Bluesky) nová verze 2026.2 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem 9 nových nástrojů v oficiálním oznámení na blogu.
Grafická aplikace Krokiet/Czkawka pro vyhledávání a odstraňovaní nepotřebných souborů (duplicitní soubory, prázdné složky, podobné obrázky, podobná videa, poškozené soubory a další) byla vydána ve verzi 12.0.0. Podrobný přehled novinek v příspěvku na Medium. Jedná se o poslední verzi frontendu Czkawka GTK nad Czkawka Core. Uživatelům se doporučuje migrovat na frontend Krokiet postavený nad frameworkem Slint. Představena byla aplikace Cedinia pro Android využívající Czkawka Core. Dostupná je jako APK pro ruční instalaci.
Po téměř třech letech od vydání verze 9 byla vydána nová verze 10 linuxové distribuce Mageia (Wikipedie). Přehled novinek v poznámkách k vydání.
Nourish (GitHub) je nový správce oken pro Linux. Tradiční plochy nahrazuje nekonečným plátnem a posouváním a přibližováním. Využívá vlastní kompozitor pro Wayland s názvem y5. Videoukázka.
Po 20 letech a 17 otevřených (open source) krátkých filmech Blender Studio oznámilo plán na svůj první celovečerní film. Cílem samozřejmě není jenom nový otevřený film, ale především vývoj a vylepšení otevřených nástrojů pro spolupráci napříč celým procesem a vytvoření otevřené příručky (playbook) pro filmovou produkci ve velkém měřítku s informacemi, které jsou obvykle dostupné pouze uvnitř komerčních studií, a pomoci tak nezávislým tvůrcům překonat technické a organizační bariéry.
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: