Newsgroup: it.comp.lang.c
Titolo: Puntatore a funzione

Salve a tutti, se dichiaro un
puntatore a funzione :
int  (*miafunz )(int, int);
e la passo ad un altra funzione
void funz2(*p);
/*non sò se fino a questo punto e giusta*/
come posso fare per passare insieme
al puntatore anche gli argomenti di miafunz?
...se ho detto e scritto delle c***e chiedo scusa! :-)
Grazie a tutti
Ciao

 wrote

Faccio prima postandoti un esempio:
#include<stdio.h>
typedef int(*PtrF_IntInt_Int)(int,int);
int StampaDueNumeri(int n1, int n2)
{
    return printf(
        "n1 = %d, n2 = %d\n",
        n1,n2
    );
}
int f(PtrF_IntInt_Int pf, int arg1, int arg2)
{
    pf(arg1,arg2);     
}
int main()
{   
    f(StampaDueNumeri,4,7);
    return 0;   
}
Prima di tutto definisco un tipo che e' puntatore ad una funzione che
prende due int e ritorna un int:
typedef int(*PtrF_IntInt_Int)(int,int);
ora quando parliamo di PtrF_IntInt_Int parliamo di questo tipo di dato.
la nostra funzione f ha questo prototitpo:
int f(PtrF_IntInt_Int pf, int arg1, int arg2)
ovvero prende un puntatore ad una funzione che prende due interi e
ritorna un intero e poi prende altri due interi, arg1 ed arg2 che se non
lo hai ancora capito sono i due parametri da passare alla funzione....
quando facciamo:
pf(arg1,arg2);   
chiamiamo la funzione che abbiamo passato come puntatore (pf) e a tale
funzione passiamo le due variabili intere.
In main le cose sono banali:
int main()
{   
    f(StampaDueNumeri,4,7);
    return 0;   
}
Il nome stesso della funzione StampaDueNumeri viene passato ad f che lo
riceve in pf (puntatore a funzione).
Assieme alla funzione che vogliamo lanciare passiamo anche i due interi
che vogliamo passargli.
Ora un esercizio per te:
Aggiungi una nuova funzione subito sotto StampaDueNumeri:
int StampaSomma(int n1, int n2)
{
    return printf(
        "%d + %d = %d\n",
        n1,n2,n1+n2
    );
}
e poi in main aggiungi una nuova linea di codice in modo da avere ad
esempio:
f(StampaDueNumeri,4,7);
f(StampaSomma,4,7);
Ora e' chiaro il fatto che f puo' ricevere un puntatore ad una qualsiasi
funzione del tipo int(*)(int,int).
<OUTPUT>
n1 = 4, n2 = 7
4 + 7 = 11
</OUTPUT>
Spero di essere stato abbastanza chiaro.
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 f(StampaSomma,4,7);
f(Stampa4numeri,x,y,v,z)


 Tommaso
... ti ringrazio , sei stato chiaro !
Ciao

 f(StampaSomma,4,7);
f(Stampa4numeri,x,y,v,z)


 f(Stampa4numeri,x,y,v,z)
beh, visto il codice che hai scritto sopra al limite sarebber f1 e non
f.
poi come ti ho detto f1 e' errata.
Mi pare che tu non abbia capito molto di quello che ho detto ed abbia
ancora le idee confuse.


 ... ti ringrazio , sei stato chiaro !
Tommaso


>> typedef int(*PtrF_IntInt_Int_b)(int,int,int,int);
motivo per cui me lo sono perso e' anche perche' ti sei dimenticato il
_b nel prototipo di f1.
Inoltre seguendo il mio stile avresti dovuto chiamarlo:
PtrF_IntIntIntInt_Int
non che lo stile che ho usato sia buono, anzi, ma il _b non e' coerente
con il resto.
Ptr = puntatore
F = a funzione
_ = iniziano i parametri
IntIntIntInt = 4 interi
_ = inizia il valore di ritorno
Int = ritorna un intero.
Ad esempio:
void f(int,double);
sarebbe PtrF_IntDouble_Void.
Tutto questo per spiegarti lo stile che ho usato. Bada bene che non lo
consiglio affatto come stile per applicazioni reali, e' solo lo stile
che ho usato nel mio esempio.


[...]
... l'ora tarda ha fatto il resto.
Ciao