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

时间:2014-04-26 16:45:14

标签: c++ arrays string file

我正在用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) {。我不知道为什么文件变量突然变空。

3 个答案:

答案 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;

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

1。 instructionCount未初始化

在C ++中,您必须始终在构造函数的类实例中初始化本机类型成员(例如整数,双精度)。默认构造函数不会为您执行此操作。结果是,在分配类实例时,这些成员将具有随机值,而您不希望这样。这条规则的官方解释是初始化不能访问的成员可能会影响性能,如果程序员想要为初始化付费,那么它必须写初始化。

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 - &gt; int转换

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

5。你的getNextInstruction总是返回0

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

6。你的run_program只循环一次

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

7。您的程序不会在main

中进行任何检查

如果有人调用没有参数的程序(这是一个很常见的情况),那么就会发生一些不好的事情。