Dubbio su puntatori di funzioni

di il
8 risposte

Dubbio su puntatori di funzioni

Ciao,
in un codice sul testo accademico ho questa chiamata:

qsort((void**)lineprt,0,nlines-1,(int(*)(void*,void*))(numeric ? numcmp : strcmp));

quello che non mi e' chiaro e' quell int(*) senza alcun nome vicino , mi sarei aspettato

qsort((void**)lineprt,0,nlines-1,(int((numeric ? numcmp : strcmp))(void*,void*)));

anzi dovrei passare direttamente solo la funzione scelta tra numcmp e strcmp

qsort((void**)lineprt,0,nlines-1,((numeric ? numcmp : strcmp));


avete dritte in merito?

grazie

8 Risposte

  • Re: Dubbio su puntatori di funzioni

    E' l'indicazione di puntatore a funzione che restituisce un int
  • Re: Dubbio su puntatori di funzioni

    Ma come mai non c'e' nessun nome attaccato all asterisco? dico perche' non e'

    qsort((void**)lineprt,0,nlines-1,(int(*funzione)(void*,void*))(numeric ? numcmp : strcmp));

    il testo fa pure un esempio prima

    int *f() /* f: funzione che restituisce un puntatore a un intero*/ OK ci siamo

    int (*pf) /*pf: puntatore a una funzione che restituisce un intero */ OK ci siamo

    quindi nel caso in esame mi aspettavo qualcosa simile al int (*pf) invece ho int (*) ...
  • Re: Dubbio su puntatori di funzioni

    Quella notazione è un cast non una dichiarazione.

    Se le funzioni sono correttamente impostate puoi anche scrivere

    qsort((void**)lineprt, 0, nlines-1, (numeric ? numcmp : strcmp));
  • Re: Dubbio su puntatori di funzioni

    Adesso ha un senso! grazie!

    un altra domanda collegata ... parto da quanto srcitto da te

    qsort((void**)lineprt, 0, nlines-1, (numeric ? numcmp : strcmp));

    numcmp e strcmp sono due funzioni definite come

    int numcmp (char *, char *);
    int strcmp (char *, char *);

    a questo punto mi chiedo quando a qsort viene passata numcmp o strcmp, a queste ultime che viene passato come parametri ??
  • Re: Dubbio su puntatori di funzioni

    No, le funzioni sono

    int numcmp (const void *, const void *);
    int strcmp (const void *, const void *);

    I parametri sono sempre puntatori a void.
  • Re: Dubbio su puntatori di funzioni

    Ok.. infatti questo è un esempio preso dal testo ed in effetti in una nota corregge come hai appena scritto anche se aggiunge che dovrebbe comunque funzionare.

    al di là di questo però come hai detto I parametri sono sempre puntatori a void. ma che valori prendono?

    facciamo che sono puntatori a char , dov è che gli passo il puntatore se in sqrt le funzioni strcmp e numcmp vengono scritte senza le parentesi e quindi senza i loro argomenti?

    è questo che non mi spiego....

    dovrebbe essere ina cosa del genere (riporto un altro esempio piu facile)

    #include <stdio.h>
    int foo(int a, int b) {
    return a+b;
    }
    int main() {
    int a=2,b=3;
    int (*ptr)(int, int) = foo;
    printf ("foo si trova all'indirizzo 0x%.8x\n",ptr);
    printf ("%d+%d=%d\n",a,b,(*ptr)(a,b));
    return 0;
    }


    quando richiamo il puntatore alla funzione gli passo anche a e b che sono i parametri appunto da passare alla funzione!
  • Re: Dubbio su puntatori di funzioni

    La qsort accetta solamente l'indirizzo di una funzione (che restituisce un int e che accetta quei due parametri).

    La qsort accetta anche il puntatore al vettore degli elementi da ordinare. Internamente la qsort chiamerà ripetutamente la funzione di cui hai passato l'indirizzo passando due puntatori ai due elementi da confrontare. I parametri sono quindi passati dalla qsort quando questa richiamerà la funzione di comparazione.
  • Re: Dubbio su puntatori di funzioni

    Adesso che me lo hai spiegato ho capito che era scritto in altri termini anche sul testo! sei stato chiarissimo!

    grazie mille!
Devi accedere o registrarti per scrivere nel forum
8 risposte