Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c打印故障中的Brainfuck解释器_C_Printing_Interpreter_Brainfuck - Fatal编程技术网

c打印故障中的Brainfuck解释器

c打印故障中的Brainfuck解释器,c,printing,interpreter,brainfuck,C,Printing,Interpreter,Brainfuck,我正试图用C编写一个非常简单的brainfuck解释器,但我在试图根据我的理解输出某些字符时遇到了问题 这是我的全部代码: #include <stdio.h> int bla(char tabukaz[30000], int ukaz, int num) { int sum = 0; int index = ukaz; while (sum > -1) { index -= num; if (tabukaz[index

我正试图用C编写一个非常简单的brainfuck解释器,但我在试图根据我的理解输出某些字符时遇到了问题

这是我的全部代码:

#include <stdio.h>

int bla(char tabukaz[30000], int ukaz, int num) {
    int sum = 0;
    int index = ukaz;
    while (sum > -1) {
        index -= num;
        if (tabukaz[index] == ']')
          sum += num;
        else if (tabukaz[index] == '[')
          sum -= num;
    }   
    return index;
}

int main () {
    int tab[30000];
    int tabukaz[30000];
    int c; 
    int i = 0; int ukaz = 0;
    unsigned char ch;
    for (int i = 0; i < 30000; i++) {
        tab[i] = 0;
        tabukaz[i] = 0;
    }
    while ((c=getchar()) != EOF) {
        ch = (unsigned char)c;
        if (ch == '>' || ch == '<' || ch == '+' || ch == '-' || ch == '.' || ch == '[' || ch == ']')
        {
            tabukaz[ukaz] = ch;
        }

        switch (ch) {
            case '>': i++; break;
            case '<': i--; break;
            case '+': tab[i]++;break;
            case '-': tab[i]--; break;
            case '.': putchar(tab[i]); break;
            case '[':
                if (tab[i]==0) {
                    ukaz = bla(tabukaz, ukaz, -1);
                }
                break;
            case ']':
                if (tab[i]!=0) {
                    ukaz = bla(tabukaz, ukaz, 1);
                }    
                break;
            default:
                break;
        }
        ukaz++;
    }
    return 0;
}
根据某人的建议,我这样做了:

while ((c=getchar())!=EOF) {
    ch = (unsigned char)c;
    if (ch == '>' || ch == '<' || ch == '+' || ch == '-' || ch == '.' || ch == '[' || ch == ']')
    {
        tabukaz[ukaz]=ch;
        stukaz++;
    }
}

while (stukaz>0) {
    switch (tabukaz[ukaz]) {
        case '>': i++; break;
        case '<': i--; break;
        case '+': if(tab[i]==255) tab[i] = 0;
                  else tab[i]++;
                  break;
        case '-': if (tab[i]==0) tab[i] = 255;
                  else tab[i]--;
                  break;
        case '.': printf ("%c", tab[i]); break;
        case '[':
            if (tab[i]==0) {
                ukaz = bla(tabukaz, ukaz, -1);
            }
            break;
        case ']':
            if (tab[i]!=0) {
                ukaz = bla(tabukaz, ukaz, 1);
            }    
            break;
        default: break;
    }
    stukaz--;
    ukaz++;
 }
while((c=getchar())!=EOF){
ch=(无符号字符)c;
如果(ch='>'| ch='':i++;中断;

案例'扫描匹配括号时测试错误

 while (sum > -1) {
        index -= num;
        if (tabukaz[index] == ']')
          sum += num;
        else if (tabukaz[index] == '[')
          sum -= num;
    }   
向后扫描时将
num
设置为1,向前扫描时设置为-1

    case '[':
        if (tab[i]==0) {
            ukaz = bla(tabukaz, ukaz, -1);
        }
        break;
    case ']':
        if (tab[i]!=0) {
            ukaz = bla(tabukaz, ukaz, 1);
        }    
        break;
所以测试应该是
(sum!=0)
这样当括号从任意方向平衡时它就会停止。当然,
sum
被初始化为0,所以我建议使用
do{…}while();
循环,这样测试就结束了

另外,请记住,您正在增加循环末尾的指令指针

        ukaz++;
因此,您可能希望将指针设置为
bla(…)-1
,以便增量将指针放置在正确的位置



您可能还想看看,它与您的非常相似。我的一位审阅者对使用跳转表优化循环执行给出了极好的解释。

您的问题是为什么您的输出是二进制的吗?我有点困惑:)您是在什么环境下编译和执行的?我猜您的意思是不可打印的(或有趣的)字符被写入屏幕。在这种情况下,为什么不将
putchar(x)
替换为
printf(“%d\n”,x)
以查看这些字符的实际值。这可能有助于您找到错误。在执行初始化循环后,您的寄存器指针
i
的值将为30000。这是数组之外的一个索引。@MaartenBodewes绝对不是。请阅读主题指导原则上的代码审阅。@MaartenBodewes否,确实如此不属于代码审查。请阅读。重要的是要记住:包含“问题”一词的问题不属于代码审查。
        ukaz++;