Dubbio su puntatori di funzioni

di Anonimizzato11973 il
8 risposte
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

  • E' l'indicazione di puntatore a funzione che restituisce un int
  • 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 (*) ...
  • 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));
  • 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 ??
  • No, le funzioni sono

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

    I parametri sono sempre puntatori a void.
  • 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!
  • 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.
  • 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