Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1621 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1273362
bossgama
Posté le 26-12-2005 à 17:22:16  profilanswer
 

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
mood
Publicité
Posté le 26-12-2005 à 17:22:16  profilanswer
 

n°1273366
Ungario
Posté le 26-12-2005 à 17:42:50  profilanswer
 

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

n°1273374
bossgama
Posté le 26-12-2005 à 17:53:28  profilanswer
 

mal indenté?

n°1273378
raynalou
Posté le 26-12-2005 à 18:00:54  profilanswer
 

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é

n°1273381
Ungario
Posté le 26-12-2005 à 18:02:11  profilanswer
 

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

n°1273390
bossgama
Posté le 26-12-2005 à 18:11:52  profilanswer
 

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?

n°1273444
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2005 à 20:25:30  profilanswer
 

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/
n°1273445
bossgama
Posté le 26-12-2005 à 20:29:46  profilanswer
 

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

n°1273446
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2005 à 20:31:43  profilanswer
 

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/
n°1273448
bossgama
Posté le 26-12-2005 à 20:40:13  profilanswer
 

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
mood
Publicité
Posté le 26-12-2005 à 20:40:13  profilanswer
 

n°1273462
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-12-2005 à 21:39:31  profilanswer
 

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/
n°1273472
bossgama
Posté le 26-12-2005 à 22:12:11  profilanswer
 

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

n°1273495
Elmoricq
Modérateur
Posté le 26-12-2005 à 23:08:23  profilanswer
 

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
n°1273511
bossgama
Posté le 27-12-2005 à 00:19:01  profilanswer
 

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 :).


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
Probleme de sessionHELP probleme pour un script d'export de zone DNS
[Batch] Accents et autres caractères exotiques [Résolu]LWP probleme upload fichier
Probléme d'interraction avec un boutton ...problème avec formulaire
probleme avec les tableaux html sous IE[C++] Urgent SVP!! Fabrique abstraite : probleme de cast
incrément (résolu)Probleme de "scrollbar" quand frame sous firefox
Plus de sujets relatifs à : [C] problème de réallocation de la taille d'une chaine [résolu]


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR