Использование Iso_Fortran_Env для установки значения Kind функции

Как можно было бы использовать встроенное в ISO Fortran Env значение функции KIND, возвращаемое функцией способом, который идиоматичен для Fortran 2008?

Обычно в основной программе я могу просто использовать встроенные функции ISO Fortran следующим образом:

program name here
    use iso_fortran_env
    implicit none
    integer, parameter :: double=REAL64
    real(kind=double) :: some_variable
end program name here

Но, похоже, нет удобного способа использовать эти встроенные функции для внешних функций, поскольку REAL64 и double будут определены только в основной функции, описанной выше. Попытка определить KIND функции в main следующим образом:

program name here
    use iso_fortran_env
    implicit none
    integer, parameter :: double=REAL64
    real(kind=double) :: some_function
    ! Do stuff
end program name here
real function some_function()
    ! Do stuff
end some_function

По крайней мере, в моей системе выдает ошибку несоответствия типов (double определяется как KIND=8, а значение по умолчанию определяется как KIND=4 в моей системе). Я всегда мог просто использовать real(kind=8) function some_function(), но я бы предпочел не в интересах мобильности. Кроме того, просто грязно использовать REAL64 из iso_fortran_env в одном месте, только чтобы развернуться и использовать KIND = 8 в другом месте.

Есть ли простой (или, по крайней мере, читабельный) способ сделать это, например, ниже?

real(kind=REAL64) function some_function()

3 ответа

Решение

Вы начинаете свой вопрос, предлагая решение на и что решения работают хорошо. Как указывает IanH, в стандартной формулировке есть некоторая двусмысленность, но я прочитал ее как высказывание, что это разрешено, и компиляторы принимают этот синтаксис:

fundef.f90:

real(kind=REAL64) function some_function()
  use iso_fortran_env
  some_function = 1._real64
end

компиляции:

> gfortran -c funkind.f90 
> 

Вы можете использовать вид, определенный в модуле, который используется внутри функции. Протестировано также с Intel Fortran и Oracle Studio.

В современном Фортране все функции должны быть определены в любом случае в модуле, но если вы хотите получить вид из модуля, используемого только внутри функции, то возможность здесь.

Расширяем ответ @chw21:

У вас всегда есть возможность объявить тип результата функции в части спецификации функции и получить доступ к параметрам из модулей с помощью ассоциации хоста внутри нее.

Редактировать: "Как указано @Vladimir F, вы также можете получить доступ к переменным по ассоциации хоста из модуля, объявленного внутри тела функции".

Фактически, это единственный способ применить атрибуты к результату функции, такие как указатель, выделение, измерение и т. Д.

Кроме того, вы также можете объявить новое имя для результата функции через result суффикс.

pure function some_other_function_with_a_long_name() result(out)
    use, intrinsic :: iso_fortran_env, only: rk => real64
    implicit none
    real(rk), dimension(5) :: out
    out = 1.0_rk
    ! (...)
end

Я обычно пробую это перед публикацией, но я думаю, что это должно работать:

function some_function()
    use iso_fortran_env, only: real64
    implicit none
    real(kind=real64) :: some_function
    some_function = 1.0_real64
end function some_function

Или внутри модуля

module some_module
    use iso_fortran_env, only: real64
    implicit none
contains
    real(kind=real64) function some_function()
        some_function=1.0_real64
    end function some_function
end module some_module
Другие вопросы по тегам