[Dcmlib] GDCM commit

Mathieu Malaterre mathieu.malaterre at kitware.com
Wed Jun 23 21:52:24 CEST 2004


En fait ton lien s'applique aux fonctions non-membre. Les fonctions dont 
je parlais etait membre de classes gdcm.

Mais sinon pour les fonctions non membres, je suis d'accord il faut bien 
sur mettre 'inline'

Mathieu

Jean-Pierre Roux wrote:
> Mathieu Malaterre wrote:
> 
>>Salut,
>>
>>   J'ai fais des commit, rien de tres spectaculaire, juste j'ai beaucoup de mal a lire les sources de gdcm. Est-ce qu'on peut se mettre d'accord sur certaines convention d'ecriture:
>>
> 
> Pas d'objection à tes suggestions, SAUF pour les inline.
> 
> Le code complet de la fonction doit effectivement être dand le .h (on 
> est bien d'accord : le compilo ne pourrait pas intégrer le code 
> directement dans l'application appelante s'il ne le connait pas  --> 
> unresolved external lors du link)
> 
> Mais si elle n'est pas déclarée inline, elle sera traitée comme une 
> fonction normale (pas inline)
> 
> le lien
> http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.8
> donne une description parfaitement confusionniste à ce sujet.
> 
> --------------------------------------------------------------------------------------------------
> 
> 
>       [9.6] How do you tell the compiler to make a non-member function
>       inline?
> 
> When you declare an inline function, it looks just like a normal function:
> 
>  void f(int i, char c);
> 
> ===> Puisque la définition se fait en même temps que la déclaration, à 
> quoi ça sert de présenter les deux, de manière contradictoire ?!?
> 
> But when you define an inline function, you prepend the function's 
> definition with the keyword inline, and you put the definition into a 
> header file:
> 
>  inline
>  void f(int i, char c)
>  {
>    /.../
>  }
> 
> Note: It's imperative that the function's definition (the part between 
> the {...}) be placed in a header file, unless the function is used only 
> in a single .cpp file. In particular, if you put the inline function's 
> definition into a .cpp file and you call it from some other .cpp file, 
> you'll get an "unresolved external" error from the linker.
> 
> --------------------------------------------------------------------------------------------
> 
>>
>>
>>- pas de printf
>>- pas de parentheses aux return:
>>return true;
>>au lieu de
>>return(true);
>>
>>- pas besoin de void quand la fonction ne prend pas de parametre:
>>
>>foo()
>>au lieu de
>>foo(void)
>>
> 
>>
>>- le parenthesage:
>>
> Ca a l'air d'être un problème religieux !
> Il faut qu'on réunisse un web-concile à ce sujet, car il est clair que 
> s'il y a deux chapelles dans le Labo, dont les affidés font des modifs 
> en sens inverse chaque fois qu'ils ouvrent un .cxx, on n'est pas prêt de 
> s'en sortir !
> 
>>
>>
>>void foo() {
>>...
>>}
>>
>>au lieu
>>
>>void foo()
>>{
>>...
>>}
>>
>>- Est-ce que "virtual" est repete meme dans les classes heritees (convention d'ecriture car non necessaire).
>>
>>- Il n'y a besoin de specifier explicitement 'inline' lorsqu'une methode est implementee dans la classe (fichier header).
>>http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.8
>>
> Voir ma remarque + haut.
> 
>>
>>
>>- Tolere pour l'instant: sprintf, FILE*
>>Mais j'aimerais passer a une approche plus C++ avec les iostream dans l'avenir
>>
> 
> A part le fait de compliquer l'écriture, ça a un réel intérêt les iostream ?
> 
>>
>>
>>Je ne reproche rien a personne, je me porte meme volontaire pour les faire. Donc est-ce que ca vous va ou vous voulez des choses differentes?
>>
>>
>>---
>>
>>Sinon plus grave je suis tombe sur ca dans gdcmFile:
>>
>>1.
>>
> Bien d'accord.
> Il y a des modifs 'profondes' à faire la-dedans (qui ne changeront pas 
> l'API)
> 
>>
>>
>>void * gdcmFile::GetImageDataRaw () {
>>  if (Header->HasLUT())
>>     /// \todo Let gdcmHeadar user a chance to get the right value
>>       /// Create a member lgrTotaleRaw ???
>>     lgrTotale /= 3;
>>  PixelData = new unsigned char[lgrTotale];
>>...
>>
>>Ca veut dire que plus j'appelle cette methode plus la taille de l'image est petite.
>>Plus serieusement, on peut pas simplifier les var membres de gdcmFile.
>>Ex1:
>>  gdcmHeader *Header;
>>  bool SelfHeader;
>>
>>Y'a t'il vraiment besoin du booleen, est-ce qu'on ne peut pas directement regarder si Header est different de NULL ?
>>
>>Ex2:
>>void* PixelData;
>>Est-ce que ce membre va disparaitre vu que l'image est dans le Header (cf dernier mail de JP).
>>
>>Ex3:
>>  size_t lgrTotaleRaw;
>>  size_t lgrTotale;
>>  int PixelRead;
>>  int Parsed;
>>
>>Je suppose que c'est liee a la question 2, mais qd meme on ne peut pas avoir une seule lgtTotale. Pour moi l'operation de tra
>>nformation via lookup table est commande par l'utilisateur. Ca veut dire qu'un volume va etre cree a la demande de l'utilisateur qd l'image a une lookup table
>>et qu'il veut appliquee celle la.
>>
> En fait, c'est lorsqu'on a une image gray level + LUT qu'on 'fabrique' 
> une zone mémoire contenant une image RGB, par GetPixelData, ou une image 
> Gray Level, par GetPixelDataRaw.
> 
>>
>>Autre ex, si on lit + ecrit l'image est-ce que l'on veut vraiment appliquee la lookup table a l'image ? 
>>
> Lorsqu'on réécrit l'image, c'est forcement l'image avec des pixels RGB :
> - si elle était stockée sous forme Plan R+ Plan G + Plan B, ou sous 
> forme de pixels YBR, ce qui n'est pas génant dans ce cas là,
> - si elle était stockée sous forme de GrayLevel + LUT, et là, ça se discute
> 
>>En plus vu qu'il n'y a qu'un seul void* PixelData si l'utilisateur demande d'abord le volume raw puis le volume filtree puis encore le volume raw on ne peut pas mettre en cache les volumes precalcules.
>>
>>2.
>>
>>Le choix unsigned char vs char semble complement arbitraire. Par defaut sur toutes les plateformes (sauf SUN), char est signed donc il y a bien une difference. Est-ce qu'on peut donc tout passer en unsigned char ?
>>
>>3.
>>
>>
>>C'est quoi: bool ParsePixelData(); Normalement VC++ ne sait pas gerer les fonctions non implementees...
>>
> C'est une fonction qui inspecte l'organisation du Dicom Element des Pixels
> En cas d'embedded JPEG, ou embedded RLE, ca peut relever d'un foutoir 
> sans nom - soit des trucs qui ressemblent à des SQItems dans  etre dans 
> un SeqEntry et qui contiennent les 'JPEG fragments', soit une table de 
> longueur variable contennant l'offset du début de chaque fragment, etc.
> Elle n'est pas appellée dans la dcmLib elle même, seulement dans un 
> exécutable. Elle est précieuse pour savoir si une image Jpeg qui pête a 
> une description kasher pour son Pixel Element.
> La méthode  se trouve dans :
> gdcmParsePixels.cxx
> comme methode de la classe gdcmFile:  
> bool gdcmFile::ParsePixelData(void) {
> ...
> }
> Je ne l'ai pas mise dans gdcmParsePixels.cxx pour ne pas allonger le 
> temps de compile.
> 
> C'est sa présence dans un autre .cxx qui pose un pb ?
> 
>>
>>
>>
>>----
>>
>>De maniere plus general, j'aurais aime un retour d'experience de cmake.
>>J'ai compris que pour l'installation python ce n'etait pas au point.
>>Mais en ce qui concerne :
>>- la compilation
>>- interface pour regler les options de compil
>>- les tests
>>- l'install des lib c++
>>
>>Meme si ce n'est que des questions merci de me les envoyer
>>
>>Voila voila merci d'avoir lu jusque la,
>>Mathieu
>>
>>Au fait j'ai envoyer sur fr.comp.lang.c++ le probleme des const char* + string ... j'espere que j'aurais une reponse.
>>
>>
> 






More information about the Dcmlib mailing list