PDA

Visualizza la versione completa : [C] puntatore a funzione


Hysoka
19-04-2010, 23:40
ciao a tutti,
il puntatore a funzione, essendo un puntatore, messo come parametro di una funzione, non dovrebbe essere un passaggio per riferimento? Mi spiego meglio. Ho questa funzione:

QSpline* qspline(double *x, double *y,int n,double(*eval)(void*,double))

nella quale all'interno faccio
eval = QSplineEval;

la funzione che chiama qspline e passa questi parametri
qspline(X,Y,punti,mia_eval);

mia_eval non dovrebbe avere l'indirizzo della funzione QSplineEval? Perché non mi funziona? Ho fatto il debbuging con gdb e ottengo 2 indirizzi di memoria diversi.

Spero di esser stato chiaro
vi auguro una buona serata

MItaly
19-04-2010, 23:56
Esattamente come qualunque altro puntatore, se modifichi la variabile puntatore direttamente non fai che cambiare oggetto a cui la tua variabile-puntatore locale punta. Mi spiego meglio:


#include <stdio.h>

void Test1(int * Ptr)
{
int mioIntero=20;
Ptr=&mioIntero;
/* ho semplicemente cambiato l'oggetto a cui punta Ptr,
che, essendo di fatto una variabile locale, non influenza la variabile dal main */
printf("%d", *Ptr); /* 20 */
}

void Test2(int * Ptr)
{
*Ptr=30;
/* qui ho effettivamente cambiato il valore nel main, visto che ho modificato
la variabile a cui Ptr punta */
printf("%d", *Ptr); /* 30 */
}

int main(void)
{
int intero=10;
printf("%d\n", intero); /* 10 */
Test1(&intero);
printf("%d\n", intero); /* 10 */
Test2(&intero);
printf("%d\n", intero); /* 30 */
return 0;
}

In sostanza, quindi, se vuoi modificare ciò a cui punta la tua variabile contenuta nel chiamante (che già come tipo di base è un puntatore) la dovrai passare per puntatore, di conseguenza passerai un doppio puntatore a funzione.


QSpline* qspline(double *x, double *y,int n,double(**eval)(void*,double))
{
/* ... */
}

/* ... */

double (*eval)(void *, double) miaEval;
QSpline * ret;
ret = qspline(&X, &Y, n, &miaEval);

Hysoka
20-04-2010, 00:03
azz...hai ragione...come ho fatto a non arrivarci...
adesso funziona :smack:

MItaly
20-04-2010, 00:05
Originariamente inviato da Hysoka
azz...hai ragione...come ho fatto a non arrivarci...
Niente di male, i puntatori a funzione confondono tutti, visto anche che la loro sintassi in C è particolarmente odiosa.


adesso funziona :smack:
:ciauz:

Loading