Я искал в Интернете решение этой проблемы, но должен признать, что полностью застрял.
У меня есть производный тип данных
TYPE :: MyType
REAL(KIND=MY_REAL_KIND) :: real_val
INTEGER :: int_val
END TYPE
Я перегружаю операторы и встроенные функции для работы с ним. Мне нужно перегрузить приведение REAL для работы с этим типом, чтобы при вызове он возвращал элемент real_val. Так фа так хорошо:
FUNCTION real_mytype (a) RESULT (x)
IMPLICIT NONE
TYPE(MyType), INTENT(IN) :: a
REAL(KIND=MY_REAL_KIND) :: x
# Take advantage of the overloaded (=) operator
x = a
END FUNCTION real_mytype
Но тогда мне нужно выполнить приведение с заданной точностью, скажем, как
INTEGER, PUBLIC, PARAMETER :: sp = SELECTED_REAL_KIND( 6, 37)
INTEGER, PUBLIC, PARAMETER :: dp = SELECTED_REAL_KIND(12,307)
TYPE(MyType) :: a
call external_function_that_I_cant_change(REAL(a, sp))
call second_external_function_that_I_cant_change(REAL(a, dp))
Я не знаю, как написать такой интерфейс, потому что тип возвращаемого значения (двойное вещественное число или одиночное вещественное число) будет зависеть от значения входного параметра INTEGER (sp или dp), а не от его типа, что является своего рода запрещено в Фортране. Следующее просто не имеет смысла:
FUNCTION real_mytype_1d (a, p) RESULT (x)
IMPLICIT NONE
TYPE(MyType), INTENT(IN) :: a
INTEGER :: p
REAL(KIND=something_that_depends_on_p) :: x
x = a
END FUNCTION real_mytype_1d
Я уже взглянул на функцию передачи, как предложено integer-or-as">здесь, но я не смог найти решение (тип возвращаемого значения val зависит от типа пресс-формы).
Любое предложение?
real(a,0._dp)
, который является идеей пресс-формы), но не значение. Внутренние процедуры могут вести себя совсем иначе, чем не внутренние. - person francescalus   schedule 02.04.2021real
является одним очевидным случаем, потому что: (невнутреннее) универсальное устранение неоднозначности не может быть получено через значение аргумента; значение фиктивного аргумента не может появляться в постоянном выражении; значение может использоваться для управления потоком, что приводит к различному полиморфному распределению результата функции, но такой результат функции подлежит многочисленным ограничениям при использовании. Просто на встроенные функции не распространяются те же правила, что и на нас (посмотрите, как мы реализуемtrim
в Forttan 77?). - person francescalus   schedule 02.04.2021