我正在用C ++制作虚拟机。我已经将文件的内容作为字符串加载。我将此字符串传递给int *类型的函数,但问题是包含文件内容的字符串变量似乎是空的,因为当我尝试使用cout << file << endl;
时,我什么都没得到。
以下是相关文件:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
using namespace std;
class reedoovm {
private:
string filedata;
string instruction;
string file;
int instr;
int instructionCount;
int instructionPointer;
public:
int load_program(string filename) {
ifstream rdfile(filename);
while(rdfile >> instruction) { /* Get each instruction */
filedata += instruction; /* Append the instruction to filedata */
filedata += ","; /* Append a comma to separate each instruction */
instructionCount++;
}
rdfile.close(); /* Close the file */
return instructionCount; /* Return the filedata */
}
int *instrToArr(string file) {
//file = "02,0022,00E1,0022,00,04,73";
cout << file << endl;
stringstream hextoint;
unsigned int value;
string s = file; /* store fconv in a variable "s" */
string delimiter = ","; /* The delimiter */
size_t pos = 0;
string token;
int i = 0;
int inst;
static int* instarray;
instarray = (int*) calloc(instructionCount,sizeof(int));
while ((pos = s.find(delimiter)) != string::npos) { /* Convert hex instructions to decimal */
token = s.substr(0, pos);
stringstream hextoint(token);
hextoint >> hex >> value;
if (i < instructionCount) {
instarray[i] = value;
cout << instarray[i] << endl;
i++;
}
s.erase(0, pos + delimiter.length());
}
return instarray;
}
int getNextIntruction(string s) {
int *instruction = instrToArr(s);
cout << *instruction << endl;
return 0;
}
void run_program(string s) {
int loop = 1;
while (loop) {
instr = getNextIntruction(s);
loop = 0;
}
}
void execute_program(string s) {
file = load_program(s);
int * arr = instrToArr(file);
//cout << arr << endl;
//run_program(s);
}
};
int main(int argc, char* argv[]) {
reedoovm rd;
rd.execute_program(argv[1]);
return 0;
}
导致问题的函数是int *instrToArr(string file) {
。我不知道为什么文件变量突然变空。
答案 0 :(得分:1)
我认为在load_program()
而不是:
return instructionCount;
return filedata;
并将load_program()
的返回类型更改为string
答案 1 :(得分:1)
我想你有一个错字
int * arr = instrToArr(file)
而不是
int * arr = instrToArr(filedata)
答案 2 :(得分:1)
你的代码有很多问题,但是那个困扰你的问题可能是
file = loadProgram(s);
因为loadProgram
被定义为返回一个整数(指令数)而不是字符串,但是你将它分配给一个字符串。
对于我称之为C ++的设计错误,将一个整数赋给字符串是一个完全合法的指令,意味着字符串将有一个字符值为整数。
正式接受整数赋值的原因是认为编写它可能有用
str += chr; // Adds the char at the end
其中str
是一个字符串,chr
是一个字符。如果+=
是合法的那么延伸,那么也认为分配也应该是合法的(在这个特定情况下我不同意这种逻辑跳跃)。
char
但是在C ++中,数字和整数(甚至double
s)可以隐式转换为char
而不会发出任何警告或任何错误。所以它也是合法的:
std::string s;
s = 3.141592654;
我可以在您的代码中看到的其他问题是:
instructionCount
未初始化在C ++中,您必须始终在构造函数的类实例中初始化本机类型成员(例如整数,双精度)。默认构造函数不会为您执行此操作。结果是,在分配类实例时,这些成员将具有随机值,而您不希望这样。这条规则的官方解释是初始化不能访问的成员可能会影响性能,如果程序员想要为初始化付费,那么它必须写初始化。
instrToArr
返回指向本地static
变量每次调用函数时都会分配这个变量,这样如果调用者没有处理释放,就会在每次调用时泄漏内存。
请注意,在C ++编写中:
static int * instarray = (int *)calloc(...);
与写作不同:
static int * instarray;
instarray = (int *)calloc(...);
因为在第一种情况下,分配只进行一次(代码第一次到达该指令),而在第二种情况下,每次都进行分配。
calloc
您的代码使用calloc
分配一个可变大小的数组,这绝对不是一个坏主意,需要非常小心处理以避免泄漏或其他错误(例如,使用calloc
分配的内存必须使用free
而不是delete[]
释放,但编译器无法帮助程序员记住用一个或另一个方法(new[]
)分配的内容。
除非有非常具体的理由使用裸指针,并且隐式大小是使用std::vector
用于可变大小的数组,否则会更好。
...但你的代码没有做任何事情。不幸的是,输入解析在C ++中是一个悲伤的故事,作为一个,我更喜欢使用旧的c <stdio.h>
函数进行输入,特别是输出(在C ++中格式化太痛苦了)。
getNextInstruction
总是返回0 instrToArr
的处理没有任何剩余,并且在输出上发送地址后,返回的数组也被丢弃在地板上。
这意味着每次迭代都会泄漏内存。
run_program
只循环一次...因此至少命名令人困惑(没有真正的循环)。
main
如果有人调用没有参数的程序(这是一个很常见的情况),那么就会发生一些不好的事情。