2011-01-17 27 views
3

私は、コンパイラが整数配列を他の配列のインデックスとして使用できるようにしたという事実に直面しました。例えば:この言語機能ではなく、何かのコンパイラはちょうどで私を繰り出す場合配列値の配列インデックス

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 

が、これはgfortanとPGIコンパイラの両方で動作するように見えるという事実を考えると、私は思ったんだけど。これが本当に言語機能であれば、私より知識のある人がコメントできるのは分かります。

そして、それは誰かがここでのように、多次元の場合にどのように解釈されるか、そのような構造の正確な言語規則を綴るならば、私は感謝よりも、ある場合:

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 

答えて

3

はい、そうです。

ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1830.pdfは、84ページ

4.8配列が

値の構築に言うのFortran 2008標準の最終案、ISO/IEC JTC 1/SC 22/WG 5/N1830は、...

6 ac-valueが配列式の場合、式の要素の値は配列要素の次数(6.5.3.2)で配列コンストラクタの要素の対応するシーケンスを指定します。

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).) 

ルールあなたのコードから直接見ることができます

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 

出力:

 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 
関連する問題