Funzioni callback

di il
6 risposte

Funzioni callback

Buonasera a tutti,

Innanzi tutto credo sia d'obbligo scusarmi dato che è il terzo post che apro su cose banali.. ma neanche a farlo apposta ogni capitolo di manuale che leggo mi lascia dubbi più che chiarimenti ed anche se a livello teorico capisco ciò leggo, a livello pratico è letteralmente un macello e non riesco a replicare nulla di ciò che """apprendo""".

Ho compreso cos'è una funzione callback ed in certi contesti riesco pure ad utilizzarla:
/*includo le librerie*/

#include <stdio.h>
#include <math.h>

/*prototipo funzione somma*/

int somma();


/*prototipo funzione quadrato*/

int quadrato(int(*p)());

/*inzio del main. qui  richiamo la funzione quadrato che punta a somma*/

int main() {

	
	printf("ecco il quadrato:%d\n",quadrato(somma));
}

/*dichiarazione della funzione somma*/

int somma() {
	
	int a=2;
	
	int b = 2;
	
	int c;
	
	c= a+b;
	
	return c;
}


/*dichiarazione della funzione quadrato*/

int quadrato(int  (*p)()) {

	int d;

	d=(*p)();

	int d1;

	d1 = d*2;

	return d1;

}
senza passare parametri alla funzione somma dal main tutto funziona a meraviglia. I problemi sorgono quando
passo i parametri necessari alla somma tramite il main:

#include <stdio.h>



int somma(int a, int b);

int quadrato( int(*p)(int a, int b));

int main(){

	int a=2, b=2;

	printf("il risultato e': %d\n",quadrato(somma(int a, int b)) );

	return 0;
}


int somma(int a, int b){
	return a+b;

}


int quadrato(int (*p)(int a, int b)){

	return (*p)(a,b) *2;
	
}

potete spiegarmi dove sbaglio?


grazie.

Saluti.

6 Risposte

  • Re: Funzioni callback

    Per passare gli argomenti a somma devi modificare la funzione quadrato:
    
    int quadrato( int(*p)(int a, int b), int arg1, int arg2) {
       return (*p)(arg1,arg2) *2;
    }
    
    printf("il risultato e': %d\n",quadrato(somma, a, b) );
    
    O ricorrere a variabili globali.
  • Re: Funzioni callback

    Ciao

    "int arg1, int arg2" cosa sono?

    perchè devo modificarlo in questo modo? non capisco a quale argomento reale vadano a riferirsi.

    quindi il problema risiede nel fatto che la variabile viene inizializzata staticamente all'interno del main?
  • Re: Funzioni callback

    No. Quando passi un puntatore di funzione a una funzione, devi passare solo il nome (come fai correttamente nel primo spezzone di codice).
    Se il puntatore di funzione è una funzione che accetta argomenti, devi comunque passare solo il nome. Gli argomenti devi passarli in un altro modo (che è quello che ho fatto io).
    Quello che hai fatto tu nel secondo spezzone, non è passare il puntatore alla funzione somma come argomento della funzione quadrato, ma passare il risultato della funzione somma alla funzione quadrato (cosa che da errore).
    "int arg1, int arg2" cosa sono?

    Sono i parametri supplementari che la funzione quadrato inoltra alla funzione somma.
    quindi il problema risiede nel fatto che la variabile viene inizializzata staticamente all'interno del main?
    non c'entra niente.
  • Re: Funzioni callback

    Ciao,

    ok ho capito cosa intendi.

    comunque mi sembra quanto meno scomodo passare gli argomenti necessari alla funzione puntata, invece che a quest'ultima, alla funzione che utilizza il puntatore.

    mi spiego meglio:

    i parametri, i due interi in questo caso, non sono necessari alla funzione quadrato che contiene il puntatore alla funzione somma; ma sono invece necessari alla funzione somma per potersi svolgere.
    mi rendo conto che l'esempio che sto per fare non sia proprio calzante ma l'unico altro linguaggio di programmazione che conosco è python; mi viene quindi facile paragonare le sintassi dei due.

    se dovesssi scrivere una funzione python che si occupa di sommare due numeri:
    
    def somm(a, b):
    	c= a+b
    	return c
    	
    #questo è un commento in py (sono consapevole che lo sappiate meglio di me. ma per precisione e chiarezza lo indico) 
    # + questa è la funzione moltiplica
    
    def moltiplica(funzione):
    	risultato = funzione *2
    	print (risultato)
    	
    #ora se devo chiamare la funzione gli argomenti necessari la passo direttamente alla funzione
    # + che li adopera
    
    moltiplica(somma(1, 2))
    
    
    
    mi rendo conto che un paragone tra due linguaggi differenti abbia poco senso; ma il concetto di quello che intendo è questo comunque.
  • Re: Funzioni callback

    comunque mi sembra quanto meno scomodo passare gli argomenti necessari alla funzione puntata, invece che a quest'ultima, alla funzione che utilizza il puntatore.
    Non è che sia scomodo: è l'unico modo se non si vogliono usare variabili globali.
  • Re: Funzioni callback

    Certo, certo non era una critica.

    Mi sembra solo poco intuitivo.

    comunque ora ho capito come si usano.

    grazie.
    ciao.
Devi accedere o registrarti per scrivere nel forum
6 risposte