【发布时间】:2021-05-03 19:02:58
【问题描述】:
我已使用以下代码成功地将固定长度的复合数据类型导出到数据包表中:
typedef struct moddata_t {
char cLog[4096];
} moddata_t;
//
// Attempt to open the revision history packet table
hid_t hidPTableID = H5PTopen(hidID, "Revision History");
//
// Create copy of native character type
hid_t hidCharLen4096TypeID = H5Tcopy(H5T_C_S1);
//
// Set size of character type
H5Tset_size(hidCharLen4096TypeID, 4096);
//
// Create memory data type for compound data
hid_t hidModDataTypeID = H5Tcreate(H5T_COMPOUND, sizeof(moddata_t));
H5Tinsert(hidModDataTypeID, "log", HOFFSET(moddata_t, cLog), hidCharLen4096TypeID);
//
// Create fixed length packet table
hidPTableID = H5PTcreate(hidID, "Revision History", hidModDataTypeID, 1, H5P_DEFAULT);
//
// Free resources
H5Tclose(hidModDataTypeID);
H5Tclose(hidCharLen4096TypeID);
//
// Fill data type
// NOTE: get() function returns a string with miscellaneous info to be exported to packet table
moddata_t modDat;
strcpy(modDat.cLog, get().c_str());
//
// Append data to packet table
herr_t herrErr = H5PTappend(hidPTableID, 1, &modDat);
//
// Close packet table
H5PTclose(hidPTableID);
但是,如果我更改为使用可变长度字符串,当调用 H5PTappend 时,我会在 HDF5 内的某个地方出现段错误。不幸的是,使用数据包表的例子并不多。这是失败的修改代码:
typedef struct moddata_t {
hvl_t cLogHandle;
} moddata_t;
//
// Attempt to open the revision history packet table
hid_t hidPTableID = H5PTopen(hidID, "Revision History");
//
// Create copy of native character type
hid_t hidCharLenVarTypeID = H5Tcopy(H5T_C_S1);
//
// Set size of character type
H5Tset_size(hidCharLenVarTypeID, H5T_VARIABLE);
//
// Create memory data type for compound data
hid_t hidModDataTypeID = H5Tcreate(H5T_COMPOUND, sizeof(moddata_t));
H5Tinsert(hidModDataTypeID, "log", HOFFSET(moddata_t, cLogHandle), hidCharLenVarTypeID);
//
// Create fixed length packet table
hidPTableID = H5PTcreate(hidID, "Revision History", hidModDataTypeID, 1, H5P_DEFAULT);
//
// Free resources
H5Tclose(hidModDataTypeID);
H5Tclose(hidCharLen4096TypeID);
//
// Fill data type
// NOTE: get() function returns a string with miscellaneous info to be exported to packet table
moddata_t modDat;
modDat.cLogHandle.len = get().length() + 1; // Added one for \0 character;
modDat.cLogHandle.p = new char [get().length()+1];
strcpy((char *) modDat.cLogHandle.p, get().c_str());
//
// Append data to packet table
herr_t herrErr = H5PTappend(hidPTableID, 1, &modDat);
//
// Close packet table
H5PTclose(hidPTableID);
结合其他人为声明具有可变长度元素的复合数据类型所做的工作,我认为我正确地创建了数据类型。但是,没有太多定义 hvl_t 结构,所以我不确定我是否正确定义了 len 和 p 变量和这就是它出现段错误的原因。
感谢任何帮助。
谢谢
【问题讨论】: