Неявное нет, неявное преобразование - PullRequest
1 голос
/ 09 января 2020

Как преобразовать следующий код, который использует implicit none

module kinds
    use iso_fortran_env, only : real64, int32 
    implicit none 
    integer, parameter :: wp = real64, iwp = int32 
end module kinds

для использования implicit. Я пытался,

module kinds
    use iso_fortran_env, only : real64, int32 
    implicit integer (w, i)
    parameter :: wp = real64, iwp = int32 
end module kinds 

, но это не работает.

Моя проблема в том, как объявить параметр с помощью оператора implicit в Fortran90.

1 Ответ

4 голосов
/ 09 января 2020

Общий комментарий: Использование implicit none облегчает отладку! Просто Неявное нет и продолжайте!


Из-за неявного определения, которое вы определяете, это правильно, вы смешиваете операторы объявления типа с операторы параметров . Я упоминаю об этом, потому что вы используете токен :: в своем параметре.

оператор объявления типа:

R801 declaration-type-spec [ [ , attr-spec ] ... :: ] entity-decl-list

источник: стандарт F2018 раздел 8.2

Вы можете объявить свой тип с возможными атрибутами, такими как PARAMETER и токен ::, который является необязательным, только когда атрибуты не определены.

PARAMETER -статум:

Оператор PARAMETER указывает PARAMETER атрибут (8.5.13) и значения для именованных констант в списке.

R851 параметр-stmt равен PARAMETER ( named-constant-def-list ) R852 named-constant-def равен named-constant = constant-expr

источник: стандартная секция F2018 8.6.11

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

Теперь существует два возможных опции для написания модуля:

через объявление типа:

module kinds
    use iso_fortran_env, only : real64, int32 
    implicit integer (w, i)
    integer, parameter :: wp = real64, iwp = int32 
end module kinds 

но тогда зачем вам использовать здесь неявное объявление, вы все равно должны заявить, что оно integer. Так что implicit none будет просто замечательно, или просто неявное утверждение и просто ничего не напишет.

через PARAMETER -статум:

module kinds
    use iso_fortran_env, only : real64, int32 
    implicit integer (w, i)
    parameter (wp = real64, iwp = int32)
end module kinds 
...