- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我决定使用 Borland 的 CppBuilder6 用 C++ 编写一个简单的 Brainfuck IDE。我已经为 RichEdit 装上了我的,让它看起来有点像记事本。然后我为输入添加了 TEdit,为输出添加了 TMemo。经过一些测试后,我认为 RichEdit 组件不适合我的情况,因此我将其更改为 TMemo。
在我的代码中,输入 = Edit2,代码 = Memo2,输出 = Memo1。我重写了两次,这个版本似乎是最正确的;我决定不使用指针(我考虑过它甚至写了指针版本,不幸的是它没有用所以为了简化我已经删除了指针)。
char *cells = (char*)calloc(65536,1); //Should i use malloc?
int cellp = 0;
void __fastcall BFIde::interpret() {
char* pf = Memo2->Lines->Text.c_str(); //Weird output
char* p = (char*)malloc(strlen(pf)+1);
strcpy(p, pf); //Because pf is constant, i need to copy it into not constant string.
int pp = 0;
MessageBox(NULL,p,NULL,MB_OK); //To ensure that program is correct, but it ain't.
while(p[pp]){
switch(p[pp]){
case '>':
cellp++;
break;
case '<':
cellp--;
break;
case '+':
MessageBox(NULL, "Plus", NULL, MB_OK); //When executing test code, never gets shown.
cells[cellp]++;
break;
case '-':
cells[cellp]--;
break;
case '.':{ //It should look other, but I've replaced it to ensure that output is correct.
char arr[2]={cells[cellp],0};MessageBox(NULL, arr, NULL, MB_OK);}
break;
case ',': //Remove first character and pass it to program
if(Edit2->Text == "")cells[cellp] = 0;
else {cells[cellp] = Edit2->Text.c_str()[0];char* str;strcpy(str, Edit2->Text.c_str());Edit2->Text=str++;}
break;
case '[':{ //Propably works.
int bal = 1;
if (cells[cellp] == '\0') {
do {
pp++;
if (p[pp] == '[') bal++;
else if (p[pp] == ']') bal--;
} while ( bal != 0 );
}
break;
}
case ']':
int bal2 = 0;
do {
if (p[pp] == '[') bal2++;
else if (p[pp] == ']') bal2--;
pp--;
} while ( bal2 != 0 );
break;
}
pp++;
}
MessageBox(NULL, IntToStr(cellp).c_str(), NULL, MB_OK); //To check that something was parsed. Shows 0 everytime (not expected).
}
当我输入一些代码时,例如。 “+。”并执行此功能(通过按钮),这将显示一系列消息框。第一个:┼
(第 8 行),第二个:0
(第 55 行),仅此而已。预期结果是写:第一个 +.
,第二个 Plus
,第三个为空。我在我的代码中做错了什么?也许我错过了什么。
最佳答案
您的代码中存在与内存相关的错误。 interpret()
的第一行采用指向临时 AnsiString
的指针,该指针随后立即被释放,因此后续代码行使用指向无效的悬垂指针内存。同样,在您的 ','
处理程序中,您试图将数据复制到未指向有效内存的未初始化指针。在访问 cells[]
数组时,您没有进行任何边界检查。
您的 ']'
处理程序中也存在逻辑错误。您没有检查当前单元格数据是否为 0 来决定下一条跳转到哪条指令,并且在查找开头的 '['
时您没有正确地向后查找。
尝试更像这样的东西:
static const int maxCells = 65536;
class BFIde : public TForm
{
__published:
TEdit *Edit2;
TMemo *Memo1;
TMemo *Memo2;
TButton *Button1;
void __fastcall Button1(TObject *Sender);
private:
char cells[maxCells];
int cellp;
char& cellData();
void __fastcall interpret(const AnsiString &commands, AnsiString input);
public:
__fastcall BFIde(TComponent *Owner);
};
__fastcall BFIde::BFIde(TComponent *Owner)
: TForm(Owner)
{
}
char& __fastcall BFIde::cellData()
{
if ((cellp < 0) or (cellp >= maxCells))
throw Exception("Accessing cells out of bounds");
return cells[cellp];
}
void __fastcall BFIde::interpret(const AnsiString &commands, AnsiString input)
{
Memo1->Clear();
memset(cells, 0, maxCells);
cellp = 0;
const char* start = commands.c_str();
const char* p = start;
while (*p)
{
switch (*p)
{
case '>':
++cellp;
break;
case '<':
--cellp;
break;
case '+':
cellData()++;
break;
case '-':
cellData()--;
break;
case '.':
{
char ch = cellData();
Memo1->SelStart = Memo1->GetTextLen();
Memo1->SelLength = 0;
Memo1->SelText = ch;
break;
}
case ',':
{
char ch;
if (input.Length() == 0) {
ch = '\0';
}
else {
ch = input[1];
input.Delete(1, 1);
}
cellData() = ch;
break;
}
case '[':
{
if (cellData() == '\0')
{
int bal = 1;
while (*++p)
{
if (*p == '[') {
++bal;
}
else if (*p == ']')
{
if (--bal == 0)
break;
}
}
if (bal != 0)
throw Exception("Unbalanced loop");
}
break;
}
case ']':
{
if (cellData() != '\0')
{
int bal = 1;
while (p > start)
{
--p;
if (*p == ']') {
++bal;
}
else if (*p == '[')
{
if (--bal == 0)
break;
}
}
if (bal != 0)
throw Exception("Unbalanced loop");
}
break;
}
}
++p;
}
ShowMessage(cellp);
}
void __fastcall BFIde::Button1(TObject *Sender)
{
interpret(Memo2->Lines->Text, Edit2->Text);
}
关于c++ - Brainfuck 解释器奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43558399/
是 Brainfuck如果单元是位,并且 + 和 - 操作只是翻转一点,那么图灵完备?是否有一个简单的证据表明无论单元大小如何,类 Brainfuck 的语言都是图灵完备的,还是我需要考虑一个模拟图灵
作为我的 Brainf*ck 实现的调试器/测试程序,我创建了以下计数循环: +[[>+]+] 对于单字节、环绕单元和 30k 单元,这会创建一个无限计数循环。它将每个单元格设置为 1,然后将每个单元
我想知道是否可以只用代码开头的数字 k 来计算 brainfuck 中 1+2+3+...+k 的总和? 例如是否可以像这样做 1+2+3: +++> (这里的代码创建了一个二和三个相加,创建一个并相
我正在研究一个直接解释 brainfuck 的物理面包板 8 位 CPU。 语言规范表明左括号和右括号都有逻辑: [ => Jump to matching ] If Zero ] => Jump t
我正在尝试在 Brainfuck 中制作一个我认为也称为“Brainflake”的程序,它将添加两个用 ASCII 数字字符输入的单位十进制整数,并在输出中以 ASCII 数字字符显示总和。我将如何着
例如,如果数组像 0 0 0 0 ... 0 0[n]s o m e d a t a 4 9 9 9 9 9 9 8 3 7 ...,如何移动指针通过 n,在指针移动后不改变 s o m e d a
有人把这个发给我,并声称这是 Brainfuck 中的一个 Hello World (我希望如此......) ++++++++++[>+++++++>++++++++++>+++>+++.>+.++
我正在尝试使用 BrainFuck 编写一个程序,该程序可以读取最多为 9 的两个数字,计算它们的总和,然后将结果打印出来,例如3 & 5 给出结果 8 。 我只是想了解 BF 语言,但它看起来比我想
有人可以在程序设计语言Brainf * ck中发布一个代码段,以将两个一位数字相乘吗? 最佳答案 ,>, go to cell #2 [ ->+>+> go to cell #4 [ -
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
你能创建一种像 Brainfuck 这样只有一个符号的编程语言吗? 最佳答案 是的,以前已经做过 - 请参阅 Unary . 基本上这是一种奇怪的 Brainfuck 编码。将每个 BF 命令视为一个
这是我正在使用的代码,它测试“b”的输入,如果有其他输入,应该输出“Y”。 拜托,没有人问我为什么选择使用“Y”作为错误值.. > , ----- ---- ----- ---
我有以下正在通过最小测试套件的 Brainfuck 解释器。除了一个相当大的问题,比如打印斐波那契数列似乎失败了(套件中的最后一个测试)。我解释执行失败的 brainfuck fibonacci 代码
我决定使用 Borland 的 CppBuilder6 用 C++ 编写一个简单的 Brainfuck IDE。我已经为 RichEdit 装上了我的,让它看起来有点像记事本。然后我为输入添加了 TE
我是 C 的新手。目前我正在尝试编写一个 Brainfuck 解释器。到目前为止,我已经尝试过了。 #include #include char *line; int curr_po
我认为我的程序并非在所有情况下都支持嵌套循环。这太荒谬了,但是这个 brainfuck 程序与我的拦截器一起正常工作并打印“Hello World!”到标准输出: ++++++++[>++++[>++
我坐下来尝试实现 BrainFuck。 syntax看起来很简单。我无法让愚蠢的事情发挥作用。我已经有一段时间了;我承认我需要 sleep 。也许这就是问题所在。解释器没有输出任何东西。我很确定问题很
是的,我正在制作 Brainfuck 解释器,但我还需要从其代码创建 AST。可以很容易地在节点中使用原始操作(+ - . , > rightBracketsIds; private rea
我写了一个 brainfuck ide 的 alpha 版本。我写了自己的解释器,虽然我从我的老师那里得到了关于代码循环的大量帮助,因为我很难以“IT 方式”理解它。现在对于我的报告,我需要解释器算法
我正在为该语言编写解释器 Brainfuck 我用的是命令行 java bfinterpreter/BFInterpreter >output.bin bf 程序应该输出 00 到 FF 的十六进制,
我是一名优秀的程序员,十分优秀!