Re: Melanger C et C++ : exceptions ou setjmp ?
Tu peux utiliser les membres 'client_data' de la structure
'jpeg_decompress_struct' et 'error_exit' de la structure
'jpeg_error_mgr' pour personnaliser ta gestion des erreurs:
METHODDEF(void) my_error_exit(j_common_ptr cinfo)
{
ggo_error * error;
error = static_cast<ggo_error*>( cinfo->client_data );
*error = GGO_ERROR_IO;
}
ggo_error read_jpeg(const string & filename)
{
jpeg_decompress_struct cinfo;
jpeg_error_mgr jerr;
ggo_error error = GGO_ERROR_NONE;
cinfo.err = jpeg_std_error( &jerr );
cinfo.client_data = &error;
jerr.error_exit = my_error_exit;
jpeg_create_decompress( &cinfo );
if ( error != GGO_ERROR_NONE) {
return ( error );
}
// Etc.
Rien ne t'empêche (j'imagine) d'avoir un traitement des erreurs plus fin
à base d'exceptions. Je te conseille également de lire la doc qui est
assez détaillée à ce niveau.
Fabien LE LEZ wrote:
> Bonjour,
>
> J'essaie d'utiliser une bibliothèque écrite en C (libjpeg).
> La gestion d'erreurs dans cette bibliothèque fonctionne comme suit :
> on fournit une fonction "my_error_exit()", qui doit se démerder pour
> arrêter le code. (La fonction par défaut appelle exit().)
>
> Dans cette fonction, je vois deux choix possibles :
> 1- longjmp() (avec un setjmp() dans le code appelant)
> 2- throw une_exception;
>
> Au moins sur mon compilateur (VC++ 2008), la première solution est
> officiellement non gérée :
> "Do not use setjmp and longjmp in C++ programs; these functions do not
> support C++ object semantics."
> <http://msdn.microsoft.com/en-us/library/yz2ez4as(VS.80).aspx>
>
> Lancer une exception serait bien agréable, mais j'ai cru lire qu'il ne
> fallait pas laisser se propager une exception à travers du code C.
>
>
> Pour l'instant, j'ai pondu une interface en C qui contient un paquet
> de fonctions de ce style :
>
> boolean JpegStartDecompress (struct jpeg_decompress_struct* cinfo)
> {
> if (setjmp (error_manager.setjmp_buffer))
> {
> return 0;
> }
>
> jpeg_start_decompress (cinfo);
> return 1;
> }
>
>
> Si quelqu'un a une meilleure solution...
>
> Merci d'avance.
>
|