
- •Управление векторами и матрицами
- •Компиляция и выполнение Компиляция
- •Связывание (редактирование связей )
- •Выполнение
- •Примеры
- •Соглашения о записи кода
- •Арифметические выражения
- •Операции отношения
- •Логические выражения
- •Сравнение символов
- •Переносимость результата
- •Спецификация массивов
- •Сечения массива Индивидуальные элементы
- •Сечения
- •Векторные указатели
- •Память для массива Физическая память:
- •Присваивание массива Присваивание всего массива
- •Присваивание секции (вырезки) массива
- •Повторная нумерация
- •Основные встроенные процедуры
- •Массивы нулевого размера
- •Массивы и производные типы
- •Инициализация массивов Конструкторы
- •Оператор data
- •Встроенные функции для массива
- •Пример упрощения
- •Пример исследования (запроса)
- •Пример конструирования
- •Пример локализации
- •Я Операторы управления
- •Вложения
- •Порядок операторов
- •Синтаксис программы Main
- •Формат представления программы
- •Программные единицы
- •Уровни доступа
- •Дополнения
- •Спецификация входных-выходных параметров
- •Использование модуля
- •Родовые подпрограммы
- •Интерактивный ввод-вывод
- •Простой Input и Output
- •Форматирование по умолчанию
- •Форматированный ввод-вывод I/o
- •Дескрипторы редактора
- •Вещественные - форма с фиксированной точкой
- •Вещественные - экспотенциальная форма
- •Символьные
- •Логические
- •Заполнение пробелами (пропуск символьных позиций)
- •Специальные символы
- •Списки ввода-вывода
- •Производные типы данных
- •Неявный цикл do
- •Ввод-вывод без продвижения
- •Файловый ввод-вывод
- •Номера устройств
- •Операторы read и write
- •Оператор write
- •Оператор open
- •Оператор close
- •Оператор inquirе
- •Динамический массив
- •Распределяемые массивы
- •Спецификация
- •Выделение и возвращение памяти
- •Статус распределяемых массивов
- •Потоки памяти (куча)
- •Что есть указатели?
- •Указатели и адресаты
- •Спецификации указателя Общая форма для операторов определения указателя и адресата такая:
- •Присваивание указателя
- •Разыменование (Dereferencing)
- •Статус (состояние) связи указателя
- •Динамическая память
- •Общие ошибки
- •Указатели в производных типах данных
- •Связанные списки
- •Параметры - указатели
- •Функции для указателей
Указатели в производных типах данных
Указатели могут быть компонентами производных типов данных. Они могут занимать место распределяемых массивов с производными типами данных или действовать как указатели к другим объектам (включая другие производные типы данных).
Динамическая природа указателей массивов может предусматривать переменный объем памяти для производного типа данных:
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
Возможно для фактических параметров, не указателей, быть связанными с формальными параметрами - указателями.
Я