Domanda

Sto utilizzando getch() e la mia app si blocca all'istante. Compreso quando si fa:

int main()
{
    getch();
}

Non riesco a trovare il link, ma presumibilmente il problema è che deve disattivare il buffering o qualcosa di strano lungo quelle linee, e voglio ancora cout lavorare con il codice multipiattaforma.

Mi è stato detto di usare std::cin.get(), ma vorrei che l'app si chiudesse quando si preme un tasto, non quando l'utente ha digitato una lettera o un numero, quindi premere Invio per uscire.

C'è qualche funzione per questo? Il codice deve funzionare su Mac (il mio sistema operativo) e Windows.


Il collegamento / compilazione non è un problema ; Includo <curses.h> e mi collego a -lcurses in XCode, mentre Windows utilizza <conio.h>.

È stato utile?

Soluzione

Hai guardato in <curses.h> per vedere cosa fa la funzione getch()?

Suggerimento: OSX e Linux non sono gli stessi di Windows.

In particolare, come macro in stdscr, troviamo:

#define getch() wgetch(stdscr)

Ora, sul tuo sistema sembra esserci una funzione reale initscr() nella libreria curses, ma si aspetta che atexit() sia impostato, e ciò viene fatto dalle funzioni di inizializzazione di curses (read(0, &c, 1) e parenti), e ciò non è indicato dal tuo codice. Quindi, il tuo codice sta invocando comportamenti indefiniti chiamando le routine di maledizioni prima che venga eseguita la corretta inizializzazione, portando al crash.

(Buon suggerimento di dmckee - ha contribuito a far uscire la linea di collegamento da acidzombie24, il che era importante.)

Per arrivare a un punto in cui è possibile leggere un singolo tasto e terminare il programma in modo pulito, è necessario fare un buon lavoro su Unix (OSX, Linux). Dovresti intercettare lo stato iniziale del terminale, disporre una <=> funzione - o qualche meccanismo simile - per ripristinare lo stato del terminale, cambiare il terminale dalla modalità cotta alla modalità raw, quindi invocare una funzione per leggere un personaggio (possibilmente solo <=>) e fai la tua uscita. Potrebbero esserci altri modi per farlo, ma certamente comporterà alcune operazioni di installazione e smontaggio.

Un libro che potrebbe aiutare è Programmazione avanzata Unix, 2a edizione di Mark Rochkind; copre la gestione dei terminali al livello necessario. In alternativa, puoi utilizzare <=> correttamente, che sarà più semplice di una soluzione roll-your-own e probabilmente più affidabile.

Altri suggerimenti

Non hai esposto un

#include <stdio.h>

o

#include <curses.h>

o linea simile. Sei sicuro di collegarti a una libreria che include getch()?

Utilizzare la funzione cin.get () ad esempio:

#include <iostream>

using namespace std;

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

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

Il programma aspetterebbe quindi che tu prema un tasto.

Una volta che hai, il tasto che hai premuto verrebbe stampato sullo schermo.

La funzione getch non è disponibile su sistemi simili a Unix, ma è possibile sostituirla con i comandi della console tramite il compilatore con la funzione system.

Utilizzo:

In Windows puoi usare system("pause");

Nei sistemi simili a Unix (come OSX) è possibile utilizzare system("read -n1 -p ' ' key");

Nota: <stdlib.h> è dichiarato in <=>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top