#c #brainfuck
#c #brainfuck
Вопрос:
Поэтому по какой-то причине, при попытке получить два разных входа в brainf ** k, он запрашивает у меня только один, а затем завершает работу. Я пытаюсь создать что-то, что принимает два числа и добавляет их, вот код:
,
>
,
[
<
>
-
]
<
------------------------------------------------
.
И вот мой интерпретатор:
#include <stdio.h>
#include <stdlib.h>
#define ARRAYSIZE 16777216
#define MAXCODESIZE 65536
int stack[MAXCODESIZE], stackp;
char code[MAXCODESIZE]; int codep, codelength;
short int array[ARRAYSIZE]; int memp;
int targets[MAXCODESIZE];
int c;
FILE *prog;
int main(int argc, char **argv){
if (argc > 2) fprintf(stderr, "Too many arguments.n"), exit(1);
if (argc < 2) fprintf(stderr, "Usage: brain <file>n"), exit(1);
if(!(prog = fopen(argv[1], "r"))) fprintf(stderr,"Can't open the file %s.n", argv[1]),exit(1);
codelength = fread(code, 1, MAXCODESIZE, prog);
fclose(prog);
for(codep=0; codep<codelength; codep ){
if (code[codep]=='[') stack[stackp ]=codep;
if (code[codep]==']'){
if(stackp==0){
fprintf(stderr,"Unmatched ']' at byte %d.", codep), exit(1);
} else {
--stackp;
targets[codep]=stack[stackp];
targets[stack[stackp]]=codep;
}
}
}
if(stackp>0){
fprintf(stderr,"Unmatched '[' at byte %d.", stack[--stackp]), exit(1);
}
for(codep=0;codep<codelength;codep ){
switch(code[codep]){
case ' ': array[memp] ; break;
case '-': array[memp]--; break;
case '<': memp--; break;
case '>': memp ; break;
case ',': if((c=getchar())!=EOF) array[memp]=c=='n'?10:c; break;
case '.': putchar(array[memp]==10?'n':array[memp]); fflush(stdout); break;
case '[': if(!array[memp]) codep=targets[codep]; break;
case ']': if(array[memp]) codep=targets[codep]; break;
}
}
exit(0);
}
Я скопировал его с github, поэтому он может быть не идеальным, так что есть идеи, как это исправить??
Действительно ценю помощь 🙂
Ответ №1:
Ваш второй getchar()
получит n
выход из буфера и, следовательно, не будет ждать ввода пользователя. Вы должны использовать оба.
Ответ №2:
Я не могу проверить интерпретатор, но если вы используете мой интерпретатор brainfuck и следующий код:
-----------[ >,----------] [-<]
Это должно сработать, если вам интересно, почему он автоматически «нажимает ENTER», это потому, что я использовал getkey
модуль, и если вам нужно объяснение:
set block 0 to -11
it enters a loop
adds 11 (first time = block == 0, after, char value is one above, fixed in the next loop)
moves over and fetches input
subtracts 10
it exits the loop IF the value is 0
adds 1
enters loop
subtracts one, than moves over
exits loop