[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