Я просто собираю и пытаюсь очистить некоторый код на Фортране, который использует библиотеку 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
).