tableaux de pointeurs

tableaux de pointeurs - C - Programmation

Marsh Posté le 28-12-2009 à 05:37:59    

Bonjour,
Je cherche a créer un tableau de pointeur et a le remplir avec des valeurs d'autre pointeur
voici un bout de prog
je fait glisser une fenetre de lecture et lorsque je detecte la chaine client-ip  je lis les caracteres suivants sans les conserver tant que ce sont des esp ensuite je concatene les carcteres suivants tant que ce ne sont pas des esp.
Le but etatnt de recupérer la valeur du pointeur de la chaine concatenée pour la mettre dans un tableau de pointeur via la fonction strcpy et la ça coinçe.Quelqu'un peut il voir ce qui cloche dans le principe.
Cordialement

Code :
  1. int Sup_ACL(begin_line,end_line)
  2. {
  3. char **temp_Sup_clientip,**Sup_clientip,*car_int,*add_ip,*temp_add_ip,*temp_Sup_clientip1;
  4. int resultat5,pos_line,end_line1,long_add_ip,nb_add_ip;
  5. printf("\nProcedure de  suppression" );
  6. pos_line=begin_line;
  7. end_line1=end_line;
  8. nb_add_ip=0;
  9. if((Sup_clientip=(char**)calloc (10,sizeof(char*)))==NULL) 
  10.   {
  11.   perror("\nErreur sur allocation de clientip1" );
  12.   exit(4);
  13.   }
  14.   if((temp_Sup_clientip1=(char*)calloc (1,sizeof(char*)))==NULL) 
  15.   {
  16.   perror("\nErreur sur allocation de temp_clientip1" );
  17.   exit(4);
  18.   }
  19. for(pos_line;pos_line<=end_line1;pos_line++)   /*Recher de la chaine client-ip*/
  20.     {
  21.     printf("\nDebut de la boucle for" );
  22.     temp_Sup_clientip=Sup_clientip;
  23.     printf("\navnt le realloc" );
  24.     if((Sup_clientip=(char**)realloc (temp_Sup_clientip,(nb_add_ip+2)*sizeof(char*)))==NULL) 
  25.         {
  26.          perror("\nErreur sur reallocation de memoire add_ip" );
  27.          exit(4);
  28.         }
  29.      fseek(Instructions,pos_line,SEEK_SET);
  30.      printf("\navant le read" );
  31.      if((resultat5=fread(temp_Sup_clientip1,sizeof(char),9,Instructions))<1)
  32.      {
  33.        perror("\nErreur de lecture du temp_clientip1 resultat4= %d",resultat5);
  34.        exit(4);
  35.       }
  36.       printf("\navant le strcmp" );
  37.       if(!strcmp(temp_Sup_clientip1,"client-ip" ))
  38.       {
  39.       printf("\nReconnaissance de la chaine client-ip" );
  40.    
  41.       do /*Recherche des add_ip*/
  42.       {
  43.       printf("\ndans la do" );
  44.       if((car_int=(char*)calloc (2,sizeof(char*)))==NULL) 
  45.      {
  46.       perror("\nErreur sur allocation de car_esp" );
  47.       exit(4);
  48.       }
  49.       if((resultat5=fread(car_int,sizeof(char),1,Instructions))<1)
  50.      {
  51.        perror("\nErreur de lecture du car_esp resultat4= %d",resultat5);
  52.        exit(4);
  53.       }
  54.       pos_line++;
  55.       printf("\nfin la do %d",*car_int);
  56.       }while(*car_int==32);
  57.    
  58.       long_add_ip=1;
  59.      if((add_ip=(char*)calloc (2,sizeof(char*)))==NULL) 
  60.      {
  61.       perror("\nErreur sur allocation de add_ip" );
  62.       exit(4);
  63.       }
  64.  
  65.       do
  66.       {
  67.       if((car_int=(char*)calloc (2,sizeof(char*)))==NULL) 
  68.      {
  69.       perror("\nErreur sur allocation de car_esp" );
  70.       exit(4);
  71.       }
  72.       if((resultat5=fread(car_int,sizeof(char),1,Instructions))<1)
  73.      {
  74.        perror("\nErreur de lecture du car_esp resultat4= %d",resultat5);
  75.        exit(4);
  76.       }
  77.       if(car_int!=32)
  78.       {
  79.       temp_add_ip=add_ip;
  80.       printf("\ndans la do %c",*temp_add_ip);
  81.       printf("\naprés reaffectation valeur de strlen %d car_int %c",strlen(temp_add_ip),car_int);
  82.        if((add_ip=(char*)realloc (temp_add_ip,strlen(temp_add_ip)+2))==NULL) 
  83.         {
  84.          perror("\nErreur sur reallocation de memoire add_ip" );
  85.          exit(4);
  86.         }
  87.         strcat(add_ip,car_int);
  88.          printf("\nadd_ip %s et car_int %c %d",add_ip,*car_int,*car_int);
  89.       }
  90.      pos_line++;
  91.    
  92.       }while(*car_int!=32);
  93.       printf ("\nSortie de do car_int %d %d %d",*car_int,nb_add_ip,add_ip);
  94.       strcpy(Sup_clientip[nb_add_ip],&add_ip);
  95.       printf("\n apres le strcpy" );
  96.       printf("\n**Sup_clientip %s",Sup_clientip[nb_add_ip]);
  97.       nb_add_ip++;
  98.       printf ("\nfin du for" );
  99.       sleep(20);
  100.       }
  101.     }
  102.     sleep(20);
  103.     return(1);
  104. }

