我的问题可能有点大而愚蠢。我还在学习C ++。 所以请耐心等待。
我正在为一个简单的5级CPU实现一个模拟器。
我在functions.h
中定义了一个结构体,并在全局命名空间中用functions.cpp
中的不同指针实例化了结构体。我有多个函数可以写入和读取这个结构,而不会将这些结构作为参数提供。但是,我得到“NullPtr”错误和“读取访问冲突”,我一直在尝试修复它几个小时。我不知道发生了什么。
这是我的代码在概述中的样子。
functions.h:
namespace functions{
typedef array<int, 2> src_reg;
struct instruction_info {
string instruction_type = "NOP";
string instruction_string;
vector<src_reg> source_registers;
int literal = NULL;
bool update_zero = true;
array<int,2> destination_register;
int target_memory_address = NULL;
int target_memory_data = NULL;
};
struct stage_struct {
bool psw_access = true;
instruction_info* input_instruction;
instruction_info* output_instruction;
bool stalled = false;
int program_counter = 4000;
bool finished = false;
};
}
然后我继续实例化它们,它们看起来像这样:
functions.cpp
using namespace functions;
stage_struct stage_memory_p;
stage_struct stage_write_back_p;
stage_struct* stage_memory = &stage_memory_p;
stage_struct* stage_write_back = &stage_write_back_p;
然后我从所有阶段打电话给他们。但它会抛出异常。
int functions::decode_rf() {
if ((stage_decode_rf->input_instruction->instruction_string == "NOP"))
return 0;
...
}
这会给我“读取访问冲突”错误。我是C ++的新手,我真的不明白这意味着什么。
我遇到了另一个与此类似的问题。这也是相同代码的一部分。
functions.h:
typedef struct Code_Line {
int file_line_number = NULL;
int address = NULL;
string instruction_string = "";
}code_line;
struct code_memory {
array<code_line, 1000> array_code_line;
};
functions.cpp:
code_memory *instructions;
code_line *code_lines;
int functions::initialize_i_memory(string file_name) {
ifstream insts;
string one_line;
insts.open(file_name);
if (!insts) {
cout << "There was an error opening the instructions file" << endl;
exit(1);
}
cout << "File loaded successfully. Now writing them into instruction memory" << endl;
int cnt = 0;
while (getline(insts, one_line)) {
instructions->array_code_line[cnt].address = (4000 + (cnt * 4));
instructions->array_code_line[cnt].file_line_number = (cnt + 1);
instructions->array_code_line[cnt].instruction_string = one_line;
cnt++;
}
insts.close();
return cnt;
}
然后我从main()
函数调用它:
int total_instructions = initialize_i_memory("input.txt");
它现在抛出“写入访问冲突”错误。
有人可以解释一下为什么会这样吗?
如果有人试图以更一般的方式解决问题并提供解决方案,我将非常感激。
如果可能,请随时发布有关此内容的任何博客/教程。