[C] problème de réallocation de la taille d'une chaine [résolu]

problème de réallocation de la taille d'une chaine [résolu] [C] - C - Programmation

Marsh Posté le 26-12-2005 à 17:22:16    

Salut,
Je cherche à coder un petit éditeur de texte , et j'ai un problème sur la gestion d'une de mes boucles. Je cherche à mettre un espace avant une parenthèse si la chaine n'en comporte pas. Mais ma boucle tourne indéfiniment et je n'arrive pas à voir pourquoi? Je suppose que je fais une erreur en réallouant la taille de ma chaine, mais je n'en suis pas sur. Est-ce que quelqu'un peut m'aider?
 
 

Code :
  1. int parentheses (char *chaine)
  2.     {
  3.             int compteur1,compteur2,taille;
  4.              
  5.             compteur1 = 0;
  6.             taille = strlen(chaine);
  7.            
  8.             while (compteur1 < taille)
  9.                   {
  10.                              if ((chaine[compteur1] == '(') || (chaine[compteur1] == ')'))
  11.                                 {
  12.                                           //On efface tous les espaces avant les parenthèses
  13.                                           if (chaine[compteur1 - 1] == ' ')
  14.                                              {                                                   
  15.                                                       while (chaine[compteur1 - 2] == ' ')
  16.                                                             {
  17.                                                                        for (compteur2 = compteur1 - 2; compteur2 < taille - 1; compteur2++)
  18.                                                                            {
  19.                                                                                       chaine[compteur2] = chaine[compteur2 + 1];
  20.                                                                            }
  21.                                                                        compteur1 = compteur1 - 1;                                                             
  22.                                                             }
  23.                                              }
  24.                                           //boucle qui tourne en rond
  25.                                           //On ajoute un espace si le caractère précédent n'est pas une parenthèse (
  26.                                           if ((chaine[compteur1] == '(') && (chaine[compteur1 - 1] != '('))
  27.                                              {
  28.                                                       taille = taille + 1;                                                     
  29.                                                       chaine = (char*) realloc(chaine,(sizeof(char) * taille));
  30.                                                       compteur2 = taille - 1;
  31.                                                       while (compteur2 >= (compteur1 - 1))
  32.                                                           {
  33.                                                                      chaine[compteur2] = chaine[compteur2 - 1];                                                                   
  34.                                                                      compteur2 = compteur2 - 1;
  35.                                                           }
  36.                                                       chaine[compteur1 - 1] = ' ';                                                     
  37.                                              }
  38.                                           //On ajoute un espace après la parenthèse )                                                       
  39.                                           if ((chaine[compteur1] == ')') && (chaine[compteur1 + 1] != ' '))
  40.                                              {                                                   
  41.                                                       taille = taille + 1;
  42.                                                       chaine = (char*) realloc(chaine,(sizeof(char) * taille));                                                     
  43.                                                       for (compteur2 = taille - 1; compteur2 > compteur1 + 1; compteur2--)
  44.                                                           {
  45.                                                                      chaine[compteur2] = chaine[compteur2 - 1];
  46.                                                           }
  47.                                                       chaine[compteur1 + 1] = ' ';                                                                 
  48.                                              }
  49.                                 }
  50.                              compteur1 = compteur1 + 1;
  51.                      }           
  52.             printf("%s\n",chaine);       
  53.             return 0;
  54.     }
  55. int main (void)
  56.    {
  57.          int pause,i;
  58.                  
  59.          char *chaine;
  60.        
  61.          chaine = (char*) malloc(sizeof(char) * 200);
  62.          strcpy (chaine,"ca marche ,ou pas? Ptet  ,(ou ptet pas).Mais bon on s'en tape.  non?" );
  63.        
  64.          parentheses(chaine);
  65.      
  66.        
  67.          scanf("%d",&pause);
  68.          return 0;
  69.    }

Message cité 2 fois
Message édité par bossgama le 27-12-2005 à 00:19:17
Reply

Marsh Posté le 26-12-2005 à 17:22:16   

Reply

Marsh Posté le 26-12-2005 à 17:42:50    

C'est mal indenté, c'est pas comme ca qu'on travaille, je vous l'ai deja dit

Reply

Marsh Posté le 26-12-2005 à 17:53:28    

mal indenté?

Reply

Marsh Posté le 26-12-2005 à 18:00:54    

