当前位置: 首页 > 知识库问答 >
问题:

愚蠢的翻译问题

轩辕嘉平
2023-03-14

我是C的新手,目前我正在尝试编写一个Brainfuck解释器。到目前为止,我已经尝试过了。

#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);
}

它只在没有循环(“[”和“]”)的情况下工作。当我尝试时:

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

它给我输出

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

预期产出:

Hello World!

共有1个答案

闻人鸿飞
2023-03-14

我猜问题出在以下代码块中:

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

程序正在寻找另一个括号(并找到了它),但是你的代码指针在你的-语句中增加了(第17行)。所以你必须在搜索循环后将a减少1。第二个问题是,你增加了数据指针(curr_pos
ifcom[a] == '['andline[curr_pos]!=0
并且如果com[a] == ']'line[curr_pos]==0
您必须增加code指针(a)在您的-语句中仍然自动增加的内容。所以在这种情况下,实际上您必须通过。最后,如果当前单元格值不等于零,您实际上不必检查两个括号。我建议的代码如下:

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--;
}

顺便说一下:试着实现''-命令。它使brainfuck程序更加有趣;)

 类似资料:
  • 有人能帮助我为什么过渡没有得到应用吗? HTML 萨斯 我在这里有一个工作代码:https://codepen.io/loganlee/pen/rwnjpdz?editors=1100 我希望.box__faces-front和.box__faces-back的rotateY转换都要转换,并且我将转换放在父元素上,在本例中是.box__faces。 多谢了。

  • 问题内容: 这个FileInputStream.available()javadoc说: 返回可以从此输入流读取(或跳过)而不会被该输入流的方法的下一次调用阻塞的剩余字节数的估计值。下一个调用可能是同一线程或另一个线程。仅读取或跳过此多个字节不会阻塞,但可能会读取或跳过较少的字节。 在某些情况下,非阻塞读取(或跳过)可能仅在速度较慢时(例如,在速度较慢的网络上读取大文件时)就被阻塞。 我不确定是否

  • 问题内容: 首先,我将解释如何理解和使用: 是为了批量加载对象的关系,从而减少对数据库的SQL请求。这对 LAZY 关系特别有用。 但是,它在 LAZY 关系上甚至还很有用:如果从数据库中加载实体列表并要求加载懒惰的实体,即使我只是使用测试来加载第一个实体的关系,它也会按批加载实体名单。 请注意是否有人要测试:仅显示是否尚未加载实体:例如,如果您有一个具有经理的用户列表并列出了所有用户,则当您访问

  • 问题内容: 这是一个非常简单的问题,但是我需要另一只眼睛来查看我的代码: 输出为: 这些字符是什么, 您有什么想法 吗? 问题答案: 这就是数组的实现方式。 的是字符数组表示,是它的哈希码。 您可能想看看 如果您想再次看到原始的String,则需要:

  • 问题内容: 这是一个非常简单的问题,但是我需要另一只眼睛来查看我的代码: 输出为: 这些字符是什么, 您有什么想法 吗? 问题答案: 这就是数组的实现方式。 的是字符数组表示,是它的哈希码。 您可能想看看 如果您想再次看到原始的String,则需要:

  • 对 stackoverflow 上 Java 相关、投票数TOP100的问答进行翻译,欢迎点star,我们会持续更新!!! 为了让“翻译”更有意义,给阅读者带来更多、更有效的收获,我们会有一些加工: 例如,对问题进行分类,整合多个答案、删除冗余内容、加上自己的验证结果、心得等等 对于参与翻译的人,这也是很好的一个学习、理解过程,欢迎大家一起来翻译