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:

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.

: 31 października 2009, 00:08
autor: budzigniew
Dodaj

Kod: Zaznacz cały

#include conio.h

: 31 października 2009, 09:55
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 ;-)

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

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

: 31 października 2009, 21:30
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

: 31 października 2009, 21:59
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.

: 01 listopada 2009, 00:22
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ć.

: 01 listopada 2009, 01:08
autor: budzigniew
Dyskusja na temat zblizony do poruszanego w tym watku oraz wypowiedz odnosnie return 0.