Ваш случай очень подходит для использования функции Fortran, представленной в стандарте 2003 года (и принятой намного позже компиляторами) с именем параметризованные производные типы .Прежде всего, вы должны проверить состояние соответствия вашего компилятора, чтобы узнать, поддерживается ли он полностью.
Эта функция позволяет передавать пользовательские параметры при объявлении или создании производного типа, поэтому внутренняя функциональность будет соответствующим образом скорректирована.,Они хороши для того, чтобы различные варианты поведения группировались в одно имя типа, возможно, со значительными различиями в кодировании или хранении.Существует 2 типа параметров:
kind
параметры ведут себя подобно спецификатору типа внутренних типов.Добрые параметры всех переменных должны быть известны во время компиляции и рассматриваться практически как постоянные значения.Удобство состоит в том, что вы можете легко изменить его (во времени кода), изменив только значение в объявлении или конструкции.Это обычно используется для специализации типа компонентов встроенного типа. len
параметры ведут себя подобно спецификатору len внутреннего типа символа.Вы можете определить параметры len во время компиляции или во время выполнения, и параметр len переменной не может измениться, пока вы не объявите его размещаемым.Более того, вы можете иметь аргументы с предполагаемыми len-параметрами в процедурах и избежать многословия кода.Это обычно используется в качестве параметра "длины" или "измерения" для производного типа, потому что вы можете использовать их в объявлении границ массива и длины символа.
В общем, используются параметры типаимитировать функциональность встроенных типов в производных типах, но вы также можете проявить «творческий подход» и использовать его для других целей, таких как пространство измерений типа матрицы преобразования;для пользовательского «типа объединения» (например, перечисление);как природа физической величины в типе данных «единицы измерения» (действительное значение, помеченное единичным «массой», напрямую не совместимо с «температурным», но с ними можно обращаться почти так же, как вкод);"arity" типа кортежа ...
module mod1
type :: mytype(n)
integer, len :: n
real :: x1
real, dimension(n) :: x2
end type mytype
contains
! your operations here...
end module mod1
И используйте его так:
program test_pdt
use mod1
implicit none
type(mytype(10)) :: mt10
type(mytype(1)) :: mt1
integer :: i
mt10%x1 = 40.0
mt10%x2 = [(0.5 * i, i = 1, 10)]
mt1 = mytype(1)(20.0, [30.0])
call sub(mt10)
call sub1(mt1)
contains
subroutine sub(m)
! accepts values with any "n" parameter
type(mytype(*)) :: m
! you can also use them in declarations
integer, dimension(m%n + 1) :: y
type(mytype(m%n)) :: w
print *, m%n, w%n, size(y)
end
subroutine sub1(m)
type(mytype(1)) :: m ! only accepts values with n=1
print *, m%x1, m%x2, m%n
end
end
Предупреждение: это особенность, несмотря на то, что было объявлено многонесколько лет назад был добавлен в большинство компиляторов совсем недавно, и вы должны знать, что в реализации все еще есть некоторые ошибки.Вероятно, с регулярным использованием у вас все будет в порядке, но в некоторых случаях я часто сталкиваюсь с ложными синтаксическими ошибками, а иногда даже с ICE.