next up previous contents
След.: Упражнения Выше: Массивы Пред.: Упражнения   Содержание


Размещаемые массивы

Концепция размещаемых массивов -- это упрощенная и более удобная форма динамических массивов. Массив (возможно, комассивный), объявленный с атрибутом ALLOCATABLE, не существует вплоть до того момента, как будет размещен в программе оператором ALLOCATE. При объявлении указывается только число измерений (и коизмерений), реальные границы указываются при размещении. По истечении потребности память следует освободить оператором DEALLOCATE. Примеры:

REAL, DIMENSION(:,:), CODIMENSION[:], ALLOCATABLE:: M

REAL, DIMENSION(:), CODIMENSION[:], ALLOCATABLE:: B, X

...

ALLOCATE(M(3,3)[*], B(3)[*], X(4)[*])

!На каждом образе теперь имеется матрица A и два вектора B и X, причем они - комассивы, то есть к ним есть доступ с других образов.

Эти массивы неотличимы от обычных для пользователя. Поскольку это комассивы, образы могут обращаться не только к своим экземплярам, но и к чужим с помощью коиндексов в квадратных скобках. Когда массивы больше не будут нужны, память следует освободить: DEALLOCATE(B,X,M). Разумеется, не обязательно освобождать массивы в том же порядке.

Общий вид оператора:

ALLOCATE(список объектов[, список спецификаторов]),

где объект списка -- размещаемые скаляры или массивы (возможно, комассивы) или указатели, объекты разделяются запятыми, каждый объект снабжается границами в круглых скобках (если он массив) и/или кограницами в квадратных скобках (если комассив; верхняя граница последнего коизмерения всегда звездочка *). Спецификаторы (через запятую) имеют вид имя=значение; возможны следующие имена: ERRMSG, STAT, SOURCE и MOLD. Первый задает строковую переменную, в которую заносится (зависящее от системы) описание ошибки, если она произошла (в противном случае значение переменной не меняется). Второй указывает целочисленную переменную, которой присваивается положительный (зависящий от системы) код ошибки (и ноль при успехе). Константы ошибок описаны во встроенном модуле ISO_FORTRAN_ENV. В частности, один из кодов описывает ситуацию попытки размещения объекта тогда, когда один или более образов завершают выполнение. Третий спецификатор задает выражение, которое должно быть согласовано со всеми размещаемыми объектами (иметь ту же конфигурацию или быть скаляром) -- это выражение инициализирует размещенные объекты. Последний спецификатор позволяет указать только границы размещаемого массива (они такие же, как у указанного спецификатором объекта) и тип в случае полиморфного объекта.

Оператор DEALLOCATE может иметь спецификаторы ERRMSG и STAT (один или оба). Освобождать можно только ранее размещенные объекты.

При размещении комассивов следует соблюдать равенство границ, кограниц и длины типа на всех образах. Имеет место неявная синхронизация всех образов в связи с вызовом ALLOCATE применительно к одному или более комассивам. Образы не начинают выполнять более поздние операторы, пока все образы не завершат оператор размещения ALLOCATE (на той же строке исходного кода). Аналогично и при выполнении DEALLOCATE, все образы откладывают освобождение памяти, пока все не будут готовы выполнить эту операцию. Без этих правил было бы возможно обращение к данным другого образа, которые еще не размещены или уже удалены. Когда образ выполняет оператор размещения ALLOCATE, коммуникация не требуется, за исключением, возможно, синхронизации. Образ размещает комассив и запоминает, как адресовать соответствующие копии на других адресах. От компилятора не требуется проверять соответствие границ и кограниц на всех образах, но он может это делать в отладочном режиме. Также компилятор не отвечает за обнаружение и разрешение тупиковых ситуаций.

Если комассив объявлен без атрибута SAVE в процедуре или конструкции BLOCK и массив все еще размещен к моменту окончания работы процедуры или конструкции, происходит неявное освобождение комассива и, следовательно, имеет место синхронизация всех образов.

Fortran-2003 допускает рассогласование конфигураций и параметров длины у частей встроенного присваивания размещаемому массиву; при этом имеет место соответствующее переразмещение. Такое рассогласование не допускается для размещаемого комассива, так как в этом случае потребовалась бы синхронизация.



Подсекции

Ilya A. Chernov 2012-12-19
X