Fortran中的“%”是什么意思/作用?

25
我试图阅读一些Fortran代码,但是无法确定百分号符号%的作用。
它在类似于以下行中出现:
   x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))

它是做什么用的?

3个回答

38
在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
抱歉,但是怎样的答案才能描述另一种语言的东西呢?如果有人不熟悉C++或点运算符,该怎么办? - Herman Toothrot
这只是一种访问模块内部变量的简单方法。因此,就像在示例中一样,您可以直接修改“对象”gas1中的一个变量,而无需使用整个构造函数,即不使用所有所需的变量(water1 = pipe(4.5,44.8,1200,"turbulent"))。 - Garini

6
作为一个标记,% 有许多密切相关的用途。随着Fortran的发展,这些用途的数量也不断增加。
回溯到Fortran 90,并考虑在问题中看到的用法,% 用于访问派生类型的组件。考虑具有该类型对象a的派生类型a_t
type a_t
  real rho, sigma
end type
type(a_t) a

组件rhosigma可以通过a%rhoa%sigma访问。如问题所示,这些组件可以用于表达式(例如a%rho * g)或者作为赋值的左侧(a%rho=1.)。
派生类型的组件本身可能是一个派生类型的对象:
type b_t
  type(a_t) a
end type
type(b_t) b

因此,在单个引用中可能会出现多个%

b%a%rho = ...

在这里,派生类型对象a的分量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有一个长度类型参数和一个类型限定过程。在像以下这样的表达式中,该类型限定过程将应用于对象a:

a%foo(x)

x = a%f()

引用派生类型对象的绑定 f

参数 a 的参数 n 可以被引用为

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

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接