Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fortran 90. ANSI Standard.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
861.18 Кб
Скачать

Указатели в производных типах данных

Указатели могут быть компонентами производных типов данных. Они могут занимать место распределяемых массивов с производными типами данных или действовать как указатели к другим объектам (включая другие производные типы данных).

Динамическая природа указателей массивов может предусматривать переменный объем памяти для производного типа данных:

TYPE data

REAL, POINTER :: a(:)

END TYPE data

TYPE( data ) :: event(3)

DO i=1,3

READ(5,*) n ! n меняется в цикле

ALLOCATE( event(i)%a(n) )

READ(5,*) event(i)%a

END DO

Число значений различно для каждого event - размер указателя массива зависит от введенного значения n. Когда данные более не требуются , указатель массива будет возвращен:

DO i=1,3

DEALLOCATE( event(i)%a )

END DO

 Я

Связанные списки

Указатели могут указывать на другие члены того же типа, в этом случае создаются 'cвязанные списки'. Например, рассмотрим следующий тип данных:

TYPE node

REAL :: item

TYPE( node ), POINTER :: next

END TYPE node

Производный тип node содержит единственный объект item (данное в списке) и указатель next к другому экземпляру типа node. Заметим, что рекурсивная техника в определении позволяет указателю ссылаться на свой собственный тип данных.

 

Связанные списки очень мощная программистская концепсия: ее динамический характер означает, что они могут расти или сжиматься как требуется. Требуется осторожность, чтобы гарантировать указателям установки и сохранение корректно - последний указатель в списке обычно нулевой.

 

 

ris

 Я

Параметры - указатели

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

  • Как и другие переменные, фактические и формальные параметры должны иметь одинаковые тип и ранг. Формальные параметры - указатели не могут иметь атрибут INTENT, поскольку не ясно, будет ли вид вызван к указателю сам или связан с адресатом.

  • Параметры-указатели для внешних процедур требуют наличия блока INTERFACE.

Когда и фактический и формальный параметры являются указателями, адресат (если он один) и связанный статус рассматривается в вызове и снова при возврате. Важно обеспечить, чтобы адресат оставался верным, когда происходит возвращение из процедуры (то есть адресат не локальная переменная процедуры), в противном случае указатель является левым "висячим" ('dangling').

Когда фактический параметр является указателем и соответствующий формальный параметр таковым не является, указатель разыменовывается и адресат копируется как формальный параметр. При возврате адресат берет значение формального параметра. Поэтому требуется, чтобы фактический параметр был связан с адресатом, когда вызывается процедура.

Например:

PROGRAM prog

INTERFACE ! нужно для внешних subroutine

SUBROUTINE suba( a )

REAL, POINTER :: a(:)

END SUBROUTINE suba

END INTERFACE

REAL, POINTER :: pt(:)

REAL, TARGET :: data(100)

...

pt => data

CALL suba( pt )

CALL subb( pt )

...

CONTAINS

SUBROUTINE subb( b ) ! internal

REAL, DIMENSION(:) :: b ! допустим образ из 100

...

END SUBROUTINE subb

END PROGRAM prog

SUBROUTINE suba( a ) ! внешняя subroutine

REAL, POINTER :: a(:) ! указывает на данные

...

END SUBROUTINE suba

Возможно для фактических параметров, не указателей, быть связанными с формальными параметрами - указателями.

Я

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]