Тот же блок кода в SELECT TYPE в Фортране - PullRequest
0 голосов
/ 27 мая 2018

Мне интересно, есть ли элегантный способ избежать повторения блока кода, который применяется к различным типам в SELECT TYPE construct.Рассмотрим для примера:

select type (var)
   type is (t1_t)
     codeA (many lines of code)
   type is (t2_t)
     codeA (same lines)
   ...
   type is (tn_t)
     codeB
   class default
     codeC
end select

Ответы [ 3 ]

0 голосов
/ 27 мая 2018

Как отметил в комментариях francescalus, типичный способ повторить одни и те же строки кода - использовать включаемый файл.Это традиционная техника, которая широко использовалась для обычных блоков, а также для шаблонизации бедняков.

Включено.

select type (var)
   type is (t1_t)
     include "included.f90"
   type is (t2_t)
     include "included.f90"
   ...

end select

Если вы используете препроцессор C, вы также можете использовать #include препроцессора.

0 голосов
/ 27 мая 2018

Существует перегруженный операторный тип конструкции, который предлагает 'type is'.Это должно быть в модуле как подпрограмма или функция.Я в основном использую функции, так что если кто-то смешивает с C, тогда подпрограммы могут быть проще, чем функция, пытающаяся вернуть вектор.double, или целое число, но глубина ... так что нет явного «типа», так как правильная версия выбирается на основе типов аргумента.

0 голосов
/ 27 мая 2018

В отличие от конструкции select case, где вы можете сгруппировать несколько тестов в одном и том же случае, в конструкции select type такой возможности нет.

Причина в том, что внутри блока каждого типа-guard, селектор (соответствующая переменная или выражение) будет иметь тот же тип, который указан в операторе type-guard, и не будет там полиморфным.Вот как вы можете иметь динамическое разрешение типов в Fortran, которое статически типизировано.

select type (var)
  type is (t1_t)
    ! Here, type of var is t1_t, and you can call
    ! procedures that use type(t1_t) as arguments with var
  type is (t2_t)
    ! Here, type of var is t2_t, and procedures expecting
    ! type(t1_t) as arguments won't work with var
  ...
end select

Следовательно, компилятор не может позволить вам группировать много типов в одном типе-защитнике, потому что это незнать, какой динамический тип применить к селектору.

В качестве примечания, в отличие от выбора переключателя в языках, производных от c, конструкции select в Fortran не пропускают через , т. е. после совпаденияв Фортране выполняется соответствующий блок, и элемент управления выходит из конструкции.

Как сказал @cup, вы можете преобразовать все, что у вас общего, в различные ветви подпрограммы, чтобы избежать повторения.Но имейте в виду, что если вам нужно передать var в процедуру, вы должны объявить ее как полиморфную пустышку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...