Как записать массив строк в набор данных HDF5 с помощью Fortran API?

Строковый массив определяется на языке fortran:

character(len = 20), dimension(5) :: strings = (/"hello", "world", "Hello", "HDF5", "fortran"/)

Теперь я хочу сохранить этот массив в набор данных, используя интерфейс h5ltmake_dataset_string_f(), проиллюстрированный справочной документацией HDF5 API.

Интерфейс 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! буфер данных

integer :: errcode ! код ошибки

конец подпрограммы h5ltmake_dataset_string_f

Мой телефонный код ниже

h5ltmake_dataset_string_f(group_id, dset_name, strings, error)

и group_id, dset_name и error были определены перед вызовом подпрограммы.

Но когда я компилирую и строю этот код, возникает ошибка компиляции, говорит

h5ltmake_dataset_string_f (): фактические аргументы и фиктивные аргументы были нарушены!

Итак, как записать строки в один набор данных?


person Jason    schedule 11.12.2012    source источник


Ответы (2)


Используйте API h5dwrite_f (...) , а не h5ltmake_dataset_f () для записи массива строк.

person Jason    schedule 14.12.2012

Хотя проблема была открыта несколько лет назад, вот решение для записи массива строк («привет», «мир», «Привет», «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 FILE example.h5")
    state = hdfql_execute("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_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)

    ! unregister variable "strings" as it is no longer used/needed (by HDFql)
    state = hdfql_variable_unregister(strings)

END PROGRAM
person SOG    schedule 02.04.2017
comment
API fortran для HDFql в настоящее время не поддерживается в Windows, верно? - person mikeck; 22.07.2018
comment
@mikeck: начиная с версии 2.0.0, HDFql поддерживает Fortran в Windows через оболочку Intel Fortran Compiler (IFORT). - person SOG; 28.03.2019