Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C/C++] Funkcja zczytywania klawiszy

despotka 04 Lut 2011 23:30 2175 9
  • #1 04 Lut 2011 23:30
    despotka
    Poziom 7  

    Siemka, mam taką funkcję zczytywania wciśniętych klawiszy:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    To jest w C, albo C++. Co teraz z tym zrobić, żeby działało jak teraz, ale żeby po 2 sekundach przestało się wykonywać i zwróciło jakąś wartość (np. 81)?
    Do dyspozycji mam tylko standardowe biblioteki, bez wgrywania czegokolwiek.

    Próbowałem dodawać w różnych miejsach liczniki czasu, niestety nic nie działa.

    Dzięki z góry : )

    0 9
  • #2 05 Lut 2011 01:14
    sevare
    Poziom 13  

    Nie rozumiem, rozumiem ze to twoj kod napisany w c albo c++ tak? Rozwin te mysl bo jedyne co mi sie nasuwa to ze kod zostal od kogos zerzniety i przypisany samemu sobie. Co do pytan:
    nie rozumiem stwierdzenia "jakas wartosc" - masz na mysli random czy poprostu "cokolwiek"? I jak cos moze dzialac jak teraz ale inaczej?

    Pozatym dodaj pelen kod bo nie mam zamiaru strzelac jakie biblioteki zostaly uzyle i w jakim jezyku jest to napisane. Wysil sie troche prosze :)

    0
  • #3 05 Lut 2011 14:56
    kolokat
    Poziom 26  

    C to to na pewno nie jest...
    Strzelam na Visual C++.


    Co do kodu ja zszedłbym poziom niżej - po asemblera i zrobił coś na przykładzie:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    źródło

    0
  • #4 05 Lut 2011 18:12
    despotka
    Poziom 7  

    sevare napisał:
    Nie rozumiem, rozumiem ze to twoj kod napisany w c albo c++ tak? Rozwin te mysl bo jedyne co mi sie nasuwa to ze kod zostal od kogos zerzniety i przypisany samemu sobie. Co do pytan:
    nie rozumiem stwierdzenia "jakas wartosc" - masz na mysli random czy poprostu "cokolwiek"? I jak cos moze dzialac jak teraz ale inaczej?

    Pozatym dodaj pelen kod bo nie mam zamiaru strzelac jakie biblioteki zostaly uzyle i w jakim jezyku jest to napisane. Wysil sie troche prosze :)

    To jest funkcja w bibliotece console.h, ale nie działa dokładnie tak jakbym chciał, więc chcę ją trochę przerobić, ale na moim obecnym poziomie po prostu nie jestem w stanie.

    W tym momencie po wywołaniu funkcji wszystkie działania programu się zawieszają i nic nie ruszy dopóki nie wcisnę jakiegoś klawisza - wtedy funkcja zwraca jego kod. Chciałbym żeby działało tak, że jeśli przez 2 sekundy nic nie wcisnę, wtedy funkcja przestaje się wykonywać, zwraca wartość (81 to numer klawisza "q", którego nie używam nigdzie w programie, więc podałem jako przykład) i program działa dalej.

    Cały kod biblioteki:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #5 09 Lut 2011 11:28
    szelus
    Specjalista - Mikrokontrolery

    No ale przecież wsytarczy w tej pętli (co ją podałeś na początku) dodać licznik obiegów i wyjście, gdy przekroczony (np. zmienić ją na pętlę for() ) i odpowiednio manipulować czasem Sleep-a. Niestety, nie mam pojęcia w jakich jest on jednostkach.

    0
  • #6 09 Lut 2011 19:33
    despotka
    Poziom 7  

    szelus napisał:
    No ale przecież wsytarczy w tej pętli (co ją podałeś na początku) dodać licznik obiegów i wyjście, gdy przekroczony (np. zmienić ją na pętlę for() ) i odpowiednio manipulować czasem Sleep-a. Niestety, nie mam pojęcia w jakich jest on jednostkach.

    No właśnie to nie takie proste, bo te funkcje są dziwne.

    Zmieniłem na fora, żeby powtarzał pętlę tylko 5 razy, ale gdy się nic nie robi, to mimo to nic się nie dzieje - program nadal czeka na wciśnięcie przycisku i nic nie robi. Za to zaczyna działać tak jak powinno w momencie poruszenia myszką...

    Po prostu któreś z poleceń w tej funkcji (nie mam pojęcia które, próbowałem wszystkiego ;o) zatrzymuje program i czeka na klawisz, to chyba nie jest tylko kwestia pętli.

    0
  • #8 11 Lut 2011 14:54
    shaevtchac1
    Poziom 9  

    Despotka:

    Masz w tej funkcji nieskończoną pętlę, która czeka na wciśnięcie klawisza. Ta pętla to while(1) {}. W c++ jakakolwiek liczba poza 0 jest rozumiana jako true, więc warunek pętli jest zawsze spełniony. Pętla ta wykonuje się co 25ms [Sleep(25)] i sprawdza, czy nie wciśnięto klawisza. Funkcję chcesz opuścić po 2s czyli 2000ms. Trzeba więc pozwolić pętli wykonać się 80 razy (2000/25=80) i opuścić funkcję zwracając daną wartość.

    Można to zrobić na kilka sposobów np. tak:

    Przed while(1) daj:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    a po Sleep(25); daj:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Chociaż po kodzie, który wkleiłaś da radę stwierdzić, że to WINAPI robione najprawdopodobniej w Visual C++ ale następnym razem napisz pod jaki system operacyjny programujesz, jakiego api używasz i w czym piszesz.

    P.S. Masz minimalną wiedzę na temat programowania, ale bierzesz się za ambitne rzeczy próbując skleić do kupy program, który będzie robił to, co ty chcesz. Jest to jeden z lepszych IMHO sposobów, żeby się nauczyć czegoś nowego. To, w czym grzebiesz to programowanie pod Windows w C++ - temat wcale niełatwy. Jeżeli znasz angielski to polecam zacząć od
    http://www.youtube.com/user/antiRTFM#p/c/1D10C030FDCE7CE0
    To C++ wytłumaczony tak, że prościej się nie da.


    Jeszcze trochę przemyśleń filozoficznych przy okazji (wrażliwi niech lepiej nie czytają :)


    do adminów:

    System punktowania na forum sprawia, że każdy chce coś odpowiedzieć, bo dostanie 2pkt. Piszą nawet ci, który temat przyśnił się 10 lat temu. Piszą też ci, co chcą się wyżyć na początkujących. Ja bym dał możliwość przydzielenia tych "darmowych" punktów zakładającemu temat.

    Teraz ja się wyżyję na wyżywaczach :]

    sevare:
    Ulżyło Ci? Jak nie to wysil się trochę bardziej proszę :)

    kolokat:

    ja zszedłbym poziom wyżej - do LOGO i zrobił coś na przykładzie:

    Code:
    oto kwadrat
    
       powtórz 4 [naprzód 100 lewo 90]
     już


    Sądzę, że moja funkcja w LOGO przyda się Despotce w takim samym stopniu jak Twoja w C - bo to jest C a nie "asembler".

    szelus:

    równie dobrze mogłeś napisać tak:
    "No ale przecież wystarczy zmienić program tak, żeby działał jak trzeba." Dodać jakieś wyrazy typu "DWORD" albo "ker.wRepeatCount". Dołączyć jakiś losowy link z 10-sekundowego przeszukania gogla i efekt byłby taki sam, czyli zero pomocy potrzebującemu.

    0
  • #9 11 Lut 2011 16:56
    szelus
    Specjalista - Mikrokontrolery

    :arrow:shaevtchac1

    Jasssne, bardzo dobre to, co napisałeś o tym nabijaniu punktów. Właśnie się zastanawiam, czy zgłosić Twój post adminom. :wink:

    Umiesz czytać ze zrozumieniem?

    Despotka napisał:

    Zmieniłem na fora, żeby powtarzał pętlę tylko 5 razy, ale gdy się nic nie robi, to mimo to nic się nie dzieje - program nadal czeka na wciśnięcie przycisku i nic nie robi. Za to zaczyna działać tak jak powinno w momencie poruszenia myszką...

    A Ty co proponujesz? Zrobić jeszcze raz to samo?

    Co do mojego linka - czytałeś w ogóle? Opisany dokładnie taki sam problem, blokowanie się funkcji ReadConsoleInput() w nieskończonej pętli i jak zrobić, aby pętla przerywała się po pewnym czasie. Autorowi tego wątku wystarczy tylko skopiować przykładowy kod z tamtego forum.

    Bez dalszego komentarza....

    0
  • #10 12 Lut 2011 20:27
    shaevtchac1
    Poziom 9  

    szelus:
    Możesz zgłosić posta do adminów - zrobisz mi przysługę, gdyż moją intencją było żeby oni go przeczytali. Zresztą chyba sam to zrobię.

    Z moim rozumieniem tego, co czytam wszystko w porządku, za to gdybyś Ty miał choć minimalne pojęcie o programowaniu, to zauważyłbyś, że oprócz tego, że zliczam wykonania pętli to jeszcze opuszczam funkcję na koniec, czego nie zrobiła despotka w swoim rozwiązaniu.

    Jeżeli chodzi o Twojego linka to owszem jest funkcja ReadConsoleInput() i jest podobny problem, ale w przypadku despotki funkcja i rozwiązanie problemu są zupełnie inne, tak więc Twoją pomoc w tym względzie można o kant dupy potłuc.

    Gratuluję 2245.76 punktów. Chyba domyślam się w jaki sposób ich tyle natłukłeś :).

    0