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] jaka pętla? Przycisk na klawiaturze. Funkcja.

masterofcs 01 Lis 2008 17:51 1806 6
  • #1 01 Lis 2008 17:51
    masterofcs
    Poziom 12  

    Sprawa jest prosta, tylko brakuje mi już pomysłów... Potrzebuje jakąś pętlę, żeby się wykonywała cały czas, dopóki nie wcisnę jakiegoś przycisku na klawiaturze :| Załóżmy, że funkcja wypisuje liczby naturalne od 0. Mniej więcej tak to ma wyglądać, brakuje tylko pętli...

    Code:
    int i=0;
    

    int main()
    {
          //nazwa petli
          {
          printf("liczba %d!\n", i);
          i++;
          Sleep(100);
          }

       return 0;

    }

    0 6
  • #2 01 Lis 2008 18:34
    Dr.Vee
    VIP Zasłużony dla elektroda

    Witam,

    Niestety w ANSI C nie ma przenośnej metody na nieblokujący odczyt ze stdin.

    Masz kilka wyjść, w zależności od systemu:
    1) wykonać blokujący odczyt fgetc(stdin) i przerwać go sygnałem, np. setsignal() i alarm(),
    2) wykonywać nieblokujący odczyt, np. fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); read(fd, ...);
    3) wykonywać select() lub poll() z timeoutem,
    4) utworzyć dwa wątki, jeden wątek wypisuje liczby, drugi wątek blokuje się na odczycie z wejścia i po odczytaniu znaku sygnalizuje koniec wypisywania dla wątku nr. 1.
    5) wykorzystać jakąś bibliotekę

    Napisz więcej co to za system i co za program piszesz, to może się jakąś opcję dobierze :)

    Pozdrawiam,
    Dr.Vee

    0
  • #3 01 Lis 2008 19:48
    masterofcs
    Poziom 12  

    Program pod Windę. To jeden z wielu problemów, z którymi nie mogę sobie dać rady w tym programie :( Chodzi o port RS232. Ten fragment kodu ma wysyłać impuls do urządzenia i odbierać od niego dane co określony okres czasu, aż do momentu przerwania przez użytkownika (wpisania jakiegoś znaku, ew. może to być wciśnięcie kombinacji klawiszy, obojętnie).

    0
  • #4 01 Lis 2008 20:23
    Dr.Vee
    VIP Zasłużony dla elektroda

    Znam taką kombinację klawiszy: CTRL+C (zabija program, czasem przydatne ;) )

    A na serio to zobacz do dokumentacji msdn, np. tutaj. Możesz tak asynchronicznie czytać stdin, jeśli nic nie przeczytano to ok, jeśli EOF lub coś przeczytano to przerywasz wypisywanie znaków.

    Aha, jeśli stdin jest sterowany przez konsolę, to znaki będziesz mógł odczytać dopiero po wpisaniu znaku i ENTER przez użytkownika.

    Pozdrawiam,
    Dr.Vee

    0
  • #5 01 Lis 2008 22:47
    masterofcs
    Poziom 12  

    Dr.Vee napisał:
    Możesz tak asynchronicznie czytać stdin, jeśli nic nie przeczytano to ok, jeśli EOF lub coś przeczytano to przerywasz wypisywanie znaków.


    Jakiś przykład "z życia"? :D

    moje kolejne pytanie: czy porównanie getchar()==NULL jest poprawne?

    0
  • #6 01 Lis 2008 23:23
    Dr.Vee
    VIP Zasłużony dla elektroda

    "Przykład z życia" masz w podanym linku do MSDNa.

    Porównanie może jest i poprawne, ale bez sensu. getchar() zwraca albo przeczytany znak, albo stałą EOF.

    Pozdrawiam,
    Dr.Vee

    0
  • #7 02 Lis 2008 10:11
    ed-ek
    Poziom 34  

    Podaję kod w C++, przerób sobie na C.
    Naciśnięcie klawisza przerywa program.

    Code:

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    using namespace std; 
    main()

    int i=0;
     while(1)
     {
       cout<<i<<" ";
       Sleep(1000);
       i++;           
     if(kbhit())break;         
     }
    }

    0
  Szukaj w 5mln produktów