Byly vyhlášeny výsledky letošní volby vedoucí/ho projektu Debian (DPL, Wikipedie). Poprvé povede Debian žena. Novou vedoucí je Sruthi Chandran. Letos byla jedinou kandidátkou. Kandidovala již v letech 2020, 2021, 2024 a 2025. Na konferenci DebConf19 měla přednášku Is Debian (and Free Software) gender diverse enough?
Byla vydána nová verze 10.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Přidána byla podpora Orange Pi 4 LTS. Přibyl balíček Prometheus.
Implementace VPN softwaru WireGuard (Wikipedie) pro Windows, tj. WireGuard pro Windows a WireGuardNT, dospěly do verze 1.0.
V Pekingu dnes proběhl 2. ročník půlmaratonu humanoidních robotů. První 3 místa obsadili roboti Honor Lightning v různých týmech. Nový rekord autonomního robota je 50 minut a 26 sekund. Operátorem řízený robot to zvládl i s pádem za 48 minut a 19 sekund. Řízení roboti měli časovou penalizaci 20 %. Před rokem nejrychlejší robot zvládl půlmaraton za 2 hodiny 40 minut a 42 sekund. Aktuální lidský rekord drží Jacob Kiplimo z Ugandy s časem 57 minut a 20 sekund [𝕏].
Stanislav Fort, vedoucí vědecký pracovník z Vlčkovy 'kyberbezpečnostní' firmy AISLE, zkoumal dopady Anthropic Mythos (nový AI model od Anthropicu zaměřený na hledání chyb, který před nedávnem vyplašil celý svět) a předvedl, že schopnosti umělé inteligence nejsou lineárně závislé na velikosti nebo ceně modelu a dokázal, že i některé otevřené modely zvládly v řadě testů odhalit ve zdrojových kódech stejné chyby jako Mythos (například FreeBSD CVE-2026-4747) a to s výrazně nižšími provozními náklady.
Federální návrh zákona H.R.8250 'Parents Decide Act', 13. dubna předložený demokratem Joshem Gottheimerem a podpořený republikánkou Elise Stefanik coby spolupředkladatelkou (cosponsor), by v případě svého schválení nařizoval všem výrobcům operačních systémů při nastavování zařízení ověřovat věk uživatelů a při používání poskytovat tento věkový údaj aplikacím třetích stran. Hlavní rozdíl oproti kalifornskému zákonu AB 1043 a kolorádskému SB26-051 je ten, že federální návrh by platil rovnou pro celé USA.
Qwen (čínská firma Alibaba Cloud) představila novou verzi svého modelu, Qwen3.6‑35B‑A3B. Jedná se o multimodální MoE model s 35 miliardami parametrů (3B aktivních), nativní kontextovou délkou až 262 144 tokenů, 'silným multimodálním vnímáním a schopností uvažování' a 'výjimečnou schopností agentického kódování, která se může měřit s mnohem rozsáhlejšími modely'. Model a dokumentace jsou volně dostupné na Hugging Face, případně na čínském Modelscope. Návod na spuštění je už i na Unsloth.
Sniffnet, tj. multiplatformní (Windows, macOS a Linux) open source grafická aplikace pro sledování internetového provozu, byl vydán ve verzi 1.5. V přehledu novinek je vypíchnuta identifikace aplikací komunikujících po síti.
V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 15.0 (Mastodon). Forgejo je fork Gitei.
Současně se SUSECON 2026 proběhne příští čtvrtek v Praze také komunitní Open Developer Summit (ODS) zaměřený na open source a openSUSE. Akce se koná ve čtvrtek 23. 4. (poslední den SUSECONu) v Hilton Prague (místnost Berlin 3) a je zcela zdarma, bez nutnosti registrace na SUSECON. Na programu jsou témata jako automatizace (AutoYaST), DevOps, AI v terminálu, bezpečnost, RISC-V nebo image-based systémy. Všichni jste srdečně zváni.
void (*array_pf[])(char *, char *) = {f1, f2, f3};
Takže toho tučňáka byste mi měli odebrat
Ten termín jsem potkal ve slovenském překladu K&R, kde ho používali dost důsledně, ale netuším, jestli se opravdu ujal.
který se napojuje „rúrami“
Těmito? :-)
Tyhle jsem myslel.
To mi došlo - jenže právě tomu v té knize říkali dátovod.
Já bych spíše řekl, že tohle je prasárna, protože jsem neuvedl typ argumentů v deklaraci ukazatele na funkci.Ale uviedol, všimni si, čo je počiarknuté.
void (*array_pf[])() = {f1, f2, f3};
To znamená, že odkaz na funkciu bude bez perametrov. V najnižšej hardvérovej úrovne je funkcia len adresa, na ktorú skočí vykonavať procesor program. Parametre funkcie hovoria, že čo sa spraví zo zásobníkom. O ich prípravu, uloženie, mazanie sa stará prekladač.
A pri
void (*array_pf[])(char *, char *) = {f1, f2, f3};
už očakáva, že prvy poľa budu smerniky na funkciu s 2 dvoma parametrami.
A ignorovať paramatre (zásobnika) funkcií vieš. Naopak už to je iné.
#include <stdio.h>
#include <stdarg.h>
#define N(a) (sizeof(a) / sizeof(a[0]))
void f1(char *s, ...);
void f2(char *s, ...);
void f3(char *s, ...);
int main()
{
int i;
char *strings[] = {"Hello", NULL, "World"};
void (*array_pf[])(char *, ...) = {f1, f2, f3};
for (i = 0; i < N(array_pf); i++)
(*array_pf[i])(strings[i], "!!!\n", 42);
return 0;
}
void f1(char *s, ...)
{
printf("%s", s);
}
void f2(char *s, ...)
{
printf(" ");
}
void f3(char *s1, ...)
{
va_list pa;
va_start(pa, s1);
printf("%s%s", s1, va_arg(pa, char*));
printf("%d", va_arg(pa, int));
va_end(pa);
}
Parametre funkcie hovoria, že čo sa spraví zo zásobníkom.To neni zaruceno. Vyuzivas toho, ze argumenty se vzdy predavaji v urcitem presne danem poradi bez znalosti prototypu funkce. Napriklad u ABI procesoru ARM je zaludnost v tom, ze pokud mas beznou funkci, tak hodnoty typu double/float se predavaji v odpovidajicich floating-point registrech, pokud je to variadicka funkce (napr. printf) tak se tyto hodnoty predavaji v beznych general-purpose registrech. Jinymi slovy, pokud budes provadet takove pretypovani, pouzijes odkaz na printf a nejaky double/float, nebude to fungovat.
f() - To znamená, že odkaz na funkciu bude bez perametrovNikoliv, to se v C řekne f(void). f() znamená, že to má nějaké neurčité argumenty, které se budou předávat podle pravidel pro varargs, čili jako kdyby tam bylo f(...).
f() je "old-style" deklarace a máš pravdu, že má neurčité argumenty (kompilátor z toho neví typ/počet), ale s varargs to nemá vůbec nic společného. f(...) je něco jiného.
Funkce se v C může volat s libovolným počtem parametrů a vezme si jen ty, které deklaruje?Ne! On ty funkce přetypoval. IIRC to, co udělal, vede dle standardu k UB (undefined behaviour) a může vést k nečekaným vedlejším účinkům. Například, jaké číslo vytiskne následující program?
#include <stdio.h>
void __attribute__((noinline)) foobar(long a, long *p1) {
*p1 += a;
}
int main(int argc, char const *argv[])
{
long x = 0;
void (*bastardized)(long) = foobar;
foobar(1, &x);
bastardized(1);
printf("%ld\n", x);
return 0;
}
Po přeložení gcc -O2 -S na x86-64:
main:
subq $24, %rsp
movl $1, %edi
leaq 8(%rsp), %rsi
movq $0, 8(%rsp)
call foobar
movl $1, %edi
call foobar
movq 8(%rsp), %rsi
movl $.LC0, %edi
xorl %eax, %eax
call printf
xorl %eax, %eax
addq $24, %rsp
ret
Čiliže tohle je něco, co by se rozhodně nemělo dělat
On ty funkce přetypoval.Kde? Na tomhle řádku jsou bez parametru:
void (*array_pf[])() = {f1, f2, f3};
A tady je všechny volá se dvěma parametry:
(*array_pf[i])(strings[i], "!!!\n");A funkce ignorují parametry, které nedeklarovaly. Zkoušel jsem to zkompilovat a spustit – funguje to a nevypisuje jediné varování.
void (*ptr)();
ptr(1, 2, 3);
Nebo třeba:
float f = 3.14;
int *i = &f;
Btw. C++ kompilátor tyhle implicitní konverze odmítne, tam by se musel udělat reinterpret_cast().
A funkce ignorují parametry, které nedeklarovaly. Zkoušel jsem to zkompilovat a spustit – funguje to a nevypisuje jediné varování.Ano, ale to je pouze šťastná náhoda, že ta dotyčná funkce nedělá nic s příslušnýma registrama a práce se stackem je taky zrovna náhodou kompatibilní. Nic z toho nemusí platit na jiné architektuře nebo třeba jen s jiným kompilátorem nebo nastavením. Když např. v tom kódu z n blogu upravim funkci
f1 takhle:
void f1(char *s, char *s2, void (*ptr)(char *))
{
printf("%s\n", s);
char *str = "Wtf, why is this string printed?";
if (s != str) ptr(str);
}
"Funguje" mi to na x86-64 při přeložení pomocí gcc -O0 a gcc -O2 (protože úplnou náhodou funkce main ten třetí parametr jakoby nastavuje, resp. používá stejný registr pro procházení tím polem), už to ale nefunguje s clangem nebo gcc -O1.
dint &= (dint - 1);volanou ve smyčce. Taky dobrej hack (schválně zda to někdo popíše z hlavy, já si to musel rozepsat cyklus po cyklu).
x & (x - 1)" považuju za standardní idiom (zejména když se výsledek použije jako bool). :-)
.
include/linux/log2.h:
static inline __attribute__((const))
bool is_power_of_2(unsigned long n)
{
return (n != 0 && ((n & (n - 1)) == 0));
}
Má to konstantní časovou složitost a lze to použít i v preprocesoru - viz makro BUILD_BUG_ON_NOT_POWER_OF_2().
721 while (dint) {
722 i = __ffs(dint);
723 dint &= (dint - 1);
724 phy = &pdev->phys[i];
Mě právě překvapilo, že se nepoužilo vymaskování tou nalezenou jedničkou nebo ještě líp maskování 1<<[0..31], ale co já vím, možná to ARM dokáže nacpat do jedné instrukce
.
Ta instrukce nevrátí tu nalezenou jedničku, ale její index, takže byste musel udělat něco jako
dint &= ~(1 << i)
tj. tři instrukce - a to si ještě nejsem jistý, jestli ten shift nebude pomalejší než bitové operace nebo odečtení jedničky.
ono záleží na architektuře. Některý umí NAND instrukci
Je brzy ráno, neměl jsem ještě kafe, tak se dám se poddat: jak by mi v tomto konkrétním případě pomohla?
. Microblaze má něco jako tohle:
x = a AND NOT b
BTW: Jsou tyhle konstrukce/idiomy někde zdokumentovanéJj: Bit Twiddling Hacks.
Částečně se to dá přirovnat k návrhovým vzorůmNééé, jen to ne. Technicky máš samozřejmě pravdu, dá se to k tomu přirovnat, ale byl bych radši, kdyby C zůstalo kargokultu tzv. návrhových vzorů ušetřeno...
Jsou tyhle konstrukce/idiomy někde zdokumentované nebo se počítá s tím, že tomu případný čtenář bude rozumět?Treba:
. Já bych ten 32bit registr naivně testoval bit po bitu
(zase ono to tak moc nezpozdí).
a & (a ^ (a - 1))" na iteráciu.
void (*array_pf[])() = {f1, f2, f3}; je temná magie, kterou když pochopíš, tak umíš ¾ jazyka C.
10 FOR A = 100 TO 300 STEP 100 20 GOSUB A 30 NEXT A 40 END 100 REM f1 110 PRINT "Hello" 120 RETURN 200 REM f2 210 PRINT " " 220 RETURN 300 REM f3 310 PRINT "World!!!" 320 RETURNakorát Céčko už je natolik pokročilý jazyk z budoucnosti že vše nejsou čísla řádků, ale adresy, takže do pole se nacpou jména funkcí a některá hvězdička je přežvýká na adresy a pak už je to úplně obyčejné GOTO, resp. jmp v assembleru a autor blogu s tím dělá machry. Odhadl jsem to špatně?
for (i = 0; i < N(array_pf); i++)Nedá se však použít u dynamicky alokovaného pole. Tenhle program bys také mohl napsat tak, že bys poslední prvek v poli ukazatelů na funkci nastavil na NULL.
int main()
{
char *strings[] = {"Hello", NULL, "World"};
void (*array_pf[])(char *, ...) = {f1, f2, f3, NULL};
print(array_pf, strings);
return 0;
}
void print(void (*apf[])(char *, ...), char *s[])
{
while (*apf)
(*apf++)(*s++, "!!!\n", 42);
}
Mimochodem zvyšování strings nebo array_pf pomocí operátoru ++ ti nebude fungovat ve funkci main(), protože obě proměnné jsou deklarovány jako pole ukazatelů a na pole nelze používat operátory ++ nebo --. Můžeš si však pomoci funkcí, která ve skutečnosti převede pole ukazatelů na ukazatel na ukazatele.
C není moc snadný jazyk.
Můžeš si však pomoci funkcí, která ve skutečnosti převede pole ukazatelů na ukazatel na ukazatele.Na to nepotřebuješ funkci, stačí přetypovat. Minimalistický příklad:
#include <stdio.h>
int main(int argc, char **argv) {
int pole[] = {1, 2, 3, 0};
for (int *ptr = pole; *ptr; ptr++) printf("%d\n", *ptr);
return 0;
}
Ten výraz v závorkách za tim vypočítává nějakou velikost, kterou pak přiřadí do tý konstanty, nebo co? Sizeof je, myslím, získání délky/velikosti, takže zjistí velikost "a" a podělí ji čím, polem a?No, ona se ta velikost vlastně nepočítá, ale určí už během překladu, v přeloženém kódu je už jenom konstantní hodnota (proto to nejde použít na dynamická pole). Operátor
sizeof vrací velikost, ale v bytech, takže pokud je pole z čehokoliv jiného, tak se musí podělit velikostí prvku. V praxi se to dělá spíš naopak, počet prvků je většinou známý předem a velikost se získává vynásobením velikostí prvku, např. stylem dynamicke_pole=ḿalloc(pocet_prvku*sizeof(typ_prvku)) ....
).
Projíždím si teď nějaké tutorialy - Itnetwork, knihy z uložto. Nemám až tak problém chápat základní principy, mám představu co je adresa/ukazatel, jak se adresuje paměť apod. Horší je, když se to začne různě kombinovat. V jedné knize jsem narazil na toto:
char *(*( *var) () ) [10];
Trochu se mi zamotala hlava, tak jsem si cvaknul něčeho ostřejšího (naštěstí máme domácí pálenku...
). Uvádí tam takový návod, že je dobrý číst to od prostředka. Tedy asi, že var je ukazatel na funkci, která vrací ukazatel na pole 10 prvků, které jsou sami ukazateli na char. Ufff....
Jestli to nepletu, tak např. int (*fce) (); je ukazatel na funkci, zatímco int *fce (); je ukazatel na typ.
Ještě jedno se chci zeptat, máte někdo zkušenosti s online IDE, plnohodnotná náhrada to asi není, nejspíš to bude nějak osekaný? Zkouším si hrát s tímto - https://www.tutorialspoint.com/compile_c_online.php, nechce se mi hned instalovat a babrat se s nějakým IDE, možná později.
… nechce se mi hned instalovat a babrat se s nějakým IDE, možná později.Celý Unix je IDE. Nainstaluj build-essential (metabalíček s gcc, make, libc-dev) a pak už potřebuješ jen textový editor.
Trochu se mi zamotala hlava, tak jsem si cvaknul něčeho ostřejšího (naštěstí máme domácí pálenku...Tak, případně můžeš použít cdecl ...). Uvádí tam takový návod, že je dobrý číst to od prostředka.
Tiskni
Sdílej: