setjmp
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
setjmp [2012/08/23 04:31] – lmateu | setjmp [2016/11/22 12:56] (actual) – [Manejo de errores] lmateu | ||
---|---|---|---|
Línea 6: | Línea 6: | ||
de una función a otra función más abajo en la pila de llamadas | de una función a otra función más abajo en la pila de llamadas | ||
a funciones. | a funciones. | ||
+ | |||
+ | Por ejemplo, si se busca un dato específico en un árbol binario no ordenado, esta búsqueda es recursiva. | ||
+ | Sin excepciones esto no se puede hacer: hay que retornar de cada una de las llamadas recursivas. | ||
+ | en C setjmp y longjmp. | ||
+ | de la ejecución. | ||
+ | |||
+ | Esta es la solución para el caso de una busqueda recursiva en un árbol binario no ordenado. | ||
< | < | ||
Línea 54: | Línea 61: | ||
retorno, el valor es lo que se especificó como argumento en el longjmp y por eso es importante | retorno, el valor es lo que se especificó como argumento en el longjmp y por eso es importante | ||
que sea distinto de 0 para poder distinguirlo del primer retorno. | que sea distinto de 0 para poder distinguirlo del primer retorno. | ||
+ | |||
+ | ==== Manejo de errores ==== | ||
+ | |||
+ | La funciones setjmp y longjmp se usan sobretodo para manejar situaciones de error, al igual que las excepciones. | ||
+ | |||
+ | < | ||
+ | jmp_buf env; | ||
+ | int main() { | ||
+ | for(;;) { | ||
+ | if (setjmp(env)==0) { | ||
+ | char buf[80]; | ||
+ | int leidos= fread(buf, 1, 80, stdin); | ||
+ | if (leidos==0) | ||
+ | break; | ||
+ | procesar(buf, | ||
+ | } | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | | ||
+ | void procesar(char *buf, int n) { ... f(); ... } | ||
+ | void f() { ... g(); ... } | ||
+ | void g() { ... h(); ... } | ||
+ | | ||
+ | void h() { | ||
+ | ... | ||
+ | if (x> | ||
+ | fprintf(stderr, | ||
+ | longjmp(env, | ||
+ | } | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | De esta forma el programa puede seguir procesando comandos en vez de terminar abruptamente el programa o alternativamente manejar la condición de error en g, h, procesar, etc. | ||
+ | |||
+ | El inconveniente de este enfoque es que si la función f pidió memoria o abrió un archivo que tenía que liberar o cerrar al retornar, si ocurre el error la memoria y el archivo abierto se transformarán en goteras. | ||
+ | |||
+ | ==== Discusión ==== | ||
Hay que reconocer que el funcionamiento de setjmp y longjmp es | Hay que reconocer que el funcionamiento de setjmp y longjmp es |
setjmp.1345696267.txt.gz · Última modificación: 2012/08/23 04:31 por lmateu