gpt4 book ai didi

C++指针函数导致空参数

转载 作者:行者123 更新时间:2023-11-30 02:46:44 25 4
gpt4 key购买 nike

我正在用 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;

我在您的代码中看到的其他问题是:

1。 instructionCount未初始化

在 C++ 中,您必须始终在构造函数的类实例中初始化 native 类型成员(例如整数、 double )。默认构造函数不会为你做这件事。结果是,在分配类实例时,这些成员将具有随机值,而您不希望这样。这条规则的官方解释是,初始化不会访问的成员可能会影响性能,如果程序员想为初始化付费,那么就必须编写初始化。

2。 instrToArr返回指向本地 static 的指针变量

然而,每次调用函数时都会分配该变量,因此如果调用者不注意释放,则每次调用都会泄漏内存。

注意在C++写法中:

static int * instarray = (int *)calloc(...);

和写作不一样:

static int * instarray;
instarray = (int *)calloc(...);

因为在第一种情况下分配只进行一次(代码第一次到达该指令),而在第二种情况下每次都进行分配。

3。您正在使用 calloc

您的代码使用 calloc 分配一个可变大小的数组这虽然绝对不是一个坏主意,但需要非常小心地处理以避免泄漏或其他错误(例如,分配给 calloc 的内存必须用 free 而不是 delete[] 释放,但编译器无法帮助程序员记住使用一种或另一种方法分配的内容 ( new[] )。

更好,除非有非常具体的理由使用裸指针和隐式大小是使用 std::vector对于可变大小的数组。

4。你似乎想要 hex -> int 转换

...但是您的代码没有任何作用。不幸的是,输入解析在 C++ 中是一个悲伤的故事,作为一个人,我更喜欢使用旧的 c <stdio.h>输入函数,尤其是输出函数(在 C++ 中格式化太痛苦了)。

5。你的getNextInstruction总是返回 0

instrToArr 的处理没有任何剩余并且返回的数组在输出地址发送后被丢弃在地板上。这意味着每次迭代都会泄漏内存。

6。你的run_program只循环一次

...因此至少命名是困惑的(没有真正的循环)。

7.你的程序不做任何类型的检查 main

如果有人调用程序时不传递任何参数(很常见的情况),那么就会发生不好的事情。

关于C++指针函数导致空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com