OVH Cloud OVH Cloud

Création de macro

27 réponses
Avatar
Michaël Delva
Bonjour à tous,

j'utilise DirectShow, et je me retrouve très souvent à employer ce genre de
syntaxe pour vérifier le bon déroulement du code:

hr = this->ConnectFilters(pGraph,pInfTee,pMux);
if (FAILED(hr))
{
ShowMessage("Impossible de connecter pInfTee à pMux");
return false;
}

FAILED étant une macro de DIrectShow permettant de vérifier que hr est
différent de S_OK, la valeur de retour indiquant que tout s'est bien passé.

Je voudrais créer une macro me permettant de réduire le code, quelque chose
du style:

TEST_FAILED(this->ConnectFilters(pGraph,pInfTee,pMux),"Impossible de
connecter pInfTee à pMux");

et qui ait le même comportement que le code ci-dessus...

Seulement je sais absolument pas utiliser les macros...

Une âme charitable pourrait-elle m'aider?

Merci d'avance!

10 réponses

1 2 3
Avatar
Pierre Maurette
"Michaël Delva" a écrit:

Et sachant que mon main() est enchassé dans un bloc comme celui-ci (par
défaut avec BCB6, mais je crois que c'est très recommandé de procéder de la
sorte):
Bonjour Michaël,

Je me permets de vous signaler que l'aide en ligne de BCB6 (du moins
sur ma version) est bien faite sur le sujet des exceptions, et en
français.
Rentrer par l'index, taper "exception..", et voir "Exceptions",
"Exceptions C++", etc.
Penser dans chaque entrée à cliquer sur "Voir aussi".
Vous aurez ainsi une explication claire des exceptions Win32 (là, il
faudrait aller dans l'aide "SDK Windows" toujours dans l'EDI BCB6,
mais je ne pense pas que ce soit indispensable) et surtout leurs
encapsulation "Exceptions C++" et "Exceptions VCL/CLX".
--
Pierre

Avatar
Michaël Delva
Tes explications, et une lecture attentive du chapitre concerné dans le
Stroustrup m'ont permis de comprendre les exceptions et par là même de
corriger mon code...

Merci!
Avatar
Michaël Delva
Pierre Maurette wrote in
news::

"Michaël Delva" a écrit:

Et sachant que mon main() est enchassé dans un bloc comme celui-ci
(par défaut avec BCB6, mais je crois que c'est très recommandé de
procéder de la sorte):
Bonjour Michaël,

Je me permets de vous signaler que l'aide en ligne de BCB6 (du moins
sur ma version) est bien faite sur le sujet des exceptions, et en
français.
Rentrer par l'index, taper "exception..", et voir "Exceptions",
"Exceptions C++", etc.
Penser dans chaque entrée à cliquer sur "Voir aussi".
Vous aurez ainsi une explication claire des exceptions Win32 (là, il
faudrait aller dans l'aide "SDK Windows" toujours dans l'EDI BCB6,
mais je ne pense pas que ce soit indispensable) et surtout leurs
encapsulation "Exceptions C++" et "Exceptions VCL/CLX".
--
Pierre


Merci, c'est une section que j'ai lu également...

Cependant, j'ai une question à ce sujet: pour mes exceptions personalisées,
vaut-il mieux les faire dériver de std::exception ou bien de
SysUtils::Exception de la VCL?

Je pencherai pour la deuxième solution, mais c'est pour confirmation...

Merci!


Avatar
Fabien LE LEZ
On 08 Sep 2004 09:54:05 GMT, "Michaël Delva"
:

pour mes exceptions personalisées,
vaut-il mieux les faire dériver de std::exception ou bien de
SysUtils::Exception de la VCL?


Pour le coup, mieux vaut bien lire la doc de ton compilo à ce sujet.
Mais si c'est possible, le plus simple est d'hériter des deux.


--
;-)

Avatar
Pierre Maurette
"Michaël Delva" a écrit:
[...]
Merci, c'est une section que j'ai lu également...

