[英]Dynamic Memory Allocation and NETCDF
我一直在努力使用我為將數據寫入 netcdf 格式文件而制作的小測試代碼。 代碼應該寫入具有相同值但內存分配不同的兩個變量。 代碼如下:
int main(int argc, char** argv)
{
int i, j, k;
char filen2[80];
int ncid, err, cmode;
int dimid[2],varid[2];
printf("Creating Netcdf Output file\n");
int mx=5, my=5, mz=5;
printf("mx my mz: %d %d %d %i \n", mx , my, mz, rank);
sprintf(filen2, "test.nc");
printf("Writing file: %s \n",filen2);
cmode = NC_CLOBBER;
err = nc_create(filen2, cmode, &ncid); ERR
/* free info object */
if (MInfo != MPI_INFO_NULL) MPI_Info_free(&MInfo);
/* define dimensions */
err = nc_def_dim(ncid, "MZ", mz, &dimid[0]); ERR
err = nc_def_dim(ncid, "MY", my, &dimid[1]); ERR
err = nc_def_var(ncid, "Z", NC_DOUBLE, 2, dimid, &varid[0]); ERR
err = nc_def_var(ncid, "Y", NC_DOUBLE, 2, dimid, &varid[1]); ERR
/* exit define mode */
err = nc_enddef(ncid); ERR
size_t start2[2], count2[2];
start2[0] = 0;
start2[1] = 0;
count2[0] = mz;
count2[1] = my;
printf("Start: %d %d %i \n", start2[0], start2[1], rank);
printf("Count: %d %d %i \n", count[0], count[1], rank);
double **buffertmp2=NULL;
double buffertmp3[mz][my];
buffertmp2 = (double **) malloc( sizeof(double *) * mz);
for(k=0; k<mz; k++){
buffertmp2[k] = (double *) malloc( sizeof(double) * my);
for(j=0; j<my; j++){
buffertmp2[k][j] = k;
buffertmp3[k][j] = k;
}
}
err = nc_put_vara_double(ncid, varid[0], start2, count2, &buffertmp2[0][0]); ERR
err = nc_put_vara_double(ncid, varid[1], start2, count2, &buffertmp3[0][0]); ERR
err = nc_close(ncid); ERR
for(k=0; k<mz; k++){
for(j=0; j<my; j++){
printf("bff2 %le \n", buffertmp2[k][j]);
}
}
for(k=0; k<mz; k++){
for(j=0; j<my; j++){
printf("bff3 %le \n", buffertmp3[k][j]);
} }
printf("The End \n");
}
在 MATLAB 上讀取的輸出給出:
X =
0 0 1.0000 0.0000 2.0000
0 0 1.0000 2.0000 0
0 0.0000 1.0000 2.0000 0
0 1.0000 0 2.0000 0.0000
0 1.0000 0 2.0000 3.0000
Y =
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
Y 的輸出是我實際預期的,但 X 的輸出完全錯誤。 我想知道是否有人可以指出內存分配如何改變整個輸出。 如果內存分配是使用 for 循環進行的,就像 buffertmp2 一樣,而不必創建中間變量,我該怎么做才能將數據寫入 netcdf 文件。
謝謝克里斯
我不確定這是正確的答案,但您應該注意buffertmp2
和buffertmp3
是兩種完全不同的數據結構。
buffertmp3
是一大塊包含二維數組的內存。
buffertmp2
是指向行數據的指針(行)數組。
當將這些不同的數據結構傳遞給 Matlab(或 netcdf 函數)時,它應該知道您正在傳遞不同的數據結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.