Brainfuck Interpreter



  • Hallo,
    ich hoffe mal das ist kein kompletter Unsinn, aber ich habe mal einen Brainfuck Interpreter programmiert. Hat jemand einen Vorschlag, wie ich den verbessern kann?
    Einlesen eines Programms per Datei kommt noch, ich arbeite dran.

    // Brainfuck 1.1
    #include <iostream>
    #include <string.h>
    using namespace std;
    int i=0;
    int pos=0;
    int r[100];
    int p=0;
    char x[100];
    int var=0;
    int main() {
        cout << "       *** Brainfuck *** " << endl;
        cout << endl;
        while(1) {
                 cout << "OK" << endl;
                 cin >> x;
                 for(i=0;i<=strlen(x);i++) 
                 {
                      switch(x[i]) {
                                   case '+':
                                        r[p]=r[p]+1;
                                        break;
                                   case '-':
                                        r[p]=r[p]-1;
                                        break;
                                   case '<':
                                        p=p-1;
                                        break;
                                   case '>':
                                        p=p+1;
                                        break;
                                   case '.':
                                        cout << r[p] << endl;
                                        break;
                                   case ',':
                                        cin >> var;
                                        r[p]=var;
                                        break;
                                   case '[':
                                        pos=i;
                                        break;
                                   case ']':
                                        if(r[p] != 0) {
                                                i=pos;
                                                }
                                        break;
                                   }
                      }
                 }
    }
    

    Die Schleife find ich besonders lustig.
    Das Programm habe ich von meiner ersten BASIC Version hergeleitet.
    Ich habe noch eine Version in SmallBASIC geschrieben.

    Hoffe der Code ist nicht zu dumm. Bin erst Anfänger.
    Gruß



  • Ein erster Schritt wäre es, den ganzen C-Kram loszuwerden und es in C++-Manier zu schreiben, das heißt erst mal: benutze std::vector (oder std::array) und std::string statt C-Strings.


  • Mod

    Was ist mit verschachtelten [] ?



  • Die globalen Variablen sind auch nicht so toll...



  • Warum sind die globalen Variablen nicht so toll?



  • Christoph-C++ schrieb:

    Warum sind die globalen Variablen nicht so toll?

    Lokal ginge auch. An sich isses kein Unterschied; beide gehen.

    Aber die alten Hasen sind schon dutzendmal reingefallen: Globale Vars waren erstmal einfacher, aber haben dann verhindert, daß man später was tolles einbauen konnte.

    Fängt beim ersten Spiel an, sagen wie mal ein Würfelspiel wie Yhazehh, nachdem es klappt, nur einen Spielerr aufzunehmen, mach man auch 5 Spieler packen und später sogar ne KI machen. Min globalen variablen muss man dann alle globalen per Hand aufsammeln und lokale machen bevor man weitermachen kann. Total unnötig, hätte man sie gleich so lokal wie möglich gemacht.

    Statt noch mehr Sachen aufzuzählen, bitte ich Dir, uns zu glauben. Lokal ist gut. Ganz viel später kotzt man, wenn man multithreading machen will und sich nicht an lokale gewöhnt hat. Zwischendurch ist fast immer lokal schneller: Der Compiler kan lokale Variablen besser optimieren. Und wenns Prog ein wenig größer wird, macht man aus Versehen Fehler und greift auf die falschen globalen Variablen zu.



  • @Christoph-C++
    Ist mit 1-2 Sätzen wirklich nicht einfach zu erklären warum globale Variablen schlecht sind. Vor allem jemandem der es nicht selbst schon weiss 🤡
    Glaub es volkard einfach. 🙂



  • Also muss ich folgendes ersetzen:
    <string> durch <vector>
    Global durch lokal
    und verschachtelte Schleifen.



  • <string> durch <vector> //<string> fände ich fein, aber nicht <string.h>
    Global durch lokal //jup!!
    und verschachtelte Schleifen //eher nicht, dein Interpreter macht das. Musst von [ zum passenden ] rennen können. Ich dächte daran, die [ und ] zwischendrin mit ++ und -- zu berarbeiten und bei ==0 ist die richtige ] gefunden oder so.


Anmelden zum Antworten