Cita:
Iniciado por Instru alguien que quiera ver tu codigo no tiene pierde con los gotos
Bueno, yo no me pierdo con esos gotos que he escrito. Son claros y lineales. Lo que pretenden hacer es saltar al comienzo de la liberacion de los recursos que se ha pedido.
Si no hay ningún error, se liberan todos, en el orden inverso, puesto que las etiquetas no representan nada.
Tu función que libera todo lo que no ha sido inicializado... ¿Cómo es? ¿Guardas en una estructura los valores iniciados y luego va mirando si son válidos?
En cualquier caso, es más código, y para actualizarlo te toca cambiar todo.
Te saco un ejemplo real y profesional (Linux última versión estable):
linux-2.6.17.13/drivers/firmware/dcdbas.c
Código:
/**
* dcdbas_init: initialize driver
*/
static int __init dcdbas_init(void)
{
int error;
error = platform_driver_register(&dcdbas_driver);
if (error)
return error;
dcdbas_pdev = platform_device_alloc(DRIVER_NAME, -1);
if (!dcdbas_pdev) {
error = -ENOMEM;
goto err_unregister_driver;
}
error = platform_device_add(dcdbas_pdev);
if (error)
goto err_free_device;
return 0;
err_free_device:
platform_device_put(dcdbas_pdev);
err_unregister_driver:
platform_driver_unregister(&dcdbas_driver);
return error;
}