[C++] Klawisze strzałek


(Rafalwiecek29081994) #1

Witam

Czy jest jakiś sposób aby odczytać jaki klawisz jest właśnie wciśnięty(konkretnie strzałki ale inne także(enter esc itp.)) bez potwierdzania

Jednym z programów odczytałem że klawisz Up zwraca 4 wartości po 2 podczas wciskania i "puszczania" tylko nie wiem co z tym zrobić

słyszałem także o odczytywaniu buforu klawiatury niestety nie umiem tego zrobić

może istnieje jakaś funkcja :?(używałem getch .itp ale one dl każdej strzałki mają wartość 244 jak dobrze pamiętam)


(Kalin 93) #2

Bo musisz 2 bajty pobrać:wink:

Np :

if (_getch() == 224)

(chasar) #3

Cześć

morze pomogę, zrozumiałem to że chcesz się dowiedzieć jaką liczbę mają znaki i strzałki np:

enter - 13

Lewo - 75

Prawo - 77

Góra - 72

dół - 80

a do przechwycenia to napisałem taki kod :

#include 
#include  // konieczne jest mieć bibliotekę conio (link na dole)
using namespace std ;
int main()
{
    while(true)
               cout << getch() << endl;
    return  EXIT_SUCCESS ;
} [/code]


może się przydałem

[code]http://4programmers.net/C/FAQ/CONIO\_dla\_MinGW\_i\_Dev-C++


(Rafalwiecek29081994) #4

kalin93- dzięki wszystko działa :wink:

chasar -artykuł mi się przydał

@edit

nie chce zakładać nowego tematu więc tutaj spytam jak "zatrzymać" program na np. ~2

załóżmy program działa w nieskończonej pętli wykonuje jakiś blok instrukcji ale musi wykonywać go właśnie co 2 sekundy jak to zrobić


(chasar) #5

cześć

Tym razem też znam odpowiedź na to pytanie,

_sleep(mini sekundy) ;

to funkcja która odczekuje jakiś czas liczy w mini sekundach. i użycie tej funkcji do tamtego programu wyglądało by tak :

#include 
#include 
using namespace std ;
int main()
{
    while(true)
    {
               cout << getch() << endl;
               _sleep(2000) ;
    }
    return  EXIT_SUCCESS ;
} [/code]

wytłumaczę się jeszcze do tamtego posta i do tego w przedostatniej linijce użyłem EXIT_SUCCESS , bo nie wiem jakiego kompilatora używasz bo jak używasz np: dev c++ to nie kombinujmy i wystarczy return 0 ;


(Rafalwiecek29081994) #6

dziękuje wszystko działa jeśli będę miał jakieś pytania napisze w tym temacie.

-- Dodane 23.05.2009 (So) 23:55 --

dobrze kolejne pytania jak zrobić aby w konsoli ten migający "znacznik" pojawiał się tam gdzie chcemy

-- Dodane 24.05.2009 (N) 0:12 --

i co do getcha dlaczego taki kod nie działa

for( ; ;){

 if (_getch() == 224)

{

if (_getch() == 72)

{

blok instrukcji;

}

if(_getch() == 80)

{

blok instrukcji;

}

system("pause");

return 0;

                {

oczywiście to wycinek :wink:

chodzi o to że tak 1 warunek działa ale drugi już nie chce

ps.środowisko w którym kompiluje to dev-c++


(chasar) #7

siema

czyli chcesz zmienić pozycje kursora do tego jest funkcja :

gotoxy(pozycja x , pozycja y) ;

a do tego co podałeś , taki kod powinien działać.

#include 

#include 

using namespace std ;

int main()

{ for( ; ; )

    {

         if (_getch() == 224)

         if (_getch() == 72){

                          //blok instrukcji;

         }

         if (_getch() == 224)  

         if(_getch() == 80){

                        // blok instrukcji;    

         }

    }

return 0 ;

}

oto chodziło.


(Rafalwiecek29081994) #8

niestety kod po dodaniu funkcji gotoxy nie kompiluje się

oto komunikaty o błędach

[Linker error] undefined reference to `gotoxy' 

  ld returned 1 exit status

a dla pewności biblioteki jakie wczytuje:

#include

#include

#include

(chasar) #9

chyba wiem dlaczego :

ostatnia linijka mojego pierwszego posta była

http://4programmers.net/C/FAQ/CONIO_dla_MinGW_i_Dev-C++

to link do biblioteki conio2 myślałem że tą bibliotekę pobrałeś i z linkowałeś do swojego kompilatora

wcześniej z funkcją getch() działało ci bo za includowałeś bibliotekę conio.h i teraz użyłeś gotoxy() i tej funkcji nie było w bibliotece conio.h i dlatego wywala błąd, na tej stronie jest podane jak z linkować tą bibliotekę do kompilatora.

pozdrawiam


(Rafalwiecek29081994) #10

biblioteke mam ściągnięto


(chasar) #11

powinieneś mieć coś takiego za plik :

Dev-C++ Package File.DevPak

tak ? i zainstalowałeś ?


(Rafalwiecek29081994) #12

conio-2.0-1mol.DevPak mam taki

-- Dodane 24.05.2009 (N) 10:45 --

tak


(chasar) #13

to jest plik kompilatora więc wystarczy zainstalować to samo zainstaluje tam gdzie powinno być i trzeba to jeszcze z linkować w :

narzędzia - opcje kompilatora - zaznacz dodaj te polecenia do wiersza poleceń kompilatora i tam wklej -lconio

na tamtej stronie jest lista jakie funkcje ta biblioteka posiada. i już nie musisz includować biblioteki :

#include

tylko

#include

(Rafalwiecek29081994) #14

dobrze wszystko działa

-- Dodane 24.05.2009 (N) 11:26 --

chasar niestety źle działa niby odczytuje strzałki ale np jak mam je ułożne

up

down

left

right

to muszę 3 razy nacisnąć right i dopiero za 4 razem zadziała


(chasar) #15

sorka za nie przemyślany błąd daje aktualizacje :

#include

(Rafalwiecek29081994) #16

dzięki ale już wcześniej to sobie zrobiłem :slight_smile:

tylko coś nie moge zrozumieć dlaczego wcześniej musieliśmy wczytywać dwa bajty a teraz 1 ?

dlaczego gdy chce zamknąc program za pomocą funkcji return 0;

dostaje takie błedy

In function `void koniec()': 

return-statement with a value, in function returning 'void'

void koniec()

{

    return 0;

}

z return 0 sobie poradziłem użyłem wpisałem exit i działa :smiley: (fart nie znałem jej :))


(chasar) #17

wiesz co jak się nie mylę jest to void który nic nie zwraca a ty próbujesz zwrócić wartość 0 ;

funkcji nie za bardzo lubię ale ja bym tam dał

int koniec()

{

     return 0 ;

}

ale nie jestem co do tego pewien i kod wygląda tak :

#include 

using namespace std ;
int koniec()
{
    return 0;
}
int main()
{
    cout << "return ma wartosc : " << koniec() << endl ;
   system("pause");  
   return  koniec();
}
 [/code]

[size=150]chcę pisać kodzik i przeprosić dumdum-a[/size]


(Zenstr) #18

Witam.

Sorry,że się czepiam,ale w tamtym programie macie za dużo if-ów obok siebie.

Od tego jest funkcja switch...case;

#include

#include 



int main()

{

 int liczba = 0;

 using namespace std ;


 for( ; ; )

 {

 liczba = _getch() ;

  switch(liczba)

   {

   case 72:cout << "gora\n";break;

   case 75:cout << "lewo\n" ;break;

   case 77:cout << "prawo\n";break;

   case 80:cout << "dol\n" ;break;

   case 27:exit(1);//wyjscie z petli i programu

   }


 }


 return 0 ;

}

Pozdrawiam


(Rafalwiecek29081994) #19

jestem przyzwyczajony do if a case nie lubię takie dziwne jak dla mnie :slight_smile:


(chasar) #20

dumdum - widzę że tam jest break ;

mnie jak uczy kolega po studiach jak by napisał na kartkówce słowo break od razu by dostał banie.

bo słowo break to ułatwienie do przerzucenia się na (c++ z starszych języków takich jak c itp:) dla starszych osób czyli żeby im było łatwiej zrozumieć c++, automatycznie jak ja jestem młody to muszę kombinować kod tak aby nie można użyć break , goto , continue itp: dla tego też wolę konstrukcje if .

pozdrawiam.