Suite de notes c++
Résolu/Fermémamiemando Messages postés 33410 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 2 décembre 2024 - 21 nov. 2022 à 12:57
- Suite de notes c++
- Retrouver une musique avec les notes - Guide
- Bloc-notes (windows) - Télécharger - Traitement de texte
- Clef de fa notes - Télécharger - Création musicale
- Donnez à ce fichier les mêmes droits d'accès que les autres notes de service. - Forum Réseau
- Droits d'acces ✓ - Forum Windows
3 réponses
18 nov. 2022 à 12:52
Bonjour,
Merci de soigner l'orthographe.
Je te recommande quand tu postes sur un forum de mettre un exemple minimum qui reproduit ton problème. D'ailleurs bien souvent cela te permettra de mieux comprendre ce qui ne va pas.
Ensuite en terme d'indentation, je t'invite à te référer à ton message #1 que j'ai remis en forme. En particulier, reviens à la ligne après chaque ";".
Avant de rentrer dans le vif du sujet, plusieurs recommandations :
- Au début de la fonction main, tu peux rajouter using namespace std;. Il ne faut jamais utiliser cette instruction ailleurs que dans un ".cpp". En l'utilisant, cela te permet d'écrire cout, cerr, cin, endl au lieu de std::cout, std::cerr, std::cin, std::endl.
#include <iostream> int main() { using namespace std; cout << "hello!" << endl; return 0; }
- Tu n'es pas obligé de faire plusieurs instructions std::cout << pour enchaîner des affichages, tu peux directement tout afficher en une instruction.
#include <iostream> int main() { using namespace std; int x = 7, y = 8; cout << "x = " << x << endl << "y = " << y << endl; return 0; }
- tu devrais mettre des parenthèses dans ton test do ... while.
- en C++, il ne faut pas inclure <string.h> (ça, c'est en C) mais <cstring>
- en C++, on préfère remplacer les retour à la ligne par std::endl (cela permet de s'affranchir du système d'exploitation, car sous Linux c'est \n, sous windows, c'est \r\n)
- tu n'utilises pas cin correctement. Voici la syntaxe :
#include <iostream> int main() { using namespace std; int x, y, z; cout << "x, y, z ? "; cin >> x >> y >> z; cout << "x = " << x << endl << "y = " << y << endl << "z = " << z << endl; return 0; }
Exécution :
x, y, z ? 11 15 8
x = 11
y = 15
z = 8
Bonne chance
Je vois entre autres:
std::cin>>informatique>>informatique>>informatique;
La variable informatique contiendra forcément la dernièere des trois valeurs.
Expliques mieux ce que tu veux faire.
Le "using namespace std" n'est plus recommandé dans l'écriture du C++ moderne.
18 nov. 2022 à 16:08
- Pas exactement, voir cette discussion.
- Si tu utilises using namespace std dans un fichier hpp c'est problématique, car quiconque inclue ton header est impacté et donc tu impactes tous les projets qui dépendent du tien. C'est dans ce cas que ça n'est pas encouragé.
- Si tu utilises using namespace std dans un fichier cpp (ou mieux dans une fonction de ce fichier cpp, comme j'ai fait), la portée est localisée et limitée au code de ton projet. Si d'aventure, il y avait une collision de nom, seul ton projet ne compilerait pas, et tu t'en rendrais compte immédiatement.
- Dans le cas très particulier qui nous concerne, il faudrait être assez aventureux pour nommer des objets cout, cin, cerr ou endl...
- Note que j'ai clairement précisé dans mon message #1 qu'il fallait veiller à utiliser cette directive uniquement dans un fichier cpp.
20 nov. 2022 à 14:27
Loin de moi l'idée de contredire Herb Sutter qui est un véritable expert. Mais je pense qu'utiliser using namespace risque d'avoir plus d'inconvénients que d'avantages, du moins pour un débutant.
Si on prend l'exemple suivant :
#include <iostream> // for cout #include <algorithm> // for transform() #include <string> // for string #include <cctype> // for toupper() #include <locale> // for locale //using namespace std; std::string uppercase( std::string const& s ) { std::string r; std::transform( begin(s), end(s), std::back_inserter(r), toupper ); return r; } void test1() { // test si les accents, leur conversion et les nombres sont gérés dans la locale std::cout << uppercase( "trouvé (nombre français) 1000.1 = " ) << 1000.1; std::cout.clear(); // juste pour contourner le cas où le séparateur milliers est mal géré endl(std::cout); } char next( volatile const char x[] ) { return *(x+1); } void test2() { endl( std::cout << "Le second caractère de \"abcd\" est " << next( "abcd" ) ); } int main() { #if defined _MSC_VER std::system( "chcp 1252>NUL" ); #elif defined _WIN32 std::system( "chcp 65001>NUL" ); #endif std::cout.imbue( std::locale( "" ) ); test1(); test2(); }
Le test1().
En utilisant using namespace std; le code ne compile pas. Il y a un problème ligne 10 et l'erreur risque d'être opaque à un débutant. Pour la comprendre et la corriger, il faut savoir qu'il existe 2 fonctions toupper(), une dans le namespace global (int ::toupper(int)) et une dans le namespace std (template<class C>C std::toupper(C,const locale&)). Il faut donc préciser quelle fonction appeler si on a fait using namespace std;.
On voit que l'injection de tout le namespace std dans le l'espace global "oblige" à connaître les dizaines de milliers de noms dans std!
Le test2().
Et dans le cas du test2(), l'incident est plus grave car aucune erreur de compilation ne se produit, mais l'exécution du code ne fait pas ce à quoi on s'attend. Ça n'est pas la fonction locale char next(volatile const char[]) qui est appelée si using namespace std; est utilisée, mais c'est la fonction template<class I> I next(I, typename std::iterator_traits<I>::difference_type=1) qui est silencieusement préférée.
Mais:
Ne pas utiliser using namespace std; risque de donner l'habitude de systématiquement ajouter std:: devant tout ce qui vient de la bibliothèque standard. Et parfois c'est cela qui va provoquer le bug. Par exemple devant certaines fonctions:
- fonction swap()
- class hash<>
- fonctions begin(),end(),clear(),size()
- ...
car ces entités peuvent et doivent être redéfinies dans certains cas, et donc mettre un std:: peut empêcher l'accès à la redéfinition provoquant le bug!
Mais du mais:
Dans tous les on aura le problème précédent pour des template ou du code dans les entêtes, et le piège du std:: de trop est donc à connaître.
Pour ma part, je préfère ne pas utiliser using namespace std; (mais j'utilise using namespace std::literals; dans les fichiers sources.)
21 nov. 2022 à 12:57
C'est pour ça que selon moi, tu peux utiliser using namespace std dans une fonction sans trop de problème et sans que ça ait trop de conséquence. Pas besoin de connaître tous les noms dans ce namespace, en cas de collision ça ne compilera pas et tu le verras rapidement. En fait j'ai longtemps refuser de l'utiliser mais ça allège significativement le code donc tant que tu sais ce que tu fais pourquoi pas :-) Après, chacun sa manière de coder ;-)