IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Liste chainée problème lors de l'ajout d'un élement


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Liste chainée problème lors de l'ajout d'un élement
    Bonjour a tous et merci d'avance pour l'aide que vous pourrez me donner,
    Ma fonction insert un élement d'une structure fournisseur au bonne emplacement dans la chaine (je la classe d'abord par ville ensuite par les noms);
    Mon problème c'est quand je veux ajouter 1 élément qui porte le même nom que mon 1er élement de ma liste mon programme crach en me disant qu'il y a un problème à cette endroit mais je ne vois pas ou est le problème.
    Si vous pourriez m’éclaircir pcq je ne vois pas trop ou est l'erreur.
    Merci d'avance et au plaisir de vous lire.
    Voila ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    FOURNISSEUR *InsertElemFournisseur(FOURNISSEUR *Fournisseur,FOURNISSEUR *ElemIns) {
    	FOURNISSEUR *ElemCourrant,*ElemPrec;
     
    	ElemPrec = NULL;
    	ElemCourrant = Fournisseur;
    	if (ElemCourrant == NULL || strcmp(ElemCourrant->ville, ElemIns->ville) >=0 ) {
    		if (ElemCourrant != NULL && strcmp(ElemCourrant->ville, ElemIns->ville) == 0) {
    			while (ElemCourrant != NULL && strcmp(ElemCourrant->nomFournisseur, ElemIns->nomFournisseur) < 0 ) {
    				ElemPrec = ElemCourrant;
    				ElemCourrant = ElemCourrant->Next;
    			}
    			ElemPrec->Next = ElemIns;
    			ElemIns->Next = ElemCourrant;
    		}
    		else {
    			ElemIns->Next = ElemCourrant;
    			ElemCourrant = ElemIns;
    		}
     
    	}
    	else {
    		while (ElemCourrant->Next != NULL && strcmp(ElemCourrant->ville,ElemIns->ville) < 0) {
    			ElemPrec = ElemCourrant;
    			ElemCourrant = ElemCourrant->Next;
    		}
    		if (!(strcmp(ElemCourrant->ville, ElemIns->ville))) {
    			while (strcmp(ElemCourrant->nomFournisseur, ElemIns->nomFournisseur) < 0 && ElemCourrant->Next != NULL) {
    				ElemPrec = ElemCourrant;
    				ElemCourrant = ElemCourrant->Next;
    			}
    		}
    		ElemIns->Next = ElemCourrant;
    		ElemCourrant = ElemIns;
    	}
    	return ElemCourrant;
    }

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    As-tu une idée de la ligne qui segfault ? As-tu essayé d'insérer des fprintf(stderr, ...) régulièrement pour situer le crash ?

    Comment sont définis les types en présence ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Pour situer le crash j'ai exécuté au pas à pas. il crashe à ce niveau ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (ElemCourrant != NULL && strcmp(ElemCourrant->ville, ElemIns->ville) == 0) {
    			while (ElemCourrant != NULL && strcmp(ElemCourrant->nomFournisseur, ElemIns->nomFournisseur) < 0 ) {
    				ElemPrec = ElemCourrant;
    				ElemCourrant = ElemCourrant->Next;
    			}
    			ElemPrec->Next = ElemIns;
    			ElemIns->Next = ElemCourrant;
    Voici le message d'erreur:
    Exception thrown: write access violation.
    ElemPrec was nullptr.
    voici la définition de la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct FOURNISSEUR {
    	long idFournisseur;
    	char nomFournisseur[25]; //obligatoire
    	char rue[50];
    	int codePostal;
    	char ville[20];
    	char pays[30]; //pays 
    	char email[50]; // local@domain.tld --> domain alphanum mini local alpha tld 2 -> 5 alpha mini
    	char website[50];// sub.domain.tld --> sub sub alphanum mini domain alphanum mini tld --> 2->5 alpha mini
    	char telephone[12]; // +zz xx xx xx xx
     
    	struct FOURNISSEUR *Next;
    };

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    En effet ce n'est pas étonnant, si le corps de la boucle n'est pas exécuté au moins une fois alors la valeur initiale d'ElemPrec n'est pas modifiée.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    En effet mais je ne vois pas pourquoi le code ne s'exécute pas

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2013
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai su réglé mon problème tout seul j'ai juste supprimer le boucle ou le code crashais et il fonctionne parfaitement et fais ce que je lui demande

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense qu'un code qui fait à la fois la recherche et l'insertion apporte plus de confusion qu'autre chose.
    Tu devrais faire une fonction de recherche qui retourne un pointeur vers le pointeur de l'élément trouvé (ce qui permettrait de le supprimer, d'insérer quelque chose avant, etc.)

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    /* Note: <stdbool.h> existe */
    #include <stdbool.h>
    /*Sinon*/
    typedef enum eBool { false, true } bool;
     
     
    /*
    	Accesseurs const-correct pour FOURNISSEUR::Next 
    */
    FOURNISSEUR* GetSuivant(FOURNISSEUR *pChainon)
    {
    	if(pChainon == NULL) { return NULL; }
    	return pChainon->Next;
    }
    FOURNISSEUR const * GetSuivantC(FOURNISSEUR const *pcChainon)
    {
    	if(pcChainon == NULL) { return NULL; }
    	return pcChainon->Next;
    }
    FOURNISSEUR ** GetPtrSuivant(FOURNISSEUR ** ppChainon)
    {
    	if(ppChainon == NULL) { return NULL; }
    	if(*ppChainon == NULL) { return NULL; }
    	return &(ppChainon[0]->Next);
    }
     
    /*
    	Fonctions de recherche
    */
    typedef bool PREDICAT(intptr_t contexte, FOURNISSEUR const *pcChainon);
     
    FOURNISSEUR const * TrouverC(FOURNISSEUR const * pcPremier, PREDICAT pred, intptr_t contexte)
    {
    	FOURNISSEUR const *pcCourant;
    	if(pcPremier==NULL || pred==NULL) { return NULL; }
     
    	for(pcCourant = pcPremier ; pcCourant != NULL ; pcCourant=GetSuivantC(pcCourant))
    	{
    		if(pred(contexte, pcCourant))
    			return pcCourant;
    	}
    	return NULL;
    }
    FOURNISSEUR * Trouver(FOURNISSEUR * pPremier, PREDICAT pred, intptr_t contexte)
    {
    	return (FOURNISSEUR*)TrouverC(pPremier, pred, contexte); //const_cast
    }
    FOURNISSEUR ** TrouverPtr(FOURNISSEUR ** ppPremier, PREDICAT pred, intptr_t contexte, bool dernierSiPasTrouve)
    {
    	FOURNISSEUR **ppCourant;
    	if(ppPremier==NULL || pred==NULL) { return NULL; }
     
    	for(ppCourant = ppPremier ; ppCourant[0] != NULL ; ppCourant=GetPtrSuivant(ppCourant))
    	{
    		if(pred(contexte, *ppCourant))
    			return ppCourant;
    	}
    	if(dernierSiPasTrouve)
    		return ppCourant; /*Ceci pointe sur le pointeur nul à la fin de la liste*/
    	else
    		return NULL;
    }
     
    /*
    	Fonctions pour ajouter avant le premier fournisseur supérieur
    */
     
    int Comparer(FOURNISSEUR const *pcGauche, FOURNISSEUR const *pcDroite)
    {
    	int ret = strcmp(pcGauche->ville, pcDroite->ville);
    	if(ret != 0) { return ret; }
    	ret = strcmp(pcGauche->nomFournisseur, pcDroite->nomFournisseur);
    	if(ret != 0) { return ret; }
    	return 0;
    }
    bool SuperieurAContexte(intptr_t contexte, FOURNISSEUR const *pcChainon)
    {
    	FOURNISSEUR const * pcReference = (FOURNISSEUR const *)contexte;
    	return Comparer(pcChainon, pcReference) > 0;
    }
     
    void InsererTrie(FOURNISSEUR ** ppPremier, FOURNISSEUR* aInserer)
    {
    	FOURNISSEUR ** ppSuperieur;
     
    	if(ppPremier==NULL || aInserer==NULL) { return };
     
    	/*On cherche le premier fournisseur supérieur à aInserer, ou le pointeur nul final sinon*/
    	ppSuperieur	= TrouverPtr(ppPremier, SuperieurAContexte, (intptr_t)aInserer, true);
     
    	/*On insère juste avant*/
    	aInserer->Next = *ppSuperieur;
    	*ppSuperieur = aInserer;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème lors de l'ajout de logiciels
    Par jamjam19 dans le forum RedHat / CentOS / Fedora
    Réponses: 5
    Dernier message: 21/02/2008, 08h37
  2. Problèmes lors de l'ajout de nouvelles polices windows
    Par spynux dans le forum Windows XP
    Réponses: 9
    Dernier message: 01/08/2007, 22h01
  3. Vider liste chainée, problème
    Par hunter99 dans le forum C
    Réponses: 39
    Dernier message: 28/03/2007, 21h08
  4. Problème lors de l'ajout d'un port
    Par zehle dans le forum VHDL
    Réponses: 1
    Dernier message: 24/05/2006, 21h44
  5. [Client mail] Problème lors de l'ajout des comptes
    Par Leobaillard dans le forum Web & réseau
    Réponses: 9
    Dernier message: 19/11/2005, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo