Chcete vědět, co se odehrálo ve světě techniky za poslední měsíc? Nebo si popovídat o tom, co zrovna bastlíte? Pak doražte na listopadovou Virtuální Bastlírnu s mikrofonem a kamerou, nalijte si něco k pití a ponořte se s strahovskými bastlíři do diskuze u virtuálního piva o technice i všem možném okolo. Mezi nejvýznamnější novinky patří Průšovo oznámení Core One L, zavedení RFID na filamentech, tisk silikonu nebo nový slicer. Dozvíte se ale i
… více »Vývojáři OpenMW (Wikipedie) oznámili vydání verze 0.50.0 této svobodné implementace enginu pro hru The Elder Scrolls III: Morrowind. Přehled novinek i s náhledy obrazovek v oznámení o vydání.
Komunita kolem Linux Containers po roce vývoje představila (YouTube) neměnný operační systém IncusOS speciálně navržený pro běh Incusu, tj. komunitního forku nástroje pro správu kontejnerů LXD. IncusOS poskytuje atomické aktualizace prostřednictvím mechanismu A/B aktualizací s využitím samostatných oddílů a vynucuje zabezpečení bootování pomocí UEFI Secure Bootu a modulu TPM 2.0. Postaven je na Debianu 13.
Mozilla začne od ledna poskytovat komerční podporu Firefoxu pro firmy. Jedná se o podporu nad rámec stávající podpory, která je k dispozici pro všechny zdarma.
V Bolzanu probíhá konference SFSCON (South Tyrol Free Software Conference). Jean-Baptiste Kempf, zakladatel a prezident VideoLAN a klíčový vývojář VLC media playeru, byl na ní oceněn cenou European SFS Award 2025 udělovanou Free Software Foundation Europe (FSFE) a Linux User Group Bolzano‑Bozen (LUGBZ).
Open-source minimalistický trackball Ploopy Nano byl po modelech modelech Classic a Thumb Trackball také aktualizován. Nová verze Nano 2 používá optický senzor PAW3222 a k původně beztlačítkovému designu přidává jedno tlačítko, které ve výchozí konfiguraci firmwaru QMK přepíná režim posouvání koulí. Sestavený trackball nyní vyjde na 60 kanadských dolarů (bez dopravy a DPH).
Github publikoval Octoverse 2025 (YouTube), tj. každoroční přehled o stavu open source a veřejných softwarových projektů na GitHubu. Každou sekundu se připojil více než jeden nový vývojář. Nejpoužívanějším programovacím jazykem se stal TypeScript.
Kit je nový maskot webového prohlížeče Firefox.
Mastodon (Wikipedie) - sociální síť, která není na prodej - byl vydán ve verzi 4.5. Přehled novinek s náhledy v oznámení na blogu.
Německo zvažuje, že zaplatí místním telekomunikačním operátorům včetně Deutsche Telekom, aby nahradili zařízení od čínské firmy Huawei. Náklady na výměnu by mohly přesáhnout dvě miliardy eur (bezmála 49 miliard Kč). Jeden scénář počítá s tím, že vláda na tento záměr použije prostředky určené na obranu či infrastrukturu.
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: