Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Wyjście z pętli przez wciśnięcie klawisza w C++


  • Zaloguj się, aby dodać odpowiedź
4 odpowiedzi w tym temacie

#1 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

Napisano 21 stycznia 2014 - 20:06

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ć ?

#2 TomBlack

TomBlack
  • 129 postów

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 pmarek77

pmarek77
  • 2 postów
  • SkądKleczew, Poland

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ę:
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ą | Kurs C++[/url]

#4 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

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 macsurf

macsurf
  • 104 postów
  • SkądKołobrzeg

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 :)




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych