Portál AbcLinuxu, 31. května 2024 01:36


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
Luboš Doležel (Doli) avatar 10.11.2010 12:23 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin
char** je ukazatel na char*, takže pokud chcete z char** dostat char, musíte dělat * dvakrát. Ale smyslem char** je změnit někde adresu ukazatele. Typicky jde tedy o výstupní argument, který tam třeba zapíše nově vytvořený buffer.
10.11.2010 12:33 Begleiter | skóre: 47 | blog: muj_blog | Doma
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
smyslem char** je změnit někde adresu ukazatele

Pokud chceme, aby se změna obsahu ukzatele (tedy kam ukazuje) projevila i vně funkce (tedy jakoby se předávalo odkazem), tak pracujeme s "**ret" (v hlavičce funkce). Díky!

Josef Kufner avatar 10.11.2010 22:55 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
A nebo se předává do funkce pole řetězců.
Hello world ! Segmentation fault (core dumped)
Luboš Doležel (Doli) avatar 10.11.2010 23:41 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Jo, typická ukázka: funkce main :-)
10.11.2010 12:45 qiRzT | skóre: 14 | blog: U_Marvina
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin
Zamysli se nad tím, co do té druhé funkce předáváš - nějakou adresu v paměti. Co je na té adrese? Zase nějaká adresa a na téhle adrese je nějaký char.
typ     char **     char *     char
adresa: 2008        2004       2000
data:   2004    ->  2000    ->  'A'
Rozdíl mezi těma funkcema ve volání může být třeba takový:
char c = 'A';
char * cp = &c; /*cp == 2000*/
char ** cpp  = &cp; /* cpp == 2004*/

/*volani se stejnym vysledkem*/
funkce1(&c);
funkce1(cp);

/*volani se stejnym vysledkem*/
funkce2(&cp);
funkce2(cpp);

pokud navíc:
int funkce2(char **ret)
{
 return funkce1(*ret);
}

Tak se to všechno bude chovat stejně.
Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...
10.11.2010 14:25 Roger
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
char c = 'A';
char * cp = &c; /*cp == 2000*/
Ty Cckove komentare tomu zrovna nepomahaji :)
10.11.2010 15:45 qiRzT | skóre: 14 | blog: U_Marvina
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Hmm, měl jsem tam dát apoň mezery. Takle s C++ komentáři to snad je jasné:
char c = 'A';
char * cp = &c;        // cp  == 2000
char ** cpp  = &cp;    // cpp == 2004
Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...
10.11.2010 16:14 Begleiter | skóre: 47 | blog: muj_blog | Doma
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

Děkuju moc. Už to chápu.

10.11.2010 12:48 ____ | skóre: 15 | blog: _
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin

Nějak nechápu, co na tom chceš ještě vysvětlit. Připadá mi, že v tom hledáš nějakou magii, která v tom není.

První funkce přebírá ukazatel na znak, druhá funkce přebírá ukazatel na ukazatel na znak. Možná ti pomůže vysvětlení na anglické Wikipedii. A nebo si to zkus načrtnout na papír.

Ukazatele se dají obecně indexovat jako pole (dokonce i do mínusu), takže *ret ve funkci1 je skutečně to samé jako ret[0] v téže funkci (jak se tu řešilo nedávno, ret[0] a 0[ret], je defakto *((ret) + (0)), což je zas ekvivalentní k *ret). Rozdíl mezi ukazatelem a polem se ukáže v momentě, kdy se pokusíš zjistit jejich velikost.

A teď jsem tě možná pomátl dočista. :)

10.11.2010 16:15 Begleiter | skóre: 47 | blog: muj_blog | Doma
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

Díky!

10.11.2010 13:50 CET
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin
Ano, jazyk C je zrovna jazyk na rozmezi mezi assemblerem/strojakem a vyssim jazykem bez ukazatelu (resp. nahrazenych jinymi konstrukcemi).

Pokud bys nekdy delal v assembleru, tak bys zjistil, ze je uplne jedno, kolik to ma v C hvezdicek, ale ze je dulezite, jak to interpretujes.

