No właśnie jak ? getchar() czy cin zawsze czekają na wciśnięcie jakiegoś znaku. A tu ma przerwać pętle po wciśnięciu danego klawisza. To sam nie wiem, może trzeba nowy wątek stworzyć ?

Wyjście z pętli przez wciśnięcie klawisza w C++
Rozpoczęty przez
macsurf
, 21 sty 2014 20:06
4 odpowiedzi w tym temacie
#1
Napisano 21 stycznia 2014 - 20:06
#2
Napisano 22 stycznia 2014 - 02:29
#include iostream
#include conio.h
using namespace std;
int main()
{
while (1)
{
if (kbhit()) break;
}
return 0;
}
To jedyna opcja jaką pamiętam z zajęć na uczelni. Chociaż nie jestem pewien czy w c++ istnieje coś takiego jak klawiatura. Wydaje mi się, że jest to z góry określone. Powyższy kod korzysta z niekończącej się pętli - dopiero po wciśnięciu jakiegokolwiek klawisza ubijasz pętle.
#3
Napisano 22 stycznia 2014 - 12:03
kbhit() sprawdza czy w buforze jest jakiś znak, jeżeli np. przed wejściem w pętle wciśnięto znak specjalny (chyba 0 + znak) to od razu wyjdzie z pętli.
Warto oczyścić bufor klawiatury przed wejściem we właściwą pętlę:
Tutaj inny przykład, który co prawda nie czyści buforu, ale czeka na klawisz 'ESC'
[url=http://cpp0x.pl/kursy/Kurs-C++/Obsluga-klawiatury-za-pomoca-conio-h/320][lekcja] Obsługa klawiatury za pomocą | Kurs C++[/url]
Warto oczyścić bufor klawiatury przed wejściem we właściwą pętlę:
while( kbhit() ) { znak = getch(); }
Tutaj inny przykład, który co prawda nie czyści buforu, ale czeka na klawisz 'ESC'
[url=http://cpp0x.pl/kursy/Kurs-C++/Obsluga-klawiatury-za-pomoca-conio-h/320][lekcja] Obsługa klawiatury za pomocą
#4
Napisano 22 stycznia 2014 - 15:47
Z kbhit mozna to zrobic jak sie koduje pod winde/ms-dos. Tutaj w bibliotece standardowej nie ma takiej funkcji. Można ją samemu napisać operując na innych bibliotekach które wchodzą w ustawienia konsoli - w to sie jeszcze nie bawiłem. Póki co zrobiłem drugi wątek dla funkcji która monitoruje czy został wciśnięty jakiś klawisz ale jeszcze kodu nie daję bo nie działa tak jak powinno
Jak wszystko będzie ok wrzucę przykładowy kod.

#5
Napisano 22 stycznia 2014 - 18:22
No cóż po dodaniu drugiego wątku dla przechwycenia znaku i tak zawsze muszę wciskać ENTER, taki urok getchar() z tego co wiem to trzeba kombinowac z biblioteka ncurses 
- - - Połączono posty - - -
Dobra sprawa rozwiązana, trzeba napisać sobie samemu funkcję getch() wykorzystując funkcje do ustawiania parametrów terminala ( deklaracje funkcji znajdują się w termios.h ). Zapisujemy stare ustawienia terminala, ustawiamy tymczasowe wyłączając buforowanie. Na końcu tresci naszej funkcji getch() po wywołaniu w niej getchar() przywracamy stare ustawienia terminala. Samo getchar() na nowych ustawieniach nie będzie czekać na znak ENTERa ! dlatego po wywołaniu przywracamy stare ustawienia aby poza funkcją getch(), getchar() zachowywała się w sposób standardowy

- - - Połączono posty - - -
Dobra sprawa rozwiązana, trzeba napisać sobie samemu funkcję getch() wykorzystując funkcje do ustawiania parametrów terminala ( deklaracje funkcji znajdują się w termios.h ). Zapisujemy stare ustawienia terminala, ustawiamy tymczasowe wyłączając buforowanie. Na końcu tresci naszej funkcji getch() po wywołaniu w niej getchar() przywracamy stare ustawienia terminala. Samo getchar() na nowych ustawieniach nie będzie czekać na znak ENTERa ! dlatego po wywołaniu przywracamy stare ustawienia aby poza funkcją getch(), getchar() zachowywała się w sposób standardowy

Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych