[ doomed @ 19.09.2002. 00:55 ] @
Jednostavno kako da realizujem pokazivace na funkcije?
e pa program bi trebao da izgleda ovako nekako ali ne znam kako da ga realizujem:

struct pokazivaci{
ptr1 //pokazivac na funkciju
ptr2//pokazivac na funkciju
};

class Neka
{
.....
piblic:
void SetNumber( int i );
int GetNumber( );
};

void main ()
{
pokazivaci pok;
Neka neka;

pok.ptr1 = ...treba da mi pokaze na funkciju SetNumber
pok.ptr2 = ..treba da mi pokze na f-ju GetNumber
CreateThread (bla, 0, &pok);
}

da bi se posle negde u niti pozivale te f-je na neki fazon , recimo: sa temppok->ptr1 i da se izvrsi ta f-ja odnosno u ovom slucaju SetNumber
Kako se ovo radi?


[ Milan Aksic @ 19.09.2002. 04:29 ] @
Code:

void (Neka::*pfnSetNumber)(int);
int (Neka::*pfnGetNumber)();
...
pfnSetNumber = Neka::SetNumber;
pfnGetNumber = Neka::GetNumber;

[ sportbili @ 19.09.2002. 11:52 ] @

Da ne otvaram novu temu cemu uopste sluze pokazivaci na funkcije?
Moze li neki primer upotrebe?
Znam da napravim isti ali nemam ideju gde se koriste. Hvala.
[ doomed @ 19.09.2002. 12:10 ] @
pa recimo kao "okidaci". barem meni za to trebaju. Kada se desi neki dogadjaj ja okinem neku funkciju.jest da postoje tajmeri i semafori ali ovo moje je malo specificno
[ tosa @ 19.09.2002. 15:02 ] @
Citat:
sportbili:
Da ne otvaram novu temu cemu uopste sluze pokazivaci na funkcije?
Moze li neki primer upotrebe?


Pokazivaci na f-je su idealno resenje kada imas vise kofiguracija
klase koju koristis.
Npr. Imas klasu Autobus i metod Vozi()
E, sad, ako hoces da metod Vozi radi potpuno razlicite stvari
u zavisnosti od (recimo) pozicije autobusa, onda svaki
put kada se promeni to stanje (u ovom slucaju pozicija)
promenis i pointer na f-ju koja odradjuje voznju..
Time izbegavas nepregledan kod i predugacke metode
(sa raznim namenama :).
[ Dragi Tata @ 19.09.2002. 17:28 ] @
Još bolji primer su klase za menije (na ekranu). Dodeliš svakoj opciji na meniju po jedan pokazivač na funkciju i kad korisnik "klikne" na tu opciju, izvrši se odgovarajuća funkcija.
[ sportbili @ 19.09.2002. 18:50 ] @
Koriscenje pokazivaca koje opisujete mi izgleda kao i koriscenje makroa?
Poziv funkcije zamenjujemo njenim pokazivacem? Ne bili smo mogli koristiti
odmah poziv funkcije? Still stuck.
[ doomed @ 19.09.2002. 19:42 ] @
pa ne bih bas rekao da slice makroima.....zamisli da pravis jedan konacni automat ili jos bolje jezgro koje ce da radi sa konacnim automatima.....e sada kada si u nekom stanju i kada ti naidje neka poruka (dogadjaj ) ti samo lepo pozoves f-ju Pogodi, ta f-ja se automatu prosledjuje kao pokazivac...........to je jedna elegantna primena
[ Dragi Tata @ 19.09.2002. 20:16 ] @
Kakve veze imaju makroi sa ovime?

Pazi primer: Imaš padajući meni koji korisnik može da puni opcijama po želji. Na primer, ti mu nudiš 300 mogućih funkcija, a on kad klikne desnim dugmetom miša dobije padajući meni sa funkcijama koje je on ranije odabrao. Jednostavno napraviš dinamički niz pokazivača na funkcije i dodaješ ih (ili brišeš) onim redom kojim to radi i korisnik. Odluka koje se funkcije pozivaju po izboru opcije menija se donosi u vreme izvršavanja programa, a ne u vreme kompajliranja.
[ sportbili @ 19.09.2002. 20:57 ] @
Citat:

