2016-09-22 1 views
1

Je suis nouveau sur C. Actuellement j'essaye d'écrire un interprète Brainfuck. J'ai essayé cela jusqu'à présent.Brainf ** k problèmes d'interprètes

#include <unistd.h> 
#include <stdlib.h> 

char *line; 
int  curr_pos; 

void interprete(char *coms) 
{ 
    int a; 
    int curr_loop; 

    a = -1; 
    curr_loop = 0; 
    while (line[++a]) 
     line[a] = 0; 
    a = -1; 
    while (coms[++a]) 
    { 
     if (coms[a] == '+') 
      line[curr_pos]++; 
     else if (coms[a] == '-') 
      line[curr_pos]--; 
     else if (coms[a] == '>') 
      curr_pos++; 
     else if (coms[a] == '<') 
      curr_pos--; 
     else if (coms[a] == '.') 
      write(1, &line[curr_pos], 1); 
     else if (coms[a] == '[') 
     { 
      if (line[curr_pos]) 
       curr_pos++; 
      else 
      { 
       curr_loop = 1; 
       while (curr_loop) 
       { 
        ++a; 
        if (coms[a] == '[') 
         curr_loop++; 
        else if (coms[a] == ']') 
         curr_loop--; 
       } 
      } 
     } 
     else if (coms[a] == ']') 
     { 
      if (line[curr_pos]) 
      { 
       curr_loop = 1; 
       while (curr_loop) 
       { 
        --a; 
        if (coms[a] == '[') 
         curr_loop--; 
        else if (coms[a] == ']') 
         curr_loop++; 
       } 
      } 
      else 
       curr_pos++; 
     } 
    } 
} 

int main(int ac, char **av) 
{ 
    if (ac == 2) 
    { 
     curr_pos = 0; 
     line = malloc(sizeof(char) * 4096); 
     interprete(av[1]); 
    } 
    write(1, "\n", 1); 
} 

Il ne fonctionne que sans boucles ("[" et "]"). Lorsque je tente « ++++++++++ [> +++++++> ++++ ++++++> +++> + < < < < -]> ++.> +. +++++++ .. +++.> ++. < < ++++++ +++++++++.>. +++. ------ .--------.> +.>. "

Il me donne la sortie

^B^A^H^H^K^B^Q^K^N^H^@^C^@ 

Sortie prévue:

Hello World! 
+1

Quelle est votre question? En regardant aussi votre code, je pense que vous devriez éviter si la forêt et les cas d'utilisation à la place. –

+0

Pourquoi cela donne une mauvaise sortie et comment améliorer mon code (peut-être). – Dan

+0

@Mayerz Vous avez raison, mais c'est une sorte de problème, une tâche et je ne suis pas autorisé à utiliser des cas. – Dan

Répondre

1

Je suppose que les problèmes sont dans le code-blocs suivants:

else if (coms[a] == '[') 
{ 
    ... 
} 
else if (coms[a] == ']') 
{ 
    ... 
} 

Le programme recherche l'autre crochet (et le trouve), mais votre code-pointeur est en outre incrémenté dans votre while -statement (ligne 17). Vous devez donc décrémenter a par 1 après vos boucles de recherche. Le deuxième problème est que vous incrémenter les données -pointer (curr_pos)
si com[a] == '[' et line[curr_pos] != 0
et si com[a] == ']' et line[curr_pos] == 0
Vous devez incrémenter le code -pointer (a) ce qui est encore incrémentée automatiquement dans votre while -déclaration. Donc, en fait, vous devez passer dans ce cas. Enfin, vous n'avez pas besoin de vérifier à les deux parenthèses si la valeur des cellules actuelles est différente de zéro. Mon code suggéré ressemblerait à ceci:

else if (coms[a] == '[') 
{ 
    if (!line[curr_pos]) 
    { 
     curr_loop = 1; 
     while (curr_loop) 
     { 
      ++a; 
      if (coms[a] == '[') 
       cur_loop++; 
      else if (coms[a] == ']') 
       cur_loop--; 
     } 
     a--; 
    } 
} 
else if (coms[a] == ']') 
{ 
    // You can always jump back to the opening bracket '[' 
    // because then the program checks again and jumps behind 
    // the closing bracket if line[a] != 0 
    curr_loop = 1; 
    while (curr_loop) 
    { 
     --a; 
     if (coms[a] == '[') 
      curr_loop--; 
     else if (coms[a] == ']') 
      curr_loop++; 
    } 
    a--; 
} 

Par ailleurs: essayer de mettre en œuvre le « , » -command. Cela rend les programmes de brainfoot beaucoup plus intéressants;)