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

Да, это так.

Окончательный проект стандарта 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 
Смежные вопросы