2015-03-06 5 views
0

Я сел и попытался реализовать BrainFuck. syntax кажется довольно простым. У меня возникают проблемы с тем, чтобы глупо работать. Я был в это время; и я признаю, что мне нужен сон. Возможно, это проблема. Переводчик ничего не выводит. Я уверен, что проблема проста. и я знаю, что мне нужно модулировать некоторые вызовы функций после того, как я получу лучшее представление о том, в каком направлении я хочу, чтобы эта программа шла. Почему я не получаю выход?Проблемы с реализацией BrainFuck:

main.c

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <memory.h> 

#include "list.h" 

node file; 
node flow; 
node memm; 

void init() { 
    file.val = 1; 
    file.next = 0; 
    flow.val = 1; 
    flow.next = 0; 
    memm.val = 1; 
    memm.next = 0; 
} 

int run = 1; 
void quit(int val) { 
    run = 0; 
    while (file.next) pop(&file); 
    while (flow.next) pop(&flow); 
    while (memm.next) pop(&memm); 
} 

void doop() { 
    switch (file.val++) { 
     case '>': 
      memm.val++; 
      break; 
     case '<': 
      memm.val--; 
      break; 
     case '+': 
      get(&memm, memm.val)->val++; 
      break; 
     case '-': 
      get(&memm, memm.val)->val--; 
      break; 
     case '.': 
      printf("c", get(&memm, memm.val)->val); 
      fflush(stdout); 
      break; 
     case '[': 
      if (!get(&memm, memm.val)->val) 
       while (get(&file, file.val)->val != ']') 
        file.val++; 
      else push(&flow, file.val); 
     case ']': 
      if (get(&memm, memm.val)->val) 
       file.val = pop(&flow); 
    } 
} 

int main(int argc, char** argv) { 
    int flen, c, i, f_len; 
    FILE *fh; 
    char fh_name[] = "test"; 

    signal(SIGINT, quit); 
    init(); 

    fh = fopen(fh_name, "r"); 
    while (run && (c = fgetc(fh)) != EOF) 
     push(&file, c); 
    fclose(fh); 

    f_len = length(&file); 
    while (file.val > 0 && file.val < f_len) 
     doop(); 
    return (EXIT_SUCCESS); 
} 

list.h

struct node { 
    int val; 
    struct node *next; 
}; 
typedef struct node node; 
int length(node *n); 
void push(node *n, int i); 
int pop(node *n); 
node *get(node *n, int i); 

list.c

#include <stdlib.h> 
#include "list.h" 

int length(node *m) { 
    int len = 0; 
    while (m->next) { 
     len++; 
     m = m->next; 
    } 
    return len; 
} 

void push(node *n, int i) { 
    node *m = n; 
    while (m->next) 
     m = m->next; 
    m->next = malloc(sizeof(struct node)); 
    m->next->val = i; 
    m->next->next = 0; 
} 

int pop(node *n) { 
    node *m = n; 
    int i = length(n) - 1; 
    while (i) { 
     i--; 
     m = m->next; 
    } 
    i = m->next->val; 
    free(m->next); 
    m->next = 0; 
    return i; 
} 

node *get(node *n, int i) { 
    node *m = n; 
    while (i) { 
     i--; 
     if (!m->next) 
      push(n, 0); 
     m = m->next; 
    } 
    return m; 
} 

test является Brainfuck "привет мир"

Hello World program 
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-] 
<.#>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[ 
<++++>-]<+.[-]++++++++++. 
+0

Отладчик, может быть? –

+1

@EugeneSh. да, я все еще на нем прямо сейчас. 'gdb' и я хорошие друзья – motoku

+0

@MotokoKusanagi проверяет, что' fopen() 'преуспел, прежде чем пытаться прочитать из файла, а также ** интерпретатор ничего не выводит **, нет интерпретатора. –

ответ

2

Линия

switch (file.val++) { 

просто не может быть. В настоящее время он просто увеличивает первый «val» файловой цепочки, как «mem.val ++» ниже.

Я ожидаю, что вам нужно будет избавиться от ++ на этой строке, а затем сделать что-то о приращении указателя на инструкцию, а не самой инструкции.


Ваша инструкция '' 'неправильна; вам нужно сделать поп, даже если вы не собираетесь возвращаться.


Ваша инструкция [[] частично неверна. Если значение начинается с нуля, оно в настоящее время переходит к первому ']', которое не находит совпадение ']'.

2

Это потому, что вы должны спать, а также потому, что ваш код грязный, я нашел это

printf("c", get(&memm, memm.val)->val); 

он напечатает c, и это все, что должно быть

printf("%c", get(&memm, memm.val)->val); 
/* ^it's the format specifier for the argument */ 

Как Я нашел это так быстро?

  • Очень простой, я включил предупреждения компилятора.

BTW: get(&memm, memm.val)->val действительно плохой стиль, но на самом деле плохо.

+0

вздох. Спасибо за совет – motoku

Смежные вопросы