C - przełączanie podprogramów w czasie rzeczywistym

0

Witam! Mam problem. Prowadzący kazał nam napisać na zajęcia program, który posiada kilka pod programów, które działają w nieskończonych pętlach. Mianowicie, jednym z programów jest licznik binarny od 0 do 255 (8 bitowy), następnym jest ten sam licznik lecz od 255 do 0. Moje pytanie: jak zmieniać te podprogramy? Próbowalem getch() ale ta funkcja czeka aż poda się znak, a do tego momentu zatrzymuje pętlę. Aktualnie działa to tak, że trzeba trzymać spację, aby licznik odliczał.
Oto co udało mi się napisać:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int pilot = 9;
int ex1 = 0;
int ex2 = 255;
void Header()
{
    printf("Aktualny tryb: %d ^ nastepny program, v poprzedni program, [spacja] wykonaj program\n\n",pilot);
}

void TableOfContents()
{
    printf("\t1. 8 bitowy licznik binarny zliczajacy w gore\n");
    printf("\t2. 8 bitowy licznik binarny zliczajacy w dol\n");
}

void VarToDefault()
{
    ex1=0;
    ex2=255;
}

void IntToBinary( int input)
{
    short i = 7;
    printf("\t");
    while(i>=0)
    {
        printf("%d",(input >> i) & 1);
        i--;
    }
}

void IntToGrayCode(int input)
{
    printf("\tBIN\t=>\tGRAY\n");
    IntToBinary(input);
    printf("\t=>");
    IntToBinary(input ^ (input >> 1));
}

void Switch()
{
    if(pilot == 1)
    {
        system("CLS");
        Header();
        IntToBinary(ex1);
        if(ex1 < 256)
            ex1++;
        else
            ex1 = 0;

    }

    if(pilot == 2)
    {
        system("CLS");
        Header();
        IntToBinary(ex2);
        if(ex2 > 0)
            ex2--;
        else
            ex2 = 255;
    }

    if(pilot == 3)
    {
        system("CLS");
        Header();
        IntToGrayCode(ex1);
        if(ex1 < 256)
            ex1++;
        else
            ex1 = 0;
    }

    if(pilot == 4)
    {
        system("CLS");
        Header();
        IntToGrayCode(ex2);
        if(ex2 > 0)
            ex2--;
        else
            ex2 = 255;
    }
}

int main(void){
unsigned long i;
int display=0;
char ch;
Header();
TableOfContents();
while(1)
{
    ch = getch();
    //strzalka w gore 72
    //strzalka w dol 80
    if(ch == 72)
    {
        VarToDefault();
        if(pilot < 9)
            pilot++;
        else
            pilot = 1;
        system("CLS");
        Header();
        TableOfContents();

    }
    else if(ch == 80)
    {
        VarToDefault();
        if(pilot > 1)
            pilot--;
        else
            pilot = 9;
        system("CLS");
        Header();
        TableOfContents();
    }
    else if(ch == 32)
    {
        Switch();
    }
}


}

1

To o wiele bardziej skomplikowane, niż tylko obsługa klawiszy *) . Znasz koncepcję, co to jest wątek? stos maszynowy? Czy para funkcji setjmp/longjmp ?
Nawet sposób drukowania musi się zmienić.
Duuużo wiedzy przed Tobą.

*) jak już używasz getch() z conio.h, to poczytaj o funkcji kbhit(); Z tą wskazówką może pójdziesz krok dalej.

0
AnyKtokolwiek napisał(a):

To o wiele bardziej skomplikowane, niż tylko obsługa klawiszy *) . Znasz koncepcję, co to jest wątek? stos maszynowy? Czy para funkcji setjmp/longjmp ?
Nawet sposób drukowania musi się zmienić.
Duuużo wiedzy przed Tobą.

*) jak już używasz getch() z conio.h, to poczytaj o funkcji kbhit(); Z tą wskazówką może pójdziesz krok dalej.

Znam zagadnienie wielowątkowości, ale nie jestem specjalistą od C... Może coś więcej mi powiesz na ten temat?

2

Ja proponuję, żebyś wkleił DOKŁADNIE polecenie które dostaliście od prowadzącego...

0

W kodzie wystarczyło dodać w funkcji switch

    while (!kbhit())
    {
        usleep( 300000 );
        if(pilot == 1)
        {

                system("CLS");
                Header();
                IntToBinary(ex1);
                if(ex1 < 256)
                    ex1++;
                else
                    ex1 = 0;
        }
}
return;
}

I to chyba nie jest wiedza objętości całej ksiązki Panie AnyKtokolwiek...

1

I to chyba nie jest wiedza objętości całej ksiązki Panie AnyKtokolwiek...

Gdzie masz te kilka podprogramów działających w nieskończonych pętlach, o których początkowo wspomniałeś? :-)

0

Co do przełączania programów, zamieszczam gotowy kod poniżej, możecie go odpalić, z tym, że są napisane na razie 4 podprogramy z 9... Przełączacie strzałkami w góre i w dół, a wykonujecie spacją
Co do odpalenia na Linuxie, zadanie tego nie wymaga, więc zbędna to aluzja

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int pilot = 9;
int ex1 = 0;
int ex2 = 255;
void Header()
{
    printf("Aktualny tryb: %d ^ nastepny program, v poprzedni program, [spacja] wykonaj program\n\n",pilot);
}

void TableOfContents()
{
    printf("\t1. 8 bitowy licznik binarny zliczajacy w gore\n");
    printf("\t2. 8 bitowy licznik binarny zliczajacy w dol\n");
    printf("\t3. 8 bitowy licznik kodu Gray'a w gore\n");
    printf("\t4. 8 bitowy licznik kodu Gray'a w dol\n");
}

void VarToDefault()
{
    ex1=0;
    ex2=255;
}

void IntToBinary( int input)
{
    short i = 7;
    printf("\t");
    while(i>=0)
    {
        printf("%d",(input >> i) & 1);
        i--;
    }
}

void IntToGrayCode(int input)
{
    printf("\tBIN\t=>\tGRAY\n");
    IntToBinary(input);
    printf("\t=>");
    IntToBinary(input ^ (input >> 1));
}

void Switch()
{
    while (!kbhit())
    {
        usleep( 300000 );
        if(pilot == 1)
        {

                system("CLS");
                Header();
                IntToBinary(ex1);
                if(ex1 < 256)
                    ex1++;
                else
                    ex1 = 0;
        }

        if(pilot == 2)
        {
            system("CLS");
            Header();
            IntToBinary(ex2);
            if(ex2 > 0)
                ex2--;
            else
                ex2 = 255;
        }

        if(pilot == 3)
        {
            system("CLS");
            Header();
            IntToGrayCode(ex1);
            if(ex1 < 256)
                ex1++;
            else
                ex1 = 0;
        }

        if(pilot == 4)
        {
            system("CLS");
            Header();
            IntToGrayCode(ex2);
            if(ex2 > 0)
                ex2--;
            else
                ex2 = 255;
        }
    }
    return;
}

int main(void){
char ch;
Header();
TableOfContents();
while(1)
{
    ch = getch();
    //strzalka w gore 72
    //strzalka w dol 80
    //spacja 32
    if(ch == 72)
    {
        VarToDefault();
        if(pilot < 9)
            pilot++;
        else
            pilot = 1;
        system("CLS");
        Header();
        TableOfContents();

    }
    else if(ch == 80)
    {
        VarToDefault();
        if(pilot > 1)
            pilot--;
        else
            pilot = 9;
        system("CLS");
        Header();
        TableOfContents();
    }
    else if(ch == 32)
    {
        Switch();
    }
}

return;
}

6

Aby podsumować sytuację:

  1. Pytasz się o coś innego, niż masz na myśli.
  2. Ludzie udzielają rad, że jest to całkiem zaawansowane zagadnienie, i rzucają przydatnymi terminami.
  3. Wyśmiewasz ich, i podajesz wydmuszkę jako rozwiązanie.
  4. Gdy oni wspominają, że owszem, to co zrobiłeś jakoś działa, ale zupełnie inaczej niż opisywałeś, stwierdzasz, że się spinają.

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