Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek i s náhledy aplikací v Týden v GNOME a Týden v KDE.
Organizace Apache Software Foundation (ASF) vydala verzi 20 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.
Desktopové prostředí Cinnamon, vyvíjené primárně pro distribuci Linux Mint, dospělo do verze 6.0. Seznam změn obsahuje především menší opravy a v říjnovém přehledu novinek v Mintu avizovanou experimentální podporu Waylandu.
OpenZFS (Wikipedie), tj. implementace souborového systému ZFS pro Linux a FreeBSD, byl vydán ve verzích 2.2.2 a 2.1.14. Přináší důležitou opravu chyby vedoucí k možnému poškození dat.
V ownCloudu byly nalezeny tři kritické zranitelnosti: CVE-2023-49103, CVE-2023-49104 a CVE-2023-49105 s CVSS 10.0, 8.7 a 9.8. Zranitelnost CVE-2023-49103 je právě využívána útočníky. Nextcloudu se zranitelnosti netýkají.
I letos vychází řada ajťáckých adventních kalendářů. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2023. Pro programátory v Perlu je určen Perl Advent Calendar 2023. Zájemci o UX mohou sledovat Lean UXmas 2023. Pro zájemce o kybernetickou bezpečnost je určen Advent of Cyber 2023…
Byla vydána verze 2.12 svobodného video editoru Flowblade (GitHub, Wikipedie). Přehled novinek v poznámkách k vydání. Videoukázky funkcí Flowblade na Vimeu. Instalovat lze také z Flathubu.
Armbian, tj. linuxová distribuce založená na Debianu a Ubuntu optimalizovaná pro jednodeskové počítače na platformě ARM a RISC-V, ke stažení ale také pro Intel a AMD, byl vydán ve verzi 23.11 Topi. Přehled novinek v Changelogu.
Po 4 měsících vývoje byla vydána nová verze 4.2 multiplatformního open source herního enginu Godot (Wikipedie, GitHub). Přehled novinek i s náhledy v příspěvku na blogu a na YouTube.
Byla vydána nová stabilní verze 23.11 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Tapir. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.
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.
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
str
znak uložený v parametruco
a 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: