Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大型矩阵计算 我在C++中编写了一个简单的代码,在Linux Ubuntu 11.04上用G++编译,没有任何错误,但是当我运行可执行文件时,我得到了这个错误“分段错误”。_C++ - Fatal编程技术网

大型矩阵计算 我在C++中编写了一个简单的代码,在Linux Ubuntu 11.04上用G++编译,没有任何错误,但是当我运行可执行文件时,我得到了这个错误“分段错误”。

大型矩阵计算 我在C++中编写了一个简单的代码,在Linux Ubuntu 11.04上用G++编译,没有任何错误,但是当我运行可执行文件时,我得到了这个错误“分段错误”。,c++,C++,我知道我的代码没有问题,这个错误与编译器有关 有人能帮我吗 我的代码是: #include <math.h> int main() { double a[200][200][200],b[200][200][200],c[200][200][200]; int i,j,k; double const pi=3.14; for(k=0;k<200;k++) { for(j=0;j<200;j++)

我知道我的代码没有问题,这个错误与编译器有关

有人能帮我吗

我的代码是:

#include <math.h>
int main()
{
    double a[200][200][200],b[200][200][200],c[200][200][200];
    int i,j,k;

    double const pi=3.14;

    for(k=0;k<200;k++)
    {
        for(j=0;j<200;j++)
        {
            for(i=0;i<200;i++)
            {
                a[i][j][k]=sin(1.5*pi*i)*cos(3.5*pi*j)*k;
                b[i][j][k]=cos(1.5*pi*i)*cos(2.5*pi*k)*j;
                c[i][j][k]=a[i][j][k]-b[i][j][k];
            }
        }
    }
}
#包括
int main()
{
双a[200][200][200],b[200][200][200],c[200][200][200];;
int i,j,k;
双常数pi=3.14;

对于(k=0;k这三个阵列需要大约190MB的空间,这几乎肯定超过了操作系统施加的堆栈大小限制


尝试在堆上分配它们(使用
new
),而不是将它们放在堆栈上。

您正在将大量的double数组放在堆栈上(假设您的体系结构就是这样处理局部变量的)。几乎可以肯定,您的系统堆栈不能容纳那么多空间

而是使用向量在堆上进行分配:

std::vector<std::vector<std::vector<double> > > a(200, std::vector<std::vector<double> >(200, std::vector<double>(200)));
std::vector a(200,std::vector(200,std::vector(200));

堆栈溢出->分段错误

对于非对称情况,我们必须使用以下方法:

    double*** a=new double**[IE];
    for(int i=0;i<IE;i++){
        a[i]=new double *[JE];
        for(int j=0;j<JE;j++){
            a[i][j]=new double [KE];
        }
    }
double***a=新的double**[IE];

对于(int i=0;i此函数可以帮助您:

double ***alloc3d(int l, int m, int n) {
    double *data = new double [l*m*n];
    double ***array = new double **[l];
    for (int i=0; i<l; i++) {
        array[i] = new double *[m];
        for (int j=0; j<m; j++) {
            array[i][j] = &(data[(i*m+j)*n]);
        }
    }

    return array;
}
double***alloc3d(整数l、整数m、整数n){
双精度*数据=新双精度[l*m*n];
双***数组=新双***[l];

for(int i=0;iDefinitely不会是8MB。200*200*200=8Mega,double可能是8字节,至少是1字节,其中有3个变量。除非他所处的体系结构中double由一位表示。200*200*200*8*3/2^20产生大约183兆字节。另一个想法是在“全局”中分配它们在OP的示例中,将它们移到
main()之外
。我说可用堆栈是8MB未使用的堆栈…如果不清楚,很抱歉…这只是一个旁白。头文件
math.h
有一个宏
M\u PI
,所以这是一个您不需要担心的细节。您可以将
PI
行更改为
double const PI=M\u PI;
或直接使用
M\PI
我更喜欢前一个选项。支持David Alber的评论。使用预先存在的pi(或类似的任何常量)
3.14
是一个相对糟糕的近似值。顺便说一句,我曾经看到有人将pi定义为
double my_pi=22.0/7.0;
,然后在出现问题时加入一个模糊因子。一条建议:如果你的程序不工作,那是你的错,而不是CPU或编译器的错。double(*a)[200]=new double[200][200]这是最简单的方法。