Erreur en prog C++

Résolu/Fermé
thedarkant - 7 déc. 2010 à 21:08
 thedarkant - 8 déc. 2010 à 00:11
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 dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
Modifié par loupius le 7/12/2010 à 21:55
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
7 déc. 2010 à 21:37
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
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
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
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