
- •Алфавит, лексемы, ключевые слова языка Фортран. Метки. Комментарии.
- •Структура программы. Внешние подпрограммы. Внутренние подпрограммы. Модули.
- •Переменные. Переменная – это величина, которая может в программе принимать различные значения.
- •Условный оператор if... Then...End if.
- •12.Неявное определение типа.
- •13. Синтаксис определения производных типов
- •14. Атрибут parameter. Именованные константы и константные выражения
- •15. Атрибуты dimension и allocatable. Описание массивов.
- •16. Атрибут intent. Описание формальных параметров.
- •17. Определенные и неопределенные переменные. Выражения с массивами и присваивание массивов.
- •24,Внешние подпрограммы.
- •30.Оператор use
- •31.Основные сведения о массивах
- •32.Массивы. Динамические массивы.
- •33.Операторы allocate, deallocate.
- •34.Форматирование ввода-вывода. Оператор format.
- •35.Соединение файла с логическим устройством
- •Алфавит, лексемы, ключевые слова языка Фортран. Метки. Комментарии.
- •15. Атрибуты dimension и allocatable. Описание массивов.
- •18. Скалярные числовые выражения и скалярное числовое присваивание.
- •27. Модули. Области общей памяти.
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
Порядок вычисления элементов в массивных выражениях и присваиваниях
стандартом Фортрана не оговаривается