Triage simultané

Résolu
Signaler
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010
-
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010
-
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).

Quelqu'un peut m'indiquer d'où vient l'erreur ?

Saros

3 réponses

Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
124
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

Problème résolu,

Pour une raison obscure, le problème a l'air de provenir de la définition qu'on utiliser de Q.

Lorsqu'on écrit :
int* Q[100];

puis

for(int i=0 ; i<100 ; i++){
Q[i] = (int*)malloc(3*sizeof(int));
}

le reste du code fonctionne bien.
Si quelqu'un a une idée de l'origine exacte du souci, je suis preneur :)
Merci.

Saros
Messages postés
921
Date d'inscription
vendredi 20 décembre 2002
Statut
Membre
Dernière intervention
23 septembre 2010

Okay. Ça explique les quelques tests que j'avais fait en débuggant
Les dessins sont clairs (pour moi en tout cas)
Merci beaucoup pour ta réponse :)

Saros