[C] TD4 exo BMaillon

Page 1 sur 2 1, 2  Suivant

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu [C] TD4 exo BMaillon

Message  LoopinG le Ven 04 Nov 2011, 15:48

Bonjour à tous, j'ai un problème avec mon constructeur de BMaillon en effet quand je test sur 4 construction l'un à la suite de l'autre avec des valeurs qui se suivent e.g. 1 2 3 4 , j'ai toujours ma 2ème construction qui me donne une valeur immense alors que les autres BMaillon* construis m'affiche la bonne valeur !

ps: lorsque je lance le deboggage il n'y a aucun soucis, les adresses de tous les maillons ne sont pas les mêmes et il m'affiche bien à la fin 1 2 3 4 mais je ne comprend pas pourquoi à chaque exécution pour le 2ème maillon construit il attribue un nombre au hasard !

Voici le screen :



Merci de vos futurs conseils pour pallier à cela !


Dernière édition par LoopinG le Ven 04 Nov 2011, 23:03, édité 1 fois

LoopinG

Nombre de messages : 100
Prénom : Laurent
Statut : Étudiant en Réseaux et Télécoms
Localisation : L'hôpital de l'armée !
Date d'inscription : 24/03/2011

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  nvs le Ven 04 Nov 2011, 18:10

t'es sûr de la taille que tu t'alloues lors du malloc ?








Idea

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  LoopinG le Ven 04 Nov 2011, 23:02

nvs a écrit:t'es sûr de la taille que tu t'alloues lors du malloc ?
Idea
C'est bon j'ai compris mon erreur !
j'explique ici :

lors de mon allocation de la mémoire à mon pointeur, je n'attribuais que la taille d'un pointeur alors que je voulais attribuer la taille d'une structure !

donc je remet le code correct :

