Я пытаюсь прочитать некоторый код Fortran, но не могу определить, что делает %
(знак процента).
Он находится в строке, подобной:
x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))
Что он делает?
Я пытаюсь прочитать некоторый код Fortran, но не могу определить, что делает %
(знак процента).
Он находится в строке, подобной:
x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))
Что он делает?
В Fortran 90 они позволяют создавать такие структуры, как на С++. Он в основном действует как оператор точки (.).
Из http://www.lahey.com/lookat90.htm:
Структуры (производные типы)
Вы можете группировать свои данные с использованием производных типов. Это позволяет пользователям объединять внутренние типы (включая массивы и указатели) в новые типы, к которым можно получить доступ к отдельным компонентам, используя знак процента в качестве разделителя. (Производные типы известны как записи в VAX Fortran.) ! Пример использования производных типов и модулей.
module pipedef
type pipe ! Define new type 'pipe', which
real diameter ! is made up of two reals, an
real flowrate ! integer, and a character.
integer length
character(len=10) :: flowtype
end type pipe
end module pipedef
program main
use pipedef ! Associate module pipedef with main.
type(pipe) water1, gas1 ! Declare two variables of type 'pipe'.
water1 = pipe(4.5,44.8,1200,"turbulent") ! Assign value to water1.
gas1%diameter = 14.9 ! Assign value to parts
gas1%flowrate = 91.284 ! of gas1.
gas1%length = 2550
gas1%flowtype = 'laminar'
.
.
.
end program
Это идентификатор части для производного типа. Проверь это. http://www.lahey.com/lookat90.htm
%
, поскольку токен имеет ряд тесно связанных целей. По мере развития Fortran эти виды использования увеличились в расчете.
Возвращаясь к Fortran 90, и использование, рассматриваемое в вопросе, %
используется для доступа к компонентам производного типа. Рассмотрим производный тип a_t
с объектом a
этого типа:
type a_t
real rho, sigma
end type
type(a_t) a
К элементам rho
и sigma
of a
можно получить доступ с помощью a%rho
и a%sigma
. Как можно видеть в вопросе, эти компоненты могут использоваться в выражениях (например, a%rho * g
), или они могут быть левой частью назначения (a%rho=1.
).
Компонент производного типа сам по себе может быть объектом производного типа:
type b_t
type(a_t) a
end type
type(b_t) b
и поэтому может быть несколько проявлений %
в одной ссылке:
b%a%rho = ...
Здесь компонент rho
объекта производного типа a
, который сам является компонентом b
, является целью назначения. В одной ссылке можно увидеть довольно ужасающее количество %
, но ссылки на части всегда разрешаются слева направо.
Приступая к Fortran 2003, вы затем видите %
, относящуюся к производным типам несколькими способами:
Рассмотрим производный тип
type a_t(n)
integer, len :: n=1
real x(n)
contains
procedure f
end type
type(a_t(2)) a
Объект a
имеет параметр одиночного типа длины и процедуру привязки типа. В выражении типа
x = a%f()
связывается f
объекта производного типа.
Параметр n
of a
может быть указан как
print *, a%n, SIZE(a%x)
так как можно ссылаться на компонент x
.
Наконец, из Fortran 2008 %
может использоваться для доступа к реальной и мнимой части сложного объекта:
complex x, y(3)
x%im = 1.
x%re = 0.
y = (2., 1.)
print *, y(2)%im+y(3)%re