2011-01-17 10 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

네, 그렇습니다.

포트란 2008 표준, ISO/IEC JTC의 최종 초안은 1/SC 22/WG 5/N1830, ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1830.pdf 페이지에 말한다 (84) 배열의

4.8 건설

을 ... 값

6 ac- 값이 배열 식인 경우 식의 요소 값은 배열 요소 순서 (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