You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HDF5 C++ 无需全局变量获取h5文件所有群组名称的实现方法

解决方法

HDF5的H5Ovisit接口预留了用户自定义数据透传参数,你只需要把目标vector的地址作为最后一个参数传入H5Ovisit,就可以在回调函数中直接操作这个vector,完全不需要全局变量。

修正后的完整代码

// 回调函数最后一个参数是透传的用户数据,注意是void*指针类型
herr_t op_func(hid_t loc_id, const char* name, const H5O_info_t* info, void* opdata)
{
   if(info->type == H5O_TYPE_GROUP)
   {
       // 将void*转回vector指针,直接往传入的vector里写数据
       auto groupVec = static_cast<std::vector<std::string>*>(opdata);
       groupVec->push_back(std::string(name));
   }
   // 必须返回0才能继续遍历,返回非0值会中断遍历流程
   return 0;
}

void getGroupNames(hid_t fileId, std::vector<std::string>& someVec)
{
    herr_t status;
    // 最后一个参数传入目标vector的地址,透传给回调函数
    status = H5Ovisit(fileId, H5_INDEX_NAME, H5_ITER_NATIVE, op_func, &someVec);
    // 无需额外赋值,回调函数已经直接把结果写入someVec了
}

注意事项

  • 你原来的回调函数最后一个参数漏了指针标识*,必须修正为void* opdata才能正常接收透传的地址
  • 回调函数必须返回0,否则HDF5会中断遍历,无法拿到全量的群组名称
  • 这种方式是线程安全的,不会出现全局变量带来的并发访问问题

内容的提问来源于stack exchange,提问作者Karl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:18:03