Что означает /% в Фортране? - PullRequest
       13

Что означает /% в Фортране?

16 голосов
/ 12 ноября 2011

Я пытаюсь прочитать некоторый код на Фортране, но не могу определить, что делает % (знак процента).

Это в строке вроде:

   x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))

Чтоэто делает?

Ответы [ 3 ]

29 голосов
/ 12 ноября 2011

В Fortran 90 они позволяют создавать структуры, как в C ++.В основном он действует как оператор точки (.).

С 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
3 голосов
/ 12 ноября 2011

Это идентификатор детали для производного типа. Проверь это. http://www.lahey.com/lookat90.htm

2 голосов
/ 30 декабря 2017

% в качестве токена имеет ряд тесно связанных применений. По мере развития Фортрана количество таких применений возросло.

Возвращаясь к Фортрану 90 и использовавшемуся в вопросе использованию, % используется для доступа к компонентам производного типа. Рассмотрим производный тип a_t с объектом a этого типа:

type a_t
  real rho, sigma
end type
type(a_t) a

Компоненты rho и sigma из 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 из 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
...