c - 动态内存分配和 NETCDF

标签 c matlab dynamic-memory-allocation netcdf netcdf4

我一直在努力编写一个将数据写入 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 文件。

谢谢 克里斯

最佳答案

我不确定这是否是正确的答案,但您应该注意 buffertmp2buffertmp3 是两个完全不同的数据结构

buffertmp3 是包含二维数组的一大块内存。

buffertmp2 是指向行数据的指针(行)数组。

当将这些不同的数据结构传递给 Matlab(或 netcdf 函数)时,它应该知道您正在传递不同的数据结构。

关于c - 动态内存分配和 NETCDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59720847/

相关文章:

c - 现在 glibc 中包含数学库了吗?

c - 如何通过 Windows 终端发送 EOF

c++ - 对称矩阵中的线性索引

Matlab:查找点(x,y)包围的面积

C++ 析构函数泄漏动态内存

c++ - 尝试编写可以从 std::string move 语义的字符串类

C++ 成员变量的析构函数?

c - C中如何优雅地遍历一个字符串到最后

具有动态数组成员的 C 结构体在内存中的分配位置问题

matlab - 在 MATLAB 中使用回归函数时出现秩不足警告