mal indenté : ça veut dire que qu'il n'y a pas assez d'indentation, pas assez de parenthèses, de guillemets, de virgules, etc.. enfin je crois .
je suis DIIC et c'est ce qu'on m'a enseigné

Reply

Marsh Posté le 26-12-2005 à 18:02:11    

tous ta fait, mais ca veut haut-ci dire que les noms de variables sont mal choisis

Reply

Marsh Posté le 26-12-2005 à 18:11:52    

ce n'est pas mon fichier final, mais un fichier temporaire pour faire marcher ma fonction. Quand aux noms de variables... j'ai mis des noms qui me paraissaient logiques, mais je veux pas passer plus de temps la dessus que sur la réalisation du programme proprement dit.
 
Sinon vous ne voyez pas ce qui peut planter dans ma boucle?

Reply

Marsh Posté le 26-12-2005 à 20:25:30    

Ungario a écrit :

tous ta fait, mais ca veut haut-ci dire que les noms de variables sont mal choisis


Ca fout la trouille !
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2005 à 20:29:46    

je comprends vraiment pas pourquoi ca marche pas. Il doit y avoir un truc tout bete, mais quoi???
 :(

Reply

Marsh Posté le 26-12-2005 à 20:31:43    

bossgama a écrit :

Est-ce que quelqu'un peut m'aider?


Déjà, ça aiderais si tu postais du code compilable...


Compiling: main.c
main.c:2: warning: no previous prototype for 'parentheses'
main.c: In function `parentheses':
main.c:6: error: implicit declaration of function `strlen'
main.c:6: warning: nested extern declaration of `strlen'
<internal>:0: warning: redundant redeclaration of 'strlen'
main.c:29: error: implicit declaration of function `realloc'
main.c:29: warning: nested extern declaration of `realloc'
main.c:29: warning: cast does not match function type
main.c:42: warning: nested extern declaration of `realloc'
main.c:29: warning: redundant redeclaration of 'realloc'
main.c:29: warning: previous implicit declaration of 'realloc' was here
main.c:42: warning: cast does not match function type
main.c:52: error: implicit declaration of function `printf'
main.c:52: warning: nested extern declaration of `printf'
<internal>:0: warning: redundant redeclaration of 'printf'
main.c: In function `main_':
main.c:63: error: implicit declaration of function `malloc'
main.c:63: warning: nested extern declaration of `malloc'
<internal>:0: warning: redundant redeclaration of 'malloc'
main.c:64: error: implicit declaration of function `strcpy'
main.c:64: warning: nested extern declaration of `strcpy'
<internal>:0: warning: redundant redeclaration of 'strcpy'
main.c:69: error: implicit declaration of function `scanf'
main.c:69: warning: nested extern declaration of `scanf'
<internal>:0: warning: redundant redeclaration of 'scanf'
main.c:59: warning: unused variable `i'


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2005 à 20:40:13    

Je le reposte, j'avais oublié les includes
my bad emmanuel delahaye :bounce:  
 
Le code ci apres est compilable, mais il tourne en rond de manière infini et je ne comprends pas pourquoi.
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //Définition des procédures.
  4. int parentheses (char *chaine)
  5.     {
  6.             int compteur1,compteur2,taille;
  7.              
  8.             compteur1 = 0;
  9.             taille = strlen(chaine);
  10.            
  11.             while (compteur1 < taille)
  12.                   {
  13.                              if ((chaine[compteur1] == '(') || (chaine[compteur1] == ')'))
  14.                                 {
  15.                                           //On efface tous les espaces avant les parenthèses
  16.                                           if (chaine[compteur1 - 1] == ' ')
  17.                                              {                                                   
  18.                                                       while (chaine[compteur1 - 2] == ' ')
  19.                                                             {
  20.                                                                        for (compteur2 = compteur1 - 2; compteur2 < taille - 1; compteur2++)
  21.                                                                            {
  22.                                                                                       chaine[compteur2] = chaine[compteur2 + 1];
  23.                                                                            }
  24.                                                                        compteur1 = compteur1 - 1;                                                             
  25.                                                             }
  26.                                              }
  27.                                            //boucle qui pose problème
  28.                                           //On ajoute un espace si le caractère précédent n'est pas une parenthèse (
  29.                                           if ((chaine[compteur1] == '(') && (chaine[compteur1 - 1] != '('))
  30.                                              {
  31.                                                       taille = taille + 1;                                                     
  32.                                                       chaine = (char*) realloc(chaine,(sizeof(char) * taille));
  33.                                                      
  34.                                                       compteur2 = taille - 1;
  35.                                                      
  36.                                                       for (compteur2 = taille - 1; compteur2 > compteur1 - 1; compteur2--)
  37.                                                           {
  38.                                                                      chaine[compteur2] = chaine[compteur2 - 1];
  39.                                                           }
  40.                                                          
  41.                                                       chaine[compteur1 - 1] = ' ';
  42.                                                       printf("%s\n",chaine);
  43.                                              }
  44.                                           //On ajoute un espace après la parenthèse )                                                       
  45.                                           if ((chaine[compteur1] == ')') && (chaine[compteur1 + 1] != ' '))
  46.                                              {                                                   
  47.                                                       taille = taille + 1;
  48.                                                       chaine = (char*) realloc(chaine,(sizeof(char) * taille));                                                     
  49.                                                       for (compteur2 = taille - 1; compteur2 > compteur1 + 1; compteur2--)
  50.                                                           {
  51.                                                                      chaine[compteur2] = chaine[compteur2 - 1];
  52.                                                           }
  53.                                                       chaine[compteur1 + 1] = ' ';                                                                 
  54.                                              }
  55.                                 }
  56.                              compteur1 = compteur1 + 1;
  57.                      }           
  58.             printf("%s\n",chaine);       
  59.             return 0;
  60.     }
  61.    
  62. int main (void)
  63.    {
  64.          int compteur;
  65.          int pause;
  66.                  
  67.          char *chaine;
  68.        
  69.          chaine = (char*) malloc(sizeof(char) * 200);
  70.        
  71.        
  72.          strcpy (chaine,"ca marche ,ou pas? Ptet  ,(ou ptet pas).Mais bon on s'en tape.  non?" );
  73.        
  74.          parentheses(chaine);
  75.                  
  76.          scanf("%d",&pause);
  77.          return 0;
  78.    }


Message édité par bossgama le 26-12-2005 à 20:40:37
Reply

Marsh Posté le 26-12-2005 à 20:40:13   

Reply

Marsh Posté le 26-12-2005 à 21:39:31    

bossgama a écrit :

Salut,
Je cherche à coder un petit éditeur de texte , et j'ai un problème sur la gestion d'une de mes boucles. Je cherche à mettre un espace avant une parenthèse si la chaine n'en comporte pas. Mais ma boucle tourne indéfiniment et je n'arrive pas à voir pourquoi? Je suppose que je fais une erreur en réallouant la taille de ma chaine, mais je n'en suis pas sur. Est-ce que quelqu'un peut m'aider?


Les indices x-1, x-2 etc. ca fait peur ! Ce genre de problème se résout plutôt à coup de machine à état... Sinon, je conseille de décoreller les problèmes de gestion de mémoire du problème du traitement de la chaine, en créant un objet 'intelligent' de type chaine, qui saurait s'agrandir ou se rétrecir quand il faut...
 
T*str_create()
str_delete(T*)
str_add_queue(T*, int car);
str_ins_head(T*, int car);
str_ins(T*, int car, size_t pos);
str_cat(T*, char const *s);
str_insert(T*, char const *s, size_t pos);
etc.
 
 
http://mapage.noos.fr/emdel/clib.htm
Module FSTR
 
http://mapage.noos.fr/emdel/tad.htm


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-12-2005 à 22:12:11    

je regarde ca tout de suite, mais ca a l'air plus compliqué :pt1cable: .
Mici Emmanuel Delahaye

Reply

Marsh Posté le 26-12-2005 à 23:08:23    

Ah oui tiens, j'ai cru que j'avais cliqué sur "poster" tout à l'heure, mais en fait non.
 
Bon alors rapidement : oublie le code pour le moment, et réexamine ton algorithme. Il cloche méchant.
 
Indice : ton algorithme pourrait se nommer "le linceul de Pénélope". [:tinostar]


Message édité par Elmoricq le 26-12-2005 à 23:20:15
Reply

Marsh Posté le 27-12-2005 à 00:19:01    

exact elmoricq. Mais j'ai galéré pour trouver mon erreur :bounce:  
Je savais que ca serait un truc tout bête mais là... vu que je decalais la parenthèse à chaque fois je rebouclais dessus alors forcement ca marchait pas  :pt1cable: .
 
Mais c'est réglé maintenant.
 
Il est sympa ton site, Emmanuel Delahaye. Je vais me plonger dedans à partir de maintenant :).

Reply

Sujets relatifs:

Leave a Replay

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