2010-10-26 13 views
5

qual è la differenza tra questi due codicidifferenza tra POINTER e ALLOCATABLE

type Foo 
    real, allocatable :: bar(:) 
end type 

e

type Foo 
    real, pointer :: bar(:) 
end type 

in particolare quando si tratta di codice seguente:

type(Foo) :: myfoo 
allocate(myfoo%bar(10)) 

risposta

9

faccio non vedere alcuna differenza principale in quello scenario.

In generale, ALLOCATABLE arrays are more efficient. Ma in FORTRAN 90/95 gli array POINTER erano più flessibili. Ad esempio, non è possibile utilizzare gli array ALLOCATABLE come componenti dei tipi derivati. Fortran 2003 ha risolto il problema. Quindi usa gli array ALLOCATABLE quando puoi.

EDIT

Voglio solo citare significativa differenza nel comportamento del programma sul tentativo di allocare entità già stanziati. Se l'entità è ALLOCATABLE avrai un errore di runtime. Il programma

PROGRAM main 

    IMPLICIT NONE 

    TYPE :: foo 
    REAL, DIMENSION(:), ALLOCATABLE :: bar 
    END TYPE foo 

    TYPE(foo) :: my_foo 

    ALLOCATE (my_foo%bar(10)) 
    ALLOCATE (my_foo%bar(10)) 

END PROGRAM main 

compilato con risultati gfortran in tale messaggio di errore:

Fortran runtime error: Attempting to allocate already allocated variable 'my_foo' 

Al contrario si può fare queste cose con i puntatori.

+0

Vale la pena menzionare che chiamare l'istruzione 'allocate' su un puntatore associato potrebbe causare una perdita di memoria (se nessun altro puntatore punta al target originale). –