Почему может не работать интерпретатор brainfuck'а на С при выполнении программы с циклами?
Решил в рамках саморазвития написать очередной интерпертатор BF, и при том, что это его уже второй с нуля написанный вариант, так или иначе не получается корректо работать с циклами. Подскажите, пожалуйста, как это можно переписать, или в чём логическая проблема. Ниже привожу код и примеры програм на BF.
#include <stdio.h>
void brainfuck(char* str, int length)
{
char arr[30000] = { 0 };
int ptr = 0, i = 0;
int **brackets = { 0 };
int br_len = 0;
while (i < length)
{
if (str[i] == '[')
{
brackets = (int **)realloc(brackets, (br_len + 1) * sizeof(int *));
brackets[br_len] = (int *)malloc(2 * sizeof(int));
brackets[br_len][0] = '[';
brackets[br_len][1] = i;
br_len++;
}
else if (str[i] == ']')
{
brackets = (int **)realloc(brackets, (br_len + 1) * sizeof(int *));
brackets[br_len] = (int *)malloc(2 * sizeof(int));
brackets[br_len][0] = ']';
brackets[br_len][1] = i;
br_len++;
}
i++;
}
int counter, pos, j; i = 0;
while (i < length)
{
switch (str[i])
{
case '>': ptr++; break;
case '<': ptr--; break;
case '+': arr[ptr]++; break;
case '-': arr[ptr]--; break;
case '.': putchar(arr[ptr]); break;
case ',': arr[ptr] = getchar(); break;
case '[':
if (arr[ptr] == 0)
{
j = 0;
pos = 0;
do
{
pos = j;
j++;
}
while (brackets[j - 1][1] != i);
j = pos + 1;
counter = 1;
while (j < br_len)
{
if (brackets[j][0] == '[')
counter++;
else if (brackets[j][0] == ']')
{
counter--;
if (counter == 0)
break;
}
j++;
}
i = brackets[j][1];
}
break;
case ']':
if (arr[ptr] == 0)
{
j = br_len - 1;
pos = br_len - 1;
do
{
pos = j;
j--;
} while (brackets[j + 1][1] != i);
j = pos - 1;
counter = -1;
while (j >= 0)
{
if (brackets[j][0] == '[')
{
counter++;
if (counter == 0)
break;
}
else if (brackets[j][0] == ']')
counter--;
j--;
}
i = brackets[j][1] - 1;
}
break;
default: break;
}
i++;
}
}
void main()
{
FILE* fr;
int length;
char* str;
fr = fopen("input.txt", "r");
fseek(fr, 0, SEEK_END);
length = ftell(fr);
rewind(fr);
str = (char*)malloc(length * sizeof(char));
fread(str, 1, length, fr);
brainfuck(str, length);
free(str);
fclose(fr);
}
"Hello World!" с одним циклом
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.
"Hello World!" с вложенными циклами
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Ответы (1 шт):
Автор решения: gbg
→ Ссылка
realloc не будет работать, если ему скормить на вход адрес который был получен иначе чем через malloc/realloc
Вы же ему передаете адрес, полученный на стеке.