begin process at 2012 05 29 20:21:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Probleme avec qsort


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme avec qsort

samedi 11 mars 2006 à 17:11:51 | Probleme avec qsort

Noxk

Membre Club
bonjour,

voila j'ai un probleme avec qsort j'esssaie de faire un tri sur un tableau de structure mais j'obtiens une erreur d'acces violation, apparemment j'oublie une chose quelque part mais je ne vois pas ou. Voila mon code :

struct ESSAI
{
    char car;
    int     Nb1;
    int     Nb2;
    char *alpha;
};

int compare (const void *a, const void *b)
{
  return _stricmp( *((char**)((ESSAI*) a)->alpha),  *((char**)((ESSAI*) b)->alpha) );
}

#define SIZE 100000
void main ()
{
    ESSAI *Array[SIZE];
    int i, j;
    int nb, len;
    char car;
    char Line[60];

    for (i=0; i<SIZE; i++)
    {
        Array1[i] = new ESSAI;
    }

srand((unsigned) time(NULL));

    for (i=0; i<SIZE; i++)
    {
        memset(Line, 0, sizeof(char) * 60);
        for (j=0; j<15; j++)
        {
            nb = rand() % 2;
            if (nb)
            {
                nb = rand() % 26;
                nb += 65;           
                Line[j] = (char) nb;
            }
            else
            {
                nb = rand() % 26;
                nb += 97;           
                Line[j] = (char) nb;
            }
        }
        len = strlen(Line)+1;
        Array[i]->alpha = new char[len];
        strcpy(Array[i]->alpha, Line);
    }

qsort(*Array, SIZE, sizeof(ESSAI*), compare);

}
dimanche 12 mars 2006 à 11:14:17 | Re : Probleme avec qsort

Gendal67

Salut,

Peut-etre est-ce que cela vient du fait que tu veux instancier 100.000 objets ESSAI ? Vérifie que le new alloue bel et bien de la mémoire à chacun de tes objets. (de plus Array1 n'est pas défini )


Dans ta fonction compare, il y a quelque chose que je ne saisis pas.
a->alpha est déja un char*...alors pourquoi le casté en char** (au lieu de faire '&') ? Puis de tout façon, tu mets un * devant le tout, alors je ne comprend pas l'interet de caster juste avant!
Pourquoi ne pas écrire ça comme ça ?

int compare (const void *a, const void *b)
{
  return _stricmp( ((ESSAI*) a)->alpha),  ((ESSAI*) b)->alpha) );
}

Prototype de la fonction qsort (stdlib.h) :

void qsort( void * tab, size_t nt, size_t taille, int (*fcmp)(const void *px1, const void *px2));

L'erreur vient peut-etre d'ici...toi tu passes en premier argument '*Array'. Or Array est un ESSAI*. En plus, la taille totale du tableau n'est pas égale à ESSAI* !! Try ceci et tient moi au courant :

qsort((void*) Array, SIZE, SIZE * sizeof(ESSAI), (fcpm) compare);

dimanche 12 mars 2006 à 15:50:21 | Re : Probleme avec qsort

aardman

Membre Club
Réponse acceptée !
Salut,
La callback compare prend en parametre des pointeurs sur les elements du tableau, ces element sont eux meme des pointeurs, donc au finale a et b sont en fait des ESSAI**.
Par exemple:
int compare (const void *a, const void *b)
{
   ESSAI* one = *(ESSAI**)a;
   ESSAI* two = *(ESSAI**)b;
   return _stricmp(one->alpha, two->alpha);
}

Ensuite pour l'appel de la fonction qsort, le troisieme param est bien la taille d'un element du tableau, soit sizeof(ESSAI*):
qsort(Array, SIZE, sizeof(ESSAI*), compare);


dimanche 12 mars 2006 à 17:15:52 | Re : Probleme avec qsort

Noxk

Membre Club
Salut,

merci pour cette solution, je m'etais un peu melanger dans les pointeurs.
dimanche 12 mars 2006 à 17:22:57 | Re : Probleme avec qsort

Gendal67

Salut,

Ben merci Aardman pour cette explication  ! Pour le ESSAI** j'ai parlé trop vite...j'aurais trouvé ça en parlant moi vite et en réfléchissant avant
Pour qsort() je ne l'ai jamais utilisé, j'ai juste vu sur un site que le troisieme paramètre était "size_t taille"; donc j'en ai conclu (trop rapidement) que c'était la taille du tableau entier.
Hmmm...enfait je suis stupide, c'est logique même que ce soit la taille d'un seul élément...ça permet à la fonction de traiter le pointeur Array correctement afon de bien donner à la fonction compare() des void* de la taille de ESSAI*... j'étais fatigué avant moi, je suis excusable, non?



Cette discussion est classée dans : int, essai, char, nb, line


Répondre à ce message

Sujets en rapport avec ce message

Fatal signal: Segmentation Fault (SDL Parachute Deployed) [ par broks ] Je ne comprends vraiment pas pourkoa ca ne marche pas...C'est surement un probleme au niveau de la fonction saisi puisque je plante lorsque je dois sa addition en binaire [ par jejedi ] bonsoir , je dois faire un petit prog qui additione 2 nombres binaire. Le probleme c' est que mes 2 nombres étant des chaines de caractére ca me renv plantage inexpliqué [ par graall ] bonjour, j'ai un problème avec ce code :     getch();     FILE *pHtml;     int nb_char = 0;     bool sortie = false; [help me!] - probleme cryptage simple de fichier [ par darthnexus ] Salut à tous!Je vous explique mon problème: j'ai commencé une petit programme de cryptage tout simple (je débute...) seulement voila cela fonctionne n Problème d allocation dynamique [ par Beqtb0x ] /*Bonjour a tous, je viens d'arriver sur ce site, je suis étudiant en première année d'informatique et j'ai un problème a un tp que même la prof n'est jeu d'echec C++ [ par CKBT ] bonjour, Je débute en programmation C++, je dois réaliser un pseudo jeu d'echec. Mais j'ai un soucis au niveau de l'echiquier. Je veux utiliser un tab PUISSANCE 4 C++ [ par AlenDjavo ] salut tout le monde je suis bloque dans mon pussance 4 je n`arive pas a afficher mon tableu quelquen peux me aider svp dsl pour le fautes. problème avec une fonction mélanger mot [ par lewan ] bonjour, voilà j'ai écris une fonction me permettant de mélanger un mot!! Dans un premier temps je crée un dictionnaire de mot aléatoire et dans un s exercice d'algo [ par Mjblue ] int chainehsrd( int i; int N; char Mot=''; char Mot[255]; int E=97; char L=(char)E) { for (i=0; i< char Mot[255]-1; i++)


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales