Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010
-
23 sept. 2010 à 15:00
Saros
Messages postés921Date d'inscriptionvendredi 20 décembre 2002StatutMembreDernière intervention23 septembre 2010
-
23 sept. 2010 à 18:49
Bonjour,
J'essaie de trier deux tableaux simultanément, ie. j'ai envie que les opérations faites sur l'un soient faites sur l'autre aussi. Un équivalent de multisort en php.
Je veux passer par la fonction qsort.
Le format de base est un tableau à deux entrées :
int Q[100][2];
la syntaxe pour appeler qsort que j'utilise est :
qsort(Q, 100, sizeof(int*), comp);
Mais j'ai un souci avec la fonction de comparaison. J'ai abouti au code suivant :
int comp(const void* a, const void* b){
int* ia = *((int**) a);
int* ib = *((int**) b);
return ia[0] - ib[0];
}
qui compile, mais génère un segfault.
Mon raisonnement est que vu que les valeurs du tableaux (qui sont des int*) sont transmis via leur adresse, il faut les typecaster en int**, puis récupérer leur valeur par déférencement. D'où le *((int**) x).
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 23 sept. 2010 à 18:12
Tu ne peux pas caster un [][] en un **.
Ce n'est pas la même chose, et c'est donc normal que ça plante.
En revanche, un []* et un ** sont compatibles. C'est pour cela que ton 2eme code fonctionne.
[][] implique que les données sont contigües, tandis qu'avec un **, les données sont éparpillés.
Ex:
tab[2][3] donnera graphiquement:
[0,0,0,......] (données dans ta RAM)
[0,0,0][0,0,0]
[0,0,0,......] (données dans ta RAM)
et
tab** (avec une allocation de 2,3) donnera graphiquement:
[.] =----->[0,0,0]
[.] =+.....[0,0,0,... (données dans ta RAM)
.....|.....[0,0,0,... (données dans ta RAM)
.....+---->[0,0,0]
Je ne sais pas si mes dessins sont très clairs, mais c'est la raison.
(Pour ceux qui vont critiquer mes dessins, oui j'ai vulgarisé, c'est pas tout à fait juste).
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question