Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 使用三维数组线性索引宏进行三维泊松乘法时的分段错误_C_Multidimensional Array_Macros_Segmentation Fault - Fatal编程技术网

C 使用三维数组线性索引宏进行三维泊松乘法时的分段错误

C 使用三维数组线性索引宏进行三维泊松乘法时的分段错误,c,multidimensional-array,macros,segmentation-fault,C,Multidimensional Array,Macros,Segmentation Fault,我希望有人能帮我解决以下问题,我不知道出了什么问题。下面的函数用于使用三维拉普拉斯算子将三维矩阵和向量相乘,尽管这不是问题所需知道的。我在函数的开头创建了两个宏,用于将三维几何空间映射到线性内存空间 分段故障出现在使用宏访问Xi、J-1、K、IE席的元素X0、0. 0时,对于当前循环为i=0、j=1、k=0、0、1 0的情况,对于具有nAx、nyy和nz z=100 100x100x100的系统。因此,宏将三维几何体0,0,0更改为线性索引0,这可以通过打印确认。打印时可以访问x[0]。打印宏的

我希望有人能帮我解决以下问题,我不知道出了什么问题。下面的函数用于使用三维拉普拉斯算子将三维矩阵和向量相乘,尽管这不是问题所需知道的。我在函数的开头创建了两个宏,用于将三维几何空间映射到线性内存空间

分段故障出现在使用宏访问Xi、J-1、K、IE席的元素X0、0. 0时,对于当前循环为i=0、j=1、k=0、0、1 0的情况,对于具有nAx、nyy和nz z=100 100x100x100的系统。因此,宏将三维几何体0,0,0更改为线性索引0,这可以通过打印确认。打印时可以访问x[0]。打印宏的结果也会得到零

抱歉说的含糊不清,希望这可能是我在宏上做错了什么简单的事情?我正在使用动态内存分配阵列

void matvec_mul(int N,int n_x, int n_y, int n_z,double* restrict Ax,double* restrict x){
 #define X(i,j,k) (x[(i*n_y*n_z)+(j*n_z)+k])
 #define AX(i,j,k) (Ax[(i*n_y*n_z)+(j*n_z)+k])
 int inv_h2 = (n_x-1)*(n_x-1);
 for (int i = 0; i < n_x; ++i) {
  for (int j = 0; j < n_y; ++j) {
   for (int k = 0; k < n_z; ++k) {
    printf("%i,%i,%i\n",i,j,k);
    printf("%i\n",(i*n_y*n_z)+(j*n_z)+k);
    double xx = X(i,j,k);
    double xn = (i > 0) ? X(i-1,j,k) : 0;
    double xs = (i < n_x-1) ? X(i+1,j,k) : 0;
    printf("Seg faults on next line\n");
    double xe = (j > 0) ? X(i,j-1,k) : 0;
    double xw = (j < n_y-1) ? X(i,j+1,k) : 0;
    double xu = (k > 0) ? X(i,j,k-1) : 0;
    double xd = (k < n_z-1) ? X(i,j,k+1) : 0;
    AX(i,j,k) = (6*xx - xn - xs - xe - xw - xu - xd)/inv_h2;
   }
  }
 }
#undef AX
#undef X
}

问题在于宏替换文本中的宏参数周围缺少括号

将宏定义更改为以下内容:

#define X(i,j,k) (x[((i)*n_y*n_z)+((j)*n_z)+(k)])
#define AX(i,j,k) (Ax[((i)*n_y*n_z)+((j)*n_z)+(k)])

用原来的宏,席,J-1,K将被扩展到x[i*ny*n+z +j-1*nz z +k],但你要x[i*nyy*nsiz +j-1 *nsiz +k]。注意j-1*n_z和j-1*n_z之间的区别。对于新的宏,替换的是x[i*n_y*n_z+j-1*n_z+k]。

为了喜欢模糊处理,请使用3D阵列!数组[i] [j] [k]不定义席,j,k x[i*nyy*nyz +j*nsiz +k]。在宏替换文本中,宏括号周围需要括号。我将代码移植到CUDA上,以便在项目后面的GPU上实现,因此从开始使用线性内存空间,以后的事情会变得更容易。伊恩,这很管用,非常感谢!CUDA是否支持自动转换为指针的函数参数中的可变长度数组?它是自C99以来的标准C构造。CUDA是否支持void matvec_mulint N、int N_x、int N_y、int N_z、双重限制Ax[N_x][N_y][N_z]、双重限制x[N_x][N_y][N_z]?这将节省所有的放屁与宏。