Reply

Marsh Posté le 28-12-2009 à 05:37:59   

Reply

Marsh Posté le 28-12-2009 à 08:09:11    

quel est le problème ??

Reply

Marsh Posté le 28-12-2009 à 12:07:28    

9a compile mais  a l'execution fichier  core = erreur memoire

Reply

Marsh Posté le 28-12-2009 à 22:38:02    

yartempion a écrit :

9a compile mais  a l'execution fichier  core = erreur memoire


 
 :pfff:  il faut au moin indiquer la ligne du erreur.
je nvai pas lire , mais je vois trop de Ptr and loops
-> possible debordement du memoire , verify

Reply

Marsh Posté le 29-12-2009 à 07:49:25    

yartempion a écrit :

9a compile mais  a l'execution fichier  core = erreur memoire


ca n'aide pas ...
 
tu dois acceder à de la mémoire non allouée quelque aprt dans ton bordel.  
Deux conseils:
- separe ton code en fonction plus simple
- utilise valgrind pour detecter les pbs de mémoires

Reply

Marsh Posté le 29-12-2009 à 10:44:57    

Quel bordel sans nom, la liste de tout ce qui ne va pas juste a la premiere lecture est longue :
Affectation de car_int dans le test sur une zone de memoire mise a zero automatiquement, puis chargee par le fread et testee parfois comme un char * parfois fois comme un char, boucle une fois for, une fois do-while, commentaires completements inutiles ou absents et le tout dans un meme bon gros bloc bien barbare. Meme pas l'excuse de la performance car le realloc de strlen alors qu'on pourrait memoriser la longueur a chaque tour de boucle est la cata. Sans mentionner les fuites memoire sur car_int alloue a chaque tour de boucle et jamais libere. Des noms de variables sexy comme resultat5 (j'imagine que les 4 premiers etaient occupes), le ad_ip utilise parfois comme char *, parfois comme je ne sais pas quoi (strcpy... &ad_ip), le sup_clientip dont les pointeurs sont bien alloues (enfin je le suppose) mais pas chacun des elements du tableaux auxquels on accede via le fameux strcpy (le core doit probablement venir de par la)...
Bref, un seul remede, reecrire proprement. Si je dois maintenir un code ecrit comme ca, je met un contrat sur la tete de son auteur, le core etant un resultat absolument certain des la lecture des premieres lignes de code. Imagine devoir revenir la dessus dans 3 mois (parceque ton truc plante a cause d'une ligne ip vide par ex dans un fichier mal forme) et tu comprendra ton malheur.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed