массивные индексы массивов - PullRequest
3 голосов
/ 17 января 2011

Я только что наткнулся на тот факт, что компилятор позволяет мне использовать целочисленные массивы в качестве индексов для других массивов.Например:

  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 Ответ

3 голосов
/ 20 января 2011

Да, это так.

Окончательный вариант стандарта Fortran 2008, ISO / IEC JTC 1 / SC 22 / WG 5 / N1830, ftp: //ftp.nag.co.uk / sc22wg5 / N1801-N1850 / N1830.является выражением массива, значения элементов выражения в порядке элементов массива (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...