OVH Cloud OVH Cloud

est-ce une bonne astuce?

36 réponses
Avatar
dark poulpo
alors voila:

imaginons ce cas


void func()
{

ouvre(a);
ouvre(b);

test();
if (error()) { ferme(a); ferme(b); return; } // je le met sur un ligne pour
visualiser les 2 cas plus simplement

testa();
if (error()) { ferme(a); ferme(b); return; }

testb();
if (error()) { ferme(a); ferme(b); return; }

testc();
if (error()) { ferme(a); ferme(b); return; }

....
....

ferme(a);
ferme(b);
return;
}
//////////////////////////////
par
/////////////////////////////

void func()
{

ouvre(a);
ouvre(b);

while(1)
{
test();
if (error()) break;

testa();
if (error()) break;

testb();
if (error()) break;

testc();
if (error()) break;

....
....
break;
}
ferme(a);
ferme(b);
return;
}

qu'en pensez-vous?

10 réponses

1 2 3 4
Avatar
Florent 'flure' C.
Le Sun, 01 Aug 2004 12:01:42 +0200, Jean-Marc Bourguet a écrit :

"Florent 'flure' C." writes:

Le Sat, 31 Jul 2004 22:37:09 +0200, dark poulpo a écrit :

qu'en pensez-vous?


Pourquoi pas plutôt ceci :


C'est peut-être du Java, certainement pas du C++.

} finally {


A+


Argh !
Au temps pour moi ! Bien que n'ayant jamais utilisé la clause finally en
C++, j'étais persuadé qu'elle existait, étant pour moi obligatoirement
liée à un bloc try ...

--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !



Avatar
Fabien LE LEZ
On Sun, 01 Aug 2004 23:18:01 +0200, "Florent 'flure' C."
:

Au temps pour moi ! Bien que n'ayant jamais utilisé la clause finally en
C++, j'étais persuadé qu'elle existait, étant pour moi obligatoirement
liée à un bloc try ...


Ben non. Et, en pratique, on s'en passe plutôt bien :-)
J'imagine qu'on a dû rajouter un "finally" en Java parce que le
programmeur n'a pas une parfaite maîtrise de la durée de vie des
objets ?


--
;-)

Avatar
drkm
Fabien LE LEZ writes:

On Sun, 01 Aug 2004 23:18:01 +0200, "Florent 'flure' C."
:

Ben non. Et, en pratique, on s'en passe plutôt bien :-)
J'imagine qu'on a dû rajouter un "finally" en Java parce que le
programmeur n'a pas une parfaite maîtrise de la durée de vie des
objets ?


J'avais un cours de Java, cette année. Je me suis donc vite
renseigné sur les différences entre C++ et Java. Lorsque j'ai appris
les différences au niveau de l'allocation, la durée de vie, pas de
destructeur, etc., je me suis de suite demandé comment implémenter
l'idiome RAII.

Pour la petite histoire, j'ai posé la question le lendemain au prof,
à qui j'ai dû expliquer RAII. Il m'a dit qu'il n'y avait pas moyen,
mais que de toute façon, un truc tordu comme ça ne devait servir à
rien.

Ahem.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html

Avatar
Fabien LE LEZ
On Sun, 01 Aug 2004 23:59:31 +0200, drkm :

Pour la petite histoire, j'ai posé la question le lendemain au prof,
à qui j'ai dû expliquer RAII. Il m'a dit qu'il n'y avait pas moyen,
mais que de toute façon, un truc tordu comme ça ne devait servir à
rien.


Héhé... faut croire que la philosophie de programmation en Java (ou
C#, qui a aussi un garbage collector je crois) est très différente de
celle du C++.
En fait Java est quelque part entre C et C++ : il y a la notion
d'objet, mais pas la notion de durée de vie des objets. Et donc, je
suppose, aucun équivalent possible à fstream (fichier à fermeture
automatique).


--
;-)

Avatar
Fabien LE LEZ
On Sun, 01 Aug 2004 23:59:31 +0200, drkm :

un truc tordu comme ça ne devait servir à
rien.


Remarque, un langage aussi tordu que le C++ (et je pèse mes mots) ne
doit pas pouvoir servir à grand-chose non plus.


--
;-)

Avatar
Gabriel Dos Reis
drkm writes:

| Pour la petite histoire, j'ai posé la question le lendemain au prof,
| à qui j'ai dû expliquer RAII. Il m'a dit qu'il n'y avait pas moyen,
| mais que de toute façon, un truc tordu comme ça ne devait servir à
| rien.

Je suppose qu'il ne fait que répéter la propagande qu'il a dû
probablement lire dans figmag.

| Ahem.

Yep.

-- Gaby
Avatar
Florent 'flure' C.
Le Sun, 01 Aug 2004 23:28:33 +0200, Fabien LE LEZ a écrit :

On Sun, 01 Aug 2004 23:18:01 +0200, "Florent 'flure' C."
:

Au temps pour moi ! Bien que n'ayant jamais utilisé la clause finally en
C++, j'étais persuadé qu'elle existait, étant pour moi obligatoirement
liée à un bloc try ...


Ben non. Et, en pratique, on s'en passe plutôt bien :-)
J'imagine qu'on a dû rajouter un "finally" en Java parce que le
programmeur n'a pas une parfaite maîtrise de la durée de vie des
objets ?



Pourtant, ne serait-ce pas plus propre si en C++ on pouvait faire :

try {
UneClasse* unObjet = new UneClasse();
///
} catch (les exceptions) {
///
} finally {
delete unObject;
}

Ou alors, existe-t-il un moyen en C++ de faire cela, et que je ne
connaitrais pas ?

--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !


Avatar
Christophe de VIENNE
Florent 'flure' C. wrote:


On Sun, 01 Aug 2004 23:18:01 +0200, "Florent 'flure' C."
:


Au temps pour moi ! Bien que n'ayant jamais utilisé la clause finally en
C++, j'étais persuadé qu'elle existait, étant pour moi obligatoirement
liée à un bloc try ...


Ben non. Et, en pratique, on s'en passe plutôt bien :-)
J'imagine qu'on a dû rajouter un "finally" en Java parce que le
programmeur n'a pas une parfaite maîtrise de la durée de vie des
objets ?




Pourtant, ne serait-ce pas plus propre si en C++ on pouvait faire :

try {
UneClasse* unObjet = new UneClasse();
///
} catch (les exceptions) {
///
} finally {
delete unObject;
}

Ou alors, existe-t-il un moyen en C++ de faire cela, et que je ne
connaitrais pas ?


Tout simplement :

try {
UneClasse unObject;
///
} catch (...) {
///
}

Si tu veux absolument une allocation dynamique de 'UneClasse' :

try {
std::auto_ptr<UneClasse> unObject ( new UneClasse );
// Le destructeur de std::auto_ptr fait un delete sur le pointeur
...

Ou encore, en utilisant boost::scoped_ptr :
try {
boost::scoped_ptr<UneClasse> unObject ( new UneClasse );
// ...


A+

Christophe

--
Christophe de Vienne



Avatar
Fabien LE LEZ
On Mon, 02 Aug 2004 11:15:10 +0200, "Florent 'flure' C."
:

Pourtant, ne serait-ce pas plus propre


Non. Au contraire, ça ne ferait qu'encourager à faire du code pas
propre.

En prime, le code que tu proposes ne pourrait pas fonctionner :

try
{ //1
UneClasse* unObjet = new UneClasse();
///
} // 2
catch (les exceptions)
{
///
} finally {
delete unObject;
}

"unObjet" est déclaré dans le bloc qui commence par la première
accolade (//1) et qui se termine par la suivante (//2) ; en parler
ailleurs n'a donc formellement aucun sens.
De plus, si "new UneClasse()" renvoie une exception, l'assignation
d'un pointeur à "unObjet" ne se fait pas, et le delete a un
comportement indéfini.

Pour corriger ça, il faudrait écrire :

UneClasse* unObjet;
try
{
unObjet = new UneClasse();
///
}
catch (les exceptions)
{
///
} finally {
delete unObject;
}

Et du coup, ben... y'a vraiment moyen de faire plus élégant :-/
Donc, cf le post de Christophe pour savoir comment faire ça
proprement.
Note qu'utiliser "new" dans ce cas n'a pas vraiment de sens : c'est
plutôt une javasserie.

--
;-)

Avatar
Gabriel Dos Reis
"Florent 'flure' C." writes:

| Pourtant, ne serait-ce pas plus propre si en C++ on pouvait faire :
|
| try {
| UneClasse* unObjet = new UneClasse();
| ///
| } catch (les exceptions) {
| ///
| } finally {
| delete unObject;
| }

Plus propre que quoi exctement ?
Quel est exactement le problème ?
Quel est la fréquence ou la gravité du problème ?

-- Gaby
1 2 3 4