Salut on m’a dit que les assertions peuvent être utile pour savoir exactement ou une erreur s’est produite dans le programme. Comment on s’en sert?
Merci.
Salut on m’a dit que les assertions peuvent être utile pour savoir exactement ou une erreur s’est produite dans le programme. Comment on s’en sert?
Merci.
Cela devrait te convenir: http://emmanuel-delahaye.developpez....tes.htm#assert![]()
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Le piege avec les assertions c'est de les confondre avec la gestion d'erreurs.
Il s'agit juste de reperer des erreurs de programmation, si le test effectué par l'assertion est trop dependant de données "externes" (ex: ce que rentre un utilisateur), c'est pas bon
En effet, les assertions servent typiquement à tester des invariants. Si tu as fait un peu de génie logiciel, de conception, tu sais ce qu'est le contrat d'une fonction, ce que sont les préconditions et postconditions. Les assertions sont bien pour vérifier que ces conditions sont respectées, indépendamment de toute influence extérieure.
L'assertion sert à tester quelque chose qui ne peut pas échouer. Si ça peut échouer, ce n'est pas une assertion qu'il faut mettre, mais une vraie gestion d'erreurs.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Est ce que cet exemple est correct ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 FILE* ouvrir_fichier() { FILE *fichier_section=NULL; fichier_section=fopen("section.dat","w"); //teste le pointer fichier_section et stoppe l'exectuion //si il est égal a NULL assert(fichier_section!=NULL); return fichier_section;
C'est typiquement un mauvais exemple. Une erreur à l'ouverture d'un fichier n'est pas une erreur de conception, elle arrivera forcément un jour ou l'autre.
Dis toi bien que les assertions sont un outil de debug; elles sont supprimées quand on passe en release. Dans ton cas cela signifie qu'il n'y aura plus de test.
Non : Il est normal qu'une ouverture de fichier échoue (influence extérieure).
Ceci est plus correct:
Là, l'assertion ne peut pas échouer. Si elle échoue quand même, c'est que quelqu'un a oublié de tester fich avant d'appeler tester_fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /** \brief Extrait des données du fichier ouvert. \param fichier_section : flux d'où extraire les données. Ne doit pas être NULL. */ void traiter_fichier(FILE *fichier_section) { assert(fichier_section!=NULL); /* ... */ } void UneFonction(void) { FILE *fich = fopen( ... ); if(fich != NULL) { traiter_fichier(fich); fclose(fich); } }
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
et on ne peut pas utiliser un autre truc de gestion d'erreurs genre si le l'ouverture a echoué alors il stoppe le programme et affiche un message d'alerte ?
si bien sûr..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (fichier_section == NULL ) { fprintf ( stderr, "ERREUR OUVERTURE FICHIER"); return ; /* exit(1) si tu veux sortir */ }![]()
c quoi stderr ?![]()
Envoyé par isoman
![]()
C'est le flux standard d'erreur ... les trois flux standard:
- stdin
- stdout
- stderr
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Partager