Code:
BMaillon * pBM = (BMaillon*) malloc(sizeof (BMaillon);

Et à présent le bug n'est plus !





LoopinG

Nombre de messages : 100
Prénom : Laurent
Statut : Étudiant en Réseaux et Télécoms
Localisation : L'hôpital de l'armée !
Date d'inscription : 24/03/2011

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Dim 06 Nov 2011, 16:41

Topic très utile j'ai une question sur cette fonction:

void deleteBM(BMaillon * * pm);
/* détruit le BMaillon pointé par un pointeur dont on
fournit l'adresse et met ce pointeur à NULL, sans
intervenir sur le maillage précédent et suivant */

Il faut libérer l'espace mémoire occupé par le pointeur Bmaillon et mettre a NULL le pointer qui nous indique où il se trouve ou je n'ai rien compris? Suspect

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  nvs le Dim 06 Nov 2011, 16:48

tu as bien compris.










Mad

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Mar 08 Nov 2011, 21:07

Merci de la confirmation

ma fonction pour libérer le BMaillon est

void deleteBM(BMaillon * * pm) {
free(pm);
pm = NULL;
}

Par contre il ne veut pas qu'on lui passe le pointeur BMaillon deleteBM(bm2);

Il y a surement quelque chose que je n'ai pas compris et ça m'empêche d'avancer Suspect

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  karemkadidola le Mar 08 Nov 2011, 21:24

normal puisque ta fonction est sensé recevoir un pointeur de pointeur de BMaillon et là tui lui fournit juste un pointeur de BMaillon donc tu devrais plutot lui fournir (&bm2) c à d l'adresse de BMaillon qui lui est un pointeur de pointeur de BMaillon voilà

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  karemkadidola le Mar 08 Nov 2011, 21:28

ben sinon pour vraiment bien faire en réalité dans ta fontion tu lui fournit (**pm) mais ce n'est pas pm que tu veux libérer mais plutot son contenu qui lui est un pointeur vers un BMaillon et qu'il a en plus était alloué dynamiquement contrairement à pm donc dans ton code faut plutot faire free (*pm) ...bref!!! c'était juste un petit détail..

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  nvs le Mar 08 Nov 2011, 21:51

karemkadidola a écrit:[...] dans ton code faut plutot faire free (*pm) ...bref!!! c'était juste un petit détail..
c'est bien ça, un détail insignifiant Laughing

bien vu, karemkadidola Smile







clown

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  karemkadidola le Mar 08 Nov 2011, 22:57

j’apprécie le lien vers "détail insignifiant" si on avait droit d'utiliser le mot "lol" sur ce site je l'aurais fait volontiers mais...oups! c déjà fait à vrai dire...désolé.

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Mer 09 Nov 2011, 12:15

Merci de votre aide! J'avais essayé avec le & mais lorsque que je supprimais le maillon et que je ré affichais sa valeur était inchangée

Code:

printf("val %d \n", getValeurBM(bm2));

deleteBM(&bm2);

printf("val %d \n", getValeurBM(bm2));

val 13
val 13


Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  mcd le Mer 09 Nov 2011, 12:30

C'est que l'instruction "pm = NULL" n'est pas correcte.
Fais un schéma mémoire, tu devrais comprendre assez vite le problème.

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Mer 09 Nov 2011, 15:54

En effet c'est le contenu du pointeur que je dois mettre à NULL et pas modifier son adresse c'est à dire "*pm = NULL;"

Mais j'ai une erreur à l'exécution "deleteBM(&bm2);" Suspect

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  nvs le Mer 09 Nov 2011, 16:07

il est construit comment bm2 ? il pointe où ?






cyclops

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  smb le Mer 09 Nov 2011, 16:11

Florent a écrit:En effet c'est le contenu du pointeur que je dois mettre à NULL et pas modifier son adresse c'est à dire "*pm = NULL;"

Mais j'ai une erreur à l'exécution "deleteBM(&bm2);" Suspect

Il faudrait peut-être qu'on voit ton code mis à jour. Sans cela, t'aider devient de la véritable magie !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Mer 09 Nov 2011, 16:28

Désolé voici mon code:

Code:

void deleteBM(BMaillon * * pm) {
   free(*pm);
   *pm = NULL;
}

mon bm est construit de cette manière:

Code:

BMaillon * newBM(TVal val) {
   BMaillon * pBM = (BMaillon*)malloc(sizeof (BMaillon));
   (*pBM).precedent = NULL;
   (*pBM).suivant = NULL;
   (*pBM).value = val; /* equivalent a unBMaillon->value */
   return pBM;
}

Code:
BMaillon * bm = newBM(3);

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  nvs le Mer 09 Nov 2011, 16:33

alors :
Code:
deleteBM(&bm);
ne devrait poser aucun problème... à moins qu'une bombe à retardement ne traîne ailleurs dans ton code...






Shocked

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  smb le Mer 09 Nov 2011, 16:35

Florent a écrit:Désolé voici mon code:

Code:

void deleteBM(BMaillon * * pm) {
   free(*pm);
   *pm = NULL;
}

mon bm est construit de cette manière:

Code:

BMaillon * newBM(TVal val) {
   BMaillon * pBM = (BMaillon*)malloc(sizeof (BMaillon));
   (*pBM).precedent = NULL;
   (*pBM).suivant = NULL;
   (*pBM).value = val; /* equivalent a unBMaillon->value */
   return pBM;
}

Code:
BMaillon * bm = newBM(3);

A mon avis, ce n'est pas ça qui pose problème. Quand tu "deletes" un BMaillon, es-tu certain de l'avoir bien enlevé logiquement de la chaîne ?

[edt] encore battu sur le fil par mon chef !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Mer 09 Nov 2011, 20:21



A mon avis, ce n'est pas ça qui pose problème. Quand tu "deletes" un BMaillon, es-tu certain de l'avoir bien enlevé logiquement de la chaîne ?


Je ne vois pas de quoi vous voulez parler, pouvez vous être plus claire svp?

Par exemple pour le dernier exercice (la ronde de l'empereur), quand on supprime un BMaillon il faut également modifier le chaînage, est-ce de cela que vous parler?

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  karemkadidola le Mer 09 Nov 2011, 20:55

tu as mentionné une erreur à l’exécution qu'est elle cher Florent?

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  smb le Mer 09 Nov 2011, 21:58

smb a écrit:
Florent a écrit:
Mais j'ai une erreur à l'exécution "deleteBM(&bm2);" Suspect

Il faudrait peut-être qu'on voit ton code mis à jour. Sans cela, t'aider devient de la véritable magie !

Ne serait-ce pas toi qui devrais être plus clair ?

On ne voit pas le code complet qui provoque l'erreur à l'exécution !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Jeu 10 Nov 2011, 13:01

Voici mes codes

Code:

/*
 * maillon.c
 *
 *  Created on: 2 nov. 2011
 *      Author: MX
 */

#include "maillon.h"
#include <stdio.h>


BMaillon * newBM(TVal val) {
   BMaillon * pBM = (BMaillon*)malloc(sizeof (BMaillon));
   if (pBM == NULL) {
      exit(0);
   }
   (*pBM).precedent = NULL;
   (*pBM).suivant = NULL;
   (*pBM).value = val; /* equivalent a unBMaillon->value */
   return pBM;
}

void deleteBM(BMaillon * * pm) {
   free(*pm);
   *pm = NULL;
}

TVal getValeurBM(const BMaillon * m) {
   return (*m).value;
}

BMaillon * getSuivantBM(const BMaillon * m){
   return (*m).suivant;
}

BMaillon * getPrecedentBM(const BMaillon * m){
   return (*m).precedent;
}

void setSuivantBM(BMaillon * m, const BMaillon * suivant) {
   (*m).suivant = (BMaillon *) suivant;

}

void setPrecedentBM(BMaillon * m, const BMaillon * precedent) {
   (*m).precedent = (BMaillon *) precedent;

}

void setValeurBM(BMaillon *m, TVal val) {
   (*m).value = val;
}


Code:

int main(void) {


BMaillon * bm = newBM(3);
BMaillon * bm2 = newBM(13);

printf("val %d \n", getValeurBM(bm));

setValeurBM(bm, 5);

setSuivantBM(bm, bm2);

printf("val %d \n", getValeurBM(bm2));

deleteBM(&bm2);

printf("val %d \n", getValeurBM(bm2));

J'ai une erreur de windows comme quoi le programme s'est arrêté, une adresse interdite?

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  karemkadidola le Jeu 10 Nov 2011, 13:38

corriger déjà ceci et vois si ça marche mieux
d'après ton code quand tu fais "setsuivant" bm2 est sensé être un const BMaillon*,
tes deux methodes setsuivant et setprecedent pourquoi pas
(*m).suivant = suivant; et (*m).precedent = precedent;
enfin tu cherche à acceder au contenu d'un pointeur NULL
deleteBM(&bm2);
printf("val %d \n", getValeurBM(bm2)); et je pense c'est le plus gros problème..je ne sais pas à ta place comme ton main n'est pas long pourquoi pas rajouter les instructions sensé tester tes fonctions au fur à mesure jusque quand tu auras l'erreur...un moyen comme un autre de debugger en tout cas pour ce cas précis Very Happy


karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  smb le Jeu 10 Nov 2011, 14:20

Florent a écrit:Voici mes codes

Code:

/*
 * maillon.c
 *
 *  Created on: 2 nov. 2011
 *      Author: MX
 */

#include "maillon.h"
#include <stdio.h>


BMaillon * newBM(TVal val) {
   BMaillon * pBM = (BMaillon*)malloc(sizeof (BMaillon));
   if (pBM == NULL) {
      exit(0);
   }
   (*pBM).precedent = NULL;
   (*pBM).suivant = NULL;
   (*pBM).value = val; /* equivalent a unBMaillon->value */
   return pBM;
}

void deleteBM(BMaillon * * pm) {
   free(*pm);
   *pm = NULL;
}

TVal getValeurBM(const BMaillon * m) {
   return (*m).value;
}

BMaillon * getSuivantBM(const BMaillon * m){
   return (*m).suivant;
}

BMaillon * getPrecedentBM(const BMaillon * m){
   return (*m).precedent;
}

void setSuivantBM(BMaillon * m, const BMaillon * suivant) {
   (*m).suivant = (BMaillon *) suivant;

}

void setPrecedentBM(BMaillon * m, const BMaillon * precedent) {
   (*m).precedent = (BMaillon *) precedent;

}

void setValeurBM(BMaillon *m, TVal val) {
   (*m).value = val;
}


Code:

int main(void) {


BMaillon * bm = newBM(3);
BMaillon * bm2 = newBM(13);

printf("val %d \n", getValeurBM(bm));

setValeurBM(bm, 5);

setSuivantBM(bm, bm2);

printf("val %d \n", getValeurBM(bm2));

deleteBM(&bm2);

printf("val %d \n", getValeurBM(bm2));

J'ai une erreur de windows comme quoi le programme s'est arrêté, une adresse interdite?

Tu détruis le maillon pointé par bm2 :
Code:
deleteBM(&bm2);
... et ensuite tu veux en prendre sa valeur :
Code:
printf("val %d \n", getValeurBM(bm2));
... et tu t'étonnes d'un plantage !

Un conseil : place quelques précautions d'usage dans tes fonctions !

smb

Nombre de messages : 1035
Age : 64
Prénom : Stéphan
Statut : Don de sang, don de vie!
Localisation : Spy
Date d'inscription : 23/01/2007

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Florent le Lun 14 Nov 2011, 11:40

Oui en effet je comprends mieux pourquoi ça ne fonctionne pas merci de votre aide Very Happy

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

resolu Re: [C] TD4 exo BMaillon

Message  Contenu sponsorisé Aujourd'hui à 10:51


Contenu sponsorisé


Revenir en haut Aller en bas

Page 1 sur 2 1, 2  Suivant

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum