[+] Funkcja getch() w C++

Potrzebujesz pomocy z C, C++, perl, python, itp.
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post autor: Rad »

piter pisze:Działanie programu raczej nie zakończy się nie powodzeniem. Czy więc ten dopisek wynika z dobrych zasad pisania kodu w C++?
Funkcja main zwraca int, więc pominięcie instrukcji return jest trochę partaczeniem kodu ]system("PAUSE");[/b] to na Linuksie to raczej nie zadziała, bo w przeciwieństwie do Windowsów w systemie nie ma standardowo programu pause, który wyświetla prośbę o naciśnięcie dowolnego klawisza. Generalnie system("pause"); nie powinno się używać - polecam link http://www.gidnetwork.com/b-61.html
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Co do system("PAUSE");

Kod: Zaznacz cały

#include <stdlib.h>
using namespace std;
int main()
{
system("pause");
return 0;
}
I wynik programu:

Kod: Zaznacz cały

sh: pause: command not found
No cóż. Raczej nie trzeba tego komentować. Zresztą wszystko dokładnie jest wyjaśnione w linku jaki podał Rad. Po tym eksperymencie całkowicie zgadzam się autorem tego tekstu.
[quote="Rad"]Funkcja main zwraca int, więc pominięcie instrukcji return jest trochę partaczeniem kodu ]
Proszę mnie wyprowadzić z błędu jeśli źle to rozumiem: Program napisany w C++ jest funkcją main(). Funkcja z założenia zwraca jakąś wartość, w tym przypadku liczbę całkowitą (int).
Ister
Junior Member
Posty: 566
Rejestracja: 05 marca 2009, 12:42

Post autor: Ister »

Owszem. Z tym że funkcja może zwracać void czyli... nic.

Generalnie to jest to co lubię w ,,uczeniu" programowania. Pojawiają się jakieś dziwne fragmenty kodu, których mam wrażenie że nie rozumie nie tylko uczący się (no bo skąd), ale i uczący... A przecież wystarczy wytłumaczyć prostą i logiczną rzecz, o której napisał piter. Program to nic innego jak funkcja. Jako funkcja zwraca to, co jej kazaliśmy zwracać (w tym wypadku int). Nie zwrócenie wartości samo w sobie już jest błędem. Co więcej dobrym nawykiem jest przekazywanie informacji o powodzeniu (lub nie) programu. Inaczej nie wiemy nawet co się stało czasem. A dlaczego warto tą zasadę stosować już przy programach na poziomie Hello world? Bo jak nie zaczniemy teraz, to później będzie nam bardzo ciężko zmienić nawyk.
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post autor: Rad »

piter pisze:Proszę mnie wyprowadzić z błędu jeśli źle to rozumiem: Program napisany w C++ jest funkcją main(). Funkcja z założenia zwraca jakąś wartość, w tym przypadku liczbę całkowitą (int).
Program w C++ jest zbiorem wszystkich funkcji i danych, nie tylko main(). Po prostu standardowo po włączeniu programu wywołuje się funkcja main(), a program kończy się po wyjściu z funkcji main().

Więcej informacji: http://en.wikipedia.org/wiki/Main_funct ... ramming%29

Co do void main() to standard c++ określa, że takie użycie jest niepoprawne, ponieważ funkcja main() powinna zwracać int. Tutaj więcej informacji: http://users.aber.ac.uk/auj/voidmain.shtml
giaur
Member
Posty: 1915
Rejestracja: 25 maja 2007, 22:16

Post autor: giaur »

Standard języka nakazuje, aby funkcja main() była typu int. Kiedyś można było używać void main i nie zwracać nic, ale to stare dzieje. Tak samo jak nagłówki C++ - było iostream.h, jest iostream.

Jeżeli nie stosujesz się do standardu, to tylko od kompilatora zależy zachowanie - w jednym się skompiluje, w innym będzie ostrzeżenie, w jeszcze innym może być błąd kompilacji.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Dziękuje za wszystkie odpowiedzi. Wydaje mi się, że kwestia użycia return 0 jest już jasna.
pietrzuch
Beginner
Posty: 104
Rejestracja: 21 lipca 2007, 22:40
Lokalizacja: Rzeszów

Post autor: pietrzuch »

Funkcja main zwraca int, więc pominięcie instrukcji return jest trochę partaczeniem kodu ;) . Mimo, że praktycznie nie zmienia to działania programu.
Akurat przy funkcji main można opuścić return i nie jest to partaczenie! Nie ma to wpływu na program. Dzieje się tak też ze względów historycznych, w funkcji main więc nie mamy przymusu pisać returna. Co się dzieje gdy go nie ma? Kompilator zachowa się tak jakby na końcu jednak był 'return 0;' czyli zwróci na zero.

Tradycyjne zwrócenie zero przez main oznacza poprawne zakończenie programu, jeśli zostaje jakaś inna wartość zwrócona to zazwyczaj podczas działania programu wystąpił jakiś błąd. (np. odniesienie się do elementu, pustego kontenera)

Co do getch'a to biblioteka NCurses go oferuje.
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

pietrzuch napisał:
Co do getch'a to biblioteka NCurses go oferuje.
Już wcześniej tego próbowałem:

Kod: Zaznacz cały

#include <iostream>
#include <ncurses.h>
using namespace std;

int main ()
{
        cout << "Naciśnij dowolny klawisz" << endl;
        getch();
}
Kompiluje tym poleceniem:

Kod: Zaznacz cały

g++ -lncurses kod.cc
Program wyświetla napis i kończy działanie bez czekania na naciśnięcie klawisza.
pietrzuch
Beginner
Posty: 104
Rejestracja: 21 lipca 2007, 22:40
Lokalizacja: Rzeszów

Post autor: pietrzuch »

Aj...
Używając NCurses strumień (cout/cin) zostawiamy w spokoju, a zamiast nich używamy NCursowych funkcji.
Musisz też przed użyciem biblioteki wywołać funkcję initscr().

Spróbuj tego kodu:

Kod: Zaznacz cały

#include <ncurses.h>

int main()
{     
  initscr();           
  printw("Nacisnij dowolny klawisz!");              
  getch();        
  endwin();
}
Apropo to NCurses ma świetną dokumentację, a kurs tej biblioteki też bez problemu znajdziesz. ;-)
piter
Beginner
Posty: 128
Rejestracja: 09 lutego 2008, 12:45

Post autor: piter »

Działa. Wielkie dzięki.
ODPOWIEDZ