Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Interpreter poleceń Brainfu** - ignoruje polecenie

Ostatnio zmodyfikowano 2014-10-12 15:57
Autor Wiadomość
bingo009
Temat założony przez niniejszego użytkownika
Interpreter poleceń Brainfu** - ignoruje polecenie
» 2014-10-12 15:57:46
Witam was serdecznie, pisze sobie w ramach treningu interpreter poleceń dla języka Brainfu**. Podczas implementacji jego poleceń, doznałem jednego problemu, jakoby pierwsze polecenie było ignorowane. Mam tablicę z pamięcią i tablicę z poleceniami. Cały parser to switch, umieszczony wewnątrz pętli do...while. Pętla działa dopóki w tablicy z poleceniami napotka 0, po każdym jej obiegu zwiększa ona zmienną, przechowującą aktualny indeks tablicy. Dla polecenia , mam zrobione coś takiego:
C/C++
memory[ mem_cell ] = getchar();

Problem polega na tym, że jeżeli na początku tablicy z poleceniami znajduje się polecenie [,](przecinek), to jest ono ignorowanie i program się kończy, a ja nie wiem dlaczego. Oto cała pętla parsera:
C/C++
do
{
   
    switch( commands[ actual_command ] )
    {
       
    case '+':
        if( memory[ mem_cell ] == 255 ) memory[ mem_cell ] = 0;
        else
             memory[ mem_cell ] ++;
       
        break;
       
    case '-':
        if( memory[ mem_cell ] == 0 ) memory[ mem_cell ] = 255;
        else
             memory[ mem_cell ] --;
       
        break;
       
    case '>':
        if( mem_cell == 29999 ) mem_cell = 0;
        else
             mem_cell++;
       
        break;
       
    case '<':
        if( mem_cell == 0 ) mem_cell = 29999;
        else
             mem_cell--;
       
        break;
       
    case '.':
        putchar( memory[ mem_cell ] );
        break;
       
    case ',':
        memory[ mem_cell ] = getchar();
        break;
       
    }
    actual_command++;
   
} while( commands[ actual_command ] != 0 );


Na razie nie mam ładowania plików, tylko polecenia podaje użytkownik w programie i są ładowane do tablicy za pomocą cin>>tablica. Jeżeli podam , i wcisnę Enter(aby rozpocząć interpretacje), to wtedy program odrazu kończy działanie. Jeżeli podam ,, to program pobiera tylko raz znak. O co tutaj chodzi? Wygląda na to, że parser ignoruje całkiem pierwsze polecenie.

Edit: Wprowadzenie 33 plusów(czyli ustawienie wartości komórki na 33, czyli w ASCII znak !) i użycie . powoduje prawidłowo wyświetlenie znaku !. Czyli nie ignoruje innych poleceń.

Edit2: Przeniosłem parsera do osobnej funkcji przyjmującej jako argument wskaźnik do zmiennej char. Wygląda to tak:
C/C++
void interpret( char * commands )

Wywołanie funkcji interpret(",") powoduje prawidłową interpretacje polecenia. Utworzenie tablicy char, ustawienie zerowego elementu jako ',' i wywołanie funkcji interpret(tablica) również działa poprawnie. Próba pobrania tablicy przez cin >> tablica i wpisanie , nie daje efektu - program znowu nic nie zrobi, odrazu się kończy. Widzę, że pętla startuje, ale z jakiegoś powodu wejście się blokuje - o co biega? Czyszczenie bufora wejściowego funkcją cin.clear() i nawet fflush(stdin) nie daje efektu. Ja nie wiem co to może być. Dla testu zainicjalizowałem zerowy element tablicy pamięci wartością 42(znak * w ASCII) i po uruchomieniu programu podałem tylko [.]. Interpreter prawidłowo wyświetlił znak *. Czyli nie działa tylko wejście, nie mam pojęcia dlaczego. Zrobiłem ostatni test, czyli w case do wartości , dałem cout. Uruchomienie programu i wpisanie , sprawiło, że pokazał się napis(czyli switch zadziałał prawidłowo), jednak znowu olał getchar i program zakończył się.

Edit3: Problem już nieważny. Zastąpiłem getchar funkcją cin i teraz działa bez problemu. Interpreter już skończony właściwie.
P-118354
« 1 »
  Strona 1 z 1