abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 10
dnes 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 4
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 10
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 25
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 4
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 772 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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

30.6.2011 15:04 rastos | skóre: 60 | blog: rastos
C - ako zapísať const argument, ktorý je poľom pointrov
Přečteno: 1301×
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: 60 | 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: 60 | 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: 60 | 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. ;-)
q66 avatar 2.7.2011 00:36 q66 | skóre: 31 | blog: Q's CZ devblog
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: 53 | 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ů.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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 extremni lama | 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
The enemy of my enemy is still my enemy.
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: 53 | 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ů.)
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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š.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 6.7.2011 15:07 pavlix | skóre: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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íš :).

GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 6.7.2011 15:09 pavlix | skóre: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
pavlix avatar 15.7.2011 11:31 pavlix | skóre: 53 | 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..)
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 21 | 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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
Grunt avatar 12.7.2011 16:55 Grunt | skóre: 21 | 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: 21 | 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: 53 | 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í.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
16.7.2011 20:39 rastos | skóre: 60 | 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: 21 | 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.