Strona 1 z 3
[+] Funkcja getch() w C++
: 30 października 2009, 21:45
autor: piter
Postanowiłem spróbować swoich sił w programowaniu w C++. Oczywiście na początek napisałem prosty programik wyświetlający napis:
Kod: Zaznacz cały
#include <curses.h>
#include <iostream>
using namespace std;
int main()
{
cout << "Naciśnij dowolny klawisz." << endl;
getch();
}
Skompilowałem tym poleceniem:
Niestety wbrew moim oczekiwaniom program po wyświetleniu napisu nie czekając na naciśnięcie dowolnego klawisza kończy działanie.
Z tego co udało mi sie znaleźć w Google dowiedziałem się, że do takiego celu służy funkcja:
która znajduje się m.in. w curses.h
Gdzie popełniam błąd? Nie pojawiają mi się żadne błędy podczas kompilacji a mimo to zastosowana przeze mnie funkcja getch() jest jakby pomijana przez program.
: 31 października 2009, 00:08
autor: budzigniew
: 31 października 2009, 09:55
autor: lessmian2
A czy to czasem nie jest windowsowy wymysł Borlanda? Z tego co wiem, to nie ma
conio.h na Linuksa. Funkcję
getch() z
conio.h można sobie zaemulować o
-->tak<--. A co do
curses to generalnie się nie znam, ale wydaje mi się że potrzebna jest ta cała otoczka, czyli zainicjowanie okna itp. Tu lepiej
byłoby żeby wypowiedział się ktoś kto wie lepiej ;-)
: 31 października 2009, 11:54
autor: budzigniew
Byc moze, byc moze. Pod linuksem jeszcze nie programowalem.
: 31 października 2009, 12:27
autor: Rad
piter, staraj się nie używać dziwnych funkcji z dziwnych bibliotek. Dla twoich zastosowań powinna wystarczyć metoda get() klasy istream. Przykładowy kod:
Kod: Zaznacz cały
#include <iostream>
using namespace std;
int main()
{
cout << "Naciśnij dowolny klawisz\n";
cin.get();
return 0;
}
: 31 października 2009, 21:13
autor: piter
OK. Po przeanalizowaniu wszystkich informacji mój kod wygląda teraz tak:
Kod: Zaznacz cały
#include <iostream>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
using namespace std;
int mygetch()
{
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
int main()
{
cout << "Naciśnij dowolny klawisz\n";
mygetch();
return 0;
}
Jeśli chodzi o Conio.h to jest pod Windows i nie ma tego w Linuksie.
Natomiast funkcja cin.get() pobiera ciąg znaków z klawiatury i wyświetla na ekranie. Kończy działanie gdy naciśnie się enter.
Podsumowując problem jest rozwiązany. Bardzo dziękuje za odpowiedzi.
Przy okazji tak się zapytam. W kodzie zaproponowanym przez
Rad zauważyłem:
Działanie programu raczej nie zakończy się nie powodzeniem. Czy więc ten dopisek wynika z dobrych zasad pisania kodu w C++?
: 31 października 2009, 21:30
autor: budzigniew
Wedle tego co czytalem
stosuje sie po to, zeby poinformowac system, ze program zakonczyl sie bez zadnych problemow.
A tak jeszcze nawiasem mowiac, to nie wiem jak sprawa wyglada w C++, natomias w C
znajduje sie w
: 31 października 2009, 21:59
autor: piter
budzigniew napisał:
Wedle tego co czytalem
stosuje sie po to, zeby poinformowac system, ze program zakonczyl sie bez zadnych problemow.
Tak. To wiem. Tylko w przypadku tak prostego programu, jest raczej trudno o jakiekolwiek niepowodzenie. Więc zapis return 0 jest moim zdaniem w tym przypadku zbędny. Chyba, że wynika to z dobrych zasad pisania kodu, tak jak wcięcia między klamrami.
: 01 listopada 2009, 00:22
autor: EdytaxEmila
Jeżeli jest się pewnym, że bez błędów to można:
a gdy się pewności nie ma to chyba:
Przynajmniej mnie tak nauczają.
Tak na marginesie to bardzo skomplikowałeś sobie sprawę z tym prostym napisem, oj bardzo, nie trzeba tylu pierdoł tam, popatrz sobie na przykłady na stronach o c++, bo jak będziesz tak komplikował to Ci się w końcu odechce.
A żeby program się od razu nie kończył i czekał na naciśnięcie klawisza to:
ponoć.
: 01 listopada 2009, 01:08
autor: budzigniew
Dyskusja na temat zblizony do poruszanego w tym watku oraz
wypowiedz odnosnie return 0.