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

17. Определенные и неопределенные переменные. Выражения с массивами и присваивание массивов.

Переменная, тип и атрибуты которой заданы операторами описания и операторами назначения атрибутов, существует, но не имеет никакого конкретного значения, т. е. не

определена. Результат обращения к такой переменной непредсказуем, так как

использовать несуществующее значение нельзя. Рассмотрим простой при-

мер обращения к переменной, находящейся в состоянии неопределенности

PROGRAM var_undef

INTEGER, PARAMETER :: A = 1

REAL С

PRINT *, ' A = ‘,A, ' С =' , С

END PROGRAM var_undef

Переменная с не получила никакого значения, но программа пытается ис-

пользовать ее. Скорее всего, эта программа оттранслируется и успешно про-

работает, напечатав строку:

А - 1 С = О,

так как большинство компиляторов инициализируют неинициализирован-

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

компилятор в таком случае было бы большой ошибкой.

Обычный способ сделать переменную определенной — назначить ей кон-

кретное значение с помощью оператора присваивания:

REAL С

С = 0.25

Теперь переменная с имеет значение, и ее можно использовать, не опасаясь

непредсказуемого результата.

Составной объект находится в состоянии определенности тогда, когда опре-

делены все его подобъекты в отдельности Массив, например, только тогда

считается определенным, когда определены все его элементы; переменная

производного типа определена только тогда, когда определены все ее ком-

поненты, а текстовая переменная — когда определены все составляющие ее

символы.

Состояние определенности ссылки связано с ее прикрепленностью к адре-

сату. Ссылка, никогда не прикреплявшаяся ни к какому адресату, находится

в состоянии неопределенности (это исходное состояние указателя). Ссылка,

прикрепленная к адресату, находится в состоянии связанности (прикреплен-

ности). Ссылка, освобожденная от связи с адресатом, откреплена. В двух

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

функцией associated .Но даже если ссылка прикреплена к адре-

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

Состояние переменных в процессе исполнения программы может менять-

ся, — основной причиной этого является освобождение памяти при возврате

управления, что происходит при выходе из подпрограмм. Если хотя бы один

элемент массива становится неопределенным, в состоянии неопределенно-

сти оказывается весь массив.

Выражения с массивами и присваивание массивов

Операндами выражений числового типа и операций присваивания могут

быть не только скалярные объекты, но массивы и массивоподобные объек-

ты Выражение -а для массива а означает применение операции унарного

отрицания ко всем его элементам Выражение: S = А + В,

где все операнды являются массивами одной и той же формы, правомочно и

означает присваивание элементам массива s суммы элементов массивов айв

с теми же индексами. Так же определено скалярное присваивание для масcивов

А = х

Это выражение, в котором а — массив, ах— скаляр числового типа, озна-

чает присваивание всем элементам массива а значения х. В выражении

а + х скаляр х будет расширен до массива той же формы, что и массив а,

все элементы которого равны х

Массивы одинаковой формы называются совместимыми. Для совместимых

массивов определены все арифметические операции и логические операции

отношения Результатом арифметических операций с массивами является

массив, конформный исходным, элементы которого получены применением

соответствующей операции к элементам массивов-операндов. Результатом

логических операций отношения является массив логического типа, элементы

которого принимают значения . true . или . false . в зависимости от резуль-

тата применения данной операции к паре элементов массивов-операндов

с одинаковыми индексами. Так, например, если а и в — двумерные массивы

формы (20, 20), т. е. определены строкой: INTEGER A(20, 20), В(20, 20),

то результатом суммирования а + в будет массив формы (20, 20), элемент

которого с индексом (i, j) равен сумме а(i, j) + B(i, j).

Результатом сравнения a .eq. в будет логический массив формы (20, 20),

элемент которого с индексом (i, j) имеет значения .true., если выраже-

ние A(i, j) .EQ. B(i, j) — ИСТИННО, И . FALSE., еСЛИ ОНО ЛОЖНО.

Отметим, что произведением массивов а * в является массив покомпонент-

ных произведений, а не произведение векторов или матриц в алгебраиче-

ском смысле.

При наличии сдвига в индексах массивов-операндов учитывается не бук-

вальное значение индекса, а положение индекса в экстенте, т. е. массивы а

и в при одинаковой форме могут иметь несовпадающие границы:

INTEGER A(-5:14, 11:30), В(2:21, -20:-1)

В этом случае при вычислении бинарного выражения в качестве операндов

участвуют элементы а(-5, 11) и в(2, -20), а(-4,11) и в(3, -20) и т. д.

Операндами выражений с массивами могут быть сечения массивов и век-

торные индексы:

REAL А(20, 20), V(5)

INTEGER, DIMENSION(5) :: IND=(/2, 4, 7, 9, 19/)

Выражение a(i, 12:16) + v определяет одномерный массив из 5-ти эле-

ментов, равных:

A(I, 11+J) + V(J)

Выражение v/a(ind) даст в результате массив той же формы, что и массив v

с элементами v(1) /а(2), v(2) / а(4),v(з) / а(7), v(4) / а(9) и V(5) / А(19).

Результат выражения-массива может быть присвоен массиву соответствую-

щей формы:

V = V / A(IND)

ИЛИ

А(I, 12:16) = V + А(I, 11:15)

Примеры выражений с массивами и массивных присваиваний приведены в примере

Примеры выражений с массивами и массивных присваиваний

PROGRAM arpress

IMPLICIT NONE

INTEGER, PARAMETER :: size_x = 5, size_y = 10

REAL, DIMENSION(size_x, size_y) :: X, Y, Z

INTEGER, DIMENSION(size_x, size_y) :: STAT

INTEGER, DIMENSION(size_x * size_y) :: ISTAT

INTEGER, DIMENSION(SQRT(size_x * size_y)) :: IND

LOGICAL, DIMENSION(size_x, size_y) :: LOT

INTEGER I, J

REAL s, t, r

DO I = 1, SIZE(IND)

IND(I) =1+2*I

END DO

s = 1.1; t = 3.2; r = 2.7

X = s; Y = t;

CALL RANDOM_NUMBER(Z)

Z = (Z + X) * (Z - Y)

LOT = (Z > r)

DO I = 1, size_x

DO J = 1, size_y

IF(LOT(I, J)) THEN

STAT(I, J) = 1

ELSE

STAT(I, J) = -1

END IF

END DO

END DO

ISTAT = RESHAPE(STAT, size_x * size_y))

WRITE(*, *) ISTAT(IND)

END PROGRAM arpress

Порядок вычисления элементов в массивных выражениях и присваиваниях

стандартом Фортрана не оговаривается

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