Bonsoir, je désire créé un petit programme en C++ permettant de gérer des matrices mathématiques dans le but de le fournir à mon IUT pour qu'on puisse éventuellement en faire une sorte de dossier pédagogique.
Les classes Matrix et Lignes ont été implémentées et fonctionnent parfaitement.
Le problème intervient dans la partie user. En effet pour contenir toutes les matrices que l'user aura créé durant la session, j'utilise un vecteur (à titre pédagogique encore une fois), mais le soucis vient de la fonction push_back(), elle semble modifier les attributs des matrices que je lui envoie, pas toujours, mais souvent :
Exemple :
Code C++ : 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 vector<Matrix> vecMatrices; Matrix mat(1,1); // Création d'une matrice de 1 ligne et de 1 colonne. Matrix mat1(1,1); Matrix mat2(1,1); mat.setLigne(1, "1"); // A la ligne 1, la matrice a pour valeur : 1. mat1.setLigne(1, "2"); // A la ligne 1, la matrice a pour valeur : 2. mat2.setLigne(1, "3"); mat.afficher(); mat1.afficher(); mat2.afficher(); cout << "A" << endl; // Cette lettre permettra de bien distinguer les affichages. vecMatrices.push_back(mat); // Ajout des matrices. vecMatrices.push_back(mat1); vecMatrices.push_back(mat2); for(vector<Matrix>::const_iterator it = vecMatrices.begin() ; it < vecMatrices.end() ; it++) { (*it).afficher(); } cout << "B" << endl; // Idem
Affichage console :
Code Console : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1 2 3 A 1.49838e-038 1.49838e-038 3 B
Voilà, on peut émettre une hypothèse comme quoi ce seraient les constructeurs de copies des classes qui seraient responsables de ce problème, je vous les donne au cas où le problème viendrait de là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Matrix::Matrix(const Matrix &matrix) { m_lignes = new Ligne[matrix.m_nbLignes]; m_nbChiffresColonnes = new unsigned int[matrix.m_nbColonnes]; m_nbLignes = matrix.m_nbLignes; m_nbColonnes = matrix.m_nbColonnes; for(unsigned int i = 0 ; i < m_nbLignes ; i++) m_lignes[i] = matrix.m_lignes[i]; for(unsigned int i = 0 ; i < m_nbColonnes ; i++) m_nbChiffresColonnes[i] = matrix.m_nbChiffresColonnes[i]; }Merci beaucoup !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Ligne::Ligne(const Ligne &L) : m_nbValeur(L.m_nbValeur) { m_cellules = new float[m_nbValeur]; for(unsigned int i = 0 ; i < m_nbValeur ; i++) { m_cellules[i] = L.m_cellules[i]; cout << "1 " << m_cellules[i]; cout << "2 " << L.m_cellules[i]; } }
EDIT :
Cela me semblerait étonnant que cela soit dû aux constructeur de copies, je viens de faire un test et pourtant cela fonctionne très bien :
Affichage console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 vector<Matrix> vecMatrices; Matrix mat(3,3); mat.setLigne(1, "1,2,3"); mat.setLigne(2, "-1,-3,-5"); mat.setLigne(3, "1.2,0.66,-0.2"); Matrix mat1(mat); mat.afficher(); mat1.afficher();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 1 2 3 -1 -3 -5 1.2 0.66 -0.2 1 2 3 -1 -3 -5 1.2 0.66 -0.2
Partager