errno es una macro de preprocesador utilizada para la indicación de errores.
- El valor de errno se establece en cero al inicio del programa, y cualquier función de la biblioteca estándar de C++ puede escribir números enteros positivos en errno, ya sea que haya ocurrido un error o no.
- Una vez que el valor de errno se cambia de cero a distinto de cero, ninguna otra función en la biblioteca estándar de C++ puede cambiar su valor a cero. El errno se define en el archivo de encabezado cerrno .
- El valor de errno se establece en 33 cuando hay un error en el argumento matemático. En C++, el error del argumento matemático está representado por EDOM cuyo valor es 33.
El mismo encabezado que declara errno() también declara al menos las siguientes macro constantes con valores distintos de cero:
- EDOM: error de dominio : algunas funciones matemáticas solo se definen para ciertos valores reales, lo que se denomina su dominio, por ejemplo, la raíz cuadrada y la función logarítmica solo se definen para números no negativos, por lo que si pasamos un argumento negativo en esta función, se establecen error a EDOM
- ERANGE – Error de rango : El rango de valores que puede representar una variable es limitado. Por ejemplo, las funciones matemáticas como pow pueden superar fácilmente el rango representable por una variable de punto flotante, o funciones como strtod pueden encontrar secuencias de dígitos más largas que los valores representables del rango. En estos casos, errno se establece en ERANGE.
- EILSEQ: secuencia ilegal : la secuencia de caracteres multibyte puede tener un conjunto restringido de secuencias válidas. Cuando un conjunto de caracteres multibyte se traduce mediante funciones como mbrtowc, errno se establece en EILSEQ cuando se encuentra una secuencia no válida.
A continuación se muestran los programas para implementar el funcionamiento de errno :
Programa 1: Este programa detecta un error cuando se pasa un valor negativo en la función de registro.
CPP
#include <cerrno> #include <clocale> #include <cmath> #include <cstring> #include <iostream> using namespace std; int main() { // log function doesn't take negative value // thus it changes value of errno to some positive number double not_valid = log(-1.0); // check if value of errno same as value of EDOM i.e. 33 if (errno == EDOM) { cout << " Value of errno is : " << errno << '\n'; cout << " log(-1) is not valid : " << strerror(errno) << '\n'; } return 0; }
Producción:
Value of errno is : 33 log(-1) is not valid : Numerical argument out of domain
Programa 2: este programa detecta un error cuando se pasa un valor negativo en la función de raíz cuadrada.
CPP
#include <cerrno> #include <clocale> #include <cmath> #include <cstring> #include <iostream> using namespace std; int main() { // sqrt function doesn't take negative value // thus it changes value of errno to some positive number double not_valid = sqrt(-100); // check if value of errno same as value of EDOM i.e. 33 if (errno == EDOM) { cout << " Value of errno is : " << errno << '\n'; cout << " -100 is not valid argument for square" << " root function : " << strerror(errno) << '\n'; } return 0; }
Producción:
Value of errno is : 33 -100 is not valid argument for square root function : Numerical argument out of domain
Programa 3: Este programa establece errno en ERANGE.
CPP
#include <bits/stdc++.h> using namespace std; // Driver code int main() { double x; double res; x = 5.000000; res = log(x); if (errno == ERANGE) { cout << "Log(" << x << ") is out of range\n"; } else { cout << "Log(" << x << ") = " << res << endl; } x = 10.00000; res = log(x); if (errno == ERANGE) { cout << "Log(" << x << ") is out of range\n"; } else { cout << "Log(" << x << ") = " << res << endl; } x = 0.000000; res = log(x); if (errno == ERANGE) { cout << "Log(" << x << ") is out of range\n"; } else { cout << "Log(" << x << ") = " << res << endl; } return 0; }
Producción:
Log(5) = 1.60944 Log(10) = 2.30259 Log(0) is out of range
Publicación traducida automáticamente
Artículo escrito por Aman Goyal 2 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA