begin process at 2012 05 29 16:08:28
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

plantage avec free( ) !!!


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

plantage avec free( ) !!!

vendredi 28 juillet 2006 à 12:17:11 | plantage avec free( ) !!!

ElectricalMan

slt tt le monde,
j'ai un beau plantage avec la fonction free
donc si qq peut m'aider pck je tourne en rond.
j'ai mis en bleu les parties concernées. et mon pb c que ça plante qd je fais :  free(Element)  ?!!


int main(int argc, char *argv[])
{
...................
char 
*Element=NULL;   

 
 // ----------- Initialisations ----------------
 const char *chemin = "c:\\user\.....\";
 sprintf(input, "%sTE\\data.dat", chemin);

 fic = fopen(input,"r"); // ouverture du fichier input en mode lecture
 if(fic == NULL)  exit(0); 

....................

 // ----------------------------------------------------------------------
 
 // ----------- Lecture des paramètres du fichier "fic" ----------------
 rewind(fic); // repositionner le curseur au début de "fic"

 while( fgets(coupleEtatsCapteurs, tailleStr, fic) != NULL ) 
{ // On lit fic (ligne par ligne) tant qu'on ne reçoit pas d'erreur (NULL)
  
     if( strcmp(coupleEtatsCapteurs, "\n") )
     { // Si ligne non vide

        .....................    
      
         for(i=0; cpsEtats[i]; i++) 
         { 
    
            ................................

           // Calculer le nbre max de caractère pour les val d'un même état
          j = 0; TailleEtat=0; // réinitialisation
          while(cpsMemeEtat[j])
          {
              if ( strlen(cpsMemeEtat[j]) > TailleEtat )
               
TailleEtat = strlen(cpsMemeEtat[j]) ; 
              j++; 
          }; 
    
           // Après avoir calculé TailleEtat, on Alloue  Element 
          if(i==0 && premiereLigne)   // 1er passage
             if ( (Element = malloc(TailleEtat * sizeof(char))) == NULL )
               exit(0); 
          else      // autres passages
              if ( (Element = realloc(Element, TailleEtat * sizeof(char))) == NULL )
               exit(0); 

        
          //--------------- Création des tableaux ---------------------------------
          Tabs[i].Dim = nbrValsParEtat ;  // MAXRAND = nbrValsParEtat 
          if ( (Tabs[i].Tab = (char **) malloc (sizeof(char *)*Tabs[i].Dim)) == NULL)
           exit(0);
      
          for (IdxEle=0; IdxEle < Tabs[i].Dim; IdxEle++) // = for(j=0; cpsMemeEtat[j]; j++) 
          {
           if( (Tabs[i].Tab[IdxEle] = (char *) malloc (sizeof(char)*TailleEtat)) == NULL )
            exit(0);
           else
           {
            sprintf (Element, "%s", cpsMemeEtat[IdxEle]); 
            strcpy (Tabs[i].Tab[IdxEle], Element);
           }
         } 
 
       // free(Element );   avant que je mette realloc,  mais ça plantait aussi  !!!!!

   }// fin de : for(i=0; cpsEtats[i]; i++)

   //-------------- Afficher les tableaux : ---------------------------------

   ...................................



   free(cpsEtats);  // important : libérer
   free(cpsMemeEtat);
   free(cpsCapteurs);
   free(cpsCouple);
   free(Tabs);
   free(Index);
         
  }// fin de : if( strcmp(coupleEtatsCapteurs, "\n") )

  premiereLigne = 0; // fin de la 1ere ligne

 }// fin de : while( fgets(coupleEtatsCapteurs, tailleStr, fic) != NULL ) 
 
 // ----------------------------------------------------------------------

 getchar();
 
free(Element);  // ça plante   !!!!!!!!

 fclose(fic);
 
}

 

vendredi 28 juillet 2006 à 13:06:07 | Re : plantage avec free( ) !!!

vinc1008881

