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 :

je me casse la tête sur un pointeur


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 901
    Points
    901
    Par défaut je me casse la tête sur un pointeur
    Bonjour, je résoud une équation où mon inconnue est un vecteur à 26 composantes. A chaque itération, j'écrivais sur le disque dur toutes les composantes de mon vecteur. Maintenant, j'ai fait un petit "module" qui permet de n'écrire que quelques composantes de mon vecteur sur le disque dur (les numéros de ces composantes étant choisies par l'utilisateur). Depuis que j'ai fait ce module, j'ai un segmentation fault à la fin de mon prgm (bien que toutes mes données aient été écrites sur le disque dur) ! Si je fais

    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
    ici il y a le code 
    
    /* destruction de la mémoire */
    DestroyVector(&nbspeprinted);
      DestroyMechanism(&mec);
      DestroyEngine(&e);
      DestroyTemporary(&temp);
      DestroyVector(&esp_EGR);
      DestroyVector(&comp_EGR);
      DestroyIniData(&id);    
      DestroyRandIniCond(&ric);
      DestroyIniMass(&inimass);
      printf("toto\n");
      DestroyDistribution(&d);
      printf("toto\n");
      free(inputfile); inputfile=NULL;
    tout se passe bien, aucune erreur. Si je fais

    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
    ici il y a le code 
    
    /* destruction de la mémoire */
      DestroyMechanism(&mec);
      DestroyEngine(&e);
      DestroyTemporary(&temp);
      DestroyVector(&esp_EGR);
      DestroyVector(&comp_EGR);
      DestroyIniData(&id);    
      DestroyRandIniCond(&ric);
      DestroyIniMass(&inimass);
      printf("toto\n");
      DestroyDistribution(&d);
      printf("toto\n");
      free(inputfile); inputfile=NULL;
    DestroyVector(&nbspeprinted);
    ma sortie est

    toto
    Erreur de segmentation
    et si je fais

    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
    ici il y a le code 
    
    /* destruction de la mémoire */
      DestroyMechanism(&mec);
      DestroyEngine(&e);
      DestroyTemporary(&temp);
      DestroyVector(&esp_EGR);
      DestroyVector(&comp_EGR);
      DestroyIniData(&id);    
      DestroyRandIniCond(&ric);
      DestroyIniMass(&inimass);
    DestroyVector(&nbspeprinted);
      printf("toto\n");
      DestroyDistribution(&d);
      printf("toto\n");
      free(inputfile); inputfile=NULL;
    ma sortie est

    toto
    *** glibc detected *** double free or corruption (fasttop): 0x000000000059d800 ***
    Abandon
    et là où je suis trop énervé, c'est que ma version multi-thread marche très bien. En revanche, ma version séquentielle plante ! D'où pourrait provenir l'erreur ?

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    C'est pas parce que ça plante pas que ya pas d'erreur..
    En clair, quelle que soit la position de ton instruction en rouge, il ya peut etre un probleme

  3. #3
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut
    Dans un module, je pense qu'on fait pas les noms des variables, seulement leurs type.
    En plus il ne faut pas oublier de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef _NOMduMODULE_H_
    #define
     
    // Declaration de tes fonctions
     
    #endif
    Enfin, o un besoin de plus de code pour detecter l'erreur!!!

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Comportement indéfini (et un beau en plus )

    Comme te l'indique gentillement la glic soit tu libère deux fois un même bloc mémoire (tu mets bien le pointeur à NULL après un appel à free ?) soit tu écris en dehors de la zone allouée.

    Tu peux utiliser des outils tel que valgrind ou un p'tit gestionnaire de mémoire perso (http://www.developpez.net/forums/sho...d.php?t=164884) pour trouver d'où vient le problème

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 901
    Points
    901
    Par défaut
    Bonjour,
    oui, c'est clair que j'ai un comportement indéfini et qu'il y a donc un pb dans mon code.

    ccensam : je fais bien ce que tu m'as indiqué.

    Etant donné que je ne sais même pas d'où provient mon erreur, j'ai un peu de mal à vous envoyer du code. Je vais continuer à chercher...

Discussions similaires

  1. fonction casse-tête sur une date
    Par clavier12AZQSWX dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/06/2009, 12h36
  2. Requête casse tête sur anniversaire
    Par fardon57 dans le forum SQL
    Réponses: 3
    Dernier message: 14/01/2009, 17h53
  3. Casse tête sur du friend avec de l'héritage
    Par Drannor dans le forum C++
    Réponses: 4
    Dernier message: 03/10/2007, 23h20
  4. casse-tête sur date/calendrier
    Par SheikYerbouti dans le forum SQL
    Réponses: 21
    Dernier message: 23/08/2007, 18h56
  5. casse-tête sur les adresses (classe C et A)
    Par HuZimA dans le forum Protocoles
    Réponses: 7
    Dernier message: 27/07/2006, 14h05

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