- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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) {
.我不知道为什么突然文件变量是空的。
最佳答案
您的代码有很多问题,但困扰您的可能是
file = loadProgram(s);
因为loadProgram
已被定义为返回一个整数(指令数)而不是一个字符串,但您将其分配给一个字符串。
对于我所说的 C++ 设计错误,将整数分配给字符串是完全合法的指令,这意味着字符串将具有一个具有整数值的字符。
官方接受整数赋值的原因是认为这样写会很有用
str += chr; // Adds the char at the end
哪里str
是一个字符串并且 chr
一个字符。通过扩展如果 +=
是合法的,然后人们认为赋值也应该是合法的(在这种特定情况下我不同意这种逻辑跳跃)。
char
但是在 C++ 中,s 是数字和整数(甚至是 double
s)可以隐式转换为 char
。没有任何警告或任何错误。所以它也是合法的:
std::string s;
s = 3.141592654;
我在您的代码中看到的其他问题是:
instructionCount
未初始化在 C++ 中,您必须始终在构造函数的类实例中初始化 native 类型成员(例如整数、 double )。默认构造函数不会为你做这件事。结果是,在分配类实例时,这些成员将具有随机值,而您不希望这样。这条规则的官方解释是,初始化不会访问的成员可能会影响性能,如果程序员想为初始化付费,那么就必须编写初始化。
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
总是返回 0instrToArr
的处理没有任何剩余并且返回的数组在输出地址发送后被丢弃在地板上。这意味着每次迭代都会泄漏内存。
run_program
只循环一次...因此至少命名是困惑的(没有真正的循环)。
main
如果有人调用程序时不传递任何参数(很常见的情况),那么就会发生不好的事情。
关于C++指针函数导致空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313851/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!