Дата публикации: Feb 05, 2013 8:13:27 PM
Указатели - это особый тип данных, хранящий системно-зависимую информацию о расположении в памяти другх объектов данных, а также процедур. Современный Фортран поддерживает указатели, но в своем стиле и в русле своей философии. Без указателей трудно себе представить динамические данные, а также сложные структуры данных вроде деревьев, списков и т.п. Без указателей на код сложно реализовать алгоритмы, для которых процедура является естественным параметром: примерами являются решатели обыкновенных дифференциальных уравнений (параметр - правая часть уравнения - функция от времени и решения) или квадратурные формулы (параметр - подынтегральная функция).
Указатель в Фортране - это объект данных с атрибутом POINTER. Он имеет тип, понимаемый как тип цели, а также может иметь атрибут DIMENSION, который - внимание - трактуется как атрибут цели, а не указателя. Так что массив указателей непосредственно объявить нельзя. При этом важен только ранг (число измерений) массива, а конфигурация - протяженности измерений - и границы измерений не указываются и могут быть любыми. Тип может быть указан как полиморфный, и тогда он может быть любым потомком данного типа или даже просто любым.
Указатель может быть связан с объектом подходящего типа и ранга, и притом имеющим атрибут TARGET. Когда связь установлена, имя указателя является синонимом имени объекта. В частности, присваивание является присваиванием объекту, а не указателю: если P связан с A, то P = B означает то же, что и A =B, при этом A меняется, а B - нет, причем в дальнейшем действия с A и P не влияют на B. Для присваивания указателю предусмотрен оператор =>
Слева указатель, а справа - подходящий объект-цель или указатель. В первом случае указатель связывается с целью, а во втором - связывается с целью правой части. Так, в примере выше P=>B означает, что теперь P связан с B: любые действия над ним не меняют A. Разорвать связь можно с помощью процедуры NULLIFY или присваиванием функции NULL()
Следует отметить, что указатель описывает расположение объекта в памяти - полностью. Так, целью может быть секция массива, не обязательно сплошная. Матрица хранится по столбцам, но указатель может быть связан со строкой: P => A(1,:); или даже с элементами строки в нечетных позициях: P => A(1,::2)
Указатели на процедуры описываются с помощью оператора PROCEDURE - при этом может указываться интерфейс, то есть число, типы и т.п. аргументов, тип функции и т.п.
Помимо связи с готовыми объектами данных, указатели могут служить для создания анонимных динамических объектов данных. Это размещаемые массивы. Скаляры тоже могут размещаться. Оператор ALLOCATE создает объект и связывает его с данным указателем, при этом указываются границы всех измерений. DEALLOCATE уничтожает объект. Для упрощения массив изначально можно объявить как размещаемый - с атрибутом ALLOCATABLE - если возможности указателей излишни (не меняется цель и т.п.) Размещаемый массив размещается в нужном месте, используется как обычный массив и уничтожается, когда необходимость в нем отпала. Размещаемые массивы являются единственным выходом из положения, когда размеры массива, пусть и постоянные, заданы переменными. Например, импортированными из модуля. Компилятор не позволит задать размеры формально неконстантными выражениями.
Для работы с размещаемыми массивами и указателями предусмотрено несколько функций: ALLOCATED проверяет, размещен ли массив, а ASSOCIATED - связан ли указатель (с данной целью или вообще); NULL() возвращает пустой указатель.
С указателями связаны еще две темы. Это процедуры-формальные параметры процедур - по сути, этот аппарат реализован на базе указателей. И связанные с типом процедуры - методы в терминологии ООП. Их можно реализовать через процедурные указатели, но в Фортране есть полная поддержка ООП, поэтому необходимость такая отсутствует.
Итак, аппарат указателей в Фортране присутствует, но необходимоть в них возникает не так часто. Сложные структуры данных, выбор одного массива из нескольких для дальнейшей работы и т.п. Для связи с языком C, в котором указатели играют более важную роль, предусмотрены средства работы с ними в стиле C.