C++ : HELP ME - variable changeant toute seule

C++ : HELP ME - variable changeant toute seule - C++ - Programmation

Marsh Posté le 13-01-2005 à 22:33:20    

Bonjour,
j'ai essayé de faire un petit programme en C++ permettant de vérifier le parenthésage d'une chaîne de carractères en utilisant une pile (liste chainée) mais j'ai deux problemes  :( :
 - le dépilage ne marche pas :fou:  
 - j'ai une variable qui voit sa valeur changer lors de l'exécution d'une commande "printf" de celle-ci :ouch: , ce que je ne savais pas possible :ouch:  :ouch:  :ouch: ...
 
mon programme:
***effacé***
 
 
 
si qqun peut m'éclairer sur le changement de valeur de la variable, et ensuite sur une probable erreur dans le dépilage....:D
merchiii


Message édité par dark86 le 31-08-2005 à 14:36:26
Reply

Marsh Posté le 13-01-2005 à 22:33:20   

Reply

Marsh Posté le 13-01-2005 à 22:40:31    

bon, on va dire que t'as dis C++ alors que tu voulais dire C
 

Code :
  1. struct brique {
  2. int c;
  3. struct brique* prec;
  4. };
  5. typedef struct brique brik;


 
=>  
 

Code :
  1. typedef struct brique {
  2. int c;
  3. struct brique* prec;
  4. }brik;


 
Cela dit je déconseille d'utiliser le langage SMS dans un langage de programmation, enfin c'est toi qui vois.
 
 
 
 

Code :
  1. void empile(brik** P, int n)
  2. {
  3. brik nouvo;
  4. nouvo.prec = *P;//se place en haut de chaine
  5. nouvo.c = n;
  6. *P = &nouvo;//s'impose comme tête de chaîne
  7. printf("\nempilage...." );
  8. }


 
A partir de la, c'est la cata complete.  Comme tu le sais, il y a des variables dites locales, et ces variables sont détruites lorsque l'on quitte la fonction les ayants crée. Hors, la que voyons nous ? Que tu conserve l'adresse d'une de ces variables locales (l'adresse de nouvo, pour etre plus précis). Ce qui n'est pas bon, du tout.
 
Bref, ce qu'il te faut faire, c'est allouer dynamiquement de la mémoire :
 
 

Code :
  1. void empile(brik** P, int n)
  2. {
  3. brik *nouvo = malloc(sizeof(brik));
  4. nouvo->prec = *P;//se place en haut de chaine
  5. nouvo->c = n;
  6. *P = nouvo;//s'impose comme tête de chaîne
  7. printf("\nempilage...." );
  8. }


 
La.
Par contre, si on malloc d'un coté, faudra penser a  libérer de l'autre coté. Je corrige pas la suite car tout ces pointeurs voltigeant dans tous les sens me cassent la tete, et que j'ai pas trop envie de jouer au mikado ce soir. Essaye de deblayer un peu tout ca, que diable.
 
 
 
 

Reply

Marsh Posté le 13-01-2005 à 23:22:48    

MERCHIIIIIIIII beaucoup
j'avais effectivement oublié l'alloc dynamique :blush:
j'ai juste eu à ajouter :
brik *nouvo = (brik*) malloc(sizeof(brik));
et le programme semble fonctionner correctement :D
 
pour l'histoire du C/C++, oui je fais du C mais j'écris tjrs en *.cpp donc c un peu du mélange^^
 
voila qui resout le pblem principal, mais je ne comprends toujours pas comment les "printf" de mon ancien programme (certes tout buggé ms le pblem n'est plus là^^) faisaient pour changer la valeur de "pile->c"...
je laisse le prog erronné à la meme adresse si qqun peut mexpliker le dernier ptit probleme :D
 
prog corrigé :  
***effacé***


Message édité par dark86 le 31-08-2005 à 14:36:52
Reply

Marsh Posté le 13-01-2005 à 23:38:43    

dark86 a écrit :

MERCHIIIIIIIII beaucoup
j'avais effectivement oublié l'alloc dynamique :blush:
j'ai juste eu à ajouter :
brik *nouvo = (brik*) malloc(sizeof(brik));
et le programme semble fonctionner correctement :D
 
pour l'histoire du C/C++, oui je fais du C mais j'écris tjrs en *.cpp donc c un peu du mélange^^
 
voila qui resout le pblem principal, mais je ne comprends toujours pas comment les "printf" de mon ancien programme (certes tout buggé ms le pblem n'est plus là^^) faisaient pour changer la valeur de "pile->c"...
je laisse le prog erronné à la meme adresse si qqun peut mexpliker le dernier ptit probleme :D
 
prog corrigé :  
http://awoiselle.perso.egim-mrs.fr [...] /main2.cpp


 
 
bin faut savoir que les variables locale sont stockée sur ce que l'on appelle 'la pile'. Quand tu appeles une fonction, tu copie les parametres sur la pile (+d'ot trucs que je developpe pas). Bref, la ou avant il y avait ta variable locale, il y a peut etre apres d'autre var locale que se sont foutus dessus, ou des parametres, ou n'importe quoi....

Reply

Sujets relatifs:

Leave a Replay

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