without raspberry osx crash getch

osx - raspberry - input char python



Equivalente a Windows getch() para bloqueos Mac/Linux (4)

Estoy usando getch() y mi aplicación falla instantáneamente. Incluyendo al hacer:

int main() { getch(); }

No puedo encontrar el enlace, pero supuestamente el problema es que tiene que desactivar el almacenamiento en búfer o algo extraño en esa línea, y todavía quiero que funcione para funcionar junto con el código multiplataforma.

Me dijeron que usara std::cin.get() , pero me gustaría que la aplicación se cierre cuando se presiona una tecla, no cuando el usuario ingresó una letra o número, luego presionar enter para salir.

¿Hay alguna función para esto? El código debe funcionar bajo Mac (my os) y Windows.

Vincular / compilar no es un problema ; <curses.h> y el enlace con -lcurses en XCode, mientras que Windows usa <conio.h> .


Usted no ha exhibido un

#include <stdio.h>

o

#include <curses.h>

o línea similar. ¿Estás seguro de que estás enlazando con una biblioteca que incluye getch() ?


La función getch no está disponible en sistemas tipo Unix, pero puede reemplazarla con comandos de consola a través de su compilador con la función del system .

Uso:

En Windows puede usar el system("pause");

En los sistemas tipo Unix (como OSX) puede usar el system("read -n1 -p '' '' key");

Nota: el system se declara en <stdlib.h> .


¿Has buscado en <curses.h> para ver qué hace la función getch() ?

Sugerencia: OSX y Linux no son lo mismo que Windows.

Específicamente, como una macro en <curses.h> , encontramos:

#define getch() wgetch(stdscr)

Ahora, en su sistema, parece que se trata de una función real getch() en la biblioteca de curses, pero espera que stdscr se configure, y eso se hace mediante las funciones de inicialización de curses ( initscr() y parientes), y eso su código no lo hace señalmente Por lo tanto, su código está invocando un comportamiento indefinido llamando a las rutinas de curses antes de que se realice la inicialización correcta, lo que lleva a la falla.

(Buena pista de dmckee: ayudó a eliminar la línea de enlace de acidzombie24, que era importante).

Para llegar a un punto donde se pueda leer un solo golpe de tecla y el programa termine limpiamente, debe trabajar mucho en Unix (OSX, Linux). Tendría que atrapar el estado inicial del terminal, organizar una función atexit() - o algún mecanismo similar - para restaurar el estado del terminal, cambiar el terminal del modo cocinado al modo raw, luego invocar una función para leer un personaje (posiblemente solo read(0, &c, 1) ), y haga su salida. Puede haber otras formas de hacerlo, pero ciertamente implicará algunas operaciones de configuración y desmontaje.

Un libro que podría ayudar es Advanced Unix Programming, 2nd Edn de Mark Rochkind; cubre el manejo del terminal al nivel necesario. Alternativamente, puede usar <curses.h> correctamente, que será más simple que una solución de rollo propio, y probablemente más confiable.


Use la función cin.get () por ejemplo:

#include <iostream> using namespace std; int main() { char input = cin.get(); cout << "You Pressed: " << input; }

El programa esperará a que presione una tecla.

Una vez que lo haya hecho, la tecla que presionó se imprimirá en la pantalla.