【问题标题】:Write 3D data into HDF5 file in C在 C 中将 3D 数据写入 HDF5 文件
【发布时间】:2016-03-22 08:13:27
【问题描述】:

我正在尝试使用超平板将三维数据 () 写入 HDF5 文件,这些数据像线性数组 () 一样存储在内存中。请参阅下面的代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <float.h>

#include "hdf5.h"

int main(int argc, char *argv[])
{
    int i, j, k;
    int count = 0;
    int Nx = 180;
    int Ny = 128;
    int Nz = 128;

    double *data = (double *)malloc(Nx * Ny * Nz * sizeof(double));

    for (i = 0; i < Nx; i++)
    {
        for (j = 0; j < Ny; j++)
        {
            for (k = 0; k < Nz; k++)
            {
                data[k + Nz * j + Nz * Ny * i] = (double)count;
                count++;
            }
        }
    }

    hid_t err;
    hid_t dataspace, memspace, dataset;
    hid_t file_identifier;
    int rank;
    hsize_t dimens_3d[3];
    hsize_t start_3d[3];
    hsize_t stride_3d[3];
    hsize_t count_3d[3];

    char *file_name = "data.h5";

    file_identifier = H5Fcreate(file_name, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

    rank = 3;

    dimens_3d[0] = Nz;
    dimens_3d[1] = Ny;
    dimens_3d[2] = Nx;

    dataspace = H5Screate_simple(rank, dimens_3d, NULL);

    start_3d[0] = 0;
    start_3d[1] = 0;
    start_3d[2] = 0;

    stride_3d[0] = 1;
    stride_3d[1] = 1;
    stride_3d[1] = 1;

    count_3d[0] = Nz;
    count_3d[1] = Ny;
    count_3d[2] = Nx;

    err = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start_3d, stride_3d, count_3d, NULL);

    dimens_3d[0] = Nz;
    dimens_3d[1] = Ny;
    dimens_3d[2] = Nx;

    memspace = H5Screate_simple(rank, dimens_3d, NULL);

    start_3d[0] = 0;
    start_3d[1] = 0;
    start_3d[2] = 0;

    stride_3d[0] = 1;
    stride_3d[1] = 1;
    stride_3d[1] = 1;

    count_3d[0] = Nz;
    count_3d[1] = Ny;
    count_3d[2] = Nx;

    err = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start_3d, stride_3d, count_3d, NULL);

    dataset = H5Dcreate(file_identifier, "data", H5T_NATIVE_DOUBLE, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);

    err = H5Dwrite(dataset, H5T_NATIVE_DOUBLE, memspace, dataspace, H5P_DEFAULT, &(data[0]));

    H5Sclose(memspace);
    H5Sclose(dataspace);
    H5Dclose(dataset);

    H5Fclose(file_identifier);

    free(data);

    return 0;
}

这个例子没有将任何数据放入文件中,我不知道为什么。该文件已创建,但是当我使用 h5dump 实用程序(h5dump -u data.h5 > data.xml)将其转储到 XML 文件中时,data 数组没有值。如果我在文件中出现带有H5Sselect_hyperslab 函数值的注释行。

我知道这里不需要使用H5Sselect_hyperslab 函数,但对我来说下一步将是在需要使用超平板的地方并行编写 HDF5。

【问题讨论】:

  • 请提供一个完整的可编译示例。
  • 你怎么知道文件被打开了?文件是否存在?它包含任何东西吗?您的调试详细信息在哪里?这个问题没救了:((
  • 我更新了代码并扩展了问题描述。再次创建文件,我可以使用 h5dump 实用程序查看文件的内容。

标签: c multidimensional-array hdf5


【解决方案1】:

您在stride_3d 中打错了字:您设置了两次stride_3d[1] 并且从未设置stride_3d[2],因此stride_3d[2] 的初始值未定义(也称为垃圾)并且对H5Sselect_hyperslab 的调用失败。这就引出了我的第二点……

检查您的错误!您应该在每次 API 调用后检查 err 的值。

【讨论】:

  • 非常感谢您的帮助,这是一个愚蠢的错误。现在我正在检查错误代码。
猜你喜欢
  • 2017-09-16
  • 2022-01-14
  • 1970-01-01
  • 2017-05-20
  • 2018-03-08
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2021-03-27
相关资源
最近更新 更多