Определение типа переменной в Фортране

В Фортране, там способ определить тип переменной?

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

15
задан nbro 6 September 2017 в 19:41
поделиться

2 ответа

Да, есть два пути.

Первый способ требует, чтобы вы написали отдельные функции или подпрограммы для каждого типа переменной, но вам не нужно вызывать разные функции. Это может быть или не быть достаточно близким к тому, что вы хотите. Вы пишете отдельные подпрограммы, а затем пишете интерфейс для создания общей функции или подпрограммы, обертывающей эти конкретные подпрограммы. Вам не нужно передавать тип переменной или делать что-то особенное в вашем вызове - все это делается через объявление и автоматически компилятором из самой переменной, если переменные достаточно разные, чтобы компилятор мог различить их (есть правила о том, что требуется). Это похоже на то, как работают встроенные функции - вы можете вызвать sin с реальным аргументом, вещественным аргументом с двойной точностью или сложным аргументом, и компилятор вызывает правильную фактическую функцию и возвращает соответствующий результат. High Performance Mark обрисовал в общих чертах решение в этом направлении. Что касается другого вопроса, я опубликовал рабочий пример, где отличительной чертой переменных был ранг массива: как написать оболочку для 'allocate' . Преимущество этого метода в том, что он широко поддерживается компиляторами Fortran.

В Fortran 2003/2008 есть обширные объектно-ориентированные функции. Цитата из «Fortran 95/2003, объясненного» Меткалфом, Ридом и Коэном: «Для выполнения альтернативного кода в зависимости от динамического типа полиморфной сущности и для получения доступа к динамическим частям предоставляется конструкция select type ."Оператор select type немного похож на оператор select case . Это поддерживается меньшим количеством компиляторов. Опять же, вам не нужно передавать тип, поскольку компилятор может вычислите его из самой переменной. Но это должен быть полиморфный тип ... Как Intel ifort, так и gfortran list выбирают тип и поддерживаемые полиморфные типы данных - последний с некоторыми экспериментальными аспектами в gfortran ( http: // gcc.gnu.org/wiki/Fortran2003). Это недавние дополнения к этим компиляторам.

4
ответ дан 1 December 2019 в 04:46
поделиться

Что ж, вы могли бы делать то, что хотите, если возитесь с внутренними функциями KIND и POINTER, но если вас интересует только сигнатура функций и подпрограммы, оставьте это Фортрану. Если вы определяете

function calc8(arg1)
    real(8), intent(in) :: arg1
    ...

и

function calc4(arg1)
    real(4), intent(in) :: arg1
    ...

в модуле и объявляете интерфейс, подобный этому

interface calc
    module procedure calc8
    module procedure calc4
end interface

(Предупреждение, я не проверял подробно синтаксис, это ваша ответственность).

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

Если код функции идентичен, за исключением типа аргументов, я иногда пишу функцию для реального (8) (или чего-то еще) и пишу версию для реального (4), которая вызывает реальную (8) версию в оболочке в преобразованиях типов.

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

8
ответ дан 1 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: