2011-01-17 9 views
3

Ich bin gerade auf die Tatsache gestoßen, dass der Compiler mir Integer-Arrays als Indizes für andere Arrays zur Verfügung stellt. Zum Beispiel:array-value Array-Indizes

implicit none 

    real*8 :: a(3), b(2) 
    integer :: idx(2) 

    a=1.d0 
    idx=(/1,2/) 

    b = a(idx) 
    print*,shape(b) 
    print*,b 
    print* 

    end 

Angesichts der Tatsache, dass dies scheint sowohl mit gfortan und einem PGI Compiler zu arbeiten, ich frage mich, ob dies eine Sprache-Funktion, anstatt etwas Compiler lässt mich gerade aus mit. Ich würde mich freuen, wenn jemand, der besser informiert ist als ich, kommentieren kann, wenn das wirklich eine Sprachfunktion ist.

Und wenn es ist, als ich es schätzen würde, wenn jemand die genauen Sprachregeln formulieren würde, wie solche Konstruktionen sind in mehrdimensionalen Fall interpretiert, wie hier:

implicit none 
    real*8 :: aa(3,3), bb(2,2) 
    integer :: idx(2) 

    do i=1,3 ; do j=1,3 
    aa(i,j) = 1.d0*(i+j) 
    enddo; enddo 

    bb=aa(idx,idx) 
    print*,shape(bb) 
    print*,bb 

    end 

Antwort

3

Ja, es ist.

Der endgültige Entwurf des Fortran 2008-Standard, ISO/IEC JTC 1/SC 22/WG 5/N1830, sagt ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1830.pdf auf Seite 84

4.8 Bau von Feldwerten

...

6 Wenn ein ac-Wert ein Array-Ausdruck ist, geben die Werte der Elemente des Ausdrucks in Array-Array-Reihenfolge (6.5.3.2) die entsprechende Sequenz von Elementen des Array-Konstruktors an.

Beispiel

real, dimension(20) :: b 
... 

k = (/3, 1, 4/) 
b(k) = 0.0  ! section b(k) is a rank-one array with shape (3) and 
       ! size 3. (0.0 is assigned to b(1), b(3), and b(4).) 

Die Regeln können Sie direkt aus dem Code

implicit none 
    real*8 :: aa(3,3), bb(2,2) 
    integer :: idx(2),i,j,k 
    idx=(/3, 2/) 
    k=0 
    do i=1,3 ; do j=1,3 
    k=k+1 
    aa(i,j) = aa(i,j)+1.d0*k 
    enddo; enddo 
    write(*,*),shape(aa) 
    write(*,'(3G24.6,2X)') aa 
    bb=aa(idx,idx) 
    print*,shape(bb) 
    write(*,'(2G24.6,2X)'),bb 
    end 

Ausgabe sehen:

 3   3 
     1.00000     4.00000     7.00000  
     2.00000     5.00000     8.00000  
     3.00000     6.00000     9.00000  
     2   2 
     9.00000     6.00000  
     8.00000     5.00000 
Verwandte Themen