[+] Funkcja getch() w C++

Potrzebujesz pomocy z C, C++, perl, python, itp.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

[+] Funkcja getch() w C++

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

Kod: Zaznacz cały

g++ -lcurses kod.cc
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:

Kod: Zaznacz cały

getch()
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.
budzigniew
Posty: 83
Rejestracja: 07 maja 2008, 11:29

Post autor: budzigniew »

Dodaj

Kod: Zaznacz cały

#include conio.h
Awatar użytkownika
lessmian2
Member
Posty: 1088
Rejestracja: 30 kwietnia 2008, 19:38
Lokalizacja: Kraków

Post autor: lessmian2 »

Kod: Zaznacz cały

#include conio.h
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 ;-)
budzigniew
Posty: 83
Rejestracja: 07 maja 2008, 11:29

Post autor: budzigniew »

Byc moze, byc moze. Pod linuksem jeszcze nie programowalem.
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post 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;
}
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

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

Kod: Zaznacz cały

return 0; 
Działanie programu raczej nie zakończy się nie powodzeniem. Czy więc ten dopisek wynika z dobrych zasad pisania kodu w C++?
budzigniew
Posty: 83
Rejestracja: 07 maja 2008, 11:29

Post autor: budzigniew »

Wedle tego co czytalem

Kod: Zaznacz cały

return 0;
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

Kod: Zaznacz cały

getch()
znajduje sie w

Kod: Zaznacz cały

stdio.h
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

budzigniew napisał:
Wedle tego co czytalem

Kod: Zaznacz cały

return 0;
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.
Awatar użytkownika
EdytaxEmila
Posty: 34
Rejestracja: 15 lutego 2009, 00:45

Post autor: EdytaxEmila »

Jeżeli jest się pewnym, że bez błędów to można:

Kod: Zaznacz cały

return0;
a gdy się pewności nie ma to chyba:

Kod: Zaznacz cały

return EXIT_SUCCESS;
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:

Kod: Zaznacz cały

system("PAUSE");
ponoć.
budzigniew
Posty: 83
Rejestracja: 07 maja 2008, 11:29

Post autor: budzigniew »

Dyskusja na temat zblizony do poruszanego w tym watku oraz wypowiedz odnosnie return 0.
ODPOWIEDZ