Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


commit:2011:10_29

Commit 2011-11-29

Correction du vecteur Oofelie. Le “mtMath::Vector” ne se comportait pas comme un “std::vector” au moment du resize ce qui était un peu contre-intuitif…

Comportement classique C++

Pour un std::vector, lorsqu'on resize un std::vector de taille n à une taille m<n, les m premiers éléments sont conservés et les (n-m) suivants sont désalloués. Si la nouvelle taille est supérieure, le std::vector est agrandi en mettant autant de copies que nécessaire d'une valeur donnée par l'utilisateur à la fin du std::vector.

Comportement du vecteur Offelie

Pour le vecteur Oofelie, les données n'était “normalement” pas conservées. Le fonctionnement était le suivant : - On désalloue le vecteur - On en réalloue un nouveau.

Si l'espace alloué est le même que l'espace désalloué et que l'on cherche à accéder aux valeurs précédement connues (avant le resize), on peut donc les récupérer. Si l'espace n'est pas le même, on peut récupérer à peu près tout et n'importe quoi, ce qui bien-sûr n'est pas trop souhaitable.

Correctif

J'ai changé la fonction resize pour qu'elle se comporte de manière équivalente à un std::vector. La seule différence est que si la nouvelle taille est supérieure, on alloue des 0 en fin de mtMath::Vector (on pourrait mettre un argument par défaut comme pour le std, mais pas sur que ce soit utile, surtout qu'ici on sait qu'on a que des valeurs numériques).

Le comportement est donc le suivant :

mtMath::Vector Fint ;
for(int i = 1 ; i < 9 ; i ++)
     Fint(i) = (double) i ;
Fint.write(std::cout);
Fint.resize(3);
Fint.write(std::cout);
Fint.resize(5);
Fint.write(std::cout);

Donnera en sortie :

Fint = [1 2 3 4 5 6 7 8]
Fint = [1 2 3]
Fint = [1 2 3 0 0]
commit/2011/10_29.txt · Last modified: 2016/03/30 15:23 (external edit)