2011-11-11 185 views
11

我正在嘗試讀取一些Fortran代碼,但無法確定%(百分比符號)的功能。「%」在Fortran中的含義是什麼?

正是在這樣一行:

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

它有什麼作用?

回答

23

在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 
+0

抱歉,但如何才能回答描述某物過另一種語言,如果有人不熟悉什麼與C++或點運營商? –

+0

它只是一種訪問模塊內部變量的方法。所以就像在這個例子中,你可以直接修改「object1」中的一個單獨變量,而不必使用整個構造函數_i.e._,而不需要使用所有需要的變量('water1 = pipe(4.5,44.8,1200, 「動盪」)')。 – Garini

1

%作爲一個令牌有許多密切相關的用途。隨着Fortran的發展,這些用途的數量有所增加。

回到Fortran 90,並且在問題中看到的用法%用於訪問派生類型的組件。考慮派生類型a_t與該類型的對象a

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

組分rhoasigma可以與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(它本身是b的組件)是分配的目標。在一個參考文獻中可以看到相當可怕的% s,但零件參考文獻總是從左到右分解。

來到2003的Fortran,一個然後看見%與派生類型在幾個其他方式:

  • 引用對象的結合;
  • 查詢參數化類型的參數。

考慮派生類型

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

參數的an可以如

print *, a%n, SIZE(a%x) 

多被引用作爲組分x可以被引用。

最後,從2008年的Fortran,%可用於訪問複雜對象的實部和虛部:

complex x, y(3) 
x%im = 1. 
x%re = 0. 
y = (2., 1.) 
print *, y(2)%im+y(3)%re