148 votes

system("pause") ; - Pourquoi est-ce mauvais ?

Voici une question que je ne comprends pas bien :

La commande, system("pause"); est enseigné aux nouveaux programmeurs comme un moyen de mettre en pause un programme et d'attendre une entrée clavier pour continuer. Cependant, il semble que de nombreux programmeurs chevronnés désapprouvent cette méthode comme quelque chose qui ne devrait pas être fait, à des degrés divers.

Certains disent que l'on peut l'utiliser sans problème. D'autres disent qu'elle ne doit être utilisée que lorsque vous êtes enfermé dans votre chambre et que personne ne vous regarde. Certains disent qu'ils viendront personnellement chez vous et vous tueront si vous l'utilisez.

Je suis moi-même un nouveau programmeur sans formation formelle en programmation. Je l'utilise parce qu'on m'a appris à l'utiliser. Ce que je ne comprends pas, c'est que si ce n'est pas quelque chose à utiliser, alors pourquoi m'a-t-on appris à l'utiliser ? Ou, à l'inverse, n'est-il pas si mauvais après tout ?

Que pensez-vous de ce sujet ?

0 votes

6 votes

Apparemment, les gens aiment que leurs appels à la pause soient très efficaces. En d'autres termes, "Dépêchez-vous et arrêtez-vous !"

81 votes

On vous l'a enseigné parce que les professeurs sont généralement de mauvais programmeurs.

96voto

ravuya Points 4234

C'est mal vu parce qu'il s'agit d'un hack spécifique à une plateforme qui n'a rien à voir avec l'apprentissage de la programmation, mais qui sert plutôt à contourner une fonctionnalité de l'IDE/OS - la fenêtre console lancée depuis Visual Studio se ferme lorsque le programme a terminé son exécution, et le nouvel utilisateur ne peut donc pas voir le résultat de son nouveau programme.

L'insertion de System("pause") exécute le programme "pause" de la ligne de commande Windows et attend qu'il se termine avant de poursuivre l'exécution du programme - la fenêtre de la console reste ouverte pour que vous puissiez lire le résultat.

Une meilleure idée serait de placer un point d'arrêt à la fin et de le déboguer, mais cela pose également des problèmes.

7 votes

Visual Studio peut exécuter le programme dans deux modes : avec ou sans débogage. Lorsqu'il est exécuté en mode débogage, il s'arrête au premier point d'arrêt. Si vous n'en avez pas défini, il exécutera le programme et fermera la console. Donc, si vous voulez que le programme de la console s'arrête, il suffit de définir un point d'arrêt ou, mieux encore, de l'exécuter sans débogage ! Cela exécutera le programme et arrêtera la console.

0 votes

Ce n'est pas seulement une caractéristique de Visual Studio - si vous exécutez un programme de console à partir de Windows (par opposition au chargement d'une invite de commande et à son exécution à partir de là), il se fermera également à la fin de son exécution.

3 votes

1 Re "la fenêtre console lancée à partir de Visual Studio se ferme lorsque l'exécution du programme est terminée", non, uniquement lorsque le programme est exécuté dans le débogueur. Re "exécute le programme "pause" de la ligne de commande Windows", non, il n'existe pas de tel ( pause est une commande interne dans cmd.exe ). La liste des meilleures idées fait également cruellement défaut.

44voto

nlaq Points 11379

C'est lent. Il est dépendant de la plateforme. C'est peu sûr.

Premier : Ce qu'il fait. Appeler "système" revient littéralement à taper une commande dans l'invite de commande de Windows. Il y a une tonne d'installation et de démontage pour que votre application puisse faire un tel appel - et les frais généraux sont tout simplement ridicules.

Et si un programme appelé "pause" était placé dans le PATH de l'utilisateur ? Le simple fait d'appeler system("pause") garantit seulement l'exécution d'un programme appelé "pause" (espérons que votre exécutable ne s'appelle pas "pause" !)

Il suffit d'écrire votre propre fonction "Pause()" qui utilise _getch. OK, bien sûr, _getch dépend aussi de la plate-forme (note : il est défini dans "conio.h") - mais c'est beaucoup plus agréable que system() si vous développez sous Windows et cela a le même effet (bien qu'il soit de votre responsabilité de fournir le texte avec cout ou autre).

En fait, pourquoi introduire autant de problèmes potentiels alors qu'il suffit d'ajouter deux lignes de code et un include pour obtenir un mécanisme beaucoup plus souple ?

66 votes

Pour quelqu'un qui se plaint de la dépendance à la plateforme, il semble étrange de suggérer _getch , notamment alors que le C++ standard fournit getchar .

35 votes

Je ressens une certaine ironie dans le calcul des frais généraux pour une interaction avec un être humain ;)

0 votes

Peut-être n'avez-vous jamais entendu parler des jeux vidéo.

32voto

Gavin H Points 6366
  • lent : il doit passer par beaucoup de code Windows inutile et un programme programme séparé pour une simple opération simple
  • non portable : dépend de le programme de pause
  • pas un bon style : faire un appel Système ne doit être fait que fait que lorsque vraiment nécessaire
  • plus typage : System("pause") est plus long que getchar()

un simple getchar() devrait faire l'affaire.

22voto

John T Points 14067

En résumé, il doit mettre en pause l'exécution du programme, faire un appel système et allouer des ressources inutiles alors que vous pourriez utiliser quelque chose d'aussi simple que cin.get(). Les gens utilisent System("PAUSE") parce qu'ils veulent que le programme attende jusqu'à ce qu'ils appuient sur la touche Entrée pour pouvoir voir leur sortie. Si vous voulez qu'un programme attende une entrée, il existe des fonctions intégrées pour cela, qui sont également multiplateformes et moins exigeantes.

Plus d'explications dans este article.

0 votes

Wow, encore vous ! Vous vivez ici ? lol Quoi qu'il en soit, merci, je vais lire un peu. En attendant, que pensez-vous de cette question ?

0 votes

J'ai eu cette même question lorsque j'ai commencé le C il y a quelques années, et on m'a renvoyé à ce même article. J'utilise personnellement getchar().

0 votes

Ho wow... Je n'ai pas fait de C++ depuis un moment mais ouais... il y a définitivement de meilleures façons d'obtenir les mêmes résultats

11voto

a_m0d Points 5784

Parce qu'il n'est pas portable.

pause

est un programme Windows / dos seulement, donc votre code ne fonctionnera pas sous linux. De plus, system n'est généralement pas considéré comme un très bon moyen d'appeler un autre programme - il est généralement préférable d'utiliser la fonction CreateProcess o fork ou quelque chose de similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X