Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
|
[Vrh] |
|
vskudar Forumaš(ica)


Pridružen/a: 05. 05. 2004. (17:05:29) Postovi: (12)16
|
Postano: 17:24 sri, 5. 5. 2004 Naslov: Re: Pokazivači na funkcije |
|
|
[quote="Crni"]Čemu služe i može par najjednostavnijih primjera?
Iz skripte prof. Juraka mi baš i nije jasno. :?[/quote]
Jooj, divna stvar....
Recimo da radis nes sa nekom fjom, npr, aproximacije. Pa sad imas taj neki potprogram koji ju racuna, pa tako i poziva. pa je lepa stvar svega da samo promjenis tu liniju koda kod fje, umjesto da trazis po cjelom programu di si sve "rucno" racuno.
Tolko se ja sjecam. Olaksalo mi zivot :)
Mozda ti vise detalja mogu dati programeri i(li) racunarci
Crni (napisa): | Čemu služe i može par najjednostavnijih primjera?
Iz skripte prof. Juraka mi baš i nije jasno.  |
Jooj, divna stvar....
Recimo da radis nes sa nekom fjom, npr, aproximacije. Pa sad imas taj neki potprogram koji ju racuna, pa tako i poziva. pa je lepa stvar svega da samo promjenis tu liniju koda kod fje, umjesto da trazis po cjelom programu di si sve "rucno" racuno.
Tolko se ja sjecam. Olaksalo mi zivot
Mozda ti vise detalja mogu dati programeri i(li) racunarci
_________________ BrrB
|
|
[Vrh] |
|
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
|
[Vrh] |
|
Void Forumaš(ica)

Pridružen/a: 14. 11. 2002. (18:08:22) Postovi: (FA)16
|
Postano: 17:37 sri, 5. 5. 2004 Naslov: |
|
|
Mozda najpoznatiji primjer je u funkciji qsort (quick sort, naravno) ciji prototip izgleda ovako:
[code:1]
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void*, const void*));
[/code:1]
Zadnji parametar je pointer na fju koja sluzi za usporedjivanje elemenata. Dakle, mozes imati vise kriterija po kojima sortiras niz ili razlicite tipove podataka pa onda samo za svaki napravis funkciju za usporedbu i ubacis pointer na nju kao parametar u qsortu.
Ovo je samo jedna od mogucih primjena.
Mozda najpoznatiji primjer je u funkciji qsort (quick sort, naravno) ciji prototip izgleda ovako:
Kod: |
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void*, const void*));
|
Zadnji parametar je pointer na fju koja sluzi za usporedjivanje elemenata. Dakle, mozes imati vise kriterija po kojima sortiras niz ili razlicite tipove podataka pa onda samo za svaki napravis funkciju za usporedbu i ubacis pointer na nju kao parametar u qsortu.
Ovo je samo jedna od mogucih primjena.
|
|
[Vrh] |
|
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
|
[Vrh] |
|
veky Forumaš(ica)

Pridružen/a: 09. 12. 2002. (19:59:43) Postovi: (5B0)16
Lokacija: negdje daleko...
|
Postano: 18:04 sri, 5. 5. 2004 Naslov: Re: Pokazivači na funkcije |
|
|
[quote="Crni"]Čemu služe ... :?[/quote]
Općenito kad trebaš prenijeti funkciju kao parametar u neku drugu funkciju. Ne možeš deklarirati parametar tipa int(int) , recimo, ali možeš prenijeti pointer na nju, slično kao što prenosiš bilo kakav drugi pointer.
Na taj način postižeš takozvane "funkcije višeg reda". Npr. možeš imati meta-funkciju "iteriraj ovu funkciju n puta na zadanom argumentu" (to je ono što se u Mathematicai zove Nest). Prirodno je toj metafunkciji dati tri parametra: broj iteracijâ , početni argument , i (pointer na) funkciju koju treba iterirati. Tim više što u C-u sâmo ime funkcije (bez zagradâ) služi kao pointer na nju, pa ti se zaista čini da prenosiš funkciju. Npr.
iteriraj(4,1.0,cos) ti može vratiti cos(cos(cos(cos(1.0)))) .
Još malo općenitije, kad u bilo kojem kontekstu želiš s funkcijama operirati kao s jednostavnim vrijednostima: npr. pospremiti funkciju u varijablu, imati polje funkcijâ (što se u C-žargonu još zove "menî", jer zaista tako i izgleda npr.:
0. nekafunkcija
1. nekadrugafunkcija
2. jošnešto
3. podmeni (ovo je pointer na neki drugi meni, s tim da su čak riječi "pointer na" suvišne, jer je meni polje)
4. izlaz )
I onda ispišeš nešto takvo, pitaš korisnika za broj n , i dereferenciraš n-ti element tog polja. Eto, izvršio si funkciju. A ne grozomorne ifelsifove i malo manje grozomorne switchove pisat... :-)
Jasnije?
Crni (napisa): | Čemu služe ...  |
Općenito kad trebaš prenijeti funkciju kao parametar u neku drugu funkciju. Ne možeš deklarirati parametar tipa int(int) , recimo, ali možeš prenijeti pointer na nju, slično kao što prenosiš bilo kakav drugi pointer.
Na taj način postižeš takozvane "funkcije višeg reda". Npr. možeš imati meta-funkciju "iteriraj ovu funkciju n puta na zadanom argumentu" (to je ono što se u Mathematicai zove Nest). Prirodno je toj metafunkciji dati tri parametra: broj iteracijâ , početni argument , i (pointer na) funkciju koju treba iterirati. Tim više što u C-u sâmo ime funkcije (bez zagradâ) služi kao pointer na nju, pa ti se zaista čini da prenosiš funkciju. Npr.
iteriraj(4,1.0,cos) ti može vratiti cos(cos(cos(cos(1.0)))) .
Još malo općenitije, kad u bilo kojem kontekstu želiš s funkcijama operirati kao s jednostavnim vrijednostima: npr. pospremiti funkciju u varijablu, imati polje funkcijâ (što se u C-žargonu još zove "menî", jer zaista tako i izgleda npr.:
0. nekafunkcija
1. nekadrugafunkcija
2. jošnešto
3. podmeni (ovo je pointer na neki drugi meni, s tim da su čak riječi "pointer na" suvišne, jer je meni polje)
4. izlaz )
I onda ispišeš nešto takvo, pitaš korisnika za broj n , i dereferenciraš n-ti element tog polja. Eto, izvršio si funkciju. A ne grozomorne ifelsifove i malo manje grozomorne switchove pisat...
Jasnije?
|
|
[Vrh] |
|
Gost
|
|
[Vrh] |
|
vskudar Forumaš(ica)


Pridružen/a: 05. 05. 2004. (17:05:29) Postovi: (12)16
|
|
[Vrh] |
|
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 22:49 čet, 6. 5. 2004 Naslov: |
|
|
Programcice lako nadjes, a ponesto ti i pise gore. :roll:
Dakle, imas neku funkciju koja radi nesto. Recimo, sort. :)
E sad, ti zelis da mozes mijenjati jedan dio te funkcije, npr. usporedjivanje. :? Konkretno: mozda ja zelim sortirati brojeve. Onda cu pozvati normalni quick sort. 8)
E, sad se sjetim da zelim sort tih istih brojeva, ali ne po vrijednosti, nego po ostatku pri dijeljenju sa 17. :shock: Jedan nacin da to izvedem je da nakucam novu funkciju za sort (cijelu!). Drugi nacin je da nakucam funkciju za usporedjivanje:
[code:1]int compareByMod17(void *x, void *y) {
return (int)(*y) - (int)(*x);
}[/code:1]
I sada fino pozoves postojecu funkciju qsort(), samo joj kazes da za komparaciju clanova niza koristi ovu tvoju funkciju, a ne standardno manje-vece. 8)
[code:1]qsort(niz, n, width, &compareByMod17);[/code:1]
I to je to! :D
(ne garantiram skroz za sintaxu, ali ideja je valjda jasna)
Programcice lako nadjes, a ponesto ti i pise gore.
Dakle, imas neku funkciju koja radi nesto. Recimo, sort.
E sad, ti zelis da mozes mijenjati jedan dio te funkcije, npr. usporedjivanje. Konkretno: mozda ja zelim sortirati brojeve. Onda cu pozvati normalni quick sort.
E, sad se sjetim da zelim sort tih istih brojeva, ali ne po vrijednosti, nego po ostatku pri dijeljenju sa 17. Jedan nacin da to izvedem je da nakucam novu funkciju za sort (cijelu!). Drugi nacin je da nakucam funkciju za usporedjivanje:
Kod: | int compareByMod17(void *x, void *y) {
return (int)(*y) - (int)(*x);
} |
I sada fino pozoves postojecu funkciju qsort(), samo joj kazes da za komparaciju clanova niza koristi ovu tvoju funkciju, a ne standardno manje-vece.
Kod: | qsort(niz, n, width, &compareByMod17); |
I to je to!
(ne garantiram skroz za sintaxu, ali ideja je valjda jasna)
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
Postano: 23:05 čet, 6. 5. 2004 Naslov: |
|
|
[quote="vsego"]...[b]samo joj kazes[/b] da za komparaciju clanova niza koristi ovu tvoju funkciju, a ne standardno manje-vece.
Kod:
[code:1]qsort(niz, n, width, &compareByMod17); [/code:1][/quote]
Dobro, ovo kaj si napisal' u kodu je očito pozivanje funkcije qsort, al' kak' ona zgleda u deklaraciji? To me zanima?
vsego (napisa): | ...samo joj kazes da za komparaciju clanova niza koristi ovu tvoju funkciju, a ne standardno manje-vece.
Kod:
Kod: | qsort(niz, n, width, &compareByMod17); |
|
Dobro, ovo kaj si napisal' u kodu je očito pozivanje funkcije qsort, al' kak' ona zgleda u deklaraciji? To me zanima?
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
|
[Vrh] |
|
veky Forumaš(ica)

Pridružen/a: 09. 12. 2002. (19:59:43) Postovi: (5B0)16
Lokacija: negdje daleko...
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 15:32 pet, 7. 5. 2004 Naslov: |
|
|
[quote="veky"][quote="vsego"][code:1]int compareByMod17(void *x, void *y) {
return (int)(*y) - (int)(*x);
}[/code:1][/quote]
Naravno, return (int)(*y)%17 - (int)(*x)%17 . 8)[/quote]
:oops: Toliko sam pazio da [i]y[/i] mora biti prvi, a [i]x[/i] drugi (u prvoj verziji posta je pisalo "[i]x-y[/i]" :oops:), da sam totalno zaboravio svoj dragi :bow: 17. :bow: Nadm se da ce mi oprostiti... ;)
Crni, reci sto ti nije jasno, ali nemoj ocekivati da cu prepisivati definiciju koju imas par postova prije... :roll:
veky (napisa): | vsego (napisa): | Kod: | int compareByMod17(void *x, void *y) {
return (int)(*y) - (int)(*x);
} |
|
Naravno, return (int)(*y)%17 - (int)(*x)%17 .  |
Toliko sam pazio da y mora biti prvi, a x drugi (u prvoj verziji posta je pisalo "x-y" ), da sam totalno zaboravio svoj dragi 17. Nadm se da ce mi oprostiti...
Crni, reci sto ti nije jasno, ali nemoj ocekivati da cu prepisivati definiciju koju imas par postova prije...
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
vskudar Forumaš(ica)


Pridružen/a: 05. 05. 2004. (17:05:29) Postovi: (12)16
|
|
[Vrh] |
|
Zvone Forumaš(ica)

Pridružen/a: 01. 07. 2003. (13:09:44) Postovi: (9D)16
|
|
[Vrh] |
|
Crni Forumaš(ica)


Pridružen/a: 15. 12. 2003. (01:20:43) Postovi: (23C)16
Spol: 
Lokacija: Zagreb
|
Postano: 16:26 sub, 8. 5. 2004 Naslov: |
|
|
[quote="gost"][code:1]typedef double (*function)(double); /* deklaracija point na fju */
double kos(double x) /* fja koju lako mozes zamjenit nekom */
/* drugom sam pazi kaj prima i vraca */
{
return(cos(x)+sin(x));
}
double koef(function f, double x) /* ova radi nes s fjom */
{
return(2*f(x));
}
int main(void)
{
double x;
scanf("%lf",&x);
printf("%lf\n", koef(kos(x))); / * pozivanje i racunanje */
return 0;
} [/code:1][/quote]
Greška je u ovom zadnjem printf-u'. Treba pisat':
[code:1]printf("%lf\n", koef(kos, x));[/code:1]
Skužil sam!!! :) Hvala svima, a najviše gošći!
[color=brown]P.S. Gošću ovom prilikom pozivam da mi se javi u PM kako bih je kao pravi kavalir počastio kavom. [/color] :buket:
gost (napisa): | Kod: | typedef double (*function)(double); /* deklaracija point na fju */
double kos(double x) /* fja koju lako mozes zamjenit nekom */
/* drugom sam pazi kaj prima i vraca */
{
return(cos(x)+sin(x));
}
double koef(function f, double x) /* ova radi nes s fjom */
{
return(2*f(x));
}
int main(void)
{
double x;
scanf("%lf",&x);
printf("%lf\n", koef(kos(x))); / * pozivanje i racunanje */
return 0;
} |
|
Greška je u ovom zadnjem printf-u'. Treba pisat':
Kod: | printf("%lf\n", koef(kos, x)); |
Skužil sam!!! Hvala svima, a najviše gošći!
P.S. Gošću ovom prilikom pozivam da mi se javi u PM kako bih je kao pravi kavalir počastio kavom.
|
|
[Vrh] |
|
|