Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    Passare una funzione come parametro ad un'altra funzione

    Salve ragazzi, cortesemente qualcuno può spiegarmi come passare una funzione come parametro ad un'altra funzione?

    Ecco le funzioni:
    codice:
    /* Funzione f_campionata */
    void f_campionata(int a, int b, int n){
    	float x, passo;
    	float values[N];
    	int i;
    
    	x=a;
    	passo=abs(b-a)/float(n-1);
    
    	for( i=0; i<n; i++ ){
    		values[i]=f(x);
    		x+=passo;
    	}
    }
    
    
    
    /* Funzione f */
    float f(int x){
    
    	/* Se l'espressione della f è: x^2+x-1 */
    	return (x*x+x-1);
    }
    Praticamente la funzione "float f(int x)", dev'essere passata alla funzione "f_campionata";
    Se avete bisogno di altre informazioni, scrivete.

    Grazie anticipatamente.
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Puoi passarla come puntatore a funzione.
    codice:
    typedef float (* IntInFloat) (int);
    
    void f_campionata(int a, int b, int n, IntInFloat funz){
    	float x, passo;
    	float values[N];
    	int i;
    
    	x=a;
    	passo=abs(b-a)/float(n-1);
    
    	for( i=0; i<n; i++ ){
    		values[i]=funz(x);
    		x+=passo;
    	}
    }
    
    /* Funzione f */
    float f(int x){
    
    	/* Se l'espressione della f è: x^2+x-1 */
    	return (x*x+x-1);
    }
    
    /* ... */
    f_campionata(/* ... */, f);
    Per inciso, si parla di C o C++?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Non riesco a capire, l'utilizzo del puntatore ne tantomento perchè "typedef" etc... potresti essere più chiaro? Grazie
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Il typedef è lì perché la sintassi dei puntatori a funzione in C/C++ è odiosa. In sostanza la dichiarazione di un puntatore a funzione è:
    codice:
    tiporestituito (* nomevariabile) (elenco argomenti)
    Tramite un typedef del tipo
    codice:
    typedef tiporestituito (* nometipo) (elencoargomenti);
    ottengo di poter usare nometipo come tipo del parametro da passare alla funzione invece di tutta quella sbrodolata.

    Per il resto, un puntatore a funzione sta ad una funzione come un normale puntatore sta ai dati a cui punta: ogni funzione sta ad una certa locazione di memoria, e per ottenere tale indirizzo o si usa la sintassi &nomedellafunzione oppure basta semplicemente usare il nome della funzione. Vedi infatti che nella chiamata a f_campionata (in fondo) passo come ultimo argomento il nome della funzione che essa dovrà richiamare.
    All'interno di f_campionata funz è il puntatore a funzione (è di tipo IntInFloat, che altro non è che un typedef per float (*) (int), ossia per un puntatore a funzione che ha un parametro int e restituisce un float), per "dereferenziarlo" e chiamare la funzione a cui punta basta usarlo come se fosse il normale nome di una funzione.

    In ogni caso, ti consiglio di leggerti il link che ho inserito nel post precedente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Come mai, quando compilo ottengo questi 2 errori:
    1 - Error 7 error LNK2019: unresolved external symbol "void __cdecl f_campionata(int,int,int)" (?f_campionata@@YAXHHH@Z) referenced in function _wmain f_campionata.obj f_campionata

    2 - Error 8 fatal error LNK1120: 1 unresolved externals


    codice:
    #include "stdafx.h"
    #include <stdio.h>
    #include <cmath>
    
    
    #define N 10
    
    
    float f(float x);
    void f_campionata(int a, int b, int n);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	float a, b;
    	int n;
    
    	printf("Inserisci il valore dell'estremo inferiore(a):\n");
    	scanf("%f", &a);
    
    	printf("Inserisci il valore dell'estremo superiore(b):\n");
    	scanf("%f", &b);
    
    	printf("Inserisci il numero dei punti di griglia(n)-(max 10):\n");
    	scanf("%d", &n);
    
    	/* Richiamo la funzione f_campionata */
    	f_campionata(a, b, n);
    
    
    	return 0;
    }
    
    
    
    /* Funzione stampa 
    void stampa(){
    }
    */
    
    
    /* Funzione f_campionata */
    typedef float (* IntInFloat) (float);
    void f_campionata(int a, int b, int n, IntInFloat funz){
    	float x, passo;
    	float values[N];
    	int i;
    
    	x=a;
    	passo=abs(b-a)/float(n-1);
    
    	for( i=0; i<n; i++ ){
    		values[i]=funz(x);
    		x+=passo;
    	}
    }
    
    
    
    /* Funzione f */
    float f(float x){
    
    	/* Se l'espressione della f è: x^2+x-1 */
    	return (x*x+x-1);
    }
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ho risolto MItaly, solo una cosa volevo sapere, con il:

    typedef float(*IntInFloat)(float), non riesco a capire come fai a puntare direttamente alla funzione: "float f(float x)", e se avessi avuto un'altra funzione di questo tipo: "float f2(float x)?
    Come gestivo il tutto?

    Grazie anticipatamente.
    Con i sogni possiamo conoscere il futuro...

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,302

    Moderazione

    Il linguaggio di programmazione va indicato anche nel titolo, come da Regolamento.

    Tienilo a mente per le future discussioni.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Originariamente inviato da gaten
    Ho risolto MItaly, solo una cosa volevo sapere, con il:

    typedef float(*IntInFloat)(float), non riesco a capire come fai a puntare direttamente alla funzione: "float f(float x)", e se avessi avuto un'altra funzione di questo tipo: "float f2(float x)?
    Come gestivo il tutto?
    Semplicemente passavi f2 come ultimo parametro di f_campionata.

    P.S.: ho chiamato IntInFloat il typedef perché era una funzione che mandava un intero in un float, dato che l'hai cambiata ti suggerirei di rinominarlo come FloatInFloat.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Grazie MItaly, alka scusami, la prossima volta sicuramente specificherò il linguaggio di programmazione utilizzato.

    saluti.
    Con i sogni possiamo conoscere il futuro...

  10. #10
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    MItaly, un'ultimissima cosa. Volevo domandarti una cosa riguardo al tutorial che mi hai inviato:

    codice:
    float (*GetPtr1(const char opCode))(float, float)
    {
    if(opCode == '+')
    return &Plus;
    else
    return &Minus; // default if invalid operator was passed
    }
    
    /*Soluzione usando il costrutto “typedef”.
    typedef float(*pt2Func)(float, float);
    Funzione prende un char e restituisce un puntatore alla funzione che è definita Con la typedef sopra. <opCode> specifica quale funzione per restituire*/
    
    pt2Func GetPtr2(const char opCode)
    {
    if(opCode == '+')
    return &Plus;
    else
    return &Minus; // default if invalid operator was passed
    }
    Quello che non riesco a capire è questo
    codice:
    float (*GetPtr1(const char opCode))(float, float)
    , seguito subito da
    codice:
    typedef float(*pt2Func)(float, float); 
    pt2Func GetPtr2(const char opCode)
    Con i sogni possiamo conoscere il futuro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.