/* IFT1166 - démonstration #2 - exercice 9 11-septembre-2005 v1.00 M.Lokbani énoncé à partir de BJ + corrigé détaillé. contact: lokbani@iro.umontreal.ca Cet exercice a pour but de vous familiariser à corriger les avertissements et les erreurs signalés par le compilateur. Copyright (C) 2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle T. Johnston & M. Lokbani -- Tous Droits Réservés -- All Rights Reserved -- */ /* * Ce programme calcule et affiche le produit de deux valeurs lues en entrée. */ #include using namespace std; int main(){ // val1 et val2 représentent respectivement la première et la seconde valeurs à saisir int val1,val2; // Produit des deux valeurs saisies int produit; cout << "Ce programme calcule le produit de deux valeurs entières ...\n"; cout << "Entrer deux valeurs entières séparées par un espace (blanc) \n"; // Saisie des valeurs cin >> val1 >> val2; // Calcul de la somme produit = val1*val2; // Affichage en sortie cout << produit << " = " << val1 << " * " << val2 << endl; return 0; } /* >g++ -Wall -pedantic -Os -c q13s.cpp -o q13s.o q13s.cpp:26:9: warning: "/ *" within comment q13s.cpp:27: warning: ISO C++ forbids declaration of `y' with no type q13s.cpp:28: warning: ISO C++ forbids declaration of `somme' with no type q13s.cpp:30: syntax error before `<<' token q13s.cpp:32: syntax error before `*' token q13s.cpp:34: syntax error before `>>' token >Exit code: 1 L'info comme quoi il y a une erreur à ligne 26 arrive trop tard! En réalité l'erreur est plus haut aux lignes 21-22. En effet il manque le commentaire de terminaison. Nous en avons ajouté un à la ligne 22. >g++ -Wall -pedantic -Os -c q13s.cpp -o q13s.o q13s.cpp:24:10: #include expects "FILENAME" or q13s.cpp:26: `main' must return `int' q13s.cpp:26: warning: return type for `main' changed to `int' q13s.cpp: In function `int main(...)': q13s.cpp:30: `cin' undeclared (first use this function) q13s.cpp:30: (Each undeclared identifier is reported only once for each function it appears in.) q13s.cpp:32: non-lvalue in assignment q13s.cpp:34: `cout' undeclared (first use this function) q13s.cpp:34: parse error before string constant >Exit code: 1 La ligne 24, le "include" est inccorect. Le compilateur nous propose les différentes possibilités. La ligne 26, la fonction doit retrouner un int au lieu de void. La ligne 30 et 34, on utilise cin et cout mais on les prend d'où en réalité? Il faut ajouter le "unsing namespace std" La ligne 32: c'est somme qui doit contenir le résultat mais pas le résultat du produit qui doit contenir son propre résultat. >g++ -Wall -pedantic -Os -c q13s.cpp -o q13s.o q13s.cpp: In function `int main(float)': q13s.cpp:34: no match for `std::istream& << int&' operator q13s.cpp:38: no match for `std::ostream& >> int&' operator q13s.cpp:38: parse error before string constant >Exit code: 1 La ligne 34: Le compilateur connaît [cin >>] mais pas [cin <<] cin << y << somme; La ligne 38: Même problème que pour le cin: cout >> somme >> " = " >> Y " * " y; La ligne 38: cout << somme << " = " << Y " * " y; Il y a problème avec [Y " * " y]. Le compilateur ne comprend pas cette expression! Il faudra ajouter des << i.e [Y << " * " << y] >g++ -Wall -pedantic -Os -c q13s.cpp -o q13s.o q13s.cpp: In function `int main(float)': q13s.cpp:30: warning: `int Y' might be used uninitialized in this function >Exit code: 0 La ligne 30: On n'est pas supposé lire deux valeurs? y et Y? Il y a une erreur de logique! Nous avons affecté la seconde valeurs lues à somme au lieu de Y. Le compilateur nous informe que nous risquons d'utiliser une valeur non initialisée, il ne nous dit pas que vous avez initialisé la mauvaise variable (somme au lieu de Y)!! C'est un avertissement! Merci à l'option -Wall! Sans elle on n'aura pas vu qu'il y avait un bug dans notre programme! >g++ -Wall -pedantic -Os -c q13s.cpp -o q13s.o >Exit code: 0 Est-ce que nous avons fini? Non! 1) La présentation du code laisse à désirer. Il faudra bien indenter le programme. 2) Utiliser des variables qui ont un sens (y et Y des noms qui prêtent à confusion!), produit au lieu de somme etc. 3) int main(float) l'argument du main est un void. 4) Bien placer les commentaires dans le programme et ils doivent avoir un sens! 5) Correctement faire ressortir l'affichage en sortie (nous avons ajouté un endl). */