/* IFT1169 - démonstration #02 - exercice 03 30-janvier -2006 v1.01 M.Lokbani - màj pour IFT1169 + gcc3.4.2 21-septembre -2003 v1.00 M.Lokbani - prg + comm. contact: lokbani@iro.umontreal.ca Copyright (C) 1999-2006 Université de Montréal Département d'informatique et de Recherche Opérationnelle Mohamed Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Description: ------------ Le code corrigé est suivi par une analyse minutieuse des erreurs générées lors de la compilation et de l'exécution. */ #include namespace Exemple { int i = 4; } int max = 2; int main(int argc, char *argv[]) { double tableau[4][2] = { {2.5,2.6}, {1.7,7.1}, {4.9,4.3}, }; int i =10; for (int i =0; i 2 #include 3 4 namespace Exemple { 5 int i = 10; 6 } 7 8 int max = 4; 9 10 void main(int argc, char *argv[]) 11 { 12 13 int tableau[4][2] = { 14 2.5,2.6, 15 1.7,7.1, 16 4.9,4.3, 17 }; 18 19 int i =10; 20 21 for (int i =0; ig++ -pedantic -Os -c demo3exo1.cpp -o demo3exo1.o In file included from C:/Programmes/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/iostream.h:31, from d1169demo02exo3.cpp:1: C:/Programmes/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated header . To disable this warning use -Wno-deprecated. 1169demo02exo3.cpp:11: error: `main' must return `int' 1169demo02exo3.cpp:11: error: return type for `main' changed to `int' 1169demo02exo3.cpp: In function `int main(...)': 1169demo02exo3.cpp:17: warning: converting to `int' from `double' 1169demo02exo3.cpp:17: warning: converting to `int' from `double' 1169demo02exo3.cpp:17: warning: converting to `int' from `double' 1169demo02exo3.cpp:17: warning: converting to `int' from `double' 1169demo02exo3.cpp:17: warning: converting to `int' from `double' 1169demo02exo3.cpp:17: warning: converting to `int' from `double' 1169demo02exo3.cpp:22: error: invalid operands of types `int' and `' to binary `operator<' 1169demo02exo3.cpp:19: warning: unused variable 'i' >Exit code: 1 ^ ^ ^ ^ | | | | A B C D A: nom du fichier B: ligne ou s'est produite l'erreur C: type d'erreur: fatale ou avertissement (warning) D: le motif derriere l'erreur. =========================================================================== Première étape on regarde ce que nous pouvons corriger du premier coup pour réduire le nombre d'erreurs et avertissements signalés par le compilateur. -Remarque 1- ------------ In file included from C:/Programmes/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/iostream.h:31, from d1169demo02exo3.cpp:1: C:/Programmes/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the header for the header for C++ includes, or instead of the deprecated header . To disable this warning use -Wno-deprecated. C'est des erreurs ou avertissements à cause d'un problème avec le .h utilisé. Ici le compilateur mentionne que le standard C++ utilise plutôt des entêtes au lieu de et propose une correction. Dans ce cas c'est juste un avertissement et propose comment désactiver l'affichage des avertissements. Un avertissement peut s'avérer mortel s'il n'est pas pris correctement en considération. Une solution pratique ici est de se conformer au standard. Pour corriger cela: ligne 1: #include en #include -Remarque 2- ------------ ligne 2: #include Ligne non signalée comme erreur ni comme "avertissement" pourtant elle est inutile. Aucune référence à titre d'exemple à print ou printf donc pas besoin de l'inclure. Pour corriger cela: ligne 2: #include retirer la ligne en question. -Remarque 3- ------------ 1169demo02exo3.cpp:11: error: `main' must return `int' Le compilateur vous informe que la méthode main doit retourner un entier. 1169demo02exo3.cpp:11: error: return type for `main' changed to `int' signifie que maintenant la fonction "main" retourne un entier alors que sur le prototype a été déclaré: void main(int argc, char *argv[]) la raison de cette erreur est : return 1; vous avez déclaré une fonction qui ne retourne normalement rien, alors que dans votre programme vous retournez quand meme une valeur. Pour corriger cela: -a- void main(int argc, char *argv[]) { // votre programme return; } -b- int main(int argc, char *argv[]) { // votre programme return 0; } Comme le compilateur vous a informé que la méthode main doit retourner un entier donc -b-. -Remarque 4- ------------ 1169demo02exo3.cpp:17: warning: converting to `int' from `double' À propos du tableau: // les paires du tableau doivent etre entourées d'accolades {} // Il ne faut pas oublier que c'est un tableau de réels // pour l'accès à un tableau donné voir la remarque -TABLEAU- // à la fin de ce programme. c'est un tableau d'entiers initialisé avec des réels! int tableau[4][2] = { {2.5,2.6}, {1.7,7.1}, {4.9,4.3}, }; -a- on change la déclaration du tableau (int vers double) ou -b- on change les valeurs du tableau on va prendre la solution a (décision arbitraire) double tableau[4][2] = { {2.5,2.6}, {1.7,7.1}, {4.9,4.3}, }; On corrige cela et on recompile .... 1 #include 2 3 namespace Exemple { 4 int i = 10; 5 } 6 7 int max = 4; 8 9 int main(int argc, char *argv[]) 10 { 11 12 double tableau[4][2] = { 13 {2.5,2.6}, 14 {1.7,7.1}, 15 {4.9,4.3}, 16 }; 17 18 int i =10; 19 20 for (int i =0; ig++ -Wall -pedantic -Os -c 1169demo02exo3.cpp -o 1169demo02exo3.o 1169demo02exo3.cpp: In function `int main(int, char**)': 1169demo02exo3.cpp:21: error: invalid operands of types `int' and `' to binary `operator<' 1169demo02exo3.cpp:22: error: `cout' undeclared (first use this function) 1169demo02exo3.cpp:22: error: (Each undeclared identifier is reported only once for each function it appears in.) 1169demo02exo3.cpp:22: error: `endl' undeclared (first use this function) 1169demo02exo3.cpp:18: warning: unused variable 'i' 1169demo02exo3.cpp:30:2: warning: no newline at end of file >Exit code: 1 -Remarque 5- ------------ 1169demo02exo3.cpp:21: error: invalid operands of types `int' and `' to binary `operator<' Le compilateur ne comprend pas la présence de std. Il pense que nous voulons réaliser une opération entre j et std à l'aide de l'opérateur < mais il ne comprend pas exactement de quoi il s'agit. Par ailleurs une définition d'un espace de noms prise de la bible c/c++ // le mot-clé namespace permet de partionner une application // en de multiples sous-systèmes. Chacun de ces sous-systèmes // peut définir et opérer dans sa propre étendue de validité. // Chaque developpeur peut introduire des identifiants conviviaux // dans son sous-système sans se tracasser de savoir si quelqu'un // d'autre utilise également ces identifiants dans d'autres sous-systèmes // for (int j=0;jg++ -Wall -pedantic -Os -c 1169demo02exo3.cpp -o 1169demo02exo3.o >Exit code: 0 >g++ -o 1169demo02exo3.exe 1169demo02exo3.o >Exit code: 0 ----------- Avec ces modification le programme ne signlera aucun warning et pourtant il subsiste toujours des erreurs dans le code. ----------- Examinons la sortie: >1169demo02exo3 le 0eme element du tableau vaut: 2.5 le 1eme element du tableau vaut: 2.6 le 2eme element du tableau vaut: 1.7 le 3eme element du tableau vaut: 7.1 le 2eme element du tableau vaut: 1.7 le 3eme element du tableau vaut: 7.1 le 4eme element du tableau vaut: 4.9 le 5eme element du tableau vaut: 4.3 le 4eme element du tableau vaut: 4.9 le 5eme element du tableau vaut: 4.3 le 6eme element du tableau vaut: 0 le 7eme element du tableau vaut: 0 le 6eme element du tableau vaut: 0 le 7eme element du tableau vaut: 0 le 8eme element du tableau vaut: 8.09477e-320 le 9eme element du tableau vaut: 5.28421e-308 le 8eme element du tableau vaut: 8.09477e-320 le 9eme element du tableau vaut: 5.28421e-308 le 10eme element du tableau vaut: 2.12407e-314 le 11eme element du tableau vaut: 1.62277e-307 le 10eme element du tableau vaut: 2.12407e-314 le 11eme element du tableau vaut: 1.62277e-307 le 12eme element du tableau vaut: 5.28416e-308 le 13eme element du tableau vaut: 5.28418e-308 le 12eme element du tableau vaut: 5.28416e-308 le 13eme element du tableau vaut: 5.28418e-308 le 14eme element du tableau vaut: 1.2732e-313 le 15eme element du tableau vaut: 1.98071e-317 le 14eme element du tableau vaut: 1.2732e-313 le 15eme element du tableau vaut: 1.98071e-317 le 16eme element du tableau vaut: 5.28428e-308 le 17eme element du tableau vaut: 2.12407e-314 le 16eme element du tableau vaut: 5.28428e-308 le 17eme element du tableau vaut: 2.12407e-314 le 18eme element du tableau vaut: 5.28448e-308 le 19eme element du tableau vaut: 1.03203e-314 le 18eme element du tableau vaut: 5.28448e-308 le 19eme element du tableau vaut: 1.03203e-314 le 20eme element du tableau vaut: 1.#QNAN le 21eme element du tableau vaut: 5.28431e-308 >Exit code: 0 ------------------------------------------ à partir de la 8e valeur c'est du "n'importe quoi!" Examinons ce code bloc par bloc: ------------------------------------------------------------------------ namespace Exemple { // int i = 10; // i doit valoir 4 car le tableau a 4 lignes int i = 4; } // int max = 4; // max doit valoir 2 car le tableau a deux colonnes int max = 2; // int i =10; // declaration ne sert à rien! for (int i =0; i1169demo02exo3 le 0eme element du tableau vaut: 2.5 le 1eme element du tableau vaut: 2.6 le 2eme element du tableau vaut: 1.7 le 3eme element du tableau vaut: 7.1 le 4eme element du tableau vaut: 4.9 le 5eme element du tableau vaut: 4.3 le 6eme element du tableau vaut: 0 le 7eme element du tableau vaut: 0 >Exit code: 0 */