2011-11-11 8 views
11

Sto cercando di leggere un codice Fortran, ma non posso determinare cosa fa il % (segno percentuale).Cosa significa "%" in Fortran?

E 'in una linea come:

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

Che cosa fa?

risposta

23

In Fortran 90 consentono di creare strutture come in C++. Funziona fondamentalmente come l'operatore punto (.).

Da http://www.lahey.com/lookat90.htm:

Structures (tipi derivati)

È possibile raggruppare i dati utilizzando tipi derivati. Ciò consente agli utenti di combinare tipi intrinseci (inclusi array e puntatori) in nuovi tipi ai quali è possibile accedere ai singoli componenti utilizzando il segno di percentuale come delimitatore. (I tipi derivati ​​sono noti come record in VAX Fortran.) ! Esempio utilizzando tipi e moduli derivati.

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

dispiace ma come può una risposta descrivere qualcosa fuori un'altra lingua, che cosa succede se qualcuno non è familiare con operatori C++ o punto? –

+0

È semplicemente un modo per accedere a una variabile che è interna a un modulo. Quindi, come nell'esempio, è possibile modificare direttamente una singola variabile dall'oggetto "gas1" senza dover utilizzare l'intero costruttore _i.e._ senza utilizzare tutte le variabili necessarie ('water1 = pipe (4.5,44.8,1200, "turbolenta") '). – Garini

1

% come un token ha un certo numero di utilizzi strettamente correlati. Come ha dimostrato Fortran, questi usi sono aumentati di numero.

Tornando a Fortran 90 e l'utilizzo visto nella domanda, % viene utilizzato per accedere ai componenti di un tipo derivato. Considerare il tipo derivato a_t con oggetto a di questo tipo:

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

I componenti rho e sigma di a si accede mediante a%rho e a%sigma. Come si può vedere nella domanda, questi componenti possono essere utilizzati nelle espressioni (come a%rho * g) o possono essere il lato sinistro di un incarico (a%rho=1.).

Un componente di un tipo derivato può essere esso stesso un oggetto di tipo derivato:

type b_t 
    type(a_t) a 
end type 
type(b_t) b 

e quindi possono esserci diverse partite di % in un singolo riferimento:

b%a%rho = ... 

Qui, la componente rho dell'oggetto derivato a, che è esso stesso un componente di b, è l'obiettivo dell'assegnazione. Si può vedere un conteggio abbastanza orribile di % s in un riferimento, ma i riferimenti alle parti sono sempre risolti da sinistra a destra.

Venendo a Fortran 2003 si vede quindi % relative ai tipi di derivati ​​in un paio di altri modi:

  • riferimento ad un legame di un oggetto;
  • interrogazione dei parametri di un tipo parametrizzato.

consideri il tipo derivato

type a_t(n) 
    integer, len :: n=1 
    real x(n) 
contains 
    procedure f 
end type 
type(a_t(2)) a 

L'oggetto a ha un unico parametro di lunghezza-type e una procedura di bound. In un'espressione come

x = a%f() 

il legame f dell'oggetto tipo derivato viene fatto riferimento.

Il parametro n di a potrebbe essere fatto riferimento come

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

quanto il componente x può fare riferimento.

Infine, dal Fortran 2008 % possono essere utilizzati per accedere alle parti reale e immaginaria di un oggetto complesso:

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