- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我认为我的程序并非在所有情况下都支持嵌套循环。这太荒谬了,但是这个 brainfuck 程序与我的拦截器一起正常工作并打印“Hello World!”到标准输出:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
但是这个程序不能正常工作并且将内存错误打印到标准输出:
+[-[<<[+[--->]-[<<<]]]>>>-]>-.---.>..>.<<<<-.<+.>>>>>.>.<<.<-.
这两个示例与在线拦截器一起工作 - https://copy.sh/brainfuck/ .
我试图解决这个问题,但我花了很多时间,但我失败了,所以我请求你帮助我。
这是我的解释器的代码:
#include <stdio.h>
#include <sysexits.h>
#include <string.h>
#include <stdlib.h>
#define EX_SUCCESS 0
#define str1_is_less_than_str2 (strcmp("bf", file_extension) < 0)
#define str2_is_less_than_str1 (strcmp("bf", file_extension) > 0)
#define MEMSIZE 30000
#define NUMBER_OF_BF_INSTRUCTIONS 8
#define FIRST_ELEMENT_NOT_EXISTS (*head_ptr == NULL)
struct bf_instruction_node {
int bf_instruction;
struct bf_instruction_node *next_element;
};
struct stack_node {
struct bf_instruction_node *bf_instr_ptr;
struct stack_node *link;
};
void inc_ptr(int **values_ptr) { ++(*values_ptr); }
void dec_ptr(int **values_ptr) { --(*values_ptr); }
void inc_value(int *values_ptr) { ++(*values_ptr); }
void dec_value(int *values_ptr) { --(*values_ptr); }
void print_value(int *values_ptr) { putchar(*values_ptr); }
void input_value(int *values_ptr) { *values_ptr = getchar(); }
void push(struct stack_node **esp_ptr, struct bf_instruction_node *current_instr_ptr) {
struct stack_node *new_element_on_the_stack;
new_element_on_the_stack = (struct stack_node *)malloc(sizeof(struct stack_node));
new_element_on_the_stack->bf_instr_ptr = current_instr_ptr;
new_element_on_the_stack->link = *esp_ptr;
*esp_ptr = new_element_on_the_stack;
}
void pop(struct stack_node **esp_ptr) {
struct stack_node *tmp;
tmp = *esp_ptr;
*esp_ptr = (*esp_ptr)->link;
free(tmp);
}
void start_loop(int *values_ptr, struct stack_node **esp_ptr, struct bf_instruction_node *current_instr_ptr) {
push(esp_ptr, current_instr_ptr);
}
void end_loop(int *values_ptr, struct bf_instruction_node **current_instr_ptr, struct stack_node **esp_ptr) {
if( *values_ptr != 0 ) {
if( *values_ptr < 0 )
*values_ptr = 255;
if( *values_ptr > 255 )
*values_ptr = 0;
*current_instr_ptr = (*esp_ptr)->bf_instr_ptr;
// *current_instr_ptr = (*current_instr_ptr)->next_element;
} else {
pop(esp_ptr);
}
}
void execute_instructions(int **values_ptr, struct bf_instruction_node *head_ptr, struct bf_instruction_node **current_instr_ptr) {
struct stack_node *esp_ptr = NULL;
char brainfuck_instruction;
*current_instr_ptr = head_ptr;
while( *current_instr_ptr != NULL ) {
brainfuck_instruction = (*current_instr_ptr)->bf_instruction;
switch( brainfuck_instruction ) {
case '>': inc_ptr(values_ptr); break;
case '<': dec_ptr(values_ptr); break;
case '+': inc_value(*values_ptr); break;
case '-': dec_value(*values_ptr); break;
case '.': print_value(*values_ptr); break;
case ',': input_value(*values_ptr); break;
case '[': start_loop(*values_ptr, &esp_ptr, *current_instr_ptr);break;
case ']': end_loop(*values_ptr, current_instr_ptr, &esp_ptr); break;
}
*current_instr_ptr = (*current_instr_ptr)->next_element;
}
}
struct bf_instruction_node *create_new_element(struct bf_instruction_node **head_ptr, struct bf_instruction_node **current_instr_ptr, int char_from_file) {
struct bf_instruction_node *new_element;
*current_instr_ptr = *head_ptr;
while( (*current_instr_ptr)->next_element != NULL )
*current_instr_ptr = (*current_instr_ptr)->next_element;
new_element = (struct bf_instruction_node *)malloc(sizeof(struct bf_instruction_node));
return new_element;
}
void add_instruction_to_the_list(struct bf_instruction_node **head_ptr, struct bf_instruction_node **current_instr_ptr, int char_from_file) {
if( FIRST_ELEMENT_NOT_EXISTS ) {
*head_ptr = (struct bf_instruction_node *)malloc(sizeof(struct bf_instruction_node));
if( *head_ptr == NULL ) {
perror("Memory allocation failed");
exit(EXIT_FAILURE);
} else {
(*head_ptr)->bf_instruction = char_from_file;
(*head_ptr)->next_element = NULL;
*current_instr_ptr = *head_ptr;
}
} else {
struct bf_instruction_node *new_element = create_new_element(head_ptr, current_instr_ptr, char_from_file);
if( new_element == NULL ) {
perror("Memory allocation failed.");
exit(EXIT_FAILURE);
} else {
new_element->bf_instruction = char_from_file;
new_element->next_element = NULL;
(*current_instr_ptr)->next_element = new_element;
*current_instr_ptr = new_element;
}
}
}
void print_instructions(struct bf_instruction_node *head_ptr, struct bf_instruction_node **current_instr_ptr) {
*current_instr_ptr = head_ptr;
while( *current_instr_ptr != NULL ) {
printf("%c", (*current_instr_ptr)->bf_instruction);
*current_instr_ptr = (*current_instr_ptr)->next_element;
}
}
void clear_the_memory(struct bf_instruction_node *head_ptr, struct bf_instruction_node **current_instr_ptr) {
struct bf_instruction_node *earlier_element;
*current_instr_ptr = head_ptr;
while( (*current_instr_ptr) != NULL ) {
earlier_element = *current_instr_ptr;
*current_instr_ptr = (*current_instr_ptr)->next_element;
free(earlier_element);
}
puts("Memory is cleared.");
}
const char *is_bf_instruction(int char_from_file) {
const char bf_alphabet[NUMBER_OF_BF_INSTRUCTIONS] = {'>', '<', '+', '-', ',', '.', '[', ']'};
return memchr(bf_alphabet, char_from_file, sizeof(bf_alphabet));
}
const char *get_file_extension(const char *filename) {
const char *dot = strchr(filename, '.');
if( dot == NULL )
return NULL;
const char *file_extension = dot + 1;
return file_extension;
}
int main(int argc, char **argv) {
if( argc < 2 ) {
fprintf(stderr, "File not specified.\n");
puts("usage: ./bf_interpreter <filename.bf>");
return EX_USAGE;
}
const char *filename = argv[1];
const char *file_extension = get_file_extension(filename);
if( file_extension == NULL || str1_is_less_than_str2 || str2_is_less_than_str1 ) {
fprintf(stderr, "Incorrect file extension.\n");
puts("usage: ./bf_interpreter <filename.bf>");
return EX_DATAERR;
}
FILE *file_with_bf_code = fopen(filename, "r");
if( file_with_bf_code == NULL ) {
perror(filename);
return EX_NOINPUT;
}
int values[MEMSIZE] = {0}, *values_ptr = values;
int char_from_file;
struct bf_instruction_node *head_ptr = NULL, *current_instr_ptr;
while( (char_from_file = fgetc(file_with_bf_code)) != EOF ) {
if( is_bf_instruction(char_from_file) != NULL )
add_instruction_to_the_list(&head_ptr, ¤t_instr_ptr, char_from_file);
}
execute_instructions(&values_ptr, head_ptr, ¤t_instr_ptr);
clear_the_memory(head_ptr, ¤t_instr_ptr);
return EX_SUCCESS;
}
我认为这个函数会产生内存冲突的错误:
void end_loop(int *values_ptr, struct bf_instruction_node **current_instr_ptr, struct stack_node **esp_ptr) {
if( *values_ptr != 0 ) {
if( *values_ptr < 0 )
*values_ptr = 255;
if( *values_ptr > 255 )
*values_ptr = 0;
*current_instr_ptr = (*esp_ptr)->bf_instr_ptr;
// *current_instr_ptr = (*current_instr_ptr)->next_element;
} else {
pop(esp_ptr);
}
}
我希望有人能帮我解决这个问题。干杯,提前谢谢你!
最佳答案
你需要调试。
我试过你的代码。根据我是否使用优化得到不同的结果。这是未定义行为 的良好指示。通过优化 -O3
和 -O2
我得到了这个段错误:
Program received signal SIGSEGV, Segmentation fault.
execute_instructions (values_ptr=0x7ffffffe0ca8, head_ptr=<optimized out>, current_instr_ptr=0x7ffffffe0cb8) at bf.c:83
83 case ']': end_loop(*values_ptr, current_instr_ptr, &esp_ptr); break;
使用 -O1
得到:
$ ./a.out fil.bf
��Memory is cleared.
没有优化似乎陷入了无限循环。我让它运行了大约 5 秒钟,但什么也没发生。
此外,您的代码会产生两个警告:
$ gcc -Wall -Wextra -std=c11 -pedantic bf.c
bf.c: In function ‘start_loop’:
bf.c:48:22: warning: unused parameter ‘values_ptr’ [-Wunused-parameter]
void start_loop(int *values_ptr, struct stack_node **esp_ptr, struct bf_instruction_node *current_instr_ptr) {
^~~~~~~~~~
bf.c: In function ‘create_new_element’:
bf.c:90:139: warning: unused parameter ‘char_from_file’ [-Wunused-parameter]
struct bf_instruction_node *create_new_element(struct bf_instruction_node **head_ptr, struct bf_instruction_node **current_instr_ptr, int char_from_file) {
^~~~~~~~~~~~~~
关于c - brainfuck 中的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51579460/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!