C ++中的动态矩阵

时间:2012-04-12 05:40:21

标签: c++ multidimensional-array dynamic-arrays

我正在使用多维数组,但我得到一个异常,我搜索了很多但我找到了相同的答案我正在使用,当我尝试分配matriz [i] = new double [n]时异常跳转。我已经尝试了评论和未注释的解决方案,但没有运气。

void interpol(double *arr_x, double *arr_y, int n, double *results) {
    //double** matriz = new double*[n];
    double** matriz;
    matriz = (double**) malloc(n * sizeof(double*));
    for(int i = 0; i < n; i++){    
        //matriz[i] = new double[n+1];
        matriz[i] = (double*) malloc(n+1 * sizeof(double));
        for(int j = 0; j < n; j++) {
            matriz[i][j] = pow(arr_x[i],j);
        }
        matriz[i][n] = arr_y[i];
    }
    gaussiana(matriz, n, results);
}

---编辑---

函数gaussiana工作正常,因为我已在此功能之外进行了测试。抛出异常:  // matriz [i] = new double [n];    matriz [i] =(double *)malloc(n * sizeof(double));

n绝不会超过10个。

抛出的异常是:

  

Interpolacion.exe中0x00071c4d的第一次机会异常:0xC0000005:   访问冲突读取位置0x00000000。       Interpolacion.exe中0x774b15de处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。       程序'[8012] Interpolacion.exe:Native'已退出,代码为-1073741819(0xc0000005)。

---- ---- EDIT 我终于得到了它的工作,问题不在matriz中,但是使用arr_x / arr_y,外部例程发送数据错误(奇怪的是错误,堆栈跟踪总是将我引用到新的double [n]赋值)

2 个答案:

答案 0 :(得分:1)

如果您想使用std::vector路线,可以使用下面的内容(未经测试,仅作为指南显示)。请注意,std::vector<std::vector<double> >double **不兼容,因此可能需要重写gaussiana函数以接受新类型。:

// Include the header!
#include <vector>


// Be careful about the use of "using namespace std", I'm only using it here
// because it's a small example
using namespace std;

vector<vector<double> > matriz;

for (int i = 0; i < n; i++)
{
    // Create a new vector "v" with n+1 elements
    vector<double> v(n + 1);

    // fill this vector
    for (int j = 0; j < n; j++)
        v[j] = pow(arr_x[i], j);
    v[n] = arr_y[i];   

    // add it to the matrix
    matriz.push_back(v);
}

答案 1 :(得分:0)

我在代码中看不到会导致异常的任何内容。必须gaussiana()造成麻烦。尝试评论该行,看看该程序是否仍然出错。

了解n的范围会很有用。只要它在现代32位或64位机器上相对较小(<1000),malloc()就不会失败。但是,如果程序使用受限内存运行,或者n很大,则某些malloc可能会失败。由于没有检查返回NULL,程序会在尝试取消引用指针时指示SEGFAULTing出现问题。

如果多次调用该函数,内存泄漏可能会导致严重的堆短缺并导致malloc()失败。