Неявная инициализация массива циклов do - PullRequest
11 голосов
/ 01 ноября 2010

Я хочу инициализировать массив в одну строку с неявным циклом do .Тем не менее, я всегда получаю синтаксис или ошибку формы.Может ли кто-нибудь помочь мне исправить следующую конструкцию?

integer myarray :: (maxdim, nr)

myarray(1:maxdim,nr) = (/ (/i,i=1,maxdim/),nr /)

Ответы [ 2 ]

19 голосов
/ 01 ноября 2010

Вы инициализируете массив с MAXDIM строками и NR столбцами, и похоже, что каждый столбец содержит целые числа от 1 до MAXDIM.

В качестве первого шага, напишите фактический DO -loop:

do j=1,NR
    do i=1,MAXDIM
        myarray(i,j) = i
    end do
end do

Свернуть внутренний цикл в структуру неявного цикла:

do j = 1,NR
    myarray(1:MAXDIM,j) = (/ (i, i=1,MAXDIM) /)
end do

Когда мы пытаемся свернуть внешний цикл, происходит нечто странное:

myarray = (/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /)

Теперь я получаю ошибку несовместимых рангов, как и вы. Так как я не очень хорош в неявных циклах do, я посмотрел на shape внутренние результаты для конструктора массива:

print *, shape(myarray)
print *, shape((/ ((/ (i, i=1,MAXDIM) /), j=1,NR) /))

Это распечатывает

   5      10
  50

Конструктор массива просто расширяет одномерный массив, сглаживая любые конструкции вложенных массивов. На самом деле мы можем отбросить второй набор (/ /) для упрощения. Так как все уже в правильном порядке, мы можем использовать встроенную reshape для обеспечения правильного ранга. Моя полная тестовая программа тогда:

program sotest
    implicit none

    integer, parameter :: MAXDIM = 5
    integer, parameter :: NR     = 10

    integer :: i
    integer :: j
    integer :: myarray(MAXDIM, NR)
    integer :: myarray_implicit(MAXDIM, NR)

    do j = 1,NR
        do i = 1,MAXDIM
            myarray(i,j) = i
        end do
    end do 

    myarray_implicit = reshape((/ ((i,i=1,MAXDIM), j=1,NR) /), (/ MAXDIM, NR /))

    print *, all(myarray == myarray_implicit)
 end program sotest
6 голосов
/ 01 ноября 2010

Неявный цикл do создаст только вектор, поэтому вам придется изменить его. Примерно так:

integer, dimension(m,n) :: myarray
integer :: ix, jx
...
myarray = reshape( [ (ix, ix = 1, m*n) ], [ m, n ] )

или, возможно, вам нужен более сложный, вложенный, подразумеваемый цикл:

myarray = reshape( [ ((ix+jx, ix = 1, m), jx = 1, n) ], [ m, n ] )

Обратите внимание, что я использую соглашение Fortran2003 [ ] для разграничения конструкций массива, а не (/ /). Также обратите внимание, что вы должны объявить подразумеваемые переменные индекса цикла do.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...