[Dcmlib] [Fwd: patch]

Eric Boix Eric.Boix at creatis.insa-lyon.fr
Mon Jun 21 12:06:30 CEST 2004


	Salut Mathieu,

Quoting Mathieu Malaterre <mathieu.malaterre at kitware.com>:
>   je suppose que vous avez vu passer les logs, donc voila je vous faire
> du décès prematuré de gdcmHeaderHelper.
Well done ! RIP gdcmHeaderHelper.

> Tout ca pour dire que mon dernier bout de patch ne marche pas
> (cf gdcm2.patch). Je peux pas 'string constifier' gdcmDicomDir.
> Est-ce que le constructeur est cense modiifer cette chaine de caractere ?
> En tout cas j'aimerais bien qu'on m'explique ce qui ne va pas
Je presume que ce qui te fait dire que cela ne va pas, c'est que ctest
rapporte que PrintDicomDir (entre autres) echoue. Supposons que c'est cela.

cd gdcmbin (la ou tu a compile' gdcm)
nm --demangle --print-file-name Test/*.o | grep gdcmDicomDir::gdcmDicomDir
  Test/PrintDicomDir.o:         U gdcmDicomDir::gdcmDicomDir(bool)
  ...
Moralite', c'est le "mauvais" constructeur qui est appele' i.e.
gdcmDicomDir(bool) au lieu de gdcmDicomDir(std::string&, bool, bool).
A l'invocation dans Test/PrintDicomDir.cxx, on a:
   std::string file;
   e1 = new gdcmDicomDir(file.c_str());
Si tu remplaces la deuxieme ligne par
   e1 = new gdcmDicomDir(file);
alors c'est le "bon" constructeur qui est appele', et Test/PrintDicomDir
fonctionne a nouveau.
Moralite', il y a conversion implicite de
gdcmDicomDir(char*) en gdcmDicomDir(bool) au lieu de ce que l'on
pourrait attendre i.e. gdcmDicomDir(std::string&, bool, bool).
J'ai essaye' de declarer gdcmDicomDir(bool) en explicit dans
src/gdcmDicomDir.h mais, etonnament, cela ne regle pas le pb.
In fine, il faut changer tout les appels au constructeur gdcmDicomDir(char*)
en des gdcmDicomDir(std::string&, bool, bool), et la liste t'es donne'e par
la commande nm ci-dessus, en l'occurence
  Test/BuildUpDicomDir.cxx
  Test/makeDicomDir.cxx
  Test/PrintDicomDir.cxx
  Test/TestDicomDir.cxx
et ton patch devrait fonctionner. Je n'ai pas integre' ton patch, mais
dis moi si souhaites que je le fasse ou si tu t'en charge.

Remarque amusante: en cherchant la cause de tes deboires, j'ai decouvert
le flag -felide-constructor de g++ qui evite une double copie du string
dans le cas semblables au cas suivant:
string foo()
{
   string bozo;
   ...do some shit with bozo...
   return bozo;
}

main(){
  string a = foo();    /// <== double copy
}
Je regarde si cela ameliore mes pb de fuite memoire, bien que la solution
ne soit pas portable...

> (surtout qu'il est tard et que j'arrive pas a reflechir).
Cafeine is your friend ;-] Amphetamine is your enemy.

> Ps: Good job, mes test ITK marchent au poil merci a tout le monde.
Hummm, il faut vraiment que l'on fasse une vrai test suite inte'gre'e
a ctest. Apres ton commit, ctest passait droit devant, mais pourtant
./bin/gdcmTest Test/WriteSimple $(GDCM_DATA)/dicom-sc_cs-1.dcm foo.dcm
se plantait lamentablement (pour les memes raisons qui font que ton
patch gdcm2.patch ne fonctionne pas). Or ctest ne voit pas de pb...
   Il m'ai deja arrive' deux fois de faire des commit recents en me
basant sur ctest, avant de decouvrir des conneries. Hummm, nicht good.
   Je regarde cela d'un peu plus pres, a commencer par la conversion
de la test suite python...

	Merci a toi.
	Eric.



More information about the Dcmlib mailing list