Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++ 修改大型动态大小的三维阵列mex/C++;_C++_Memory Management_Multidimensional Array_Mex_Dynamic Arrays - Fatal编程技术网

C++ 修改大型动态大小的三维阵列mex/C++;

C++ 修改大型动态大小的三维阵列mex/C++;,c++,memory-management,multidimensional-array,mex,dynamic-arrays,C++,Memory Management,Multidimensional Array,Mex,Dynamic Arrays,短篇故事:尝试修改在堆上运行时分配的大型3D数组。我相信下面显示的修改数组的函数,vcross正在创建不会被破坏的内存 更长的故事: 我有一个大的3D双阵列(~126000x3x3或大约8.6MB),需要在其上运行一些操作。我不知道这个数组的第一维在编译时有多大,所以我使用new和delete操作将内存分配给堆 当我尝试将值存储到此数组时,会出现分段冲突。这让我觉得,在将值存储到数组时,我在某个地方创建的内存会被浪费,最终会填满堆 代码编译得很好,但运行时遇到seg冲突 static void

短篇故事:尝试修改在堆上运行时分配的大型3D数组。我相信下面显示的修改数组的函数,
vcross
正在创建不会被破坏的内存


更长的故事: 我有一个大的3D双阵列(~126000x3x3或大约8.6MB),需要在其上运行一些操作。我不知道这个数组的第一维在编译时有多大,所以我使用
new
delete
操作将内存分配给堆

当我尝试将值存储到此数组时,会出现分段冲突。这让我觉得,在将值存储到数组时,我在某个地方创建的内存会被浪费,最终会填满堆

代码编译得很好,但运行时遇到seg冲突

static void inpolyh(
    double (*f)[3],//pointer to array[3], treated as 2D array where I don't know the first dimension until run-time.
    double (*v)[3],
    double (*p)[3],
    size_t numF,
    size_t numP)
{

    /*Calculate the baseNormals*/
    //allocate memory on the heap
    double (*baseNormals)[3] = NULL;//pointer to an array[3]
    if ( !(baseNormals = new double[numF][3]) ) { out_of_memory(); }

    //store the vector cross products in each array[3] of baseNormals
    for (int i=0; i<numF; i++) {
         vcross(baseNormals[i],
             v[(int)f[i][0]],
             v[(int)f[i][1]],
             v[(int)f[i][2]]);
         //THIS WORKS
    }

    /*Calculate face normals of tetrahedron*/
    //allocate memory on the heap (THIS WORKS)
    double (*faceNormals)[3][3] = NULL; //pointer to an array[3] of arrays[3]
    if ( !(faceNormals = new double[numP][3][3]) ) { out_of_memory(); }

    //store vector cross products into each array[3] of faceNormals
    for (int i=0; i<numP; i++ ) {
        for (int j=0; j<3; j++ ) {
            vcross(faceNormals[i][j],
                p[i],
                v[ (int) f[i][j] ],
                v[ (int) f[i][ (j + 1) % 3 ] ] );
            //SEG VIOLATION at i=37560
        }
    }

    delete [] baseNormals;
    delete [] faceNormals;
}
其他可能重要的细节:

  • 这是一个在matlab中运行的mex函数
  • 默认编码:windows-1252
  • MATLAB根目录:C:\Program Files\MATLAB\R2012b
  • MATLAB版本:8.0.0.783(R2012b)
  • 操作系统:Microsoft Windows 7
  • 处理器ID:x86系列6型号58 Stepping 9,GenuineIntel
  • 虚拟机:Java 1.6.0_17-b04与Sun Microsystems Inc.的Java HotSpot(TM)64位服务器虚拟机混合模式
  • 窗口系统:版本6.1(版本7601:Service Pack 1)

您确定
(int)f[i][j]
始终在[0]范围内吗?我要做的第一件事是在循环运行时打印出
(int)f[i][j]
的值。或者在崩溃时启动调试器查看值。

vcross()中有分配吗
是用看不见的墨水写的,因为我什么都看不见。在
numP
循环中,你有多确定
v[(int)f[I][(j+1)%3]
中的
f
的大小大于或等于
numP
?我建议添加行
assert(numF>=numP);
或代码中类似的内容。使用double(强制转换为int)似乎很奇怪作为索引。哦,goody@ilent2,我想你刚刚击中了它的头部。好眼睛,我将重新评估该索引应该是什么,然后返回。我分别生成f和v数组,它断言f中给出的索引对应于v中的条目。
static void vcross(
    double (&n)[3],
    double a[3],
    double b[3],
    double c[3])
{
    n[0] = b[1] * c[2] - a[1] * c[2] + a[1] * b[2] - b[2]
                * c[1] + a[2] * c[1] - a[2] * b[1];
    n[1] = b[2] * c[0] - a[2] * c[0] + a[2] * b[0] - b[0]
                * c[2] + a[0] * c[2] - a[0] * b[2];
    n[2] = b[0] * c[1] - a[0] * c[1] + a[0] * b[1] - b[1]
                * c[0] + a[1] * c[0] - a[1] * b[0];
    return;
}