• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Interpreter Brainfucka - wypisuje śmieci

Object Storage Arubacloud
+1 głos
162 wizyt
pytanie zadane 20 kwietnia 2016 w C i C++ przez polewa Nowicjusz (230 p.)
zamknięte 20 kwietnia 2016 przez polewa

Witam.

Piszę interpreter brainfucka:

#include <iostream>
#include <fstream>

std::string read( std::fstream && file ) {
    std::string temp;
    std::string ret;
    while( file >> temp ) ret += temp;
   
    return ret;
}

int main( int argc, char ** argv ) {
    if( argc == 1 ) {
        std::cerr << "Enter path to the *.by file\nPress any key to exit...";
        std::cin.get();
        return 1;
    }
    std::fstream file( argv[ 1 ] );
    if( !file ) {
        std::cerr << "Unable to open file\nPress any key to exit...";
        std::cin.get();
        return 2;
    }
    char data[ 1000 ];
    char * dp = data; //data pointer
    std::string code = read( std::move( file ) );
    size_t it = 0;
    size_t nor = 0;
    while( it < code.size() ) {
        switch( code[ it ] ) {
        case '>':
            ++dp;
            break;
        case '<':
            --dp;
            break;
        case '+':
            ++( * dp );
            break;
        case '-':
            ++( * dp );
            break;
        case '.':
            std::cout <<* dp;
            break;
        case ',':
            std::cin >>* dp;
            break;
        case '[':
            if( * dp == 0 ) {
                int lc = 1; //loop counter
                while( lc != 0 ) {
                    ++it;
                    if( code[ it ] == '[' ) ++lc;
                   
                    if( code[ it ] == ']' ) --lc;
                   
                }
            }
            else
                 nor = it;
           
            break;
        case ']':
            it = nor - 1;
            break;
        default:
            break;
        }
        ++it;
    }
    std::cout << "\nExecution time: TODO\nPress any key to exit...";
    std::cin.get();
}

Testuję na tym kodzie:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Ale wypisuje śmieci za każdym razem(i za każdym razem inne). Na przykład:

╝ÍŢŢÓń╦ÓŃÚ˝ňÍ

Proszę o pomoc i z góry dzięki.

komentarz zamknięcia: Problem rozwiązany. Rozwiązanie w poście niżej

1 odpowiedź

0 głosów
odpowiedź 20 kwietnia 2016 przez polewa Nowicjusz (230 p.)
przywrócone 16 maja 2016 przez Eryk Andrzejewski


Ok rozwiązaniem jest wyzerowanie tablicy data i błąd jest jeszcze tutaj:

case '-':
            ++( * dp );
            break;

Powinna być oczywiście deinkrementacja

2
komentarz 20 kwietnia 2016 przez Dobi Użytkownik (640 p.)

Dekrementacja :D

Podobne pytania

0 głosów
1 odpowiedź 155 wizyt
pytanie zadane 4 czerwca 2016 w C i C++ przez C☺ndzi Stary wyjadacz (12,100 p.)
+5 głosów
3 odpowiedzi 846 wizyt
pytanie zadane 12 września 2015 w Nasze projekty przez Radfler VIP (101,030 p.)
0 głosów
0 odpowiedzi 127 wizyt
pytanie zadane 26 lipca 2023 w Offtop przez reaktywny Nałogowiec (40,990 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...