数组值数组索引

时间:2011-01-17 15:59:54

标签: fortran

我偶然发现编译器让我使用整数数组作为其他数组的索引这一事实。例如:

  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

1 个答案:

答案 0 :(得分:3)

是的,是的。

Fortran 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