Jednostavno napraviš dinamički niz pokazivača na funkcije i dodaješ ih (ili brišeš) onim redom kojim to radi i korisnik. Odluka koje se funkcije pozivaju po izboru opcije menija se donosi u vreme izvršavanja programa, a ne u vreme kompajliranja.


Palo mi je napamet da probam upravo to, odoh. :-) Hvala svima.
[ doomed @ 20.09.2002. 21:04 ] @
Citat:
passenger:
Code:

void (Neka::*pfnSetNumber)(int);
int (Neka::*pfnGetNumber)();
...
pfnSetNumber = Neka::SetNumber;
pfnGetNumber = Neka::GetNumber;



e kada smo vec kod pokazivaca na f-je...ne bih da budem dosadan ali kako se posle pozivaju ove f-je? sta god da sam probao kompajler mi izbacuje gresku : term does not evaluate to a function.........
elem sve f-je na koje sam pokazivao su public pa ne bi bilo problema da se pozivaju "i preko dva brda"..........................
[ Milan Aksic @ 20.09.2002. 21:37 ] @
U ovom slucaju konkretno (kada su to pokazivaci na member funkcije), moras da imas instancu klase, jer je drugacije naravno, besmisleno zvati je. Znaci:
Code:

class Neka
{
public:
void SetNumber( int i ) { x = i; }
int GetNumber( ) { return x; }

private:
int x;

};

void main ()
{
void (Neka::*pfnSetNumber)(int);
int (Neka::*pfnGetNumber)();

int k;

Neka* cTest = new Neka;

pfnSetNumber = Neka::SetNumber;
pfnGetNumber = Neka::GetNumber;

cout << "Unesi broj: ";
cin >> k;

(cTest ->* pfnSetNumber)(k); // Ovako se upotrebljavaju pokazivaci
k = (cTest ->* pfnGetNumber)(); // na funkcije clanice
cout << "\nUneti broj: " << k << endl;
}


Podestio bih te jos da je ->* ( kao i .* ) poseban operator.
[ doomed @ 20.09.2002. 22:33 ] @
hvala , hvala odoh da probam mada mi se cini da sam probao sa
.* nesto poput
(struktura.*pok1)()
i da mi javlja da ne moze da je razvije u funkciju ili cak da mu je nepoznat pok1(!!??)
naravno pok1 je pokazivac na f-ju koja "uzima" void i vraca void
videcemo...............
thanks any way
[ doomed @ 21.09.2002. 00:52 ] @
pa cekaj sada: koja je stvarno svrha pokazivaca na f-je? :))
to je dobro pitanje narocito u mom slucaju....
naime radim jedan program u MFC-u. pored mainframe-a bice i jedna nit koja ce proveravati da li se neki dogadjaj desio ( a ima ih desetak) i ako se desi on pozove odredjnu f-ju iz mainframe klase da bi osvezio prozor. Ja sam nesto kontao da pokazivace na odredjene f-je mainframe klase strpam u jednu strukturu i da ih prosledim niti kao parametar i kada se nesto desi on samo pozove odredjenu f-ju
Sada ispada da u toj strukturi mora da se nalazi pokazivac i na samu main frame klasu(ili se varam). Onda nema smisla
da prosledjujem i pokazivace na f-ju kada sam prosledio pokazivac na celu klasu...
Hmmmm da li sam u pravu kada kazem da ne moram da prosledjujem i pokazivace na f-je kada vec prosledjujem celu klasu?Samo ne znam kako ce to da se svidi MFC-u....naime moje znanje o mfc-u je skromno.
[ Milan Aksic @ 21.09.2002. 01:01 ] @
Citat:
doomed:
hvala , hvala odoh da probam mada mi se cini da sam probao sa
.* nesto poput
(struktura.*pok1)()
i da mi javlja da ne moze da je razvije u funkciju ili cak da mu je nepoznat pok1(!!??)
naravno pok1 je pokazivac na f-ju koja "uzima" void i vraca void
videcemo...............
thanks any way

Onaj kod koji sam postovao gore, radi.
Isprobao sam i pre nego sto sam postovao ovde.