Triage simultané

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

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

Saros

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
23 sept. 2010 à 15:54
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
0
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
23 sept. 2010 à 18:49
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
0
Rejoignez-nous