[Dcmlib] [Fwd: patch]
Mathieu Malaterre
mathieu.malaterre at kitware.com
Mon Jun 21 16:31:25 CEST 2004
ca marche avec mon g++ 3.3, qu'est ce que ca dis chez toi ?
#include <iostream>
#include <string>
class foo {
public:
foo(bool bar);
foo(const char* bar, bool bar1=false, bool bar2 = false);
};
foo::foo(bool bar)
{
(void)bar;
std::cout << "bool constructor" << std::endl;
}
foo::foo(const char* bar, bool bar1, bool bar2)
{
(void)bar;
(void)bar1;
(void)bar2;
std::cout << "const char constructor" << std::endl;
}
int main(int argc, char* argv[])
{
std::string s = "hello";
foo* f = new foo( s.c_str() );
return 1;
}
Eric Boix wrote:
> 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