CLASS MATRICE EFFICACE

Signaler
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
-
Messages postés
13
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
11 août 2008
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47364-class-matrice-efficace

Messages postés
13
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
11 août 2008

Bonjour,

Juste une petite question :
Pourquoi tu ajoutes 1 au nombre d'entrées allouées dans le tableau?

exemple : ligne 240 => mat = new double[column * line + 1];

J'ai regardé en vitesse mais je n'ai pas trouvé où cette dernière valeur était utilisée.


Une deuxième remarque qui se rapporte un peu à la première :

Le test pour savoir si l'indice dans le tableau (opérateur []) est dans les limites est celui-ci :
if (i < 0 || i > (m_m * m_n)) throw ERROR_INVALID_PARAM;

Hors les indices valides sont entre 0 et m_m*m_n-1.
Si on admet que la valeur supplémentaire allouée ne sert à rien (et donc qu'on la supprime), il faut mettre un >= à la place du >

Me goure-je?



Sinon, j'aime bien ta classe. Ca semble rapide.
J'aurais préféré que l'aspect linéaire du stockage soit caché à l'utilisateur ( cf. l'opérateur []).
Cet opérateur pourrait plutôt renvoyer un pointeur sur le premier élément de la colonne (const double *).
Mais là, c'est une affaire de goût. ^_^
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008

"Ton operator = ne permet pas le standard c++ qui autorise la forme :
mat1 mat2 mat3;"

Intérêt de faire mat1 mat2 mat3; ?

"Pour parler de l'"efficacité", il reste le C et aucune classe." Ce que j'ai voulu faire à la base mais je parle d'efficacité car les algos sont en O(n^3) pas en O(n!) comme la pluparts des sources.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
23
...
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
23
Salut,

Ton operator = ne permet pas le standard c++ qui autorise la forme :
mat1 mat2 mat3;

Pour cela il te faut un constructeur par recopie conforme et un prototype de cette forme :
const Matrice& oparator = (const Matrice&);

De plus ton operator + en friend est inutile et pour la même raison il doit renvoyer une Matrice non constante par valeur :

Matrice operator + (const Matrice&);

De mon point de vue il est beaucoup plus lisible de declarer un pointeur vers un tableau à 2 dimentions :

double** m_pMat;

car les differents calculs seront plus lisibles avec le double operateur d'extraction
(m_pMat[0][1]) et le compilateur ne verra pas la difference (linéaire en mémoire...)

Pour parler de l'"efficacité", il reste le C et aucune classe. Beaucoup moins générique mais certainement plus efficace :

typedef float MAT4x4[4][4];

Les fonctions ou MACROs pour toutes les primitives, ex :

inline void copie_matrice(MAT4x4 source, MAT4x4 dest)
{
memcpy(dest, source, sizeof(MAT4x4));
}

Sinon je te mets 6 pour le partage.
Afficher les 13 commentaires