Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature may not be available in some browsers.
#include <stdio.h>
#include <stdlib.h>
int values[] = { 88, 56, 100, 2, 25 };
int cmpfunc (const void * a, const void * b) {
return ( *(int*)a - *(int*)b );
}
int main () {
int n;
printf("Before sorting the list is: \n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}
qsort(values, 5, sizeof(int), cmpfunc);
printf("\nAfter sorting the list is: \n");
for( n = 0 ; n < 5; n++ ) {
printf("%d ", values[n]);
}
return(0);
}
#include <stdio.h>
int values[] = { 88, 56, 100, 2, 25 };
void cmpfunc (int a) {
printf("The number is %d", a);
}
void invoca_func(int b, void (*f)(int)) {
f(b);
}
int main () {
invoca_func(5, cmpfunc);
return(0);
}
invoca_func
prende come argomento un intero e una funzione, e poi chiama la funzione che ha ricevuto come argomento. Sono pienamente d'accordo.Quindi la funzioneinvoca_func
prende come argomento un intero e una funzione, e poi chiama la funzione che ha ricevuto come argomento.
Nel caso che ti ho scritto io, si, ha come unico argomentoSono pienamente d'accordo.
Una volta che cmpfunc() viene invocata , dalla sua dichiarazione, questa ha come unico parametro d' ingresso int a, giusto?
Ma int a qual'e ?
grazie
a
.invoca_func
come b
: infatti f(b);
significa "prendi la funzione che ti viene passata come argomento, e invocala con l'argomento b
, che anche lui ti viene passato come argomento".invoca_func(5, cmpfunc);
, nella funzione invoca_func
f(b);
significa cmpfunc(5);
(b -> 5, f -> cmpfunc)#include <stdio.h>
int somma(int,int);
int main(){
int a=2;
int b=2;
int d;
d=somma(a,b);
printf("il risultato è %d",d);
return 0;
}
int somma(int a, int b){
int c;
c=a+b;
return c;
}
qsort
, tu non vuoi passare il risultato di un'invocazione di una funzione, ma il riferimento alla funzione, cosi qsort
può usarla come preferisce.Le funzioni non vengono chiamate! Questo è il punto fondamentale!quando vengono chiamate le funzioni cmpfunc e cmpfunc
qsort
.Allora se non il risultato che cosa? ok ,ma il riferimento alla funzione , cosi la funzione chiamante puo farci quello che vuole. Ma una funzione chiamante di che cosa avrebbe bisogno di una funzione chiamata se non il suo risultato d'uscita?non riesco a capire!tu non vuoi passare il risultato di un'invocazione di una funzione, ma il riferimento alla funzione, cosiqsort
può usarla come preferisce.
qsort
: essa prende un'array come argomento, e lo riordina dall'elemento più piccolo al più grande.struct point {
int x;
int y;
};
qsort
a sapere quale elemento viene prima e quale dopo? Non può! E qua entra in gioco la nostra funzione: noi forniamo a qsort
la funzione cmpfunc
. Ogni volta che qsort
dovrà comparare due elementi, invocherà la funzione cmpfunc
, che dirà quale dei due valori è più grande (o se sono uguali).cmpfunc
con degli argomenti quando la passi, passeresti il valore di ritorno, per esempio qsort(values, 5, sizeof(int), cmpfunc(1, 1));
equivale a qsort(values, 5, sizeof(int), 0);
.qsort
di un argomento che vale 0?che dirà quale dei due valori è più grande (o se sono ugual
Esattamente. Quindi torniamo al punto iniziale: tu non invochiQuale dei due è il più grande non è mica il risultato della funzione cmpfunc?
cmpfunc
, tu passi una referenza ad essa a qsort
.qsort
la invoca tutte le volte che deve fare una comparazione per capire quale elemento è più grande.int cmpfunc (const void * a, const void * b) {
printf("Comparo %d e %d\n", *(int*)a, *(int*)b);
return ( *(int*)a - *(int*)b );
}
Before sorting the list is:
88 56 100 2 25 Comparo 88 e 56
Comparo 2 e 25
Comparo 100 e 2
Comparo 100 e 25
Comparo 56 e 2
Comparo 56 e 25
Comparo 56 e 100
Comparo 88 e 100
After sorting the list is:
2 25 56 88 100 %
qsort
segue l'algoritmo QuickSort, e quindi deve comparare certi elementi in un certo ordine. cmpfunc
passandogli l'elemento 0 e l'elemento 1 dell'array. if ((*cmp) ((void *) mid, (void *) lo, arg) < 0)
SWAP (mid, lo, size);
cmp
), con il valore di mezzo dell'array (mid
) e con il primo elemento dell'array (lo
).mid
< lo
, allora fa lo swap dei due elementi.typedef int (__cdecl* _CoreCrtNonSecureSearchSortCompareFunction)(void const*, void const*);
_ACRTIMP void __cdecl qsort(
_Inout_updates_bytes_(_NumOfElements * _SizeOfElements) void* _Base,
_In_ size_t _NumOfElements,
_In_ size_t _SizeOfElements,
_In_ _CoreCrtNonSecureSearchSortCompareFunction _CompareFunction
);