Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813

    [C] puntatore a funzione

    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
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  2. #2
    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:
    codice:
    #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.
    codice:
    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);
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    813
    azz...hai ragione...come ho fatto a non arrivarci...
    adesso funziona
    Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!

  4. #4
    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
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.