Bonjour à tous ,
j'utilise une File dans mon code C++.
quelqu'un me propose une solution pour copier les élements d'une file dans une autre .
merci d'avance pour l'aide .
Bonjour à tous ,
j'utilise une File dans mon code C++.
quelqu'un me propose une solution pour copier les élements d'une file dans une autre .
merci d'avance pour l'aide .
Bonjour,
je pense ce que cela pourra t'aider
voici le fichier File.cc
le code génère une erreur lorsque j'appelle la méthode Enfiler()
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #include <stdio.h> #include "File.h" File::File ( int taille ) // Constructeur { window = new int [taille]; } File::~File () { delete []window; } // destructeur void File::ViderFile () { for(int i=0;i<taille;i++) { window[i]=0; } } void File::Enfiler ( const int & element ) { if (FilePleine()) int x = Defiler(); int indice = dernier_indice(); window[indice] = element; } int File::Defiler () { if ( FileVide() ) printf("erreur la file vide"); int x = window[0]; Decaler_tableau(); return x ; } int File::PremierElement () const { if ( FileVide() ) printf("erreur la file vide"); return window[0]; } bool File::FileVide () const { int nbre_element = 0 ; for (int i=0;i<taille;i++) if (window[i]==0) { nbre_element ++; } if (nbre_element == taille ) return 1; else return 0; } bool File::FilePleine () const { int nbre_element = 0 ; for (int i=0;i<taille;i++) if (window[i]!=0) { nbre_element ++; } if (nbre_element == taille ) return 1; else return 0; } int File::get_element(int position) { return window[position]; } int File::dernier_indice() { for (int i=0;i<taille;i++) if (window[i]==0) { return i; break; } } void File::Decaler_tableau() { for (int i=0;i<taille;i++) window[i]=window[i+1]; } File File::copie_file() { File copie = File(taille); int i=0 ; for (int i=0;i<taille;i++) { copie.Enfiler(window[i]); } return copie; }
merci de m'aider à trouver la source d'erreur .
Tu as une erreur de segmentation dans la fonction decaler_tableau() qui est appelée par défiler()
Je ne peux que te conseillais d'utiliser les conteneurs de la STL
Tu sors de ton tableau
Les bornes d'un tableau c'est entre 0 et taille -1 hors là à la dernière itération...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void File::Decaler_tableau() { for (int i=0;i<taille;i++) window[i]=window[i+1]; //bim }![]()
Salut,
à première vue, il y a un problème d'indice en fin de cette boucle :
je la limiterais à taille-1 , mais je n'ai pas vu le reste du code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void File::Decaler_tableau() { for (int i=0;i<taille;i++) window[i]=window[i+1]; }
et maintenant , ça va ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void File::Decaler_tableau() { for (int i=1;i<taille;i++) window[i-1]=window[i]; }
oh lala!!
maintenant je trouve une autre erreur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected *** ns: double free or corruption (fasttop): 0x095e2fe8 ***
Si ca plante pu oui
mais oui en tout cas il n'y a pu d'erreurs ici
edit : montre ton header
Donc après je sais pas si c'est vraiment propre ta façon de procéder.Si la variable MALLOC_CHECK_ vaut zéro, toutes les corruptions du tas détectées sont ignorées silencieusement
ça ne marche pas tout le temps !!!!!!!!!!!!!!!!!!
donc voyons le fichier File.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 // fichier File.h // déclaration de la classe File #ifndef FILE_H #define FILE_H //#include "ant_pkt.h" const int Taille_de_File = 50 ; class File { public : File ( int taille = Taille_de_File ) ; // Constructeur ~File () ; // destructeur void ViderFile (); void Enfiler ( const int & ); int Defiler () ; int PremierElement () const; bool FileVide () const; bool FilePleine () const; int get_element(int position); int dernier_indice(); void Decaler_tableau(); File copie_file (); private : int taille; int *window;// tableau contenant les éléments de la file }; #endif
Je dirai bien que tu delete quelque chose qui a déjà été delete ou quelque chose dans cette idée.
Donc si c'est bien a cause de ca que cette erreur est généré montre nous ton main()![]()
j'ai pas de main() , en fait je travaille avec le simulateur ns2 , j'avais juste besoin d'une file dans protocole que je suis entrain d'implémenter .
je ne vois pas l'origine du double free à partir du header, peut être un objet de type File a été alloué dynamiquement et détruit plusieurs fois
il y a peut être un cas (peu probable mais bon) : la variable membre taille n'est initialisée nulle part
donc si on instancie un objet de type File et qu'on le duplique (File::copie_file()) , je crains une alloc qui ne passera pas ( taille = ?)
en plus celle fonction renvoie par valeur et le copy-constructor (généré par le compilo) dans ce genre de code :
fera que firstFile et newFile pointeront vers la meme adresse window, et là le plantage est assuré au delete des deux
Code : Sélectionner tout - Visualiser dans une fenêtre à part File newFile = firstFile.copie_file();
après tout cela n'est qu'hypothèses, si c'est avéré :
remplate copie_file par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 const File& operator=(const File& source) { taille = source.taille; delete[] window; window = new int [taille]; for (int i=0;i<taille;i++) window[i]=source.window[i]; return *this; }
les fonctions qui utilisent taille sont à observer également,
à moins que l'initialisation de File::taille me soit passée sous le nez
Non, ce n'est évidemment pas la bonne façon de procéder. On peut mettre les balayures sous le tapis quand on balaye une pièce, mais si on fait ça, on aura pas nettoyé (l'objectif ne sera pas atteint).Si la variable MALLOC_CHECK_ vaut zéro, toutes les corruptions du tas détectées sont ignorées silencieusement
C'est effectivement la bonne façon de procéder.
Partager