Присвоение массива rank1 в фортране - PullRequest
1 голос
/ 22 марта 2011

Всякий раз, когда я компилирую следующий код на Фортране:

program test
    implicit none
    integer     :: temp(1),i
    integer     :: z(1:10) = [(i,i=1,10)]

    temp(1) = 10
    z(2)    = temp

end program test

Я получаю ошибку: ошибка # 6366: формы выражений массива не соответствуют Если я изменю строку:

z(2)    = temp

до

z(2)    = temp(1)

Он компилируется и работает нормально. Почему вы не можете назначить один элемент массива элементу другого массива без явного перечисления элемента. Я спрашиваю об этом, потому что некоторые встроенные функции, такие как minloc и pack, возвращают значения ранга 1. Так, например: z (i) = minloc (z) выдает ту же ошибку.

1 Ответ

9 голосов
/ 22 марта 2011

Почему нельзя присвоить массив из одного элемента элементу другого массива без явного перечисления элемента.

Согласно стандарту Фортрана ранги массивов должны быть совместимы приназначение.Вы можете найти определение совместимости в этом документе.Например, в стандарте Fortran 2003, раздел 7.4.1.2 Оператор внутреннего присваивания

(2) Любая переменная должна быть размещаемым массивом того же ранга, что и выражение, или формамипеременная и выражение должны соответствовать

, а секция 2.4.5 Массив дает нам определения:

Массив может иметь до семи измерений, илюбой экстент (количество элементов) в любом измерении.Ранг массива - это число измерений;его размер - это общее количество элементов, равное произведению экстентов.Массив может иметь нулевой размер.Форма массива определяется его рангом и его экстентом в каждом измерении и может быть представлена ​​в виде массива ранга 1, элементами которого являются экстенты.
[...]
Два массива согласуются, если ониимеют одинаковую форму.

Теперь взгляните на свой код.z (2) является скалярным.Его ранг равен 0. Его форма - массив нулевого размера.temp это массив с рангом 1 и формой [1].Формы разные.Эти две сущности несовместимы.

Но вы можете сделать их, если хотите.Вы можете использовать секции массива:

z(2:2)    = temp

Теперь форма обеих сущностей - [1].

...