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

32.Массивы. Динамические массивы.

Динамические массивы

Размер массива не всегда известен заранее; для того, чтобы определить его, нужно, например, считать некоторые данные или произвести вычисления

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

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

REAL, ALLOCATABLE, DIMENSION(:,:) :: X Экстенты динамического массива при описании не указываются, так как

они к этому времени неизвестны; указывается только ранг массива.

Выделение памяти и определение фактических границ массива производится оператором allocate:

ALLOCATE(X (N, N))

где n — переменная целого типа с определенным положительным значением. Выделенная память автоматически не освобождается, ее необходимо освобождать оператором deallocate:

DEALLOCATE(X) Того же результата можно добиться, используя ссылку на массив — память под ссылки также может быть выделена динамически:

REAL, POINTER, DIMENSION(:, :, :) :: Y

ALLOCATE(Y(2:10, 3:K, -2:K - 1), STAT = IER)

33.Операторы allocate, deallocate.

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

ALLOCATE(список_вьщеляемых_объектов [,STAT = состояние]), где список_выделяемых_объектов — это разделенный запятыми перечень имен массивов или ссылок с указанием границ в виде:

имя_объекта[([нижняя_граница:]верхняя_граница)]

В качестве нижней и верхней границ может использоваться скалярное выражение целого типа. По умолчанию значение нижняя_граница равно 1.

В момент выделения памяти границы выделяемых объектов неопределенны и не могут использоваться в составе выражений. Нельзя, например, в рамках одного оператора использовать результат встроенной функции size:

ALLOCATE(Y(N, N, N) , X(SIZE(Y))

[неверно: границы массива Y еще не определены!

Но совершенно правильно использование ссылки на границы массива, выделенного предыдущим оператором:

ALLOCATE(Y(N, N, N))

ALLOCATE(X{SIZE(Y))

Необязательный ключевой параметр stat содержит информацию о результате выполнения операции выделения памяти. Параметр stat должен быть переменной целого типа, не входящей в состав выделяемых объектов. Если выделение прошло успешно, переменная состояние принимает значение 0; если выделить память не удалось, то эта переменная принимает положительное значение.

В принципе, при наличии ссылок, выделяемые массивы и не были бы нужны; но ссылки, кроме способности занимать память динамически, обладают рядом свойств, которые нельзя не учитывать. Оператор allocate выделяет

ссылке нового адресата даже в том случае, когда она прикреплена к другому адресату. Если предыдущий адресат был создан также оператором allocate

и не имеет других прикрепленных к нему ссылок, он становится недоступен — так может возникнуть утечка памяти.

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

DEALLOCATE(список_вьщеленных_объектов[,STAT = состояние]) подобен оператору allocate, кроме того, что в списке выделенных объектов не нужно указывать границ. Необязательный ключевой параметр stat содержит информацию о результате выполнения операции освобождения памяти. Параметр stat должен быть переменной целого типа, не входящей в состав список_выделенных_объектов. Если освобождение памяти прошло успешно, переменная состояние принимает значение 0; если освободить память не удалось, то эта переменная принимает положительное значение

При отсутствии параметра stat неудача при освобождении памяти приводит к прекращению исполнения программы.

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