unam trabajo los libro importancia familia ejemplos derechos conducta asertivos asertividad asertiva c++ c assert

c++ - trabajo - ¿Estoy malinterpretando el uso de asertivo()?



derechos asertivos pdf (3)

Estaba mirando la página de referencia de assert() y me quedé atascado mientras leía el ejemplo dado:

/* assert example */ #include <stdio.h> #include <assert.h> int main () { FILE * datafile; datafile=fopen ("file.dat","r"); assert (datafile); fclose (datafile); return 0; }

En este ejemplo, asert se usa para abortar la ejecución del programa si el archivo de datos se compara con 0, lo que sucede cuando la llamada anterior a fopen no tuvo éxito.

Estoy totalmente de acuerdo en que si fopen() falla, assert() abortará la ejecución. Sin embargo, me preocupa la corrección de este ejemplo:

En mi opinión, assert() está ahí para detectar casos que normalmente no pueden ocurrir (como pasar un puntero NULL a una función cuya documentación indica que está prohibido).

En este ejemplo, no abrir un archivo no es algo que normalmente no puede suceder . De hecho, puedo ver docenas de razones por las cuales esto podría fallar. El archivo no podría existir, el programa podría ejecutarse sin los privilegios requeridos, etc.

Preferiría haber hecho algo como:

/* not longer an assert example */ #include <stdio.h> #include <assert.h> int main () { FILE * datafile; datafile=fopen ("file.dat","r"); if (datafile != NULL) { // Do something, whatever. fclose (datafile); } else { // Report the error somehow. } return 0; }

¿Mi comprensión de cómo se debería usar assert() es incorrecta?

EDITAR Y BUENAS NOTICIAS!

Parece que el sitio referido está gobernado por personas rigurosas. Aquí está el correo que recibí de uno de los mantenedores del sitio:

Hola Julien, estoy de acuerdo, el código de ejemplo fue mal elegido. Ahora ha sido reescrito a algo más apropiado.

Muchas gracias por señalarlo, y disculpe las molestias que esto pueda haberle causado.

Atentamente,

Y el ejemplo actualizado:

/* assert example */ #include <stdio.h> #include <assert.h> void print_number(int* myInt) { assert (myInt!=NULL); printf ("%d/n",*myInt); } int main () { int a=10; int * b = NULL; int * c = NULL; b=&a; print_number (b); print_number (c); return 0; }

Me alegra ver que algunas personas hacen bien su trabajo en Internet. ;)


De hecho tienes razón. Como otras personas ya han señalado, assert() será más que probablemente compilado en la versión de lanzamiento (he visto gente forzar a que las declaraciones se queden para la versión de lanzamiento).

Solo quería agregar una historia de terror relacionada con esta pregunta que he visto en una base de código:

assert(do_something() == NO_ERR);

A algunas personas no se les debe permitir usar un teclado.


Notificación menor: sería mejor si escribes ...

FILE * datafile = NULL;

Además, afirmar que solo funciona en modo de depuración ... para que su método sea mejor.


Tienes toda la razón, señor. Este es un mal uso de assert .