Bonjour à tous.
J'ai un problème assez inexpliqué, le programme s'arrete abruptement
sur un stack smashing detected.
M'étant renseigné, j'ai compris que ce terme signifie qu'on a écrasé une zone
en mémoire qu'on n'aurait pas du...
Par contre pas moyen de comprendre pourquoi mon code persiste à le faire.
L'idée du code : Lire dans un fichier en mode binaire, deux structures
contenant des champs de type int et short (il s'agit de fichier bitmap
et des structures INFOHEADER et FILEHEADER, mais ca n'a pas d'importance ici).
Pour ca pas de problème, j'ai fait un essai et ca marchait très bien !
Mais mon code était plus du C que du C++.
J'ai donc voulu obtenir un code plus propre, plus objet, en créant une classe BmpEnTete. Elle contient deux attributs, de type struct INFOHEADER et struct FILEHEADER. J'ai créer un constructeur qui prend en paramètre un nom de fichier, et j'ai mis dedans exactement le code que j'avais pour la lecture et qui MARCHAIT.
Et maintenant ca foire...
J'ai isolé le problème avec des cout, le constructeur s'exécute bien jusqu'a
la dernière ligne, et dès qu'on "revient" dans le main, crack !
Je ne sais pas si cela a une importance, je suis sous Linux-Ubuntu.
Quelqu'un a une idée qui lui saute au visage ?
Voila. Ca écrit bien "fin constructeur", puis stack truc...
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
99
100
101
102
103
104
105
106
107
108
109
110
111 #pragma pack( push,1 ) // OBLIGATOIRE ! Empeche le compilateur d'aligner #include <fstream> #include <iostream> #include <cstdlib> #include <string> using namespace std; /* LA STRUCTURE DU PREMIER EN-TETE */ struct BMPFILEHEADER { short bfType; int bfSize ; short bfReserved1 ; short bfReserved2 ; int * bfOffBits ; }; /* LA STRUCTURE DU SECOND EN-TETE */ struct BMPINFOHEADER { int biSize; int biWidth; int biHeigth; short biPlanes; short biBitCount; int biCompression; int biSizeImage; int biXpelsPerMeter; int biYpelsPerMeter; int biClrUsed; int biClrImportant; }; class BmpEnTete { private: BMPFILEHEADER fh; BMPINFOHEADER ih; public: BmpEnTete() {} ; // Par défaut BmpEnTete(char * nom_fichier, bool & succes) { // A partir d'un nom de fichier ifstream FileIn; succes = true; FileIn.open(nom_fichier, ios_base::binary); if ( FileIn.is_open() ) { FileIn.read( reinterpret_cast<char*>(&fh), sizeof(BMPFILEHEADER) ); FileIn.read( reinterpret_cast<char*>(&ih), sizeof(BMPINFOHEADER) ); /* Le nombre de caractère lus par la derniere opération est-t-il correct ? */ succes = ( FileIn.gcount() == sizeof(BMPINFOHEADER) ); // Bien passé ? FileIn.close(); } else succes = false; cout << "fin constructueur" << endl; return; } short get_bfType() { return fh.bfType; } int get_bfSize() { return fh.bfSize; } }; int main(int argc, char * argv[]) { int taille; bool succes; BmpEnTete en_tete(argv[1], succes); cout << "apres construction" << endl; if (succes) { taille = en_tete.get_bfSize(); cout << "taille du fichier : " << taille << endl; } else cout << "l'ouverture du fichier a échouée" ; return EXIT_SUCCESS; }
Je précise que même en commentant les lignes FileIn.read... (et le .gcount()), enfin en gros en ne gardant que l'ouverture/fermeture du fichier l'erreur reste la même. Ce n'est donc aucunement un problème lié à la lecture même dans le fichier.
Partager