如何使用 Fortran API 将字符串数组写入 HDF5 数据集?
Posted
技术标签:
【中文标题】如何使用 Fortran API 将字符串数组写入 HDF5 数据集?【英文标题】:How to write string array to a HDF5 dataset with Fortran API? 【发布时间】:2012-11-29 01:44:01 【问题描述】:一个字符串数组是用fortran语言定义的:
character(len = 20), dimension(5) :: strings = (/"hello", "world", "Hello", "HDF5", "fortran"/)
现在我想使用 HDF5 API 参考文档说明的h5ltmake_dataset_string_f()
接口将该数组保存到数据集中
Fortran90 接口: h5ltmake_dataset_string_f
子程序 h5ltmake_dataset_string_f(loc_id,dset_name,buf,errcode)
implicit none
整数(HID_T),意图(IN)::loc_id !文件或组标识符
字符(LEN=*),意图(IN)::dset_name !数据集的名称
字符(LEN=*),意图(IN),维度(:) :: buf !数据缓冲区
整数 :: 错误码 !错误代码
结束子程序 h5ltmake_dataset_string_f
下面是我的调用代码
h5ltmake_dataset_string_f(group_id, dset_name, strings, error)
并且在子程序调用之前已经定义了group_id、dset_name和error。
但是当我编译和构建这段代码时,出现编译错误说
h5ltmake_dataset_string_f():实际参数和虚拟参数都被违反了!
那么如何将字符串写入一个数据集呢?
【问题讨论】:
【参考方案1】:虽然问题是几年前提出的,但这里有一个解决方案,可以使用 Fortran 将字符串数组(“hello”、“world”、“Hello”、“HDF5”、“fortran”)写入 HDF5 数据集HDFql (http://www.hdfql.com)。发布此内容以防其他人在执行此类操作时发现自己在 HDF5 低级细节方面遇到困难:
PROGRAM Example
! use HDFql module (make sure it can be found by the Fortran compiler)
USE HDFql
! declare variables
CHARACTER(LEN = 20), DIMENSION(5) :: strings = [CHARACTER(LEN = 20) :: "hello", "world", "Hello", "HDF5", "fortran"]
CHARACTER :: variable_number
INTEGER :: state
! create an HDF file named "example.h5" and use (i.e. open) it
state = hdfql_execute("CREATE AND USE FILE example.h5")
! create a dataset named "my_dataset" of type char (size 20) of one dimension (size 5)
state = hdfql_execute("CREATE DATASET my_dataset AS CHAR(5, 20)");
! register variable "strings" for subsequent use (by HDFql)
state = hdfql_variable_transient_register(strings)
WRITE(variable_number, "(I0)") state
! insert (i.e. write) content of variable "strings" into dataset "my_dataset"
state = hdfql_execute("INSERT INTO my_dataset VALUES FROM MEMORY " // variable_number)
END PROGRAM
【讨论】:
目前 Windows 不支持 HDFql 的 fortran API,对吧? @mikeck:从 2.0.0 版开始,HDFql 通过其英特尔 Fortran 编译器 (IFORT) 包装器支持 Windows 中的 Fortran。【参考方案2】:使用 API h5dwrite_f(...),而不是 h5ltmake_dataset_f() 来写入字符串数组。
【讨论】:
以上是关于如何使用 Fortran API 将字符串数组写入 HDF5 数据集?的主要内容,如果未能解决你的问题,请参考以下文章