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:
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:
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:
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.