[C++]Wyjście z funkcji po naciśnięciu ESC

0

Witam!

Piszę właśnie program zaliczeniowy, ale mniejsza o to.
W czym rzecz: chciałbym umożliwić wyjście z funkcji po naciśnięciu klawisza ESC.

Znalazłem takie coś: http://forum.programuj.com/viewtopic.php?p=6375&sid=2cd2e040fc0bfa1db04e000b0f60b504

Niestety w przypadku, gdy funkcja zawiera cin, to sprawa się nieco komplikuje.
Aby to jako tako działało, robię tak:

void switch_menu_7()
{
     //sprzedaz detaliczna
     char nazwa[51];
     int ilosc;
     int istnieje = -1;
     int esc;
     
     while(1)
     {                  
     cout << "Wprowadz nazwe towaru: ";
     if ( !kbhit() )
             {
                  esc = getch();
                  if (esc == 27) break;}
     cin >> nazwa;
     
     
        for (int i=0; i<licznik_towaru; i++)
        {
            if(strcmp(nazwa,magazyn.towar_magazyn[i].nazwa)==0)
            {
             istnieje = i;
             break;                                           
             }//koniec if 
         }//koniec for
     if (istnieje>=0)
     {
                    magazyn.wypisz_towar(istnieje);
                    cout << "Ilosc towaru do sprzedazy: ";
                    cin >> ilosc;
                    magazyn.Sprzedaj_Det(nazwa, ilosc);
                    cout << "Sprzedano!\n";
                    sleep(); 
                     }
     else cout << "Brak towaru\n";     
     }
     sleep();
     
 }

Problem: pierwsze litera nie jest brana do nazwa (cin >> nazwa), trzeba ją wstukać dwa razy.

Jak to można inaczej zrobić?

0

Fajnie, a jaki kompilator? Borlandowski?

Jak już używasz getch() to spróbuj ungetch() jeśli to nie jest escape. I zdefiniuj sobie gdzieś stałą:
const int ESCAPE_KEY = 27;
bo co to jest to 27 to za tydzień sam pamiętał nie będziesz.

0
Bart_wmi napisał(a)
stfu napisał(a)

Fajnie, a jaki kompilator? Borlandowski?

Jak już używasz getch() to spróbuj ungetch() jeśli to nie jest escape. I zdefiniuj sobie gdzieś stałą:
const int ESCAPE_KEY = 27;
bo co to jest to 27 to za tydzień sam pamiętał nie będziesz.

Kompilator: Dev-C++ [EDIT: kompilator zawarty w Dev-C++]

Zaraz wypróbuję rady.

Więc tak, z tego co wygooglałem, ungetch() wyrzuca na wejście konsoli znak, ale przy następnym czytaniu getch() lub getche(), więc nie działa to, gdy chcę spisać wyraz z klawiatury, albo źle to wykorzystuję.

void switch_menu_7()
{
     //sprzedaz detaliczna
     char nazwa[51];
     int ilosc;
     int istnieje = -1;
     int esc = 0;
     
     while(1)
     {
         esc = 0;                  
         cout << "Wprowadz nazwe towaru: ";
         
         if (!kbhit())
         {             
         esc = getch();
         if (esc == ESCAPE_KEY) break;
         else ungetch(esc);
         }//koniec if (!kbhit())
         cin >> nazwa;     
         
            for (int i=0; i<licznik_towaru; i++)
            {
                if(strcmp(nazwa,magazyn.towar_magazyn[i].nazwa)==0)
                {
                 istnieje = i;
                 break;                                           
                 }//koniec if 
             }//koniec for
         if (istnieje>=0)
         {
                        magazyn.wypisz_towar(istnieje);
                        cout << "Ilosc towaru do sprzedazy: ";
                        cin >> ilosc;
                        magazyn.Sprzedaj_Det(nazwa, ilosc);
                        cout << "Sprzedano!\n";
                        sleep(); 
                         }//koniec if
         else cout << "Brak towaru\n";     
     }//koniec while
     cout << "przerywam";
     sleep();     
 }

Mógłbyś mnie jakoś lepiej nakierować?
[EDIT] Podczas pierwszej pętli while w tej funkcji po naciśnięciu ESC przerywanie działa. Pierwszą literę muszę wpisywać dwa razy, jeśli towaru o danej nazwie nie znajdzie, to w drugiej pętli przerywanie już nie działa.

0

Nie lubię strumieni, dlatego korzystam z szybszych funkcji scanf i printf, ale..
Możesz skorzystać z funkcji (jak już zwrócisz ungetch'em ten znak) gets() - ładuje całą linię do bufora typu char[], ale uwaga na dłuższe nazwy, bo funkcja gets() nie sprawdza rozmiaru Twojego bufora i długości pobieranego stringa.

Nie wiem dlaczego nie działa, bo nie mogę sprawdzić u siebie. Podejrzewam, że ten zwrócony znak pozostaje jeszcze w strumieniu stdin, kbhit() działa ale z tym zwróconym znakiem i kółko się kręci. Chyba :)

PS. Zmień środowisko..

Pozdrawiam.

0

Po użyciu gets() program się zapętla, w ogóle nie pyta o nazwę towaru, tylko od razu pyta o ilość, wyświetlając poprzednio wpisany produkt(mimo, że wypisanie nazwy jest puste). ESC działa tylko przy pierwszej pętli.

Może jakaś (zupełnie)inna metoda na rozwiązanie problemu?

PS. Jakie środowisko proponujesz?

[EDIT] OK, po zakomentowaniu "else ungetch(esc);" ESC działa przy każdej pętli, jednak pierwszy znak zawsze trzeba wpisać dwa razy.

0

Jest wiele metod, ale prostych raczej nie ma :) [albo ja sobie zawsze życie utrudniam]
Możesz skorzystać z tego (ale to jest dość skomplikowane jak dla Ciebie (zapewne) i pod uniksowe systemy): http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html
Możesz również wykorzystać bibliotekę curses (pod Windowsem PDCurses) i tam wykorzystać funkcję keypad().

Jakie środowisko? Visual C++ Express darmowe na początek. Pamiętaj, że do nauki (chyba, że się już nie uczysz :) ) nie należy wykorzystywać niestandardowych bibliotek, bo później się przesiądziesz na inny kompilator i.. google w ruch :)

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