« Programmation C/Erreurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Tpierron (discussion | contributions)
Tpierron (discussion | contributions)
Ligne 22 :
 
== Exemple ==
Pour illustrer cela, voici un exemple, qui tente de convertir une chaine de caractères en un nombre. Le nombre donné, 2<sup>64</sup>, peut ne pas être dans le domaine de valeur du type '''unsigned long''' (qui peut se limiter à 2<sup>32</sup> - 1), suivant l'implémentation qui est utilisée pour l'exécuterarchitecture. Dans ce cas, on utilise '''errno''' pour afficher un message d'erreur approprié à l'utilisateur.
 
<pre>
Ligne 28 :
#include <stdlib.h> /* strtoul() */
#include <limits.h> /* ULONG_MAX */
#include <errnostring.h> /* errno et ERANGEstrerror() */
#include <errno.h> /* errno */
 
void teste(const char *nombre)
Ligne 37 ⟶ 38 :
{
/* il y a eu une erreur ! */
printf("Impossible de convertir le nombre '%s': %s.\n", nombre, strerror(errno));
if (errno == ERANGE)
{
/* on sait quelle est l'erreur */
puts("L'erreur rencontree est une erreur de domaine.");
}
else
{
/* pas d'information précise à fournir à l'utilisateur */
puts("Une erreur a ete rencontree.");
}
}
else
{
printf("La conversion a eteété effectueeeffectuée, et la valeur est: %ld\n", res);
}
}
Ligne 66 ⟶ 58 :
ULONG_MAX vaut 4294967295l.
La conversion a ete effectuee, et la valeur est: 256
Impossible de convertir le nombre '18446744073709551616': la valeur est en dehors de l'intervalle du type spécifié.
L'erreur rencontree est une erreur de domaine.
 
Il est nécessaire de placer '''errno''' à 0 ''avant'' d'utiliser '''strtoul''', car les fonctions de la bibliothèque standard ne sont pas obligées de la mettre à zéro en cas de succès. À cause de celà, siSi on ne la réinitialisait pas «&nbsp;manuellement&nbsp;», on pourrait voir le résultat d'une erreur précédente, causée par uneun autreappel de fonction antérieur. C'est une des lourdeurs du modèle de gestion d'erreur du C.., même si une telle paranoïa n'est pas toujours nécessaire.
 
'''Note&nbsp;:''' Le contrôle d'erreur des fonctions '''strto*''' est en réalité plus complexe, puisque le deuxième paramètre permet un contrôle plus fin. Il n'est pas utilisé ici, pour se concentrer sur '''errno''', mais devrait l'être dans un vrai programme.
 
== Erreurs possibles ==