2013-10-23 17 views
5

Ich brauche in einem Programm einige zuweisbare Arrays Subroutinen übergeben, und ich muss wissen, ob die Art, wie ich es tun, sind im Standard oder nicht.Fortran, zuweisbare Arrays zu einer Unterroutine mit richtigen Grenzen

Wenn Sie wissen, wo ich nach dem Standard von Fortran suchen kann, sagen Sie mir bitte.

Hier ist ein kleiner Code, der besser als Worte erklären

program test 

use modt99 

implicit none 

real(pr), dimension(:), allocatable :: vx 

allocate(vx(-1:6)) 
vx=(/666,214,558,332,-521,-999,120,55/) 
call test3(vx,vx,vx) 
deallocate(vx) 

end program test 

mit dem Modul modt99

module modt99 

contains 
subroutine test3(v1,v2,v3) 
    real(pr), dimension(:), intent(in) :: v1 
    real(pr), dimension(0:), intent(in) :: v2 
    real(pr), dimension(:), allocatable, intent(in) :: v3 

    print*,'================================' 
    print*,v1(1:3) 
    print*,'================================' 
    print*,v2(1:3) 
    print*,'================================' 
    print*,v3(1:3) 
    print*,'================================' 

end subroutine test3 


end module modt99 

auf dem Bildschirm, ich

================================ 
    666.000000000000  214.000000000000  558.000000000000  
================================ 
    214.000000000000  558.000000000000  332.000000000000  
================================ 
    558.000000000000  332.000000000000  -521.000000000000  
================================ 

So sind die drei Möglichkeiten, von Dummy-Argumenten in Subroutine test3 legal (in welcher Version von Fortran, 90, 95, 2003?) und sind ihr Verhalten normal?

Antwort

5

Die erste Version übergibt den Array-Slice an das Unterprogramm. Beachten Sie, dass die Grenzinformationen nicht auf diese Weise weitergegeben werden. Es wird angenommen, dass Arrays bei 1 beginnen und zu size(array) gehen.

Der zweite Weg ist genau wie die erste, aber sie manuell an die untere Grenze zu 0, deshalb v3(1:3) Drucken Sie die Werte mit einem von 1 Offset gibt.

Der dritte Weg übergibt alle Array Informationen an die Unterroutine (einschließlich Grenzen), daher die "richtige" Indizierung. Die Übergabe von allocatable Arrays wurde mit Fortran 2003 eingeführt.

Abgesehen von der Tatsache, dass Sie ein Alias-Problem haben (die gleiche Variable an drei verschiedene Dummy-Argumente übergeben), sind alle drei Versionen legal.

Sie finden alle Dokumente der Normen here.

Vor allem nehmen, einen Blick auf die Fortran 2003 Standard, Ch. 5.1.2.5 DIMENSION attribute die Unterschiede zu sehen zwischen Form angenommen und aufgeschobene Form Arrays in Dummy-Argumente.

+0

Vielen Dank für Ihre Antwort, es wird mir sehr helfen. In dem Link, den du gibst, scheint es auch in F95 in Ordnung zu sein oder nicht? – user2910558

+0

* Alle * Standarddokumente sind dort angegeben, beginnend mit * Fortran für IBM 704 * (1957!). –