Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Brainfuck in c++??

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
11.06.2004, 13:51 Uhr
RedEagle



Gibt es ne Möglichkein Brainfuck - code in ein C++ - programm zu intengrieren??
(wie z.B. assembler-code)
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.06.2004, 14:36 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Quatsch, du kannst ja auch kein VB oder Pascal Code in C integrieren.

Außerdem ist Brainfuck keine richtige Programmiersprache, sondern einfach nur Brainfuck
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.06.2004, 14:42 Uhr
~RedEagle
Gast



Zitat:
Guybrush Threepwood postete
Außerdem ist Brainfuck keine richtige Programmiersprache, ...


Es gibt aber Compiler und editorern mit Syntax-"värbung" (auch wenn es nur 8 zeichen gibg)

es währe aber interessant gewesen, um Passwörter u.ä. bei Opensource-projekten unleserlich zu machen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.06.2004, 16:26 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Warum schreibst Du nicht Deinen eigenen BF-Interpreter als C++-Lib? Sollte nicht allzu kompliziert sein
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.06.2004, 09:32 Uhr
RedEagle




Zitat:
Bruder Leif postete
Warum schreibst Du nicht Deinen eigenen BF-Interpreter ...


Wie macht man das?? Habe ich noch nie gemacht, gibts da nen Online-Tutorial??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.06.2004, 19:51 Uhr
Bruder Leif
dances with systems
(Operator)


Zum Beispiel so:


C++:
#include<stdio.h>

int main(int argc, char *argv[])
{
  int pc = 0;    // Program Counter
  int xc;        // Datenpointer
  int prog_len;  // Länge des Programms
  int l = 0;     // Hilfszähler für Schleifenbefehle
  int x[32768];  // Datenspeicher
  int p[32768];  // Programmspeicher
  FILE *stream;  // Um die Datei einzulesen

  // Alle Argumente der Kommandozeile durchgehen
  for(argv++; *argv; argv++)  
  {
    // Programm einlesen
    stream = fopen(*argv, "r");
    for(prog_len = 0; prog_len < 32768 && (p[prog_len] = getc(stream)) != EOF; )
       prog_len++;
    fclose(stream);

    // Datenspeicher und -pointer zurücksetzen ("Reset")
    for(xc = 0; xc < 32768; xc++) x[xc] = 0;
    xc = 0;

    // Und los gehts!
    for(pc = 0; pc < prog_len; pc++)
    {
      // Je nach Befehl abarbeiten
      switch(p[pc])
      {
        case '+': x[xc]++; break;
        case '-': x[xc]--; break;
        case '.': putchar(x[xc]); break;
        case ',': x[xc] = getchar(); break;
        case '>': xc++; break;
        case '<': xc--; break;

        // Schleifenbefehle sind etwas komplexer, daher als eigener Block:
        case '[':
        {
          if(!x[xc])
          {
            pc++;
            while(l > 0 || p[pc] != ']')
            {
              if(p[pc] == '[') l++;
              if(p[pc] == ']') l--;
              pc++;
            }
          }
          break;
        }

        case ']':
        {
          pc--;
          while(l > 0 || p[pc] != '[') {
            if (p[pc] == ']') l++;
            if (p[pc] == '[') l--;
            pc--;
          }
          pc--;
          break;
        }
      }
    }  
  }
  return 0;
}


Ein kleines Progrämmchen zum Testen:


Code:
>++++++++[ <++++++++>-]<++++++++++++++++.[ -]
>++++++++++[ <++++++++++>-]<++++++++++++++.[ -]
>++++++++++[ <++++++++++>-]<+++++.[ -]
>++++++++++[ <++++++++++>-]<+++++++++.[ -]
>++++++++++[ <++++++++++>-]<+.[ -]
>++++++++++[ <++++++++++>-]<+++++++++++++++.[ -]
>+++++[ <+++++>-]<+++++++.[ -]
>++++++++++[ <++++++++++>-]<+++++++++++++++++.[ -]
>++++++++++[ <++++++++++>-]<++++++++++++.[ -]
>+++++[ <+++++>-]<+++++++.[ -]
>++++++++++[ <++++++++++>-]<++++++++++++++++.[ -]
>++++++++++[ <++++++++++>-]<+++++++++++.[ -]
>+++++++[ <+++++++>-]<+++++++++.[ -]
>+++++[ <+++++>-]<+++++++.[ -]
+[ ->,----------[ <+>-------------------------------------->
[ >+>+<<-]>>[ <<+>>-]<>>>+++++++++[ <<<[ >+>+<<-]>>[ <<+>>-]<[ <<+>>-]>>-]<<<[ -]<<
[ >+<-]]<]>>[ <<+>>-]<<>+<-[ >+[ >+>+<<-]>>[ <<+>>-]<>+<-->>>>>>>>+<<<<<<<<[ >+<-
<[ >>>+>+<<<<-]>>>>[ <<<<+>>>>-]<<<>[ >>+>+<<<-]>>>[ <<<+>>>-]<<<<>>>
[ >+>+<<-]>>[ <<+>>-]<<<[ >>>>>+<<<[ >+>+<<-]>>[ <<+>>-]<[ >>[ -]<<-]>>[ <<<<
[ >+>+<<-]>>[ <<+>>-]<>>>-]<<<-<<-]+>>[ <<[ -]>>-]<<>[ -]<[ >>>>>>[ -]<<<<<<-]<<
>>[ -]>[ -]<<<]>>>>>>>>[ -<<<<<<<[ -]<<[ >>+>+<<<-]>>>[ <<<+>>>-]<<<>>[ >+<-]>[
[ >+>+<<-]>>[ <<+>>-]<>+++++++++<[ >>>+<<[ >+>[ -]<<-]>[ <+>-]>[ <<++++++++++>>-]<<-<-]
+++++++++>[ <->-]<[ >+<-]<[ >+<-]<[ >+<-]>>>[ <<<+>>>-]<>+++++++++<[ >>>+<<[ >+>[ -]<<-]
>[ <+>-]>[ <<++++++++++>>>+<-]<<-<-]>>>>[ <<<<+>>>>-]<<<<>[ -]<<+>]<[ [ >+<-]
+++++++[ <+++++++>-]<-><.[ -]>>[ <<+>>-]<<-]>++++[ <++++++++>-]<.[ -]>>>>>>>]
<<<<<<<<>[ -]<[ -]<<-]++++++++++.[ -]


--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 13.06.2004 um 19:53 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.06.2004, 21:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Primzahlenberechnung? nett ist aber ganz schön langsam...
--
class God : public ChuckNorris { };

Dieser Post wurde am 13.06.2004 um 21:51 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.06.2004, 22:15 Uhr
Bruder Leif
dances with systems
(Operator)


*g* aber Turing-komplett ;-)
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.06.2004, 14:09 Uhr
virtual
Sexiest Bit alive
(Operator)


@FloSoft
Ein Compiler kann da aber Abhilfe schaffen:
Folgendes Mittagspausenprogramm generiert aus der BF Datei eine C Datei, welche man dann durch einen C Compiler jagen kann. Sollte Deine Performancebedenken zumindest teilweise ausräumen....


C++:
#include <fstream>
#include <iostream>
#include <string>
#include <cstdlib>
#include <iterator>
#include <list>
#include <algorithm>
#include <cctype>


const unsigned DATA_SPACE = 32768;
const unsigned PRG_SPACE = 32768;


int main(int argc, char** argv)
{
    std::string strPrgname = *argv++;
    std::string::size_type delimit = strPrgname.find_last_of("/\\");
    if (delimit!=std::string::npos) strPrgname = strPrgname.substr(delimit+1);

    if (argc!=3)
    {
        std::cerr<<"error: "<<strPrgname<<": illegal command line."<<std::endl
                 <<"usage: "<<strPrgname<<" <infile> <outfile>"<<std::endl;
        std::exit(1);
    }
    std::string inFilename = *argv++;
    std::string outFilename = *argv;

    std::list<char> bfSource;
    std::ifstream inFile(inFilename.c_str());
    std::copy(std::istream_iterator<char>(inFile),
              std::istream_iterator<char>(),
              std::back_inserter(bfSource));
    bfSource.remove_if(std::isspace);
    if (bfSource.size()>PRG_SPACE)
    {
        std::cerr<<"error: "<<strPrgname<<": input too long."<<std::endl;
        std::exit(2);
    }

    std::ofstream outFile(outFilename.c_str());
    outFile<<"#include <stdio.h>"<<std::endl
           <<std::endl
           <<"char data["<<DATA_SPACE<<"];"<<std::endl
           <<std::endl
           <<"int main(void)"<<std::endl
           <<"{"<<std::endl
           <<"\tchar* p = data;"<<std::endl;

    std::list<char>::const_iterator i = bfSource.begin();
    std::string indent = "\t";
    int level = 0;
    unsigned pos = 1;
    while (i != bfSource.end())
    {
        int count = 1;
        char token = *i++;
        while (i!=bfSource.end() && *i==token)
        {
            ++count;
            ++i;
        }
        switch(token)
        {
        case '+':
            if (count>1)
                outFile<<indent<<"*p += "<<count<<";"<<std::endl;
            else
                outFile<<indent<<"++*p;"<<std::endl;
            break;
        case '-':
            if (count>1)
                outFile<<indent<<"*p -= "<<count<<";"<<std::endl;
            else
                outFile<<indent<<"--*p;"<<std::endl;
            break;
        case '<':
            if (count>1)
                outFile<<indent<<"p -= "<<count<<";"<<std::endl;
            else
                outFile<<indent<<"--p;"<<std::endl;
            break;
        case '>':
            if (count>1)
                outFile<<indent<<"p += "<<count<<";"<<std::endl;
            else
                outFile<<indent<<"++p;"<<std::endl;
            break;
        case '.':
            for(int j=0; j<count; ++j)
                outFile<<indent<<"putchar(*p);"<<std::endl;
            break;
        case ',':
            if (count>1)
                std::cerr<<"warning: "<<strPrgname<<": "<<inFilename<<":"<<":"<<(pos+1)<<": dead code."<<std::endl;
            outFile<<indent<<"*p = getchar();"<<std::endl;
            break;
        case '[':
            for(int j=0; j<count; ++j)
            {
                outFile<<indent<<"while(*p)"<<std::endl;
                outFile<<indent<<"{"<<std::endl;
                ++level;
                indent += "\t";
            }
            break;
        case ']':
            for(int j=0; j<count; ++j)
            {
                if (level-- == 0)
                {
                    std::cerr<<"error: "<<strPrgname<<": "<<inFilename<<":"<<":"<<(pos+1)<<": unbalanced []."<<std::endl;
                    std::exit(3);
                }
                indent = indent.substr(0, indent.length()-1);
                outFile<<indent<<"}"<<std::endl;
            }
            break;
        default:
            std::cerr<<"error: "<<strPrgname<<": "<<inFilename<<":"<<":"<<(pos+1)<<": unrecognized token \""<<token<<"\"."<<std::endl;
            std::exit(4);

        }
        pos += count;
    }

    if (level!=0)
    {
        std::cerr<<"error: "<<strPrgname<<": "<<inFilename<<":"<<(pos+1)<<": unexpected end of file."<<std::endl;
        std::exit(5);
    }
    outFile<<indent<<"}"<<std::endl;
    outFile.close();

    std::exit(0);
}



Brainfuck rulez
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 14.06.2004 um 14:13 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.06.2004, 16:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



gcc3.2.2:

bf-compiler.cpp: In function `int main(int, char**)':
[b]bf-compiler.cpp:35: error: no matching function for call to `std::list<char,
   std::allocator<char> >::remove_if(<unknown type>)'[/b]
bf-compiler.cpp:138:1: Warnung: no newline at end of file



Das kennt mein Compiler nicht :)

Scheinbar kennt er das std::isspace nicht...
--
class God : public ChuckNorris { };

Dieser Post wurde am 14.06.2004 um 16:15 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: