Как иметь общее входное значение Fortran - PullRequest
3 голосов
/ 05 июня 2019

Я просто собираю и пытаюсь очистить некоторый код на Фортране, который использует библиотеку HDF5.В этой библиотеке есть функция, определенная так:

SUBROUTINE h5dwrite_f(dset_id, mem_type_id, buf, dims, hdferr, & 
                      mem_space_id, file_space_id, xfer_prp)
  IMPLICIT NONE
  INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
  INTEGER(HID_T), INTENT(IN) :: mem_type_id  ! Memory datatype identifier
  TYPE, INTENT(IN) :: buf                    ! Data buffer; may be a scalar 
                                             ! or an array
  ...

Ввод ключа здесь buf.У меня есть куча разных частей моего кода, которые используют эту подпрограмму и имеют подпрограммы-оболочки, которые отличаются только на одну строку, и тип ввода, поэтому я бы хотел немного обобщить код.Единственная разница во всех моих подпрограммах, которые вызывают это, - mem_type_id и фактический тип значения, передаваемого в buf.Например, в одном вызове mem_type_id - это H5T_NATIVE_CHARACTER, а buf - это строка, а в другом mem_type_id - это H5T_NATIVE_REAL, а buf - это real.

.повторить то, что содержится в их объявлении подпрограммы, чтобы у меня был ввод типа, но он не компилируется.

  subroutine StoreDataIntoH5File (vname, vval, mem_type_id)
    character, intent (in) :: vname*(*)
    type, intent (in) :: vval                  ! use generic type statement
    integer(HID_T), intent(in) :: mem_type_id  ! Memory datatype identifier
    ...
    call h5dwrite_f (dset_id, mem_type_id, vval, (/1_HSIZE_T/), hdf5_error)

Есть ли способ сделать то, что я ищу?На любом другом языке я бы описал это как желание иметь ввод типа object, или в CI можно использовать void*.По сути, этот API, похоже, может принимать общий тип ввода, и я пытаюсь его воспроизвести, так как моя подпрограмма оборачивает его.

Я рад пойти по пути указателя, в основном я просто хочучтобы иметь возможность совместно использовать эту подпрограмму для различных типов входных переменных, так же, как это делает подпрограмма, которую она вызывает (h5dwrite_f).

1 Ответ

0 голосов
/ 05 июня 2019

В HDF5 привязки Фортрана перегружены для всех комбинаций аргументов. Вы можете сделать то же самое (повторить код с перегрузкой) или обработать вызов библиотеки C HDF5. Я советую первое решение! (Может быть в основном автоматизирован путем циклического объединения комбинаций аргументов).

...