Erreur en prog C++

Résolu
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

#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 << ')';
}



3 réponses

loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
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.
2
cherche_toujours_un_pseudo
 
Salut,
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);
}
@+
1
thedarkant
 
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 ?
0
thedarkant
 
Enfin c'est vrai que c'était écrit n'importe comment ... Maintenant c'est mieux. C'est quand même bête ce que parfois les choses simples peuvent devenir compliquées dés lors qu'on est crevé. Juste avant j'avais fini un code autrement plus compliqué pour moi. !! lol
0
thedarkant
 
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)++
0