je crois que il y a une erreur là

 if(i==0 && premiereLigne)   // 1er passage
 if ( (Element = malloc(TailleEtat * sizeof(char))) == NULL )
 exit(0); //OK
 else      // autres passages
 if ( (Element = realloc(Element, TailleEtat * sizeof(char))) == NULL )
 exit(0); //ERREUR PAS DE REALLOC PUISQUE Element n'a jamais été alloue (bloc precedent non executé)

d'ou Element contient une valeur erroné d'ou free cause une segment fault
vendredi 28 juillet 2006 à 13:19:32 | Re : plantage avec free( ) !!!

ElectricalMan

excuse moi je l'avais enlevé ; au début j'initialise ( premiereLigne = 1 )
donc la 1ere fois ça rentre bien dans  if(i==0 && premiereLigne)

mais avant j'avais testé sans le realloc. comme c une boucle (for)  j'allouer Element  puis à la fin de la boucle de faisias free, et rebelote pour les autres itérations. mais ça ne marchais pas auss !
donc je sais pas si ça pose pb d'Allouer dans une boucle ?!!!

vendredi 28 juillet 2006 à 13:23:14 | Re : plantage avec free( ) !!!

vinc1008881

non il n'y a pas de probleme je crois, envoye le code en entier je vais le compiler.
vendredi 28 juillet 2006 à 13:42:34 | Re : plantage avec free( ) !!!

ElectricalMan

 peux tu me donner ton email, comme ça je t'envoie les fichiers...

vendredi 28 juillet 2006 à 13:56:16 | Re : plantage avec free( ) !!!

ElectricalMan

 c pas la peine, j'ai rassemblé le code. mais avant tu doit créer un fichier text (input.txt) dont voici le contenu :

P1on/B_P1,P2off/B_P2,COU_CAB0,TF/B_TF,CF/B_CF,FR/B_FR,V/B_V CTT,CCVD,CCVG,!CTO,CTFG,CTVD,CTVG,!CCTO,!CCADD,!CCADG,CCARD,CCARG

P1on/B_P1,P2off/B_P2,COU_CAB0,TF/B_TF,CF/B_CF,FR/B_FR,V/B_V CTT,CCVD,CCVG,!CTO,CTFG,CTVD,CTVG,!CCTO,!CCADD,!CCADG,CCARD,CCARG

P1on/B_P1,P2off/B_P2,COU_CAB0,TF/B_TF,CF/B_CF,FR/B_FR,V/B_V CTT,CCVD,CCVG,!CTO,CTFG,CTVD,CTVG,!CCTO,!CCADD,!CCADG,CCARD,CCARG