Prakticky jsou ty hvezdicky jakesi kontroly, co ta promenna obsahuje, takze pokud to blbe pouzijes, tak te bude treba kompiler u prace s char **a varovat, ze s obsahem ukazatele (coz je zase ukazatel) chces pracovat jako s char. Ale fakticky ti to dovoli, stejne jako v assembleru muzes obsah pameti bud vypsat jako znak, nebo to vzit jako adresu a cist neco z te adresy.

Ve vyssich jazycich pak uz te nezajima, ze "a" ve string a; je vlastne taky ukazatel na znaky (ala char *a), ale pracujes s tim, jakoby sama promenna "a" byla ten string.

Cili funkce1 bere ukazatel na pole charu, cili na adresu, od ktere zacinaji chary.

char *a je tedy
a[1000] -> 'A','B','C','D'...'\0'
Druha funkce2 bere ukazatel na ukazatele na chary, cili od adresy ret mas seznam cisel, ktere udavaji adresy, kde zacinaji jednotlive chary.

Tady je ale char **a

a[3000] -> 1000,1200,1400,1600
1000 -> 'a','a','a','a',...'\0'
1200 -> 'e','e','e','e',...'\0'
1400 -> 'c','c','c','c',...'\0'
nebo se pletu?
10.11.2010 16:18 Begleiter | skóre: 47 | blog: muj_blog | Doma
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

Super! Moc děkuju.

10.11.2010 15:17 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin
int funkce1(char *ret)
{
  /* Můžu si tedy dovolit toto: */
  *ret = 'A';
}
ne tak uplne. treba volani funkce1("Foobar"); ti neprojde, protoze retezec je s nejvetsi pravdepodobnosti v casti pameti, ktera se neda menit.

Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
10.11.2010 15:24 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Tam vypíše warning, protože "Foobar" je, afaik, const char*.
Nicméně přeloži to a pak vzniká rizoto SIGSEGV.
rADOn avatar 10.11.2010 17:00 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
C prekladac to dovoli, protoze se nemeni ukazatel ale pamet na kterou ukazuje. C++ to nedovoli.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
10.11.2010 17:27 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Mně to přeložil i g++... ale nevim...
pavlix avatar 11.11.2010 03:56 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
C prekladac to dovoli, protoze se nemeni ukazatel ale pamet na kterou ukazuje. C++ to nedovoli.
Takhle použitý const právě naopak znamená, že se *nesmí měnit obsah té paměti.

* Mnohé překladače pouze varují.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
10.11.2010 16:43 Radek Hladik | skóre: 20
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin
Upřímně řečeno, tohle je v C jeden z nejdůležitějších momentů (a pro mně i jeden z největších důvodů, proč C nesnáším). Při programování v C se budete velmi často setkávat s konstrukcemi typu adresa pointeru na pointer a pod. A především i s přetypováváním pointerů, tedy funknce může dostat pointer buď na char nebo int (dejme tomu). Pak má jako parametr pointer na void (netypový pointer) a podle potřeby si pointer přetypuje. A pro jistotu se předává ne pointer na void, ale pointer na pointer na void, aby to šlo změnit.

Ještě lepší je, když se posílá pointer na pointer na void, ten se přetypuje na nějakou uživatelskou struct, tam se očekává polovina věcí už vyplněná, zbytek se nějak v rámcí funkce dopočítá a vše se vrátí jako nový pointer :-) A přidáme si do toho makra, která sice mohou být úžasná, ale zároveň i megaultrahumusná a vznikne dobrý chaos... Například práce s ASN.1 v OpenSSL je naprosto "úžasná". Zavoláte jedno makro (od kterého není pořádný popis v dokumentaci) a ono to udělá asi milión volání funkcí, přetypovávání a já nevím čeho všeho. Definice makra není pořádně k dispozici, protože je nějaká hromadná, či jak se to jmenuje atd...

Nu, to jsem se ale nechal trochu unést, v principu jsem chtěl říct jen to, že tahle práce s pointery je v C alfou a omegou všeho a je potřeba jí perfektně ovládát... Až pak budete luštit/tvořit konstrukce typu (sc_path_t *) &(env->file_ref), budete to sakra potřebovat...
10.11.2010 16:50 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Ne všichni píší pod gtk :-D
(a freetype2 a libavcodec a ... a ... :-()
Grunt avatar 10.11.2010 17:36 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
No jo, ale vem si, že i přes to, že mplayer polovinu času nedělá nic jiného než že někde přesouvá pointery z libav*, ffmpegu, a jiných obalovacích vrstev jak je rychlý. Dovedeš si představit ho napsaný v něčem jiném? (krom komplet Assembleru…i tak ho tam už není málo). Např. stack některých C++ aplikací, to je fakt dílo. Proti nim je i debugovaní kernelu slabé máslo.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
10.11.2010 18:18 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Jo, to je pravda, mplayer je hodně rychlý.
Ale třeba takové VLC je taky (z většiny) v C a přitom je děsně pomalý...
Grunt avatar 10.11.2010 18:27 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Tam je totiž těch obalových vrstev ještě jednou tolik.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
Luboš Doležel (Doli) avatar 10.11.2010 22:04 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Pomalý v čem? :-)
11.11.2010 01:14 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
V přehrávání.
Na notebooku s omezeným výpočetním výkonem se to pozná; VLC má o dost níž strop HD videí, které je schopno plynule přehrát...
David Watzke avatar 11.11.2010 16:18 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
To není pravda obecně, třeba na Intelu když používám VA API, tak mi VLC přijde lepší. Problém MPlayeru je hlavně postupný (mírný) rozjíždění A/V.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
11.11.2010 20:51 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Tím Intelem myslíš grafárnu? Tam už funguje aj h264 Vím že dřív šlo jen mpeg2...
mirec avatar 11.11.2010 09:30 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Taký ffmpeg je tiež v C a patrí medzi pomerne pomalé dekódery. MPEG4 AVC prehráva o dosť pomalšie než CoreAVC.
LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
10.11.2010 16:56 Begleiter | skóre: 47 | blog: muj_blog | Doma
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C

Děkuju za názor.

10.11.2010 16:59 qiRzT | skóre: 14 | blog: U_Marvina
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
A tos ještě zapoměl na pointery na funkce. S těma makrama jsi mi připoměl moje první setkání s tím, jak jsou v Linuxu (tedy kernelu) řešeny objekty, polymorfismus apod. V tom se vyznat, je taky (aspoň zpočátku) pěkná fuška :-)
Důležité je vědět jak problém vyřešit, zbytek zvládne i cvičená opice...
Rezza avatar 10.11.2010 19:03 Rezza | skóre: 25 | blog: rezza | Brno
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
A GLib!
Grunt avatar 10.11.2010 17:32 Grunt | skóre: 23 | blog: Expresivní zabručení | Lanžhot
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Na to mám jednoduchý trik. Zapnu GDB a mlátím do TABu (umí to něco jako BASH completion) tak dlouho dokuď se tečkama přes struktury a pointery neprobiju až na požadovanou proměnnou. A jako bonus to zahlásí, když je některá proměnná typu void a nejde dereferencovat. Stallman budiž blahořečen.
Na co 64-bitů když to jde i s jedním? | 80.78.148.5 | Hack (for) free or Die Hard!
11.11.2010 22:51 tom
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Odpovědět | Sbalit | Link | Blokovat | Admin
Krome *(ret + 1) = 'A' a ret[1] = 'A' muzete psat i 1[ret] = 'A' ;) scitani je totiz komutativni
11.11.2010 23:34 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
To je sice hezké, ale je to - kromě znepřehlednění programu - k něčemu dobré?
Gilhad avatar 12.11.2010 01:33 Gilhad | skóre: 20 | blog: gilhadoviny
Rozbalit Rozbalit vše Re: Ukazatele jako parametry funkcí v jazyce C
Připravuje nás to psychicky na použití Perlu :)

(A možná se jednou za čas někde vyskytne nějaká složitější konstrukce, která se tak dá zapsat lépe. A taky má určitý půvab "úplnost" - nevylučovat předem věci, které jsou zdarma, jen pro ně nemám použití zrovna tady a teď, zvláště pokud by to vyloučení něco stálo.)

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.