Question

J'utilise getch() et mon application se bloque instantanément. Y compris en faisant:

int main()
{
    getch();
}

Je ne trouve pas le lien, mais le problème est supposé qu'il doit désactiver la mise en mémoire tampon ou quelque chose d'étrange dans ce sens, et je veux toujours cout travailler avec du code multiplateforme.

On m'a dit d'utiliser std::cin.get(), mais j'aimerais que l'application soit fermée lorsqu'une touche est enfoncée, et non lorsque l'utilisateur a saisi une lettre ou un chiffre, puis appuyez sur Entrée pour quitter.

Existe-t-il une fonction pour cela? Le code doit fonctionner sous Mac (mon système d'exploitation) et Windows.

La création de liens / compilation n’est pas un numéro ; J'inclus <curses.h> et lie à -lcurses dans XCode, tandis que Windows utilise <conio.h>.

Était-ce utile?

La solution

Avez-vous consulté <curses.h> pour voir ce que fait la getch() fonction?

Indice: OSX et Linux ne sont pas identiques à Windows.

Plus précisément, en tant que macro dans stdscr, nous trouvons:

#define getch() wgetch(stdscr)

Il semble que, sur votre système, il existe une fonction réelle initscr() dans la bibliothèque curses, mais elle attend que atexit() soit configuré, ce qui est effectué par les fonctions d'initialisation des curses (read(0, &c, 1) et parents), et cela n’est pas fait par votre code. Ainsi, votre code appelle un comportement indéfini en appelant des routines curses avant que l’initialisation correcte ne soit effectuée, ce qui entraîne le blocage.

(Bon conseil de dmckee - cela a aidé à éliminer la ligne de liaison de acidzombie24, ce qui était important.)

Pour arriver à un point où il est possible de lire un seul trait de touche et de terminer le programme proprement, vous devez effectuer beaucoup de travail sous Unix (OSX, Linux). Vous devez capturer l’état initial du terminal, prévoir une <=> fonction - ou un mécanisme similaire - pour restaurer l’état du terminal, faire passer le terminal du mode cuisiné au mode brut, puis appeler une fonction pour lire un message. caractère (éventuellement juste <=>) et faites votre sortie. Il y a peut-être d'autres façons de le faire - mais cela impliquera certainement des opérations de configuration et de démontage.

Un livre qui pourrait aider est Programmation Unix avancée, 2e édition par Mark Rochkind; il couvre la manipulation du terminal au niveau requis. Vous pouvez également utiliser <=> correctement - ce sera plus simple qu’une solution personnalisée et probablement plus fiable.

Autres conseils

Vous n'avez pas exposé de

#include <stdio.h>

ou

#include <curses.h>

ou une ligne similaire. Etes-vous sûr de lier une bibliothèque incluse getch()?

Utilisez la fonction cin.get () par exemple:

#include <iostream>

using namespace std;

int main()
{
  char input = cin.get();

  cout << "You Pressed: " << input;
}

Le programme attendra alors que vous appuyiez sur une touche.

Une fois que vous avez, la touche sur laquelle vous avez appuyé sera imprimée à l'écran.

La fonction getch n'est pas disponible sur les systèmes de type Unix, mais vous pouvez la remplacer par des commandes de console via votre compilateur avec la system fonction.

Utilisation:

Sous Windows, vous pouvez utiliser system("pause");

Dans les systèmes de type Unix (tels que OSX), vous pouvez utiliser system("read -n1 -p ' ' key");

Remarque: <stdlib.h> est déclaré dans <=>.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top