2010-10-26 7 views
5

, was der Unterschied zwischen diesen beiden Codes istUnterschied zwischen POINTER und ALLOCATABLE

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

und

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

insbesondere, wenn es um den folgenden Code kommt:

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

Antwort

9

ich tun sehe keinen prinzipiellen Unterschied in diesem Szenario.

Im Allgemeinen ALLOCATABLE arrays are more efficient. Aber in Fortran 90/95 waren POINTER-Arrays flexibler. Zum Beispiel war es nicht möglich, ALLOCATABLE-Arrays als Komponenten abgeleiteter Typen zu verwenden. Fortran 2003 behob dieses Problem. Verwenden Sie daher ALLOCATABLE-Arrays, wenn Sie können.

EDIT

wollen einfach signifikanten Unterschied im Verhalten des Programms auf dem Versuch, erwähnen, bereits zugeteilten Einheit zuzuordnen. Wenn die Entität ALLOCATABLE ist, erhalten Sie einen Laufzeitfehler. Das Programm

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 

mit gfortran Ergebnisse in einer solchen Fehlermeldung zusammengestellt:

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

Im Gegensatz kann man solche Dinge mit Pointern tun.

+0

Nur erwähnenswert, dass das Aufrufen der Anweisung 'allocate' auf einem zugeordneten Zeiger wahrscheinlich zu einem Speicherverlust führen kann (wenn kein anderer Zeiger auf das ursprüngliche Ziel verweist). –