Programovací jazyk Python byl vydán v nové major verzi 3.15.0. Podrobný přehled novinek v aktualizované dokumentaci.
BIGWORDS.PAGE je open-source webová aplikace, která po otevření odkazu v prohlížeči vykreslí přes celou obrazovku jednoduché informační sdělení. Zpráva i její nastavení jsou uložené v části URL za znakem #, například odkaz https://bigwords.page/#abclinuxu zobrazí jako velký bílý nápis 'abclinuxu' na černém pozadí. Obsah odkazu lze upravovat i vestavěným editorem, ten umožňuje nastavovat formátování a vizuální efekty textu, časovače, QR kódy a obrázky. Zdrojový kód je dostupný pod licencí MIT na GitHubu.
V neděli 11. října proběhne rotace klíče kořenové zóny. Podruhé v historii. Ondřej Filip na blogu CZ.NIC: "Pokud je pro Vás DNS protokol spíše výzva, ale přesto spravujete nějakou síť či DNS resolver, zkuste si jednoduchý test, který připravila firma Cloudflare na této adrese. Obzvláště zbystřit byste měli, pokud uvidíte nějaká červená políčka."
Vláda Spojených států se rozhodla vyřadit americkou softwarovou společnost Microsoft a několik dalších velkých technologických podniků z programu, který umožňuje kvalifikovaným zahraničním pracovníkům získat povolení k trvalému pobytu. Oznámila to včera administrativa amerického prezidenta Donalda Trumpa. Opatření zdůvodnila rozsáhlým zneužíváním programu, který je dlouhodobě terčem kritiky ze strany Trumpových příznivců, neboť prý znevýhodňuje americké pracovníky.
Datové centrum největší ruské technologické společnosti Jandex v Rjazaňské oblasti se stalo cílem dronového útoku a zastavilo provoz. Jandexu se někdy přezdívá „ruský Google“. Provozuje nejoblíbenější internetový vyhledávač v Rusku nebo aplikace pro objednávky jídla a taxi. Využívají jej desítky milionů lidí v rusky mluvících zemích.
Francouzská společnost Mistral AI představila Mistral Large 4 (interně přezdívaný 'le Chonk', volně přeloženo 'pořádný macek'), 'open-weight multimodální hybridní instruct-and-reasoning model s architekturou granulárního MoE, nativně podporující více jak 160 jazyků'. Model má přes jeden bilión parametrů, z nichž při práci využívá 49 miliard, kontextové okno o délce milion tokenů a obrazový enkodér o 1,6 miliardách parametrů.
… více »Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.20. Díky 227 přispěvatelům.
Simon Long oznámil Raspberry Pi Desktop pro PC a Mac s Intelem postavený na aktualizovaném Debianu 13 Trixie. S klientem Raspberry Pi Connect pro vzdálenou správu. Ke stažení je vedle Raspberry Pi OS pro Raspberry Pi.
ESP32-C3 adblock přemění lacinou vývojovou desku ESP32‑C3 na samostatný DNS blokovač nejenom reklamních domén, minimalistickou alternativu k populárnímu Pi-hole. ESP32-C3 adblock místo objemných názvů domén ukládá jejich 40-bitové FNV-1a hashe do flash paměti, které pak binárně prohledává, kontrola jedné domény trvá přibližně 10 milisekund. Blocklist pojme až 537 tisíc domén a lze jej spravovat přes webové rozhraní. Projekt zatím
… více »ArtCraft je sada open source aplikací pro práci s obrázky a videi "inspirovaných" aplikacemi od Adobe. Napsaných v Rustu. Pro MacOS, Windows i Linux. Běží také ve webovém prohlížeči. Aktuálně se jedná o 7 aplikací: PhotoCraft (Photoshop), VectorCraft (Illustrator), FilmCraft (Premiere Pro), LightCraft (Lightroom), PdfCraft (Acrobat), EffectCraft (After Effects) a DesignCraft (InDesign). Zdrojové kódy jsou k dispozici na GitHubu.
void f(char *p[])Ak správne upraviť jej deklaráciu, ak chcem vyznačiť, že funkcia nemodifikuje dáta, ktoré cez ten argument dostane?
p[i], ani p[i][j], tak bych pouzil:
void f(const char * const p[])
void f(const char * const p[])
{
}
int main(int argc,char *argv[])
{
f(argv);
return 0;
}
gcc -c -Wall const.c const.c: In function 'main': const.c:10:2: warning: passing argument 1 of 'f' from incompatible pointer type const.c:1:6: note: expected 'const char * const*' but argument is of type 'char **'
T * <: T const * i v C.
Zadruhé, deklarovat neměnnost dat za pointrem v C nelze. To znamená, že ji nelze ani "očekávat," "ve funkci využívat," ani z typu pointru (bez analýzy celého programu) poznat.
void f(char * const p[])
{
}
int main(int argc,char *argv[])
{
f(argv);
return 0;
}
void f(int i)tak to, čo chcem, by bolo dosiahnuté prepísaním na
void f(const int i)Ale vyzerá to tak, že pri poli pointrov je to trocha inak.
void f(const char *p[])ani
void f(const char *const p[])nie je to správne. Najbližšie je zatiaľ
void f(char *const p[])Len chcem vedieť či sa to dá ešte lepšie.
char *p="foo" spôsoboí warning, by ťa mohlo primäť k tomu, aby si ten const občas použil.
Přemýšlení, jaký zápis co znamená, znamená pouze to, že jazyk neovládáte plynule.To platí i o Céčku, kde potřebujete půlstránkový algoritmus pro dešifrování typu ukazatele? IMHO LOL.
const int i se i ne(z)mění, ale při const int *i se *i změnit může.
const int *i se i (pointer) změnit může, *i (cíl) ne.
#include <stdio.h>
int main () {
const int i = 5;
int j = 10;
const int* pi = &i;
printf ("values:\n\ti: %d\tj: %d\t*pi: %d\nmem:\n\ti: %p\tj: %p\tpi: %p\n", i, j,*pi,&i, &j, pi);
// *pi = j; /* error due to const int* */
pi = &j;
printf ("\nvalues:\n\ti: %d\tj: %d\t*pi: %d\nmem:\n\ti: %p\tj: %p\tpi: %p\n", i, j,*pi,&i, &j, pi);
return 0;
}
vystup:
$ make
gcc -g -DDEBUG -Wall -c test.c
gcc -g -DDEBUG -Wall -o atest test.o
$
$ ./atest
values:
i: 5 j: 10 *pi: 5
mem:
i: 0x7fffffffeb14 j: 0x7fffffffeb10 pi: 0x7fffffffeb14
values:
i: 5 j: 10 *pi: 10
mem:
i: 0x7fffffffeb14 j: 0x7fffffffeb10 pi: 0x7fffffffeb10
$
co by sa ovsem dalo zabranit const int* const pi
int *x = ...; int const *y = x;ted kdyz menim *x tak se meni i *y
Lze to použít pro optimalizace.Možná ano.
Pokud je cíl konstantní, tak se předpokládá, že v dané funkci ani tou funkcí volanými funkcemi se nemění a změnit se může jen mezi voláními té funkce.Mno... tohle tvrzení je v době vícevláknových aplikací úplně mimo. (Jo... samozřejmě, ve chvíli kdy ji použiju, musím se chránit pomocí různých synchronizačních prostředků.)
Doba vicevlaknovych aplikaci zacala nejmene pred dvaceti lety... Promenne sdilene ve vice vlaknech se pochopitelne chrani ruznymi prostedky, to ale s const nijak zvlast nesouvisi.Ono by bohatě stačilo, kdybysys přečetl poslední dva příspěvky vlákna, než reaguješ.
a tedy jsem pravdepodobne na rozdil od tebe vedel, ze se diskutuje o pouzivani a vyznamu constVzhledem k tomu, že se celou dobu bavíme o const, tak nevím, co si chceš tímhle příspěvkem dokázat. Jestli jenom trollovat, tak věz, že mě brzo přestane bavit ti odpovídat, a pak vyhladovíš :).
Pak asi nemas jasno v tom, co const delaNejsi ty náhodou Miroslav Ponkrác, ten taky rád věští z hvězd. Buď máš problém s porozuměním textu, nebo jsi pouhopouhý troll.
změnit se může jen mezi voláními té funkce.ve vícevláknových aplikacích nemusí platit.
Lze to použít pro optimalizace. Pokud je cíl konstantní, tak se předpokládá, že v dané funkci ani tou funkcí volanými funkcemi se nemění a změnit se může jen mezi voláními té funkce.Citujte část standardu, která to povoluje.
Citujte část standardu, která to povoluje.Až mě odkážete na standard pro optimalizaci :). Jedna věc je chtít relevantní citace... druhá je ohánět se citací tam, kde to nemá smysl.
Až mě odkážete na standard pro optimalizaciMožná vám to přijde divné, ale sémantika jazyka C, a tedy i optimalizace, které může kompilátor provádět, se řídí standardem jazyka C. Tedy jde o dokument ISO/IEC 9899:1990, případně ISO/IEC 9899:1999.
ohánět se citací tam, kde to nemá smyslSamozřejmě, pro někoho, kdo nějakému dokumentu nerozumí, jakákoli jeho citace smysl nemá (i když by to nemusel tak okatě dávat najevo).
Možná vám to přijde divné, ale sémantika jazyka C, a tedy i optimalizace, které může kompilátor provádět, se řídí standardem jazyka C. Tedy jde o dokument ISO/IEC 9899:1990, případně ISO/IEC 9899:1999.Možná ti to přijde divné, ale s touto větou naprosto souhlasím. Jen není jednoznačná a nevím, který význam jste si vybral vy. Já ten jednodušší, přirozenější, tedy ten, že optimalizace ten standard nemá porušovat. Jenže ty píšeš, jako by každá optimalizace byla v těchto standardech popsána, což je holý nesmysl.
Samozřejmě, pro někoho, kdo nějakému dokumentu nerozumí, jakákoli jeho citace smysl nemá (i když by to nemusel tak okatě dávat najevo).Argumentem ad hominem nikoho na tomto webu dávno neoslníš. Maximálně tak sebe.
Lze to použít pro optimalizace. Pokud je cíl konstantní, tak se předpokládá, že v dané funkci ani tou funkcí volanými funkcemi se nemění a změnit se může jen mezi voláními té funkce.pak to musí mít oporu ve standardu, jinak je to prostě kec.
Argumentem ad hominemVšak taky v tom příspěvku žádný argument ad hominem není, udělej si v tom jasno. Holt když v tvých příspěvcích není k věci ani čárka, těžko můžeš očekávat odpověď plnou argumentů (k čemu by se asi měly vztahovat?).
Až si ten standard přečteš, zjistíž, že takové (falešné) dilema neexistuje. Optimalizující kompilátor samozřejmě nesmí porušovat standard. Současně je ve standardu specifikováno, co kompilátor může při optimalizacích dělat, zvláště, co může při optimalizacích předpokládat.
Příště si ten standard přečti předtím, než tu začneš plácat blbosti.
Standardy C ani C++ neříkají co se smí optimalizovat, ale pouze ve výjimečných případech říkají co se při optimalizaci dělat nesmí. Toho moc není, například v ANSI ISO IEC 14882/2003 (C++) je to v sekcích 3.7.2 a 7.1.5.1. Ve standardu C 99 jsou podmínky takřka identické s tím, že dokonce na začátku dokumentu je psáno:
The semantic descriptions in this Standard describe the behavior of an abstract machine in which issues of optimization are irrelevant.
Však taky v tom příspěvku žádný argument ad hominem není, udělej si v tom jasno. Holt když v tvých příspěvcích není k věci ani čárka, těžko můžeš očekávat odpověď plnou argumentů (k čemu by se asi měly vztahovat?).Pokud máš o mých příspěvcích takovéto mínění, tak nevidím jediný důvod s tebou diskutovat :). Přecejenom si chodím na Abclinuxu přátelsky popovídat, případně trochu poflejmovat, o technologiích, které mě zajímají. Ne se s někým přetahovat o to, kdo je větší blb. Za věcnou reakci mi tento tvůj příspěvek už nestojí. (Jasně, i mně to občas ujede..)
Ukazujete konstatní ukazatel. Tam samozřejmě nemůžete kešovat hodnotu, na kterou ukazuje, ale jeho vlastní hodnotu.
Problém měnění dat přes jiný ukazatel řeší kvalifikátor restrict.
Ne docela - to, že je proměnná const, skutečně znamená, že se nesmí (nikde) měnit.Pravda, hodně jsem se ponořil do praxe, kde potkávám víc pointerů na const než const samotných.
Tzn. při const int i se i ne(z)mění, ale při const int *i se *i změnit může.Jak bylo výše uvedeno, když je *i typu const int, tak je konstantní a měnit se nemůže. ale myšlenku dejme tomu chápu.
Proste, ani z hlediska optimalizace v tom nevidim zadnou velkou vyhodu; pokud to vyhoda je, pak jedine v nejakych opravdu uzkych smyckach, a tam by to mel prekladac poznat sam od sebe. Podle me se to oznacovani "const" dela predevsim kvuli chybam a v podstate je to historicka tradice, pochazeji nejspis odnekud z FORTRANu. A jak uz zde naznacili jini, neni to 100% ochrana, a proto me to pripada jako maly benefit za tu cenu.
30.6. 18:28 Jirka P je tvojim riesenim, resp. odpovedou.
Modifikátor const
Jeho použití specifikuje, že definovanému objektu nesmí být po jeho inicializaci již měněna hodnota.
Význam tohoto modifikátoru je v tom, že takto definovaná konstanta je určitého typu (narozdíl od symbolických konstant) a je tedy možno tento typ využít k některým kontrolám prováděným kompilátorem, např. typ skutečných parametrů funkce.
Příklad:
const float pi = 3.141519; /* definice a inicializace */ const max = 100; /* typ je implicitní */ pi = 3.14; /* chybne */Častěji je ale const využívána při definici formálních parametrů funkce. Setkáme-li se s takovou hlavičkou funkce, která vyhledává v řetězci určeném parametrem
strznak uložený v parametrucoa vrátíá jeho pozici:16
int hledej(cont char *str, char co)neznamená to, že funkce
hledej()musí být volána vždy s konstantním prvním parametrem (což ovšem lze také), např:
i = hledej("nazdar", c);ale to, že parametr označený const bude zpracován pouze jako vstupní (bude jen čten). Skutečný parametr, dosazený při volání funkce na místo
str, nebude ve funkcihledej()měněn, i když by to bylo pomocí pointerů (viz str. 151) proveditelné.
Poznámka:
- Budeme-li v budoucnu potřebovat konstantní pointer, tj. pointer, jehož hodnota se nedá měnit, použijeme, např.:
char *const p_c = "Ahoj";nikoliv intuitivní:const char *p_c = "Ahoj";
Úryvek z knížky: (otázka za 5 bludišťáků)
Autor: (otázka za 3 bludišťáky)
Příště dostaneš jen RTFM!
f(const char *str[]) ? Abychom to definitivně rozlouskli ;)
Budeme-li v budoucnu potřebovat konstantní pointer, tj. pointer, jehož hodnota se nedá měnit, použijeme, např.: char *const p_c = "Ahoj"; nikoliv intuitivní: const char *p_c = "Ahoj";Vždyť z toho lze lehce nakombinovat cokoli.
navrhujete jako správně řešení co přesně?No my v první řadě nepochopili co vlastně žadatel přesně chce, proto jsme také odcitovali celou část nech si z toho vybere co potřebuje.
Takže vy na základě znalostí TFMKdo my a co je to TFM?
void f(int i) void f(const int i) void f(char *p) void f(const char *p) void f(char *p[]) ->zde doplňte správné řešení<-Teď už chápeš, co žadatel chce? Vy, to je oslovení. TFM ti snad dojde, sám jsi doporučoval RTFM, k rozlousknutí je potřeba poravdu jen minimální inteligence :)
Žadatel chce upravit deklaraci funkce: void f(char *p[]) tak, že chce "vyznačiť, že funkcia nemodifikuje dáta, ktoré cez ten argument dostane".Já si myslím, že o tom nemůže být pochyb a žadatelův požadavek byl splněn:
Constantness is often used in function declarations, as a promise that when an object is passed by reference, the called function will not change it. Depending on the syntax, either a pointer or the object being pointed to may be constant, however normally the latter is desired. Especially in C and C++, the discipline of ensuring that the proper data structures are constant throughout the program is called const-correctness.
Mně se to zdá poměrně jednoznačné a připadá mi, že chápu o co tazateli jde.No já si jen s tím polem nebyl úplně na 100% jistý, ale jinak si myslím že dál není co řešit.
Vy, to je oslovení.Je rozdíl mezi Vy a vy. Takže buď budu dumat kdo by tu se mnou ještě měl být, komu to vlastně bylo adresované a nebo nad tím jak plesknu dalšího chudáka co se mi pokusí vykat. Ale to je nepodstatné – nechejme toho.
TFM ti snad dojde, sám jsi doporučoval RTFM, k rozlousknutí je potřeba poravdu jen minimální inteligence :)Chvilková slabost.
Že bychom mohli označit správné řešení, místo toho co omylem zaklikl pavlix? ;)Dík za upozornění.
Když už není co řešit, tak jaké je konkrétně správné řešení pro tazatelův případ?Možno moja otázka nebola tak celkom správna. Pôvodne som riešil problém, kedy mám v C funkciu f(), ktorá dostane pole pointrov na char a každý prvok toho poľa pošle do funkcie očakávajúcej
const char *. Z toho mi vyplývalo, že f() musí byť deklarovaná ako f(const char *a[]). Lenže ak do takej funkcie pošlem premennú deklarovanú ako char *b[], dostanem warning. Takže moja otázka možno nemala znieť "ako zapísať, že z argumentov len čítam?", ale "ako sa vyhnúť tomu warningu?". No a odpoveď, myslím je, že v C to skrátka bez pretypovania nejde.
Že bychom mohli označit správné řešení,Schválne som neoznačoval otázku za vyriešenú, pretože napriek môjmu očakávaniu, sa diskusia rozvetvila a rozmnožila zaujímavým spôsobom.
Pôvodne som riešil problém, kedy mám v C funkciu f(), ktorá dostane pole pointrov na char a každý prvok toho poľa pošle do funkcie očakávajúcej const char *. Z toho mi vyplývalo, že f() musí byť deklarovaná ako f(const char *a[]). Lenže ak do takej funkcie pošlem premennú deklarovanú ako char *b[], dostanem warning. Takže moja otázka možno nemala znieť "ako zapísať, že z argumentov len čítam?", ale "ako sa vyhnúť tomu warningu?".Ukaž kód (i překlad ať vidím o jakou jde chybu). Mi přijde že se v tom ztrácíš tak, že se jsem se v tom ztratil s tebou. Ale už asi tuším v čem bude problém.
Ahoj, si myslim, ze reseni bylo napsano hned v prvni odpovedi.
void f (const char* const p[])
{
p[0] = NULL; // compile error
p[0][0] = 'x'; // compile error
}
priklad volani:
char* p[3];
f ((const char**) p);
Tiskni
Sdílej: