[C con Clase] consulta sys_nerr
Juan José López
juanjolistascorreo en gmail.com
Mar Feb 24 21:54:59 CET 2015
el Tue, 24 Feb 2015 20:49:27 +0100
Miguel Ángel Ordóñez <maormo en gmail.com> dijo:
> Muy buenas.
>
> Retomando el aprendizaje de c y c++, estoy con un ejercicio tonto que
> es mostar una lista con todos los códigos de error.
>
> #include <stdlib.h> /* para exit */
> #include <stdio.h>
>
> int main()
> {
> int i;;
> for (i=0; i< sys_nerr; i++)
> printf ("%d: %s\n", i, sys_errlist[i]);
> exit(0);
> }
>
> la compilación me devuelve los avisos:
> `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
> `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
>
> Y la ejecución muestra hasta el error 134 (para este valor ya
> devuelve NULL)
>
> Así que he modificado el programa para usar strerror de esta forma
> (no se si es muy elegante...) :
>
> #include <stdio.h>
> #include <string.h>
>
> int main()
> {
> int errnum = 0;
> int resultado;
> char *desconocido = "Unknown error";
> char cadena[256] = " ";
> strncpy(cadena, strerror(errnum),13);
> // tenía definida la variable cadena cono char *cadena, pero
> // me daba un error SIGSEGV, Segmentation fault porque strncopy no
> comprueba si copia una cadena más grande en una más pequeña
>
> while ((resultado = strcmp(cadena,desconocido)) != 0)
> {
> printf( "%d: %s\n", errnum, strerror( errnum ) );
> errnum++;
> strncpy(cadena, strerror(errnum),13);
> }
>
> return 0;
> }
>
>
> Como el error nº 41 no está definido, ahí finaliza el programa.
>
> La pregunta que os quería hacer, ¿hay alguna alternativa a la variable
> sys_nerr?
>
> Un saludo y muchas gracias.
> Miguel Ángel.
Me temo que no. 'errno' y funciones relacionadas no están pensadas para
eso, sino para informar sobre errores y mostrar mensajes sobre los
mismos. Si lo piensas bien, verás que este comportamiento es lógico.
Las funciones de la librería de C son implementadas por cada Sistema
Operativo como buenamente puede. Los errores no tienen porqué ser
números correlativos. Podría ser una máscara de bits o cualquier otro
mecanismo que el sistema o el hardware maneje de forma 'cómoda', o
implementar los errores mediante 'rangos' de números y asignar estos
rangos a distintos controladores, o cualquier otra forma. Es decir, que
ni siquiera tiene que existir un límite real (aparte del tamaño mismo
del tipo, 16 32 o 64 bits).
Siempre lo puedes hacer de forma 'no portable'. Edita el archivo
'errno.h' y busca el valor máximo utilizado. Tendrás que recompilar
cada vez que actualices las bibliotecas. El precio de la 'no
portabilidad' ;-)
Más información sobre la lista de distribución Cconclase