Я давно использую следующие коды для создания и присвоения значений 3D-массивам в visual studio 2010 / cuda 7.0. Недавно я попытался перейти на visual studio 2013, но код неожиданно завершил работу. Я попытался отладить и обнаружил, что могу назначать значения только первому измерению трехмерного массива, созданного с помощью цикла for. Мне интересно, почему это может произойти? Спасибо!
выделение массива:
void * alloc1d (int n, int size)
{
void * a;
if ((a=malloc(n*size))==NULL)
fprintf(stderr, "warning: memory allocation failure.\n");
return a;
}
void ** alloc2d (int nx, int ny, int size)
{
register int i, block;
void ** a;
a = (void **)alloc1d(ny, sizeof(void *));
a[0] = alloc1d(nx*ny, size);
block = nx*size;
for(i=1; i<ny; i++) a[i]=(void *)((int)(a[i-1])+block);
return a;
}
void *** alloc3d (int nx, int ny, int nz, int size)
{
void *** a;
register int i, block;
a = (void ***) alloc2d(ny, nz, sizeof(void *));
a[0][0] = alloc1d(nx*ny*nz, size);
block = nx*size;
for(i=1; i<ny*nz; i++) a[0][i]=(void *)((int)(a[0][i-1])+block);
return a;
}
присвоение значения
voxelgrad = (float ***)alloc3d(size[0], size[1], size[2], sizeof(float));
for (k=0;k<size[2];k++)
{
for(j=0;j<size[1];j++)
{
for(i=0;i<size[0];i++)
{
voxelgrad[k][j][i]=0.0; %the code will crash here.
}
}
}