Metafor

ULiege - Aerospace & Mechanical Engineering

User Tools

Site Tools


commit:2011:10_29

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

commit:2011:10_29 [2011/11/04 18:04] – créée biotteaucommit:2011:10_29 [2016/03/30 15:23] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +===== 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 :
 +
 +<code>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);</code>
 +
 +
 +Donnera en sortie :
 +
 +<code>
 +Fint = [1 2 3 4 5 6 7 8]
 +Fint = [1 2 3]
 +Fint = [1 2 3 0 0]</code>

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki