HDF5可变长度结构,可变长度(CAPI)
HDF5 variable length structure, of variable length (C API)
我想将包含在 STL 容器中的数据写入 HDF5 文件。根据我收集到的信息,我需要声明一个连续的内存块并使用 "hdf5.h"
C API 将数据从内存缓冲区传输到磁盘。
对于常规数据空间,过程很简单;只需要使用 new
在堆栈上创建临时数组。 HDF5 "understands" 这样的内存布局。
当处理不规则的数据空间时,情况就不同了,因为必须使用专用类型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
,但我在这里真的很困惑。
@Lashane 在评论中回答:
一个人应该简单地使用
hvl_t * X = (hvl_t *)malloc(jagged_array.size() * sizeof(hvl_t))
我知道已经有一段时间了,但我今天遇到了这个。这是一个正确的 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();
}
我想将包含在 STL 容器中的数据写入 HDF5 文件。根据我收集到的信息,我需要声明一个连续的内存块并使用 "hdf5.h"
C API 将数据从内存缓冲区传输到磁盘。
对于常规数据空间,过程很简单;只需要使用 new
在堆栈上创建临时数组。 HDF5 "understands" 这样的内存布局。
当处理不规则的数据空间时,情况就不同了,因为必须使用专用类型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()];
.
我应该如何声明一个大小在运行时确定的 hvl_t
?
它肯定涉及 malloc
,但我在这里真的很困惑。
@Lashane 在评论中回答:
一个人应该简单地使用
hvl_t * X = (hvl_t *)malloc(jagged_array.size() * sizeof(hvl_t))
我知道已经有一段时间了,但我今天遇到了这个。这是一个正确的 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();
}