abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:55 | Zajímavý software

    Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.

    Ladislav Hagara | Komentářů: 0
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 7
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 1
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    24.4. 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    24.4. 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (73%)
     (9%)
     (2%)
     (16%)
    Celkem 769 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: C - ako zapísať const argument, ktorý je poľom pointrov

    30.6.2011 15:04 rastos | skóre: 62 | blog: rastos
    C - ako zapísať const argument, ktorý je poľom pointrov
    Přečteno: 1324×
    Mám funkciu, ktorá berie pole pointrov
    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?

    Odpovědi

    30.6.2011 16:01 chochi | skóre: 29 | Praha
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Pokud chces rict, ze nomodifikujes p[i], ani p[i][j], tak bych pouzil:
    void f(const char * const p[])
    30.6.2011 16:14 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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 **'
    30.6.2011 17:27 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Je rozdíl mezi "dát najevo že funkce nemodifikuje data" a "očekávat že data jsou konstantní".

    Z hlediska první podmínky to máte dobře - když zkusíte ve f něco jako p[2]="foo" tak překlad skončí s chybou.

    Z hlediska neměnnosti dat to nemáte dobře, protože v main není nic co by naznačovalo, že data se nezmění. Ve f byste mohl nějak neměnnost dat využívat (nebo překladač při optimalizaci) a to je špatně, proto to varování.

    Pokud chcete dát najevo, že data se opravdu měnit nebudou, tak argv přetypujte.
    In Ada the typical infinite loop would normally be terminated by detonation.
    30.6.2011 18:28 Jirka P
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Toto vysvětlení je nesmyslné, už jen proto, že pak by to nefungovalo ani na první úroveň pointeru. Ale 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.
    1.7.2011 22:21 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Jo, máte pravdu, je to blbě. To je tak, když si to člověk prve nezjistí :P

    Každopádně zde je diskuse ohledně téhož plus nějaké další postřehy:

    http://stackoverflow.com/questions/78125/why-cant-i-convert-char-to-a-const-char-const-in-c
    In Ada the typical infinite loop would normally be terminated by detonation.
    30.6.2011 17:34 Jirka P
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Takhle to funguje v C++. V C můžeš jen toto:
    void f(char * const p[])
    {
    }
     
    int main(int argc,char *argv[])
    {
        f(argv);
        return 0;
    }
    30.6.2011 19:46 R
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Pridaj const k argv.
    30.6.2011 20:22 MadCatX
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Nebo pokud z nějakého důvodu chceš argv měnit, lze volat f((const char**)argv).
    30.6.2011 21:40 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ide o kód funkcie, ktorú poskytuje knižnica. Nemám kontrolu nad tým, kto tú knižnicu ako použije. Chcem aby niekto mohol skutočne urobiť premennú typu "char *xy[]" a mohol ju bez warningu (MSVC to dokonca považuje za error) poslať do mojej funkcie. Chcem iba deklarovať prísľub, že moja funkcia s tými dátami, ktoré dostane bude robiť len čítanie, nie zápis. Keby to bolo
    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.
    Voty avatar 30.6.2011 22:16 Voty | skóre: 12 | blog: gemini
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Jednu rozbil a tu druhou ztratil.
    30.6.2011 22:56 Jirka P
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    To je zavádějící odkaz, vzhledem k tomu, že C++ má v tomhle pravidla jiná než C. Tzn. to, o čem tam píšou, že je OK, v C neprojde.
    Voty avatar 1.7.2011 09:41 Voty | skóre: 12 | blog: gemini
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Mea culpa. Měl jsem pocit, že C99 to má stejně :(
    Jednu rozbil a tu druhou ztratil.
    1.7.2011 07:19 JS
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Jsem jediny, komu const v C/C++ prijde jako zbytecna onanie? C/C++ je unsafe v tolika vecech, ze tohle uz moc chyb nevytrhne (zvlast kdyz to porovnam s casem, ktery zabere premysleni, jaky zapis co znamena).
    1.7.2011 08:13 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Asi nie si jediný. Ale už len to, že char *p="foo" spôsoboí warning, by ťa mohlo primäť k tomu, aby si ten const občas použil.
    1.7.2011 09:36 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Nejsi, sem tam to má význam, ale často mi taky přijde, že je se to honěním za něčím, čeho nelze dosáhnout a na své půli cesty to pak sem tam komplikuje život :-)
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    1.7.2011 18:10 Sten
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Přemýšlení, jaký zápis co znamená, znamená pouze to, že jazyk neovládáte plynule. Používání const tam, kde má být, je vhodné, protože tím přinejmenším jasně řeknete, jak se váš kód chová a co očekává. To, že je jazyk unsafe, přeci neznamená, že ho můžete používat jako prase a udělat tak z něj ještě unstable.
    1.7.2011 21:03 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    1.7.2011 22:43 Sten
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Dešifrování typu ukazatele? Před hvězdičkou jsou kvalifikátory cíle, za hvězdičkou samotného ukazatele. Nic složitého na tom není.
    1.7.2011 22:33 JS
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Nevim, proc to rikate me a ne tazateli. ;-)
    2.7.2011 00:36 ---- | skóre: 33 | blog:
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    +1, ale občas se hodí
    3.7.2011 19:48 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Značení konstatních částí paměti se dělá kvůli optimalizaci. Kdyby překladač nevěděl, že se určitá proměnná nemění, nemohl by si s ní hrát v registrech procesoru a vždy by ji musel draze načítat s opět ukládat do paměti.
    4.7.2011 09:54 JS
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Pokud prekladac neni schopen poznat, ze je nejaky vyraz lokalne konstantni (napriklad pro jeho vyrazeni ven ze smycky), pak je nejspis tak spatny, ze se to neoplati. IMHO moderni prekladace tohle zvladnou i bez zapisu.

    Kazdopadne, ja mam na to svuj filozoficky pohled, s kterym kazdy nemusi souhlasit. V podstate by se dal shrnout tak, ze implementacni zalezitosti, ktere neovlivnuji spravnost programu (popr. slouzi jen k dalsimu overeni), by mely byt v jazyce syntakticky oddelene od samotneho zapisu algoritmu. Tam patri nejen const ale z velke casti i staticke typy.
    4.7.2011 18:18 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Máte vysoké mínění o schopnosti překladačů řešit nerozhodnutelné problémy. Pro jednoduché situace existují algoritmická řešení, ale obecně nikoliv. Volání funkce (která klidně může být linkována z jiného objektového souboru) je jeden z případů, kdy explicitní vyjádření neměnnosti je účinné řešení problému.
    pavlix avatar 4.7.2011 22:04 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Já nevím, jestli to tu už někdo zmínil... ale to, že je proměnná const vůbec neříká, jestli ji někdo (někde) může měnit nebo ne. Vzhledem ktomu, že non-const se automaticky typuje na const při přiřazení a předávání argumentů.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    4.7.2011 23:59 Jirka P
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ne docela - to, že je proměnná const, skutečně znamená, že se nesmí (nikde) měnit. Něco jiného je ale ukazatel. Tzn. při const int i se i ne(z)mění, ale při const int *i se *i změnit může.
    5.7.2011 12:37 Sten
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Při const int *i se i (pointer) změnit může, *i (cíl) ne.
    5.7.2011 15:15 mato
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    tak ako hovoris. tento programcek je toho ukazkou:
    
    #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
    5.7.2011 17:33 ::: | skóre: 14 | blog: e_lama
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    pres *i se zmenit nemuze ale muze se zmenit pres jiny pointer, takze to (vetsinou) nejde pouzit pro optimalizace.

    priklad:
    int *x = ...;
    int const *y = x;
    
    ted kdyz menim *x tak se meni i *y
    6.7.2011 11:36 Sten
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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. Pokud si to však nějak změníte a program přestane fungovat, je to problém vaší implementace.
    pavlix avatar 6.7.2011 14:16 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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ů.)
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    6.7.2011 15:04 kuka
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    pavlix avatar 6.7.2011 15:06 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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š.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    pavlix avatar 6.7.2011 15:07 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    To platí mimochodem i pro mně... ale všiml jsem si toho sám až teď. Takže se můžu hřát u srdce tím, že tvoje reakce je ještě víc mimo než ta moje :D.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    6.7.2011 15:55 kuka
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ne ze by na tom zalezelo, ale ja jsem si prave diskusi precetl a tedy jsem pravdepodobne na rozdil od tebe vedel, ze se diskutuje o pouzivani a vyznamu const. Reagoval jsem na to tvrzeni o vlaknech, ktere je sice samo o sobe mozna pravdive, ale v danem kontextu je relevantni asi jako ze "cihla pada dolu" a muze vyvolavat mylny dojem, ze vlakna poslala const definitivne na smetiste dejin. A jestli te to zahralo, tak jsem to kadopadne nepsal zbytecne:-)
    pavlix avatar 6.7.2011 16:32 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    a tedy jsem pravdepodobne na rozdil od tebe vedel, ze se diskutuje o pouzivani a vyznamu const
    Vzhledem 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íš :).

    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    6.7.2011 23:32 kuka
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Pak asi nemas jasno v tom, co const dela. Pomoci const funkce deklaruje, ze SAMA nebude menit parametr (co presne je to meneni/nemeneni je castecne predmetem teto diskuse). Nikoliv, ze jeji parametr nesmi byt menen! Jde o omezeni pro funkci (jeji implementaci), ne pro jejiho volajiciho (ten z toho naopak muze castecne profitovat). Tedy zadna vlakna na to nemaji vliv, pokud si je nevytvorim v te funkci a nejak si to tam s jejich pomoci sam nezaprasim. Ze funkce nemuze nikomu slibit, ze jeji volajici (o kterem se pri jejim prekladu nemusi nic vedet) parametr zaroven nemodifikuje paralelne nekde jinde, je asi dostatecne zrejme a mozna proto se o to nikdo nesnazi ani pouzitim const ani jinak.
    pavlix avatar 6.7.2011 23:34 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Pak asi nemas jasno v tom, co const dela
    Nejsi 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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    pavlix avatar 6.7.2011 15:09 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ať v tom není zmatek... konkrétně
    změnit se může jen mezi voláními té funkce.
    ve vícevláknových aplikacích nemusí platit.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    7.7.2011 09:07 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    thank you, Mr. Obvious :) To jak jste si navzájem nepřečetli poslední věty svých tvrzení a pořádně se za ně vzájemně zkritizovali bylo výborné, jen tak dál holky, bijte se :D
    pavlix avatar 7.7.2011 12:31 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    thank you, Mr. Obvious :)
    Kéž by to bylo tak obvious pro všechny.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    9.7.2011 23:02 Jirka P
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    pavlix avatar 10.7.2011 01:45 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    10.7.2011 11:18 Jirka P.
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Až mě odkážete na standard pro optimalizaci
    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.
    ohánět se citací tam, kde to nemá smysl
    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).
    pavlix avatar 10.7.2011 11:46 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    15.7.2011 01:33 Jirka P
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    optimalizace ten standard nemá porušovat vs. jako by každá optimalizace byla v těchto standardech popsána

    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. Tedy pokud Sten napsal
    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 hominem
    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?).
    stativ avatar 15.7.2011 08:38 stativ | skóre: 54 | blog: SlaNé roury
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Ať sežeru elfa i s chlupama!!! ljirkovsky.wordpress.com stativ.tk
    pavlix avatar 15.7.2011 11:31 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Díky, ale jak vidíš, asi to nemá cenu.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    pavlix avatar 15.7.2011 11:31 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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..)
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    6.7.2011 12:29 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov

    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.

    pavlix avatar 6.7.2011 01:34 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    4.7.2011 22:26 JS
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ano, volani nezname funkce muze takovou analyzu narusit. Jenze je otazka, jestli takova optimalizace (nenacist neco znovu z pameti) ma pak jeste smysl, pokud volate neznamou funkci a predavate ji parametry na zasobniku. ;-) 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.
    4.7.2011 12:14 mato
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    nedokazaem oznacit prispevok za vyrieseny, ale podla mna prispevok od Jirka P. z 30.6. 18:28 Jirka P je tvojim riesenim, resp. odpovedou.
    Grunt avatar 8.7.2011 12:49 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov

    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 parametru co 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 funkci hledej() 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!

    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    10.7.2011 16:31 Milan Roubal | skóre: 25
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Uryvek z knizky: Ucebnice jazyka C Autor: Pavel Herout

    kolik jsem vyhral bludistaku? :)
    12.7.2011 14:56 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    RTFM by mu asi moc nepomohlo, protože podle mne již dávno RTFM, a správné řešení se mu stále nepodařilo nalézt :) Takže vy na základě znalostí TFM navrhujete jako správně řešení co přesně? f(const char *str[]) ? Abychom to definitivně rozlouskli ;)
    pavlix avatar 12.7.2011 15:49 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Nebylo toto dostatečně srozumitelné?
    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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    Grunt avatar 12.7.2011 16:55 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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í TFM
    Kdo my a co je to TFM?
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    12.7.2011 18:59 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Žadatel chce upravit deklaraci funkce: void f(char *p[]) tak, že chce "vyznačiť, že funkcia nemodifikuje dáta, ktoré cez ten argument dostane". Mně se to zdá poměrně jednoznačné a připadá mi, že chápu o co tazateli jde. Má ukazatel na pole, a chce naznačit, že funkce hodnoty v poli nebude měnit, tedy nepoužije ukazatele jí svěřeného k ničemu nepravému, jako třeba k měnění hodnot v oblastech paměti jím adresovaných, a to nikde, kam by se přes ten ukazatel dostala.
    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 :)
    Grunt avatar 12.7.2011 21:12 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ž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.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    12.7.2011 21:37 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Když už není co řešit, tak jaké je konkrétně správné řešení pro tazatelův případ? Že bychom mohli označit správné řešení, místo toho co omylem zaklikl pavlix? ;)

    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.

    Když píšu Vy nebo vy, je to pořád oslovení TEBE; nevím jak jsi přišel na možnost, že bych tě považoval za skupinu osob. Ale dobře.

    Podle velikosti písmene nelze rozlišit počet oslovovaných osob, pouze míru vyjadřované úcty pisatele (dle aktuálně platných pravidel).
    pavlix avatar 13.7.2011 17:23 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Že bychom mohli označit správné řešení, místo toho co omylem zaklikl pavlix? ;)

    Dík za upozornění.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    16.7.2011 20:39 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Grunt avatar 16.7.2011 21:28 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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.
    Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
    17.7.2011 13:24 Ash | skóre: 53
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    Ano, warningu se lze vyhnout přetypováním.
    13.7.2011 13:26 Sten Fil
    Rozbalit Rozbalit vše Re: C - ako zapísať const argument, ktorý je poľom pointrov
    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);
    
    

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.