J'essaye de faire une classe pour du calcul matriciel et mon problème est que pour une opération du type : n = m * m, le destructeur du m * m calculé est appelé avant l'opérateur = et donc au moment de parcourir la matrice pour l'opérateur =, j'ai un segment fault
Et ma question est donc : comment contourner ce problème ?
L'opérateur *:
Matrix operator*(Matrix & m1, Matrix & m2)
{
Matrix buf(m2.get_w(), m1.get_h());
if (m1.get_w() == m2.get_h())
{
for (int i = 0; i < m2.get_w(); i++)
for (int j = 0; j < m1.get_h(); j++)
for (int k = 0; k < m2.get_h(); k++)
buf.set(i, j, buf.get(i, j) + m1.get(k, j) * m2.get(i, k));
}
return buf;
}
L'opérateur = :
Matrix &Matrix::operator=(Matrix m)
{
if (_mat != nullptr)
{
for (int i = 0; i < _w; i++) delete _mat[i];
delete _mat;
}
_w = m.get_w(); _h = m.get_h();
if (_w * _h != 0)
{
_mat = new double*[_w];
for (int i = 0; i < _w; i++)
_mat[i] = new double[_h];
for (int i = 0; i < _w; i++)
for (int j = 0; j < _h; j++)
_mat[i][j] = m.get(i, j);
}
return *this;
}
Merci d'avance
Edit : il manquait simplement le constructeur de copie
- Edité par kickflip1408 23 octobre 2018 à 0:08:06
N'utilise pas new et delete à moins de bien savoir ce que tu fais. Formellement, ton opérateur "=" est faux parce que tu ne considères pas les exceptions.
Et pour ton opérateur d'ailleurs, regarde du côté de l'diome copy and swap.
Utiliser les new[] et delete[] est quelque chose à éviter car on a mieux et moins risqué. Néanmoins pourquoi pas. Il faut alors à tout prix bien comprendre certains concepts: a) la const correctness (en gros comment bien utiliser le mot const.) b) les divers types de paramètre (par exemple : par référence, par copie, ...) c) les 3 fonctions spéciales (devenues 5 depuis le C++11.)
Ton exemple , si j'ai bien compris, ça plante en voulant récupérer le résultat de la multiplication de 2 matrice
Si tu essaies de multiplier 3 matrices, ça ne compile pas. Pourquoi?
En ajoutant le constructeur de copie, ça ne plante plus. As-tu compris pourquoi? Ton opérateur= a besoin du constructeur de copie. Tel que tu l'as créé il reçoit un paramètre par copie. Donc pour copier une matrice, on crée une copie qui est passée en paramètre pour être ensuite copiée dans ton opérateur. Il y a deux fois copie!
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C
En recherche d'emploi.
Discord NaN. Mon site.