maintenant le code ; ( n'oublie de mettre ton path ! au début de main() )


/*
main.c
-----------


Première modification : 19/07/06
Dernière modification : 27/07/06

Description : Modification du fichier input.txt (carte capteurs)

*/


#include <stdio.h> // directives de préprocesseur
#include <stdlib.h>
#include <string.h>


typedef struct
{
    long Dim; // Taille du tableau
    char **Tab; // Tableau de chaines ("Sol1-1", "Sol1-2"..)
} _Tabs, *_pTabs;


//-----------------------------------------------------------------
// Extraction des mots d'une ligne à partir d'un séparateur
//-----------------------------------------------------------------
char** split( char* str, const char* separateur)
{
size_t sizeSeparateur = strlen( separateur );
char** currentSplit  = 0;
size_t nbSep = 0, sizeSplit = 0, currentSep = 0;
char* pos = str, *currentPos = str;

 
  // Compte le nombre séparateur, et le séparateur par des '\0'
    while( pos = strstr( pos, separateur ) )
 {
        memset( pos, '\0', sizeSeparateur );
       
        ++nbSep;
        currentPos = (pos += sizeSeparateur);
    }
   

  // Calcul la taille du tableau final
    sizeSplit = nbSep+1 ; 
    if ( !sizeSplit )
  return 0;
   
  // Alloue le tableau des pointeurs
    currentSplit = malloc( (sizeSplit+1) * sizeof(char*) );
    if ( !currentSplit )
  return 0;

 currentSplit[sizeSplit] = 0; // ça permettra après (ds main.c) de faire le test: for(i=0;tab[i];i++)

   
  // Affecte les entrées du tableau
    pos = str;
    while( currentSep < sizeSplit )
 {
        currentSplit[currentSep++] = pos;

        while( *pos++ );
        pos += sizeSeparateur - 1;
    }

 return currentSplit;
}

//-----------------------------------------------------------------
// Afficher les sol
//-----------------------------------------------------------------
void AfficherSol(_pTabs Tabs, long Index[], long Niveau, long MAXTAB, long *pNbrSol)
{
long IdxEle, Idx;
static long nbrSol=0;

    if ( Niveau == MAXTAB )
 {
  (*pNbrSol)++;
  
        for (Idx=0; Idx < MAXTAB; Idx++)
  { 
            if(Idx != MAXTAB-1)
    printf ("%s,", Tabs[Idx].Tab[Index[Idx]]);
   else
    printf ("%s", Tabs[Idx].Tab[Index[Idx]]);
  }
        puts("");
       
  return; // retourner à l'appel de fonction (en bas ; ***)
    }
 
    for (IdxEle=0; IdxEle < (*(Tabs+Niveau)).Dim; IdxEle++ )
 {
        Index[Niveau] = IdxEle;
  
        AfficherSol (Tabs, Index, Niveau+1, MAXTAB, pNbrSol); // ***
    }
}

 

 

int main(int argc, char *argv[])
{
char input[255];
FILE *fic=NULL;
long i, j, nbrCouples=0, tailleStr=255, nbrEtats=0, nbrValsParEtat=0, TailleEtat, IdxEle, nbr2Sol=0;
int  premiereLigne=1;
char *coupleEtatsCapteurs=NULL, *Element=NULL;
char **cpsCouple=NULL, **cpsEtats=NULL, **cpsCapteurs=NULL, **cpsMemeEtat=NULL;

_pTabs Tabs=NULL;  // au lieu de : "_Tabs Tabs[MAXTAB];"
long *Index=NULL; // au lieu de : "SubTab Index;"  équivalent à : "long Index[MAXTAB]"

// pour info : MAXTAB=nbrEtats  & MAXRAND=nbrValsParEtat


 
 // ----------- Initialisations ----------------

 const char *chemin = "c:\\................................\\";   // n'oublie de mettre ton path !
 sprintf(input, "%sinput.txt", chemin);

  
 fic = fopen(input,"r"); // ouverture du fichier input en mode lecture
 if(fic == NULL)
  exit(0);

 coupleEtatsCapteurs = malloc( (tailleStr) * sizeof(*coupleEtatsCapteurs) ); // sizeof(char)
 if (coupleEtatsCapteurs == NULL) // Si l'allocation a échoué
  exit(0);

 // ----------------------------------------------------------------------
 

 
 // ----------- Lecture des paramètres du fichier "fic" ----------------

 rewind(fic); // repositionner le curseur au début de "fic"
 nbrCouples = 0; // Réinitialisation ( au cas où ! )

 while( fgets(coupleEtatsCapteurs, tailleStr, fic) != NULL ) 
 { // On lit fic (ligne par ligne) tant qu'on ne reçoit pas d'erreur (NULL)
  
  if( strcmp(coupleEtatsCapteurs, "\n") )
  { // Si ligne non vide

    // Virer l'\n à la fin (de la ligne lue)
   coupleEtatsCapteurs[strlen(coupleEtatsCapteurs) - 1] = '\0'; 

    // Séparer les couples Etats/Capteurs en 2 chaines :
     // l'ensemble des états et l'ensemble des valeurs capteurs
   cpsCouple = split(coupleEtatsCapteurs, "\t"); 
 
    // Extraire les différents états d'un couple
   cpsEtats = split(cpsCouple[0], ",");
   
    // Calculer la taille du tableau : cpsEtats
   nbrEtats = 0; // réinitialisation
   while(cpsEtats[nbrEtats++]); 
   nbrEtats--; // ne pas oublier de retrancher le dernier

    // Après avoir calculé nbrEtats (MAXTAB), on Alloue 
   if ( (Tabs = malloc(nbrEtats * sizeof(_Tabs))) == NULL)
    exit(0);
         
   for(i=0; cpsEtats[i]; i++)
   { // Traiter les "nbrEtats" Etats d'un couple (ligne de fic)
    
     // Extraire les différentes vals d'un même état
    cpsMemeEtat = split(cpsEtats[i], "/");
    for(j=0; cpsMemeEtat[j]; j++)
     printf("%ld : %s\n", j, cpsMemeEtat[j]);   
    
     // Calculer la taille du tableau : cpsMemeEtat
    nbrValsParEtat = 0; // réinitialisation
    while(cpsMemeEtat[nbrValsParEtat++]); 
    nbrValsParEtat--; // ne pas oublier de retrancher le dernier 

     // Calculer le nbre max de caractère pour les val d'un même état
    j = 0; TailleEtat=0; // réinitialisation
    while(cpsMemeEtat[j])
    {
     if ( strlen(cpsMemeEtat[j]) > TailleEtat )
      TailleEtat = strlen(cpsMemeEtat[j]) ;
     j++; 
    }; 
    
     // Après avoir calculé TailleEtat, on Alloue 
    if(i==0 && premiereLigne)
    {
     if ( (Element = malloc(TailleEtat * sizeof(char))) == NULL )
      exit(0);
     printf("1ere ligne - TailleEtat = %ld\n\n", TailleEtat);
    }
    else
    {
     if ( (Element = realloc(Element, TailleEtat * sizeof(char))) == NULL )
      exit(0);
     printf("TailleEtat = %ld\n\n", TailleEtat);
    }
    
    
    //--------------- Création des tableaux ---------------------------------
       Tabs[i].Dim = nbrValsParEtat ;  // MAXRAND = nbrValsParEtat 
    if ( (Tabs[i].Tab = (char **) malloc (sizeof(char *)*Tabs[i].Dim)) == NULL)
     exit(0);
      
    for (IdxEle=0; IdxEle < Tabs[i].Dim; IdxEle++) // = for(j=0; cpsMemeEtat[j]; j++)
    {
     if( (Tabs[i].Tab[IdxEle] = (char *) malloc (sizeof(char)*TailleEtat)) == NULL )
      exit(0);
     else
     {
      sprintf (Element, "%s", cpsMemeEtat[IdxEle]); 
      strcpy (Tabs[i].Tab[IdxEle], Element);
     }
    } 
    

    //free(Element); ça plantais aussi!

   }// fin de : for(i=0; cpsEtats[i]; i++)

   
   //-------------- Afficher les tableaux : ---------------------------------
   for (i=0; i < nbrEtats; i++) // MAXTAB = nbrEtats;
   {
    printf ("Tableau numero %ld : ", i+1);
    for ( IdxEle = 0; IdxEle < Tabs[i].Dim; IdxEle++)
     printf ("%s ", Tabs[i].Tab[IdxEle]);
    puts("");
   }
   puts("");
   
   //-------------- Affichage de la solution ------------------------------- 
   if ( (Index = malloc(nbrEtats * sizeof(long))) == NULL )
    exit(0);

   AfficherSol(Tabs, Index, 0, nbrEtats, &nbr2Sol);
   printf("\n\nnbr2Sol : %ld\n", nbr2Sol);
      
   
   
      

    // Extraire les différents valeurs Capteurs d'un couple
   cpsCapteurs = split(cpsCouple[1], ",");
   for(i=0; cpsCapteurs[i]; i++)
   {
    //printf("%d : %s\n", i, cpsCapteurs[i]);   

   }
        

   free(cpsEtats);  // important : libérer
   free(cpsMemeEtat);
   free(cpsCapteurs);
   free(cpsCouple);
   free(Tabs);
   free(Index);

   //free(Element); // ça blante !!!!!!!
      
      
   nbrCouples++; // compter le nombres de couples (= lignes non vides)
      
  }// fin de : if( strcmp(coupleEtatsCapteurs, "\n") )

  premiereLigne = 0; // fin de la 1ere ligne

 }// fin de : while( fgets(coupleEtatsCapteurs, tailleStr, fic) != NULL ) 
 
 
 printf("\nnbre de couples : %ld\n", nbrCouples);
 
 
 // ----------------------------------------------------------------------


 getchar();
 free(Element); // ça blante aussi !!!!!!!!!!!!!!!!!!!!!!!
 printf("\nça plante !!!!!!!!!!\n");

 free(coupleEtatsCapteurs);
 fclose(fic);
 

   

vendredi 28 juillet 2006 à 14:10:53 | Re : plantage avec free( ) !!!

vinc1008881

ok je reste ça sous ma plateforme linux.
vendredi 28 juillet 2006 à 14:26:47 | Re : plantage avec free( ) !!!

vinc1008881

il n'y a pas que free qui plante, mon debugger me dit que strstr plante et provoque une jolie sehment fault. Sinon c'est jamais un truc pareil, des whiles dans des for dns des if...et pas incrementation. Ça coute rien d'increment son code et ça permet de gagner du temps.
vendredi 28 juillet 2006 à 14:40:30 | Re : plantage avec free( ) !!!

ElectricalMan

Ça coute rien d'increment son code >>       tu parles du manque de commentaires ?!!!

vendredi 28 juillet 2006 à 15:10:49 | Re : plantage avec free( ) !!!

buno

Administrateur CodeS-SourceS
Si "free() plante, cela vient du fait d'une mauvaise allocation.
Généralement, quand on alloue une chaine de caractère, on rajoute 1 pour le caractère de fin de chaine...justement pour finir la chaine.
Dans ton cas, tu ne le fait pas:
if ( (Element = malloc((TailleEtat+1)* sizeof(char))) == NULL )

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage

1 2

Cette discussion est classée dans : element, char, free, fic, tailleetat


Répondre à ce message

Sujets en rapport avec ce message

probleme avec ifstream et ofstream [ par kobee12 ] J'ai un petit probleme dans mon programme. J'ai voulu inserer une fonction de cryptage pour crypter et decrypter un fichier. Le probleme c'est que j'a PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ] Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang récup de donnée dans un fichier text [ par ymlf ] Je veux récupere des données dans un fichier teste qui sont contenu entre une chaine de caractere et " .Aucun problème pour des petits fichier mais j' Pb avec la fonction free en C [ par Cako19 ] Bonjour,J'ai un problème lorsque je souhaite libérer une chaîne de caractère et je ne trouve pas la réponse dans le forum bien que le sujet ait déjà é problème d'ouverture et de lecture d'un fichier [ par Trinity_vv ] J'ai fais un code d'ouverture et d'affichage d'un fichier, tout marchait très bien. Sans exagérer 10 minutes plus tard, je le régénére et il ne veut p Comment free un char *** ? [ par kaervas ] Bonjour, j'ai un probleme pour free un char ***,pour le char ** j'utilisais cette fonction (qui a priori marche):void      dfree(char **str){ int    i structure [ par lektrosonic ] Bojour,j'ai cree cette structure:typedef struct element element;struct element{    SOCKET socket;    unsigned int con_type;    int index;    BOOL conn Visual C++ Free() [ par PRZYBYLSKI ] #include #include #include "stdafx.h"Question au Pro?Qu'es qui est faux docteurArrivé à free ça bombe#include <io lister un tableau de string [ par minet03 ] Soyons bref, je suis en train de bosser sur un code qui liste les srting d'un tableau, seul problème c'est qu'il y a des problèmes !Voici mon code :vo


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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 : 1,279 sec (4)

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