Tiens, je ne pensais pas que cette question soulèverait autant d'intérêt. Perso, ça me fait gamberger à fond à chaque programme...
Pour ce qui est de mon cas, on est dans une application locale qui s'occupe de données/fichiers/ressources locales qui ne sont pas utilisés par un autre. C'est donc du très simple.
Merci à tous pour vos avis en tout cas, vos restours et expériences m'intéressent grandement.
squalyl (./6) :
Avant de me gotoeuler dessus la raison est d'éviter la séquence de
if(fail) {
fclose()
liberation_des_autres_ressources()
}
(
)
J'ai plusieurs manières de contourner ça, mais aucune ne me satisfait :
int main (void)
{
if (!InitSdl ()) {
return EXIT_FAILURE;
}
if (!InitFont ()) {
DeinitAll ();
return EXIT_FAILURE;
}
if (!InitRessources ()) {
DeinitAll ();
return EXIT_FAILURE;
}
if (!InitGameState ()) {
DeinitAll ();
return EXIT_FAILURE;
}
if (!GameStateEngine ()) {
DeinitAll ();
return EXIT_FAILURE;
}
DeinitAll ();
#ifdef DEBUG
PrintGSMax ();
#endif
return EXIT_SUCCESS;
}
void DeinitAll (void)
{
DeinitGameState ();
DeinitRessources ();
DeinitFont ();
DeinitSdl ();
}
Comme tous les deinit sont appelés, ça les oblige à avoir une variable static m_init (initialisée à false évidemment) pour savoir s'ils ont été initialisés ou non. J'aime pas.
L'autre solution, c'est ça :
if (a) {
if (b) {
if (c) {
.....
....
....
....
}
closeC();
}
closeB();
}
closeA();
Ca devient bordélique quand t'initialises plus de 10 trucs ici et là.
ps -> c'est ce que propose Brunni au
./8, et j'ai été vite débordé. C'est le plus propre à l'esprit, conceptuellement parlant, mais perso j'ai pas trouvé ça commode quand le nombre de if augmente démesurément.
Godzil -> chapeau, t'as réussi à me convaincre que goto n'est pas une instruction démonique créée par les reptiliens du NOM pour nous infiltrer, je vais essayer, ça a l'air en effet très propre si on s'entient à des règmes d'utilisation très strictes.
Du coup, je crayonne autant que toi le
./10 de Zerosquare.