domingo, julio 16, 2006

Haciendo buen uso del matamoscas

Ahora que estoy integrando los modulos que llevo creados, el proyecto se esta poniendo mas interesante desde el punto de vista programatico. Y al menos funciona mejor que la versión que tenía hace tiempo. Sin embargo, la integración, si no soy cuidadosa, tiene un precio muy elevado: bugs!

Según el manual del programador feliz, assert() hace esto: "Evaluates an expression and, when the result is false, prints a diagnostic message and aborts the program.". Pero la verdad no me da mucha información como el lugar de los hechos, generalmente nos manda a lugares muy siniestros. Recuerdo que uno de mis amigos me paso un tip para "personalizar" el mencionado assert(). Se puede mejorar con el uso de macros y una funcioncita como ésta:

bool myFunctionAssert(
bool expression,
char *description,
int line,
char *file )
{
// Si todo salio bien, continuemos
if( expression ) { return false; }

char message[ 256 ];
char *pfile = file;

// Para mostrar el nombre del archivo afectado
pfile += strlen( file );
while( pfile != file && *( pfile - 1 ) != '\\' )
{ pfile--; }

// Mostramos una ventanita con nuestro mensaje,
// en que linea de codigo y en que archivo
// pasaron los acontecimientos

sprintf_s( message, sizeof( message ),
"%s\nLine: %d\nFile: %s\n\nNos detenemos a depurar?",
description, line, pfile);

if( MessageBox( NULL, message,
"Creo que metimos la pata!",
MB_YESNO | MB_ICONWARNING ) == IDYES )
{
return true;
}

return false;
}

Y el macro para llamar a esta función es algo asi, por supuesto, sin olvidar eliminar todo ese codigo cuando no se este depurando:

#if defined (ESTOY_DEPURANDO)
#define myAssert( expression, description)
if( myFunctionAssert(
( expression ), description, __LINE__, __FILE__ ) )
{ _asm{ int 3 } }
#else
#define myAssert( expression, description ) ( ( void ) 0 )
#endif

Y en algun punto del programa donde quiera verificar, por ejemplo:

Object *elChicoMalo = crearChicoMalo();
myAssert( elChicoMalo != NULL,
"Hay! no se pudo hacer un chico malo!" );

Por lo menos esto me hace la vida mas fácil al correguir los errorcillos. Gracias a mi amigo Feri por el tip, BIG KISS!!



leer más...