Sprawdzenie czy klawisz jest aktualnie wciśnięty

0

Cześć. Kiedyś napisałem w Pascalu prościutki program, który zamieniał podany tekst na kod Morse'a. Na przestrzeni kilku lat czasem zastanawiałem się jakby zrobić konwersję w drugą stronę w C++. Wiem, że to nie jest takie proste, np. trzeba by powiedzmy na początku ustawić jakiś sztywny zakres czasu, z delikatnym marginesem błędu który by sprawdzał czy dany znak jest kropką czy kreską czy ewentualną przerwą między znakami. Potem można by się pobawić w jakieś bardziej elastyczne działanie, które by, że tak powiem kalibrowało odczyt w trakcie działania programu, jakby nadawanie zmieniało swoje tempo. Ale to już raczej abstrakcja na ten moment.

Na tym etapie zastanawiam się jak sprawdzić stan wciśniętego klawisza? Pętla mierząca czas to już mniejszy problem, ale bez odczytania stanu klawisza nie pójdę dalej. Zależy mi, aby zamierzone działanie nie sprowadzało się jedynie do systemu operacyjnego Windows. Chciałbym, aby rozwiązanie problemu odnosiło się się do jednego konkretnego klawisza, ale też do jakiegokolwiek klawisza. Jeśli nie rybkę to prosiłbym o wędkę ;)

0

Jeśli ma to być rozwiązanie niezależne od systemu, to nie zrobisz tego w C++ bez użycia jakiejś "niestandardowej" biblioteki.
Myślę, że praktycznie dowolna bilioteczka do pisania gier powinna mieć wystarczające możliwości.

Zerknij np. na SFML.

0

Ok, dzięki. A gdyby ułatwić nieco sprawę i skupić się na systemie Windows? Jaką biblioteką się wtedy zainteresować? Czy nie byłoby lepszym rozwiązaniem wstawić do programu kod assemblera (chociaż jeśli o to chodzi to jestem zielony w tym temacie)?

0

Pamiętam że na studiach wspominali o takiej starej bibliotece do czytania z klawiatury conio.h. Na wikipedii jest nawet artykuł o niej i o podobnych bibliotekach czytającyh z klawiatury

0

Niedawno pisałem swój algorytm na bufor kołowy i miałem bardzo podobny problem który polegał na tym by pobierać dowolny znak bez wciskania klawisza "enter". Jest to opisane w bibliotece standardowej C++. A funkcja która to robi nazywa się getchar. Jest to niskopoziomowa funkcja. Assembler jest tu niepotrzebny.

Polecam Ci poczytać o funkcjach z biblioteki standardowej. Może coś ciekawego znajdziesz dla siebie.

0

Zastanawia mnie ta funkcja getchar(). Myślę jak jej użyć. W przypadku pobrania znaku i powiedzmy umieszczenia go w zmiennej i tak muszę wcisnąć Enter, by przejść dalej. Nie wiem jak to ugryźć...

0
haracz napisał(a):

Cześć. Kiedyś napisałem w Pascalu prościutki program, który zamieniał podany tekst na kod Morse'a. Na przestrzeni kilku lat czasem zastanawiałem się jakby zrobić konwersję w drugą stronę w C++. Wiem, że to nie jest takie proste, np. trzeba by powiedzmy na początku ustawić jakiś sztywny zakres czasu, z delikatnym marginesem błędu który by sprawdzał czy dany znak jest kropką czy kreską czy ewentualną przerwą między znakami. Potem można by się pobawić w jakieś bardziej elastyczne działanie, które by, że tak powiem kalibrowało odczyt w trakcie działania programu, jakby nadawanie zmieniało swoje tempo. Ale to już raczej abstrakcja na ten moment.

Na tym etapie zastanawiam się jak sprawdzić stan wciśniętego klawisza? Pętla mierząca czas to już mniejszy problem, ale bez odczytania stanu klawisza nie pójdę dalej. Zależy mi, aby zamierzone działanie nie sprowadzało się jedynie do systemu operacyjnego Windows. Chciałbym, aby rozwiązanie problemu odnosiło się się do jednego konkretnego klawisza, ale też do jakiegokolwiek klawisza. Jeśli nie rybkę to prosiłbym o wędkę ;)

Genralnie Windows nie jest systemem czasu rzeczywistego (może w dowolnej chwili się wziąć za optymalizację pamięci czy coś równie cięzkiego) i krótkofalowcy nie stworzyli wiarygodnego keyera (bo tak to się nazywa, wrzuć w google, albo CW keyer) o podanej filozofii. Wiarygodne keyery mają mikro-kontroler połączony z pecetem

0

Zastanawia mnie ta funkcja getchar(). Myślę jak jej użyć. W przypadku pobrania znaku i powiedzmy umieszczenia go w zmiennej i tak muszę wcisnąć Enter, by przejść dalej. Nie wiem jak to ugryźć...

Przeanalizuj sobie mój kod na działanie bufora. Ten kod musi mieć jeszcze sporo poprawek ale właściwie działa w sensie wczytywania znaków. Wpisz od razu jakieś słowo i na końcu wciśnij enter.

int main(void)
{
    int size=16;
    char *buffer = new char[size];
    int sign;
    int ESC=27;

    char *read;
    char *write;

    while(1)
    {
        write = &buffer[0];

        for(int i=0; i<size; i++)
        {
            sign = std::cin.get();
            *write=static_cast<char>(sign);
            std::cout << static_cast<void*>(write) << " ";
            write++;

            if(i==(size-1))
            {
                write = &buffer[0];
                std::cout << "new" << std::endl;

                for(int j=0; j<size; j++)
                {
                    sign = std::cin.get();
                    *write=static_cast<char>(sign);
                    std::cout << static_cast<void*>(write) << " ";
                    write++;

                    if(j==(size-1))
                    {
                        write = &buffer[0];
                        break;
                    }
                }
            }
        }
    }

    delete [] buffer;

    std::cout << std::endl;

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1