小型文本处理程序中的分词错误 我有一个C++函数 RealPosiDATA DATABOS>代码,读取一些输入文件并将这些值写入数组。我首先声明一个适当长度的数组,并使用函数用inputfile中的值填充它

小型文本处理程序中的分词错误 我有一个C++函数 RealPosiDATA DATABOS>代码,读取一些输入文件并将这些值写入数组。我首先声明一个适当长度的数组,并使用函数用inputfile中的值填充它,c++,segmentation-fault,C++,Segmentation Fault,但我有一个分割错误。有人知道我做错了什么吗 #define MAX 140160 void read_inputdata(double input[MAX], char files[40]); char inputfiles1[40] = "input/Hesse04/FR_Hes_rad.txt"; std::cout << "Declaring the arrays" << std::endl; double input1[MAX]; std::cout <&

但我有一个分割错误。有人知道我做错了什么吗

#define MAX 140160
void read_inputdata(double input[MAX], char files[40]);

char inputfiles1[40] = "input/Hesse04/FR_Hes_rad.txt";
std::cout << "Declaring the arrays" << std::endl;
double input1[MAX];
std::cout << "Calling function read_inputdata" << std::endl;
read_inputdata(input1, inputfiles1);

所以现在他调用函数
read\u inputdata
时出错了,因为他没有达到
std::cout,可能堆栈用完了。请使用指针、动态分配,甚至更好

#定义最大值140160
无效读取输入数据(双*输入,字符*文件);
char inputfiles1[40]=“input/Hesse04/FR_Hes_rad.txt”;

std::cout可能耗尽堆栈。请使用指针、动态分配,甚至更好

#定义最大值140160
无效读取输入数据(双*输入,字符*文件);
char inputfiles1[40]=“input/Hesse04/FR_Hes_rad.txt”;

std::cout我的猜测是j超过了允许的范围0..1。试试这个:

        #include <assert.h>

        ...

        int j=0;
        while( result != NULL )
        {
            assert(j < 2); // make sure that we don't try to write beyond the bounds of getal !
            getal[j][i]=atof(result);
            result = strtok( NULL, delims );
            j++;
        }
#包括
...
int j=0;
while(结果!=NULL)
{
assert(j<2);//确保我们不会试图编写超出getal界限的内容!
getal[j][i]=atof(结果);
结果=strtok(空,delims);
j++;
}

我猜j超出了允许的范围0..1。试试这个:

        #include <assert.h>

        ...

        int j=0;
        while( result != NULL )
        {
            assert(j < 2); // make sure that we don't try to write beyond the bounds of getal !
            getal[j][i]=atof(result);
            result = strtok( NULL, delims );
            j++;
        }
#包括
...
int j=0;
while(结果!=NULL)
{
assert(j<2);//确保我们不会试图编写超出getal界限的内容!
getal[j][i]=atof(结果);
结果=strtok(空,delims);
j++;
}

您不动态分配阵列有什么原因吗?这是一个相当大的尺寸。这个
double getal[2][MAX]声明一个大小为数兆字节的数组。你确定你的系统上有那么多的堆栈空间吗?是的,事实上,当我尝试使用较小的
#define MAX 140160
时,它起了作用,因此可能与可用空间有关。为什么我没有动态分配它?我试过了,但也有一些缺点,我不是一个真正有经验的C++程序员,所以我放弃了。但是我将尝试下面的答案。对于调试输出,您应该使用std::cerr而不是std::cout。cout写入STDOUT并被缓冲,因此在终端中看到的最后一条消息不一定是程序编写的最后一条消息。相反,cerr写入STDERR并且没有缓冲。@bopersson:你怎么知道你有多少堆栈空间?你能改变这一点吗?你不动态分配数组有什么原因吗?这是一个相当大的尺寸。这个
double getal[2][MAX]声明一个大小为数兆字节的数组。你确定你的系统上有那么多的堆栈空间吗?是的,事实上,当我尝试使用较小的
#define MAX 140160
时,它起了作用,因此可能与可用空间有关。为什么我没有动态分配它?我试过了,但也有一些缺点,我不是一个真正有经验的C++程序员,所以我放弃了。但是我将尝试下面的答案。对于调试输出,您应该使用std::cerr而不是std::cout。cout写入STDOUT并被缓冲,因此在终端中看到的最后一条消息不一定是程序编写的最后一条消息。相反,cerr写入STDERR并且没有缓冲。@bopersson:你怎么知道你有多少堆栈空间?你能改变这一点吗?使用断言进行错误检查是不好的!它应该只适用于你的申请很糟糕的情况;不是逻辑错误。我想如果这用于初始逻辑测试并在…@丹尼尔:你说的是正确的,但我建议这仅仅是作为初始调试步骤,也可能是为了向OP介绍添加断言是编程的一个有用且重要的部分使用断言进行错误检查是不好的!它应该只适用于你的申请很糟糕的情况;不是逻辑错误。我想如果这用于初始逻辑测试并在…@丹尼尔:你说的是正确的,但我建议这仅仅是一个初始调试步骤,也可能是为了向OP介绍添加断言是编程中有用且重要的一部分的想法
#define MAX 140160
void read_inputdata(double *input, char *files);

char inputfiles1[40] = "input/Hesse04/FR_Hes_rad.txt";
std::cout << "Declaring the arrays" << std::endl;
double *input1 = new double[MAX];
std::cout << "Calling function read_inputdata" << std::endl;
read_inputdata(input1, inputfiles1);
        #include <assert.h>

        ...

        int j=0;
        while( result != NULL )
        {
            assert(j < 2); // make sure that we don't try to write beyond the bounds of getal !
            getal[j][i]=atof(result);
            result = strtok( NULL, delims );
            j++;
        }