HDF5可变长度结构,可变长度(C API)

时间:2015-03-18 20:11:34

标签: c memory memory-management malloc hdf5

我想将包含在STL容器中的数据写入HDF5文件。根据我收集的内容,我需要声明一个连续的内存块,并使用"hdf5.h" C API将数据从内存缓冲区传输到磁盘。

对于常规数据空间,程序很简单;只需要使用new在堆栈上创建临时数组。 HDF5“了解”这种内存布局。 当处理不规则数据空间时,这是一个不同的故事,因为必须使用专用类型hvl_t

以下代码段有效,但不是ISO C ++(11):

// Test data
std::vector< std::vector<int> > jagged_array(3);
jagged_array[0] = {0};
jagged_array[1] = {0, 1, 2, 3};
jagged_array[2] = {0, 1, 2};

hvl_t X[jagged_array.size()];
for (unsigned int i = 0; i < jagged_array.size(); ++i) {
    X[i].len = jagged_array[i].size();
    int * ptr = (int *) malloc (X[i].len * sizeof(int));
    for (unsigned int j = 0; j < X[i].len; ++j) {
        ptr[j] = jagged_array[i][j];
    }
    X[i].p = (void *) ptr;
}

我的C 非常生锈;除了非法行hvl_t X[jagged_array.size()];之外,此片段几乎完全从HDF5示例页面中删除。

如何宣布在运行时确定大小的hvl_t? 肯定涉及malloc,但我真的很难过。

2 个答案:

答案 0 :(得分:1)

我知道已经有一段时间了,但是今天我想到了。这是一个合适的c ++解决方案,它不分配额外的内存,而只是将指向向量的指针存储在vlen_t中:

// Test data
std::vector< std::vector<int> > jagged_array(3);
jagged_array[0] = {0};
jagged_array[1] = {0, 1, 2, 3};
jagged_array[2] = {0, 1, 2};

hvl_t X[jagged_array.size()];
for (unsigned int i = 0; i < jagged_array.size(); ++i) {
    X[i].len = jagged_array[i].size();
    X[i].p = (void*) &jagged_array[i].front();
}

答案 1 :(得分:0)

@Lashane在评论中回答:

应该只使用

hvl_t * X = (hvl_t *)malloc(jagged_array.size() * sizeof(hvl_t))