Plantage avec free( ) !!!

ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008 - 28 juil. 2006 à 12:17
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 28 juil. 2006 à 19:17
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);
 
}





<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 

15 réponses

vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
28 juil. 2006 à 13:06
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
0
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 13:19
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 ?!!!
0
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
28 juil. 2006 à 13:23
non il n'y a pas de probleme je crois, envoye le code en entier je vais le compiler.
0
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 13:42
 peux tu me donner ton email, comme ça je t'envoie les fichiers...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 13:56
 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);
 

   
0
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
28 juil. 2006 à 14:10
ok je reste ça sous ma plateforme linux.
0
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
28 juil. 2006 à 14:26
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.
0
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 14:40
Ça coute rien d'increment son code >>       tu parles du manque de commentaires ?!!!
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
28 juil. 2006 à 15:10
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
0
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
28 juil. 2006 à 15:20
non il faut ajouter des decalages sinon on ne s'y retrouve pas dan les boucles
0
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 15:24
et oui t'as raison !   ça doit être la chaleur. ou la fatigue  

merci, vous êtes trop cool
0
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 15:26
ok vinc1008881 
je ferai de mon mieux la prochaine fois...
0
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
28 juil. 2006 à 15:46
Ça ne marche toujours pas : un conseil redemmarre tout de zero, essaye de faire du code clair, utilise malloc correctement, utilise free le plus rapidement possible avec un malloc, il y a une fonction ou il y a un malloc sans free (), attention au char ** c'est dur a manier, crée plus de petites fonctions simples fesant une tache facilement comprehensible et enfin indente ton code.

j'ai essayé de corriger quelques bricoles sans succes...

#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 )exit(0)

  
  // Alloue le tableau des pointeurs
    currentSplit = malloc( (sizeSplit+1) * sizeof(char*) );
    if ( !currentSplit )exit(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); // ***
    }
return;
}

 

 

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;
char *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 = "/tmp/";   // 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 malloc(TailleEtat * sizeof(char))) NULL )exit(0);//realloc pas bon puisque free ()
                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 (Tabs[i].Tab[IdxEle]);
                 }
            }
            free (Tabs[i].Tab);           
            free (Element);
        }
       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);
        cpsCapteurs = split(cpsCouple[1], ",");
        free(Index);
          //for(i=0; cpsCapteurs[i]; i++)
          //{
           //printf("%d : %s\n", i, cpsCapteurs[i]);  

          //}
           //free(cpsEtats);  // important : libérer ? ou il a été alloue celui là
           //free(cpsMemeEtat);
           //free(cpsCapteurs); ??
           //free(cpsCouple); ??
   
        //free(Element); // ça blante !!!!!!! : evidemment on libere pas un tableau deja liberé
        nbrCouples++; // compter le nombres de couples (= lignes non vides)
         
      }

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

}
 
 
printf("\nnbre de couples : %ld\n", nbrCouples);

 getchar();
// free(Element); // ça plante aussi !!!!!!!!!!!!!!!!!!!!!!! : on libere pas element 30 fois non plus
 printf("\nça plante !!!!!!!!!!\n");

 //free(coupleEtatsCapteurs);
 fclose(fic);
 
0
ElectricalMan Messages postés 39 Date d'inscription samedi 20 mars 2004 Statut Membre Dernière intervention 5 novembre 2008
28 juil. 2006 à 16:18
oulah, je croix que je suis pas seul à être fatigué
mais je te comprends avec un code aussi peu clair !

Buno a raison ;   if ( (Element malloc( (TailleEtat+1) * sizeof(char))) NULL )
et   if ( (Element realloc(Element, (TailleEtat+1) * sizeof(char))) NULL

et ça marche
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
28 juil. 2006 à 19:17
et oui, pas besoin de chercher la petite bête...
A mettre dans ta liste des erreurs les plus fréquentes...

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