Je souhaiterais décrire une méthode de lecture sur un flux
pour remplir une structure de points... Alors ce à quoi
j'ai pensé :
une classe abstraite 'feeder' pour définir une méthode
virtuelle pure getNextPoint()
est la solution classique :
des classes dérivées 'feeder_XXX' implémentant getNextPoint()
suivant le format
class Feeder {
public:
typedef enum { ok=0,ko,eof /*end of feed*/} Status;
Feeder();
virtual ~Feeder();
virtual Status getNextPoint(Quad<T> &q)=0;
}
/* (où Quad<T> est le pendant de std::pair pour les quadruplets)*/
class FeederXYZW : public Feeder {
protected:
std::ifstream fin;
public:
FeederXYZW(char const * const filename):fin(filename){}
virtual ~FeederXYZW();
virtual typename PointFeeder<T>::Status getNextPoint(Quad<T> &q){
double x,y,z;
double w;
if (fin.eof()) return eof;
if ((fin>>x)&&(fin>>y)&&(fin>>z)&&(fin>>w)) {
// TODO : here I should check and assert
p[0]=x;p[1]=y;p[2]=z;p[3]=w;
return ok;
}
else {
return ko;
}
}
};
}
la méthode vous parrait-elle correcte ?
Je souhaiterais décrire une méthode de lecture sur un flux
pour remplir une structure de points... Alors ce à quoi
j'ai pensé :
une classe abstraite 'feeder' pour définir une méthode
virtuelle pure getNextPoint()
est la solution classique :
des classes dérivées 'feeder_XXX' implémentant getNextPoint()
suivant le format
class Feeder {
public:
typedef enum { ok=0,ko,eof /*end of feed*/} Status;
Feeder();
virtual ~Feeder();
virtual Status getNextPoint(Quad<T> &q)=0;
}
/* (où Quad<T> est le pendant de std::pair pour les quadruplets)*/
class FeederXYZW : public Feeder {
protected:
std::ifstream fin;
public:
FeederXYZW(char const * const filename):fin(filename){}
virtual ~FeederXYZW();
virtual typename PointFeeder<T>::Status getNextPoint(Quad<T> &q){
double x,y,z;
double w;
if (fin.eof()) return eof;
if ((fin>>x)&&(fin>>y)&&(fin>>z)&&(fin>>w)) {
// TODO : here I should check and assert
p[0]=x;p[1]=y;p[2]=z;p[3]=w;
return ok;
}
else {
return ko;
}
}
};
}
la méthode vous parrait-elle correcte ?
Je souhaiterais décrire une méthode de lecture sur un flux
pour remplir une structure de points... Alors ce à quoi
j'ai pensé :
une classe abstraite 'feeder' pour définir une méthode
virtuelle pure getNextPoint()
est la solution classique :
des classes dérivées 'feeder_XXX' implémentant getNextPoint()
suivant le format
class Feeder {
public:
typedef enum { ok=0,ko,eof /*end of feed*/} Status;
Feeder();
virtual ~Feeder();
virtual Status getNextPoint(Quad<T> &q)=0;
}
/* (où Quad<T> est le pendant de std::pair pour les quadruplets)*/
class FeederXYZW : public Feeder {
protected:
std::ifstream fin;
public:
FeederXYZW(char const * const filename):fin(filename){}
virtual ~FeederXYZW();
virtual typename PointFeeder<T>::Status getNextPoint(Quad<T> &q){
double x,y,z;
double w;
if (fin.eof()) return eof;
if ((fin>>x)&&(fin>>y)&&(fin>>z)&&(fin>>w)) {
// TODO : here I should check and assert
p[0]=x;p[1]=y;p[2]=z;p[3]=w;
return ok;
}
else {
return ko;
}
}
};
}
la méthode vous parrait-elle correcte ?
Je ne sais pas si la classe est si nécessaire ici. Si les points
à lire sont toujours en format text, un surcharge de l'opérateurest la solution classique
Le nombre de types d'obtention est suceptible d'etre augmenté... J'ai
C'est quoi, T, ici ?
oui, désolé j'ai oublié de stripper tous les paramètres templates
std::ifstream fin;
Pourquoi protected ?
hum hum... j'avoue que j'ai encore du mal à argumenter sur ce genre de
Et en passant, je sais que c'est un exemple, mais FileFeeder
serait un meilleur nom, non ?
Le vrai nom c'est PointFeeder, encore une fois je voulais masquer le
Pourquoi assert ?
Parce que je me suis laissé emporter... Il est vrai qu'il n'est pas
Je ne sais pas si la classe est si nécessaire ici. Si les points
à lire sont toujours en format text, un surcharge de l'opérateur
est la solution classique
Le nombre de types d'obtention est suceptible d'etre augmenté... J'ai
C'est quoi, T, ici ?
oui, désolé j'ai oublié de stripper tous les paramètres templates
std::ifstream fin;
Pourquoi protected ?
hum hum... j'avoue que j'ai encore du mal à argumenter sur ce genre de
Et en passant, je sais que c'est un exemple, mais FileFeeder
serait un meilleur nom, non ?
Le vrai nom c'est PointFeeder, encore une fois je voulais masquer le
Pourquoi assert ?
Parce que je me suis laissé emporter... Il est vrai qu'il n'est pas
Je ne sais pas si la classe est si nécessaire ici. Si les points
à lire sont toujours en format text, un surcharge de l'opérateurest la solution classique
Le nombre de types d'obtention est suceptible d'etre augmenté... J'ai
C'est quoi, T, ici ?
oui, désolé j'ai oublié de stripper tous les paramètres templates
std::ifstream fin;
Pourquoi protected ?
hum hum... j'avoue que j'ai encore du mal à argumenter sur ce genre de
Et en passant, je sais que c'est un exemple, mais FileFeeder
serait un meilleur nom, non ?
Le vrai nom c'est PointFeeder, encore une fois je voulais masquer le
Pourquoi assert ?
Parce que je me suis laissé emporter... Il est vrai qu'il n'est pas
Je ne sais pas si la classe est si nécessaire ici. Si les
points à lire sont toujours en format text, un surcharge de
l'opérateur >> est la solution classique
Le nombre de types d'obtention est suceptible d'etre
augmenté... J'ai essayé de masquer le fond du problème pour
focaliser l'attention sur la part "technique", mais je crois
que je n'échapperai pas à un explication plus détaillée. Donc,
en fait je suis toujours sur mon problème de détection de
trous dans les proteines. La première étape consiste à lire
les données relatives aux atomes : coordonnées spatiales plus
rayon atomique (ce que je charge dans mes Quad<T>).
Ces données sont généralement stockées dans des fichiers;
généralement au format pdb.
Bien entendu ce format est assez complexe et contient un grand
nombre de données qui ne m'intéressent pas directement. Pour
pouvoir aller rapidement à l'essentiel j'ai donc ecrit un
petit script pour génerer des fichiers au format :
ligne = x y z rayon
que je lis pour faire mes calculs.
A terme cependant je serai certainement amené à utiliser des
bibliothèques de gestion de formats biologiques afin d'etre
capable de lire dirrectement les pdb, mmcif et compagnie. Je
connais pas encore ces bibliothèques, mais à priori je pense
qu'elle permettent de garder les données structurées, de faire
des selections dessus (ensemble de la proteine, sous partie,
etc...), et d'en extraire les données qui m'intérressent : x y
z rayon des atomes de la selection.
A bien y réfléchir, rien ne m'empechera alors de redéfinir
l'opérateur >> d'une classe SelectionResult vers Quad<T>...
Cela dit, comment ferais-je si un jour j'ai aussi à traiter
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Enfin, en replaçant dans le contexte : (tiens, j'avais déjà
commencé à parler de mes feeder dans ce thread :
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/91ba3 67843a86751)
j'ai une classe VoidHandler qui me sert à "stocker des vides",
elle aggrège un objet de type PocketDetector (pattern
strategie) auquel elle délègue la detection de ces poches...
J'avais donc naturellement pensé à lui aggreger un PointFeeder
sur le meme pattern (strategy). Mais maintenant, je ne suis
plus si certain que ce soit une bonne idée, après tout, les
données peuvent etre pré-chargées puis fournies au
VoidHandler... Là, j'avoue que je commence à etre un peu paumé
! En quoi le choix de ce pattern pour le chargement des
données est-il bon/mauvais ?
Bon, reprenons le fil de tes réponsesC'est quoi, T, ici ?
oui, désolé j'ai oublié de stripper tous les paramètres
templates que je voulais cacher pour simplifier mon exemple. T
est le type des données que je load. généralement double.
std::ifstream fin;
Pourquoi protected ?
hum hum... j'avoue que j'ai encore du mal à argumenter sur ce
genre de sujets.
Bon, je saisis l'occasion de ta question pour ouvrir une
parenthèse sur le sujet : Alors pas public parce que
encapsulation des données, et euh... pas private pour le cas
où je voudrais étendre ma classe... Bon, OK, ça tient pas la
route :)
Par contre, entre temps je me suis rendu compte que je devrais
plutot remonter cet attribut dans la classe supérieure :
Feeder { protected : istream s;
public : getNextPoint()=0;
... }
FeederXYZW : public Feeder { ...
getNextPoint();
}
et là j'aurais le choix entre laisser is en protected si je
veux par exemple laisser l'accès à s en lecture pour
FeederXYZW, ce qui est sale. Ou le mettre en private auquel
cas il faudra que Feeder implémente une méthode protected
readData utilisée dans les getNextPoint() de ses filles...
Correct ?
Et en passant, je sais que c'est un exemple, mais FileFeeder
serait un meilleur nom, non ?
Le vrai nom c'est PointFeeder, encore une fois je voulais
masquer le plus possible de parasites... Raté. Promis je le
ferai plus.Pourquoi assert ?
Parce que je me suis laissé emporter... Il est vrai qu'il
n'est pas nécessaire de crasher toute l'appli sur un problème
de lecture :)
pour les erreurs sur le flux : oui, j'ai tendance à vouloir
aller trop vite et à considérer certaines choses comme
secondaires... Cela dit, pour l'utilisateur du Feeder à la
limite tout ce qu'il veut savoir c'est si il faut continuer à
lire les données, si c'est terminé, ou bien s'il y a eu une
erreur... Le type d'erreur importe peu, non ?
Je ne sais pas si la classe est si nécessaire ici. Si les
points à lire sont toujours en format text, un surcharge de
l'opérateur >> est la solution classique
Le nombre de types d'obtention est suceptible d'etre
augmenté... J'ai essayé de masquer le fond du problème pour
focaliser l'attention sur la part "technique", mais je crois
que je n'échapperai pas à un explication plus détaillée. Donc,
en fait je suis toujours sur mon problème de détection de
trous dans les proteines. La première étape consiste à lire
les données relatives aux atomes : coordonnées spatiales plus
rayon atomique (ce que je charge dans mes Quad<T>).
Ces données sont généralement stockées dans des fichiers;
généralement au format pdb.
Bien entendu ce format est assez complexe et contient un grand
nombre de données qui ne m'intéressent pas directement. Pour
pouvoir aller rapidement à l'essentiel j'ai donc ecrit un
petit script pour génerer des fichiers au format :
ligne = x y z rayon
que je lis pour faire mes calculs.
A terme cependant je serai certainement amené à utiliser des
bibliothèques de gestion de formats biologiques afin d'etre
capable de lire dirrectement les pdb, mmcif et compagnie. Je
connais pas encore ces bibliothèques, mais à priori je pense
qu'elle permettent de garder les données structurées, de faire
des selections dessus (ensemble de la proteine, sous partie,
etc...), et d'en extraire les données qui m'intérressent : x y
z rayon des atomes de la selection.
A bien y réfléchir, rien ne m'empechera alors de redéfinir
l'opérateur >> d'une classe SelectionResult vers Quad<T>...
Cela dit, comment ferais-je si un jour j'ai aussi à traiter
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Enfin, en replaçant dans le contexte : (tiens, j'avais déjà
commencé à parler de mes feeder dans ce thread :
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/91ba3 67843a86751)
j'ai une classe VoidHandler qui me sert à "stocker des vides",
elle aggrège un objet de type PocketDetector (pattern
strategie) auquel elle délègue la detection de ces poches...
J'avais donc naturellement pensé à lui aggreger un PointFeeder
sur le meme pattern (strategy). Mais maintenant, je ne suis
plus si certain que ce soit une bonne idée, après tout, les
données peuvent etre pré-chargées puis fournies au
VoidHandler... Là, j'avoue que je commence à etre un peu paumé
! En quoi le choix de ce pattern pour le chargement des
données est-il bon/mauvais ?
Bon, reprenons le fil de tes réponses
C'est quoi, T, ici ?
oui, désolé j'ai oublié de stripper tous les paramètres
templates que je voulais cacher pour simplifier mon exemple. T
est le type des données que je load. généralement double.
std::ifstream fin;
Pourquoi protected ?
hum hum... j'avoue que j'ai encore du mal à argumenter sur ce
genre de sujets.
Bon, je saisis l'occasion de ta question pour ouvrir une
parenthèse sur le sujet : Alors pas public parce que
encapsulation des données, et euh... pas private pour le cas
où je voudrais étendre ma classe... Bon, OK, ça tient pas la
route :)
Par contre, entre temps je me suis rendu compte que je devrais
plutot remonter cet attribut dans la classe supérieure :
Feeder { protected : istream s;
public : getNextPoint()=0;
... }
FeederXYZW : public Feeder { ...
getNextPoint();
}
et là j'aurais le choix entre laisser is en protected si je
veux par exemple laisser l'accès à s en lecture pour
FeederXYZW, ce qui est sale. Ou le mettre en private auquel
cas il faudra que Feeder implémente une méthode protected
readData utilisée dans les getNextPoint() de ses filles...
Correct ?
Et en passant, je sais que c'est un exemple, mais FileFeeder
serait un meilleur nom, non ?
Le vrai nom c'est PointFeeder, encore une fois je voulais
masquer le plus possible de parasites... Raté. Promis je le
ferai plus.
Pourquoi assert ?
Parce que je me suis laissé emporter... Il est vrai qu'il
n'est pas nécessaire de crasher toute l'appli sur un problème
de lecture :)
pour les erreurs sur le flux : oui, j'ai tendance à vouloir
aller trop vite et à considérer certaines choses comme
secondaires... Cela dit, pour l'utilisateur du Feeder à la
limite tout ce qu'il veut savoir c'est si il faut continuer à
lire les données, si c'est terminé, ou bien s'il y a eu une
erreur... Le type d'erreur importe peu, non ?
Je ne sais pas si la classe est si nécessaire ici. Si les
points à lire sont toujours en format text, un surcharge de
l'opérateur >> est la solution classique
Le nombre de types d'obtention est suceptible d'etre
augmenté... J'ai essayé de masquer le fond du problème pour
focaliser l'attention sur la part "technique", mais je crois
que je n'échapperai pas à un explication plus détaillée. Donc,
en fait je suis toujours sur mon problème de détection de
trous dans les proteines. La première étape consiste à lire
les données relatives aux atomes : coordonnées spatiales plus
rayon atomique (ce que je charge dans mes Quad<T>).
Ces données sont généralement stockées dans des fichiers;
généralement au format pdb.
Bien entendu ce format est assez complexe et contient un grand
nombre de données qui ne m'intéressent pas directement. Pour
pouvoir aller rapidement à l'essentiel j'ai donc ecrit un
petit script pour génerer des fichiers au format :
ligne = x y z rayon
que je lis pour faire mes calculs.
A terme cependant je serai certainement amené à utiliser des
bibliothèques de gestion de formats biologiques afin d'etre
capable de lire dirrectement les pdb, mmcif et compagnie. Je
connais pas encore ces bibliothèques, mais à priori je pense
qu'elle permettent de garder les données structurées, de faire
des selections dessus (ensemble de la proteine, sous partie,
etc...), et d'en extraire les données qui m'intérressent : x y
z rayon des atomes de la selection.
A bien y réfléchir, rien ne m'empechera alors de redéfinir
l'opérateur >> d'une classe SelectionResult vers Quad<T>...
Cela dit, comment ferais-je si un jour j'ai aussi à traiter
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Enfin, en replaçant dans le contexte : (tiens, j'avais déjà
commencé à parler de mes feeder dans ce thread :
http://groups.google.fr/group/fr.comp.lang.c++/browse_thread/thread/91ba3 67843a86751)
j'ai une classe VoidHandler qui me sert à "stocker des vides",
elle aggrège un objet de type PocketDetector (pattern
strategie) auquel elle délègue la detection de ces poches...
J'avais donc naturellement pensé à lui aggreger un PointFeeder
sur le meme pattern (strategy). Mais maintenant, je ne suis
plus si certain que ce soit une bonne idée, après tout, les
données peuvent etre pré-chargées puis fournies au
VoidHandler... Là, j'avoue que je commence à etre un peu paumé
! En quoi le choix de ce pattern pour le chargement des
données est-il bon/mauvais ?
Bon, reprenons le fil de tes réponsesC'est quoi, T, ici ?
oui, désolé j'ai oublié de stripper tous les paramètres
templates que je voulais cacher pour simplifier mon exemple. T
est le type des données que je load. généralement double.
std::ifstream fin;
Pourquoi protected ?
hum hum... j'avoue que j'ai encore du mal à argumenter sur ce
genre de sujets.
Bon, je saisis l'occasion de ta question pour ouvrir une
parenthèse sur le sujet : Alors pas public parce que
encapsulation des données, et euh... pas private pour le cas
où je voudrais étendre ma classe... Bon, OK, ça tient pas la
route :)
Par contre, entre temps je me suis rendu compte que je devrais
plutot remonter cet attribut dans la classe supérieure :
Feeder { protected : istream s;
public : getNextPoint()=0;
... }
FeederXYZW : public Feeder { ...
getNextPoint();
}
et là j'aurais le choix entre laisser is en protected si je
veux par exemple laisser l'accès à s en lecture pour
FeederXYZW, ce qui est sale. Ou le mettre en private auquel
cas il faudra que Feeder implémente une méthode protected
readData utilisée dans les getNextPoint() de ses filles...
Correct ?
Et en passant, je sais que c'est un exemple, mais FileFeeder
serait un meilleur nom, non ?
Le vrai nom c'est PointFeeder, encore une fois je voulais
masquer le plus possible de parasites... Raté. Promis je le
ferai plus.Pourquoi assert ?
Parce que je me suis laissé emporter... Il est vrai qu'il
n'est pas nécessaire de crasher toute l'appli sur un problème
de lecture :)
pour les erreurs sur le flux : oui, j'ai tendance à vouloir
aller trop vite et à considérer certaines choses comme
secondaires... Cela dit, pour l'utilisateur du Feeder à la
limite tout ce qu'il veut savoir c'est si il faut continuer à
lire les données, si c'est terminé, ou bien s'il y a eu une
erreur... Le type d'erreur importe peu, non ?
Pour commencer : je définirais une classe Atom, plutôt
[..]
Mais un atome, c'est un atome, ce n'est pas n'importe quelle
Certes. J'ai toujours tendance à vouloir faire vite pour aller à ce
Le typage statique est ton ami.
Euh... C'est quoi le typage statique (shame & blush)
ce n'est pas la peine de réinventer la roue.
Oui, c'est exactement ce que je disais : Je n'ai pas l'intention de
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Des manipulateurs.
Qu'est- ce ?
std::getline, puis en mettant la ligne dans un
std::istringstream pour le parser :
ok, j'adopte
Ceci n'est pas du tout garanti par la norme du langage, qui
permet des octets de rembourage n'importe où dans
PDBAtomFmt.
J'imagine que ce qui est litigieux c'est la ligne :
En général, c'est une bonne idée d'écrire l'application comme
simplement de la colle qui joint des divers composants
Je tacherai de m'en souvenir
Pour commencer : je définirais une classe Atom, plutôt
[..]
Mais un atome, c'est un atome, ce n'est pas n'importe quelle
Certes. J'ai toujours tendance à vouloir faire vite pour aller à ce
Le typage statique est ton ami.
Euh... C'est quoi le typage statique (shame & blush)
ce n'est pas la peine de réinventer la roue.
Oui, c'est exactement ce que je disais : Je n'ai pas l'intention de
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Des manipulateurs.
Qu'est- ce ?
std::getline, puis en mettant la ligne dans un
std::istringstream pour le parser :
ok, j'adopte
Ceci n'est pas du tout garanti par la norme du langage, qui
permet des octets de rembourage n'importe où dans
PDBAtomFmt.
J'imagine que ce qui est litigieux c'est la ligne :
En général, c'est une bonne idée d'écrire l'application comme
simplement de la colle qui joint des divers composants
Je tacherai de m'en souvenir
Pour commencer : je définirais une classe Atom, plutôt
[..]
Mais un atome, c'est un atome, ce n'est pas n'importe quelle
Certes. J'ai toujours tendance à vouloir faire vite pour aller à ce
Le typage statique est ton ami.
Euh... C'est quoi le typage statique (shame & blush)
ce n'est pas la peine de réinventer la roue.
Oui, c'est exactement ce que je disais : Je n'ai pas l'intention de
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Des manipulateurs.
Qu'est- ce ?
std::getline, puis en mettant la ligne dans un
std::istringstream pour le parser :
ok, j'adopte
Ceci n'est pas du tout garanti par la norme du langage, qui
permet des octets de rembourage n'importe où dans
PDBAtomFmt.
J'imagine que ce qui est litigieux c'est la ligne :
En général, c'est une bonne idée d'écrire l'application comme
simplement de la colle qui joint des divers composants
Je tacherai de m'en souvenir
Pour commencer : je définirais une classe Atom, plutôt
[..]Mais un atome, c'est un atome, ce n'est pas n'importe quelle
Certes. J'ai toujours tendance à vouloir faire vite pour aller
à ce que je juge essentiel : mon algorithme et ses résultats.
Bref, je sous-estime l'importance de certains à coté et mon
code finit par devenir illisible.
hop, je me flagelles un coup et j'ecris ces classes.Le typage statique est ton ami.
Euh... C'est quoi le typage statique (shame & blush)
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Des manipulateurs.
Qu'est- ce ?
Ceci n'est pas du tout garanti par la norme du langage, qui
permet des octets de rembourage n'importe où dans
PDBAtomFmt.
J'imagine que ce qui est litigieux c'est la ligne :
PDBAtomFmt const& atom(
*reinterpret_cast< PDBAtomFmt const* >( line.data() ) ) ;
où l'on fais un alignement brutal entre la chaine de caractère
de la ligne et les chaines de caractères empaquetées dans
PDBAtomFmt ?
Question bete : la norme garantit t'elle déjà que dans une
structure les divers champs sont stockés dans l'ordre de
précédence où ils sont déclarés ?
Pour éviter ce genre d'horreurs ne pourrait t'on pas imaginer une
fonction qui se chargerait de la conversion de char const * vers
PDBAtomFmt ?
Pour commencer : je définirais une classe Atom, plutôt
[..]
Mais un atome, c'est un atome, ce n'est pas n'importe quelle
Certes. J'ai toujours tendance à vouloir faire vite pour aller
à ce que je juge essentiel : mon algorithme et ses résultats.
Bref, je sous-estime l'importance de certains à coté et mon
code finit par devenir illisible.
hop, je me flagelles un coup et j'ecris ces classes.
Le typage statique est ton ami.
Euh... C'est quoi le typage statique (shame & blush)
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Des manipulateurs.
Qu'est- ce ?
Ceci n'est pas du tout garanti par la norme du langage, qui
permet des octets de rembourage n'importe où dans
PDBAtomFmt.
J'imagine que ce qui est litigieux c'est la ligne :
PDBAtomFmt const& atom(
*reinterpret_cast< PDBAtomFmt const* >( line.data() ) ) ;
où l'on fais un alignement brutal entre la chaine de caractère
de la ligne et les chaines de caractères empaquetées dans
PDBAtomFmt ?
Question bete : la norme garantit t'elle déjà que dans une
structure les divers champs sont stockés dans l'ordre de
précédence où ils sont déclarés ?
Pour éviter ce genre d'horreurs ne pourrait t'on pas imaginer une
fonction qui se chargerait de la conversion de char const * vers
PDBAtomFmt ?
Pour commencer : je définirais une classe Atom, plutôt
[..]Mais un atome, c'est un atome, ce n'est pas n'importe quelle
Certes. J'ai toujours tendance à vouloir faire vite pour aller
à ce que je juge essentiel : mon algorithme et ses résultats.
Bref, je sous-estime l'importance de certains à coté et mon
code finit par devenir illisible.
hop, je me flagelles un coup et j'ecris ces classes.Le typage statique est ton ami.
Euh... C'est quoi le typage statique (shame & blush)
des fichiers "rayon x y z" à la place de "x y z rayon" ?
Des manipulateurs.
Qu'est- ce ?
Ceci n'est pas du tout garanti par la norme du langage, qui
permet des octets de rembourage n'importe où dans
PDBAtomFmt.
J'imagine que ce qui est litigieux c'est la ligne :
PDBAtomFmt const& atom(
*reinterpret_cast< PDBAtomFmt const* >( line.data() ) ) ;
où l'on fais un alignement brutal entre la chaine de caractère
de la ligne et les chaines de caractères empaquetées dans
PDBAtomFmt ?
Question bete : la norme garantit t'elle déjà que dans une
structure les divers champs sont stockés dans l'ordre de
précédence où ils sont déclarés ?
Pour éviter ce genre d'horreurs ne pourrait t'on pas imaginer une
fonction qui se chargerait de la conversion de char const * vers
PDBAtomFmt ?