Bonjours a tous;
Je suis en train de me faire un petit script de calcul matriciel dynamique... et la je seche... j'ai pas mal de modifications en cours.. d'ou certaine lourdeur et inutilité diverse... mais l'erreur qui me stress concerne une fonction amie de generation aleatoire de matrice que le compialteur trouve en non-template alors que je pensais l'avoir bien specifiée...
ps : y'a surement enormement d'erreur, j'ai bien avancé mais y'a encore du taf... et cette erreur me bloque un peu... si quelqu'un pouvais jetter un petit coup d'oeil je lui serais grandement reconnaissant !!
voila ma class :
la fonction qui me stressssssss :
Code : 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
27
28
29
30
31
32
33
34
35
36 //definition d'une structure matricielle en template //contenant un pointeur de pointeur de type Template //but : allouer un tableau de pointeur de l ligne // contenant l'adresse d'un tableau de Telmt de c colonne //acces naturel comme un tableau multidimensionnel template <typename Telmt> struct Mat { Telmt ** mat; }; // definition de la classe matrice en template //taille -> tableau prenant en premier le nombre de ligne // en deuxieme le nombre de colonne, ordre naturel ! //A pointeur de type Telmt vers ma structure mat template <typename Telmt> class matrice { int taille[2]; Mat<Telmt> * A; public: matrice(); matrice(int, int); matrice( const matrice &); ~matrice(); void saisie(int , int, Telmt); void generer(); void afficher(); Telmt donnee( int, int); friend matrice operator+( matrice &, matrice &); /<<<--- friend matrice operator*( matrice &, matrice &); /<<<--- ce sont ces deux là quie me renvoie un warning... 8O };
La fonction saisie
Code : 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 template<class Telmt> matrice<Telmt> operator+( matrice<Telmt> &M1, matrice<Telmt> &M2) { if ( M1.taille[0] == M2.taille[0] && M1.taille[1] == M2.taille[1] ) { matrice<Telmt> S( M1.taille[0], M1.taille[1] ); for (int l = 0; l < M1.taille[0]; l++) { for (int c = 0; c < M1.taille[1]; c++) { S.saisie( l, c, (M1.donnee( l, c) + M2.donnee( l, c)) ); } } return S; } else cout << " On additionne des matrices de taille identique, arrete de jouer ! " << endl; }
Les constructeurs :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template <typename Telmt> void matrice<Telmt>::saisie( int ligne, int colonne, Telmt valeur) { cout << "fonction membre saisie ---- " << endl; A->mat[ligne][colonne] = valeur; //dbg(3) }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template <typename Telmt> matrice<Telmt>::matrice() { cout << "constructeur par defaut ----" << endl; taille[0] = 0; taille[1] = 0; A = NULL; dbg(1) }Le constructeur par copie :
Code : 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 template <typename Telmt> matrice<Telmt>::matrice( int ligne, int colonne) { cout << " constructeur l/c specifie ----" << endl; taille[0] = ligne; taille[1] = colonne; dbg(2) cout << "Test ligne/colonne : " << taille[0] << " , " << taille[1] << endl; A = new Mat<Telmt>; A->mat = new Telmt *[(taille[0])];dbg(21) if (A->mat != NULL) { for (unsigned short l = 0; l < taille[0]; l++) A->mat[l] = new Telmt [(taille[1])]; cout << " Allocation d'une matrice de " << taille[0] << " ligne(s) et de " << taille[1] << " colonne reussi !!." << endl; for (unsigned short l = 0; l < taille[0]; l++) { for (unsigned short c =0; c < taille[1]; c++) A->mat[l][c]=0; } } else cout << " A->mat NULL ... " << endl; dbg(22) }
fonction donnee
Code : 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
27 template <typename Telmt> matrice<Telmt>::matrice( const matrice<Telmt> & M) { cout << " Entree dans le constructeur par copie ----" << endl; taille[0] = M.taille[0]; taille[1] = M.taille[1]; if ( M.A == NULL ) A = NULL; else { A = new Mat<Telmt>; A->mat = new Telmt *[taille[0]]; for (unsigned short l = 0; l > taille[0]; l++) A->mat[l] = new Telmt [taille[1]]; if ( A != NULL) { for (unsigned short l=0; l < taille[0]; l++) for (unsigned short c = 0; c < taille[1]; c++) saisie( l, c, M.donnee( l, c ) ); // <<<<<<<------- erreur !!! } else cout << " mauvaise allocation constr copie\n"; } cout << " sortie constructeur par copie ! " << endl; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 //fonction membre recuperation donnee template <typename Telmt> Telmt matrice<Telmt>::donnee( int ligne, int colonne) { return ( A->mat[ligne][colonne] ); }
Partager