Cependant, j'ai une question à ce sujet: pour mes exceptions personalisées,
vaut-il mieux les faire dériver de std::exception ou bien de
SysUtils::Exception de la VCL?

Je pencherai pour la deuxième solution, mais c'est pour confirmation...
Moi également, mais je ne suis pas une référence, en ce sens que j'ai

pratiquement découvert C++ après (en même temps, disons) que BCB3.
Si votre appli est définitivement BCB6 (avec éventuellement portage
Linux via Kylix), autant utiliser VCL/CLX pour les exceptions, mais
également les threads, les API Win32, les fonctions de chaînes, de
répertoires, etc. Autant rester homogène, à part éventuellement
quelques fonctions plus C que C++ que vous pouvez souhaiter
réutiliser.
Sinon, il vous faut virer également les AnsiString.
Bon, ce n'est qu'un avis...
--
Pierre

Avatar
Michaël Delva
Je pencherai pour la deuxième solution, mais c'est pour
confirmation...
Moi également, mais je ne suis pas une référence, en ce sens que j'ai

pratiquement découvert C++ après (en même temps, disons) que BCB3.
Si votre appli est définitivement BCB6 (avec éventuellement portage
Linux via Kylix), autant utiliser VCL/CLX pour les exceptions, mais
également les threads, les API Win32, les fonctions de chaînes, de
répertoires, etc. Autant rester homogène, à part éventuellement
quelques fonctions plus C que C++ que vous pouvez souhaiter
réutiliser.
Sinon, il vous faut virer également les AnsiString.
Bon, ce n'est qu'un avis...


Oui mon appli est exclusivement BCB6...

Quant à virer les AnsiString, ça me semble difficile, tant elles sont
imbriquées avec la VCL... Et j'ai pas trop envie de tout changer au profit
des std::string, surtout que, si je ne m'abuse, il faudra que je mette des
.c_str() partout??


Avatar
Fabien LE LEZ
On Wed, 08 Sep 2004 14:06:59 +0200, Pierre Maurette
:

autant utiliser VCL/CLX pour les exceptions, mais
également les threads, les API Win32, les fonctions de chaînes, de
répertoires, etc. Autant rester homogène,


Le problème, c'est que tôt ou tard, on a besoin de bibliothèques
externes. Donc il va falloir passer, à un moment ou à un autre, par la
gestion d'interfaces hétérogènes.


--
;-)

Avatar
Michaël Delva
Supposons le cas suivant:

A *a = new A();
B *b = new B();

//

//

//

delete b;
delete a;

Si les constructeurs de a et b sont susceptibles de déclencher une
exception (le même type), comment écrire les blocs try catch?

try
{
A *a = new A();
try
{
B *b = new B();
}
catch (const Exception & e)
{
delete a;
}
}
catch (const Exception & e)
{
//traitement
}

C'est bien ça?
Avatar
Fabien LE LEZ
On 08 Sep 2004 12:57:47 GMT, "Michaël Delva"
:

C'est bien ça?


Non. Cherche "RAII" dans Google News.




--
;-)

Avatar
Christophe de VIENNE
Supposons le cas suivant:

A *a = new A();
B *b = new B();

//

//

//

delete b;
delete a;

Si les constructeurs de a et b sont susceptibles de déclencher une
exception (le même type), comment écrire les blocs try catch?

try
{
A *a = new A();
try
{
B *b = new B();
}
catch (const Exception & e)
{
delete a;


ici on ajouterais un :
throw; // relance l'exception

}
}
catch (const Exception & e)
{
//traitement
}

C'est bien ça?



Presque, mais il y a beaucoup plus simple...

Si tu n'as pas forcément besoin d'instances dynamique, tu peux écrire :
try
{
A a;
B b;
}
catch (const Exception & e)
{
//traitement
}



Sinon, tu peux utiliser std::auto_ptr, ou bien boost::scoped_ptr:

try
{
std::auto_ptr<A> a = new A;
std::auto_ptr<B> a = new B;

// traitement

// A et B sont détruits automatiquement.
}
catch (const Exception & e)
{
//traitement
}


--
Christophe de Vienne

1 2 3