Erreur en prog C++
Résolu
thedarkant
-
thedarkant -
thedarkant -
Bonjour,
Ca fait plusieurs heures que je me prends la tête avec un truc qui, j'en suis persuadé, va faire "a mais oui bien sûr" quand j'aurai eu la solution. Le problème c'est que je suis encore trop newbie pour décoder tout ce que ma petite bête (entendre, mon pc) m'envoie comme message.
J'ai donc écrit le programme suivant en C++, qui définit une classe de vecteur lorsqu'on lui donne la dimension et un pointeur pointant une liste de nombres (de la même dimension)
Le problème, c'est que lorsque j'execute ce programme, au lieu de me dire que tout va bien, il me dit : "glibc detected double free or corruption" avec tout un blabla derrière. J'ai cherché sur google, j'ai relu mon prog voir si je n'avais pas une erreur de segmentation, mais rien à faire.
Quelqu'un éclairerait ma lanterne ?
Cordialement,
AB
Ca fait plusieurs heures que je me prends la tête avec un truc qui, j'en suis persuadé, va faire "a mais oui bien sûr" quand j'aurai eu la solution. Le problème c'est que je suis encore trop newbie pour décoder tout ce que ma petite bête (entendre, mon pc) m'envoie comme message.
J'ai donc écrit le programme suivant en C++, qui définit une classe de vecteur lorsqu'on lui donne la dimension et un pointeur pointant une liste de nombres (de la même dimension)
Le problème, c'est que lorsque j'execute ce programme, au lieu de me dire que tout va bien, il me dit : "glibc detected double free or corruption" avec tout un blabla derrière. J'ai cherché sur google, j'ai relu mon prog voir si je n'avais pas une erreur de segmentation, mais rien à faire.
Quelqu'un éclairerait ma lanterne ?
Cordialement,
AB
#include <cstdlib> #include <iostream> #include <climits> #include <cfloat> #include <cmath> using namespace std; class Vector { int ndim; double* data; public: Vector(int n, double d[]) { ndim=n; for (int i=0; i<ndim; i++){ data= new double[n]; d[i]=(*data); } }; ~Vector() { for (int i=0; i<ndim; i++) { delete[] data; } }; Vector& operator+=(const Vector& q); Vector& operator-=(const Vector& q); double operator[](int i) const { return data[i]; }; friend Vector operator+(const Vector& p,const Vector& q); friend Vector operator-(const Vector& p,const Vector& q); friend double operator*(const Vector& p,const Vector& q); friend ostream& operator<<(ostream& s, Vector& p); }; int main(int argc, char *argv[]) { double l[]={1.0,2.0,3.0,4.0}; Vector (4, l); system("PAUSE"); return EXIT_SUCCESS; } Vector& Vector::operator+=(const Vector& a) { for(int i=0; i<a.ndim; i++){ data[i]+=a[i]; } return *this; } Vector& Vector::operator-=(const Vector& a) { for(int i=0; i<a.ndim; i++){ data[i]-=a[i]; } return *this; } Vector operator+(const Vector& a,const Vector& b) { double d[a.ndim]; for(int i=0; i<a.ndim; i++){ d[i]=a[i]-b[i]; } return Vector(a.ndim, d); } Vector operator-(const Vector& a,const Vector& b) { double d[a.ndim]; for(int i=0; i<a.ndim; i++){ d[i]=a[i]+b[i]; } return Vector(a.ndim, d); } double operator*(const Vector& a,const Vector& b) { double s=0; for(int i=0; i<a.ndim; i++){ s+=a[i]*b[i]; } return s; } ostream& operator<<(ostream& s, Vector& a) { s << '(' <<a[0]; for(int i=0; i<a.ndim; i++) { s << ',' << a[i]; } return s << ')'; }
A voir également:
- Erreur en prog C++
- Erreur 0x80070643 - Accueil - Windows
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
- Erreur de lecture reconnecté en 3s - Forum TV & Vidéo
3 réponses
Moi non plus je ne comprends pas ce que tu veux faire dans le constructeur; j'aurais plutôt tendance à écrire:
Vector(int n, double d[]) : ndim(n) { data = new double[n]; for (int i=0; i<ndim; i++) data[i] = d[i]; }Ce n'est qu'une idée.. mais de toutes les façons, pour le destructeur j'aurais écrit:
~Vector() { delete[] data; }Bonne continuation.
Salut,
je suis pas un expert c++...
mais ca pourra peut-etre t'aider:
je t'avouerai que j'ai pas compris ce que tu as voulu faire dans ton constructeur.....
for (int i=0; i<ndim; i++){
data= new double[n];
d[i]=(*data);
}
@+
je suis pas un expert c++...
mais ca pourra peut-etre t'aider:
class Vector { int ndim; double* data; public: Vector(int n, double d[]) { ndim=n; data= new double[n]; for (int i=0; i<ndim; i++){ data[i] = d[i]; } }; ~Vector() { for (int i=0; i<ndim; i++) { delete[] data; } }; void affiche(); }; int main(int argc, char *argv[]) { double l[]={1.0,2.6,3.5,4.9}; Vector v(4, l); v.affiche(); return EXIT_SUCCESS; } void Vector::affiche() { for(int i=0; i<this->ndim; i++) { cout<< data[i]<<";"; } }
je t'avouerai que j'ai pas compris ce que tu as voulu faire dans ton constructeur.....
for (int i=0; i<ndim; i++){
data= new double[n];
d[i]=(*data);
}
@+
Mon constructeur prends pour arguments la dimension (n) et un pointeur (sur une liste) préalablement défini (d). Je copie donc les coordonnées du vecteur (qui sont dans la liste) dans une nouvelle liste sur le freestore. d'où le " data = new double[n] " qui crée la liste sur le freestore et la boucle qui rentre les valeurs dedans.
Pas d'accord ?
Pas d'accord ?
voila ce qui arrive lorsqu'on passe sa journée à coder et qu'on n'est qu'un pauvre étudiant perdu dans un pays étranger ...
En effet, c'était le destructeur qui partait en sucette. Ne me demanedz pas pourquoi j'avais mis un boucle là dessus, je n'en sais rien, mais alors rien du tout !!
En tout cas merci beaucoup !! Ca va m'éviter de passer encore 3h dessus sans trouver parce que c'est trop évident ...
Encore merci !!
(C)++
En effet, c'était le destructeur qui partait en sucette. Ne me demanedz pas pourquoi j'avais mis un boucle là dessus, je n'en sais rien, mais alors rien du tout !!
En tout cas merci beaucoup !! Ca va m'éviter de passer encore 3h dessus sans trouver parce que c'est trop évident ...
Encore merci !!
(C)++