这可能是一个基本问题,但我想为结构的三维数组分配内存。
我试图从一个文件中读取doubles,并希望存储在struct中。第一行是块编号(这里不相关,因为它总是1),第二行分别表示X、Y和Z坐标中的网格点数量。在这种情况下,X方向10点,Y方向5点,Z方向1点从第三行,是每个点的X,Y,Z坐标,这是我想读的双倍。首先是所有X分量(即10*5*1 X坐标,然后是类似的Y和Z)。文件格式如下:
1
10 5 1
0.000000e+00 1.111111e+00 2.222222e+00 3.333333e+00
4.444445e+00 5.555555e+00 6.666667e+00 7.777778e+00
8.888889e+00 1.000000e+01 0.000000e+00 1.111111e+00
2.222222e+00 3.333333e+00 4.444445e+00 5.555555e+00
6.666667e+00 7.777778e+00 8.888889e+00 1.000000e+01
0.000000e+00 1.111111e+00 2.222222e+00 3.333333e+00
4.444445e+00 5.555555e+00 6.666667e+00 7.777778e+00
8.888889e+00 1.000000e+01 0.000000e+00 1.111111e+00
2.222222e+00 3.333333e+00 4.444445e+00 5.555555e+00
6.666667e+00 7.777778e+00 8.888889e+00 1.000000e+01
0.000000e+00 1.111111e+00 2.222222e+00 3.333333e+00
4.444445e+00 5.555555e+00 6.666667e+00 7.777778e+00
8.888889e+00 1.000000e+01...and so on...
我可以读取前4个整数,因此我知道要存储数据的点数。然后我使用malloc函数分配内存并将数据存储在变量中。当我执行程序时,它读取整数,但无法读取双精度数。我犯了什么错?
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
double x,y,z;
}Mesh;
int main(void)
{
int nblocks, IMAX, JMAX, KMAX;
Mesh ***grid;
FILE *mesh = fopen("test.x","r");
fscanf(mesh,"%i %i %i %i",&nblocks,&IMAX,&JMAX,&KMAX);
printf("%i %i %i %i\n",nblocks,IMAX,JMAX,KMAX);
grid = malloc(sizeof(Mesh)*nblocks*IMAX*JMAX*KMAX);
fscanf(mesh,"%lf",&grid[0][0][0].x);
printf("%lf\n",grid[0][0][0].x);
fclose(mesh);
return 0;
}
程序在编译时不会给出任何错误,但它不会读/写存储在结构的x变量中的变量。(如果这个方法有效,我可以将它放入循环中,以便读取我在这里没有完成的所有值。)
如果在我读入
Mesh grid[IMAX][JMAX][KMAX]
后定义IMAX,JMAX,KMAX
,我将得到正确的输出。但想知道指针的工作方式是如何工作的。谢谢您,
普拉纳夫
最佳答案
你有一个四维数组,而不是三维。尺寸为:nblocks
IMAX
JMAX
KMAX
因此,grid
的类型必须是Mesh****
,而不是Mesh***
。
Mesh ****grid;
为
grid
分配内存的代码必须是:grid = malloc(nblocks * (sizeof *grid));
for ( block = 0; block < nblocks; ++block )
{
grid[block] = malloc(IMAX * (sizeof *grid[0]));
for ( i = 0; i < IMAX ; ++i )
{
grid[block][i] = malloc(JMAX * (sizeof *grid[0][0]));
for ( j = 0; j < JMAX ; ++j )
{
grid[block][i][j] = malloc(KMAX * (sizeof *grid[0][0][0]));
}
}
}
现在,可以使用以下方法访问网格数据:
grid[block][index][jindex][kindex]
这些是有效的用法:
fscanf(mesh,"%lf",&grid[0][0][0][0].x);
printf("%lf\n",grid[0][0][0][0].x);