2010-04-01 2 views
12

В Фортране существует ли способ определить тип переменной?Определение типа переменной в Fortran

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

+2

Какой винтаж fortran? 77? 9й? 200x? –

ответ

8

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

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) версию завернутые в преобразования типов.

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

+1

Это слишком сложно. Исходный вопрос не требует наследования или дополнительных функций. – 2013-10-09 03:42:05

3

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

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

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

+3

Существует пример кода «select type» с полиморфным типом по адресу http://software.intel.com/en-us/forums/showthread.php?t=73454 –

Смежные вопросы