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.