Основы языка Fortran
Fortran — это язык программирования общего назначения, предназначенный для математических вычислений, например, в машиностроении. Фортран-это аббревиатура для перевода формул, и первоначально она была написана с заглавной буквы как FORTRAN. Однако, следуя нынешней тенденции использовать только заглавную букву в аббревиатурах, все называют его Fortran.
Фортран был первым в истории языком программирования высокого уровня. Работа над Fortran началась в 1950 — х годах в IBM, и с тех пор было много версий. По соглашению, версия Fortran обозначается двумя последними цифрами года, когда был предложен стандарт. Таким образом, мы имеем:
- Fortnan 66
- Fortnan77
- Fortnan90 (95)
Наиболее распространенной версией Фортран сегодня по-прежнему является Fortran 77, хотя Fortran 90 набирает все большую популярность. Fortran 95-это пересмотренная версия Fortran 90. Существует также несколько версий Fortran, предназначенных для параллельных компьютеров. Наиболее важным из них является высокопроизводительный Fortran (HPF), который является стандартом де-факто.
Пользователи должны знать, что большинство компиляторов Fortran 77 допускают надмножество Fortran 77, то есть допускают нестандартные расширения. В этом уроке мы подчеркнем стандарт ANSI Fortran 77.
Зачем изучать Фортран?
Fortran является популярным языком программирования, используемым в инженерных приложениях. Поэтому выпускникам инженерных специальностей важно уметь читать и изменять фортранский код. Время от времени так называемые эксперты предсказывают, что Фортран быстро угаснет в популярности и вскоре исчезнет. Эти предсказания всегда проваливались. Фортран-самый прочный язык программирования в истории. О
дна из главных причин, по которой Fortran выжил и выживет — это программная инерция. После того, как компания потратила много человеко-лет и, возможно, миллионы долларов на программный продукт, она вряд ли попытается перевести программное обеспечение на другой язык. Надежный перевод программного обеспечения — очень сложная задача.
Основным преимуществом Fortran является то, что он стандартизирован ANSI и ISO (см. сноски). Следовательно, если ваша программа написана на ANSI Fortran 77, не используя ничего, выходящего за рамки стандарта, то она будет работать на любом компьютере, имеющем компилятор Fortran 77. Таким образом, программы Fortran переносимы на разные платформы машин. (Если вы хотите ознакомиться с некоторыми документами по стандартам Fortran, нажмите здесь.)
Основы Fortran 77
Программа Fortran — это просто последовательность строк текста. Текст должен следовать определенной структуре, чтобы быть действительной программой Fortran. Начнем с простого примера:
program circle
real r, area
с Эта программа считывает действительное число r
с печатает площадь окружности с радиусом r.write (*,*) ‘Give radius r:’
read (*,*) r
area = 3.14159*r*r
write (*,*) ‘Area = ‘, areastop
end
Строки, начинающиеся с буквы «с», являются комментариями и не имеют иной цели, кроме как сделать программу более читаемой для людей. Первоначально все программы на Фортране должны были быть написаны заглавными буквами. Большинство людей теперь пишут строчными буквами, так как это более разборчиво, и мы тоже. Вы можете смешать регистр, но Fortran не чувствителен к регистру, поэтому «X» и «x»-это одна и та же переменная.
Организация программы
Программа Fortran обычно состоит из основной программы (или драйвера) и, возможно, нескольких подпрограмм (процедур или подпрограмм). Пока мы поместим все утверждения в основную программу; подпрограммы будут рассмотрены позже. Структура основной программы такова:
- название программы
- декларации
- заявления
- остановка
- конец
В этом учебнике слова, выделенные курсивом, следует воспринимать не как буквальный текст, а скорее как описание того, что находится на их месте.
Оператор stop необязателен и может показаться излишним, поскольку программа все равно остановится, когда достигнет конца, но рекомендуется всегда завершать программу с помощью оператора stop, чтобы подчеркнуть, что поток выполнения останавливается на этом. Обратите внимание, что у вас не может быть переменной с тем же именем, что и у программы.
Правила расположения столбцов
Fortran 77 не является языком свободного формата, но имеет очень строгий набор правил форматирования исходного кода. Наиболее важными правилами являются правила расположения столбцов:
- Колонна 1 : Пусто, или буква «с» или » * » для комментариев
- Колонна 1-5 : Этикетка заявления (необязательно)
- Колонна 6 : Продолжение предыдущей строки (необязательно)
- Колонна 7-72 : Заявления
- Колонна 73-80: Порядковый номер (необязательный, редко используемый сегодня)
Большинство строк в программе Fortran 77 начинается с 6 пробелов и заканчивается перед столбцом 72, то есть используется только поле оператора.
Комментарии
Строка, начинающаяся с буквы «с» или звездочки в первом столбце, является комментарием. Комментарии могут появляться в любом месте программы. Хорошо написанные комментарии имеют решающее значение для удобочитаемости программы. Коммерческие коды Fortran часто содержат около 50% комментариев.
Вы также можете столкнуться с программами Fortran, которые используют восклицательный знак (!) для комментариев. Это не стандартная часть Fortran 77, но поддерживается несколькими компиляторами Fortran 77 и явно разрешена в Fortran 90. При понимании восклицательный знак может появиться в любом месте строки (кроме позиций 2-6).
Продолжение
Иногда оператор не помещается в 66 доступных столбцов одной строки. Затем можно разбить оператор на две или более строк и использовать метку продолжения в позиции 6. Пример:
c23456789 (Это демонстрирует положение столбца!)
c Следующее утверждение идет по двум физическим линиям
площадь = 3,14159265358979
+ * r * r
Любой символ может быть использован вместо знака плюс в качестве символа продолжения. Хорошим стилем программирования считается использование знака плюс, амперсанда или цифр (2 для второй строки, 3 для третьей и т. Д.).
Исходный код, объектный код, компиляция и связывание
Программа Fortran состоит из простого текста, который следует определенным правилам (синтаксису). Это называется исходным кодом. Вам нужно использовать редактор для написания (редактирования) исходного кода. Наиболее распространенными редакторами в Unix являются emacs и vi, но они могут быть немного сложными для начинающих пользователей. Возможно, вы захотите использовать более простой редактор, например xedit, который работает под управлением X-windows.
Когда вы написали программу Fortran, вы должны сохранить ее в файле с расширением .f или .for. Прежде чем вы сможете выполнить программу, вы должны перевести ее в машиночитаемую форму. Это делается с помощью специальной программы, называемой компилятором. Компиляторы Fortran 77 обычно называются f77.
Выход из компиляции по умолчанию имеет несколько загадочное имя a.out, но при желании вы можете выбрать другое имя. Чтобы запустить программу, просто введите имя исполняемого файла, например a.out. (Это объяснение несколько упрощено.На самом деле компилятор переводит исходный код в объектный код, а компоновщик/загрузчик превращает его в исполняемый файл.)
Примеры:
В каталоге классов есть небольшая программа Fortran под названием circle.f. Вы можете скомпилировать и запустить его, выполнив следующие действия:
cp /usr/class/me390/circle*.f .
f77 circle.f
a.out
(Обратите внимание, что там есть несколько точек (точек), которые легко пропустить!) Если вам нужно иметь несколько исполняемых файлов одновременно, рекомендуется дать им описательные имена. Это можно сделать с помощью опции-o.
Например, f77 circle.f -o circle.out скомпилирует файл circle.f и сохранит исполняемый файл в файле circle.out. Обратите внимание, что объектные коды и исполняемые файлы занимают много места на диске, поэтому вы должны удалить их, когда вы их не используете. (Команда remove в Unix-это rm.)
В предыдущих примерах мы не проводили различия между компиляцией и связыванием. Это два разных процесса, но компилятор Fortran выполняет их оба, поэтому пользователю обычно не нужно знать об этом. Но в следующем примере мы будем использовать два файла исходного кода.
f77 circle.f -o circle.out
Это приведет к созданию трех файлов, двух файлов объектного кода circle1.o и circle2.o, а также исполняемого файла a.out. Что действительно произошло здесь, так это то, что компилятор Fortran сначала скомпилировал каждый из файлов исходного кода в объектные файлы (заканчивающиеся на .o), а затем связал два объектных файла вместе в исполняемый файл a.out. Вы можете разделить эти два шага, используя опцию-c, чтобы указать компилятору компилировать только исходные файлы:
f77 -c circle1.f circle2.f
f77 circle.f -o circle.out
Компиляция отдельных файлов, подобных этому, может быть полезна, если существует много файлов и только некоторые из них должны быть перекомпилированы. В Unix есть полезная команда make, которая обычно используется для обработки больших пакетов программного обеспечения с большим количеством исходных файлов. Эти пакеты поставляются с файлом makefile, и все, что нужно сделать пользователю, — это ввести make. Написание makefiles немного сложно, поэтому мы не будем обсуждать это в этом уроке.
Переменные, типы и объявления
Имена переменных
Имена переменных в Фортран должны быть из 1-6 символов(допустимые буквы a-z и цифры 0-9).Кроме того, первый символ должен быть буквой. Fortran 77 не различает верхний и нижний регистр, фактически, он предполагает, что все входные данные являются верхним регистром. Однако почти все компиляторы Фортран 77 принимают нижний регистр. Если вы когда-нибудь столкнетесь с компилятором Fortran 77, который настаивает на верхнем регистре, обычно легко преобразовать исходный код во все верхние регистры.
Слова, составляющие язык Фортран, называются зарезервированными словами и не могут использоваться в качестве имен переменных. Некоторые из зарезервированных слов, которые мы видели до сих пор, — это «program», «real», «stop» и «end».
Типы и объявления
Каждая переменная должна быть определена в объявлении. Это устанавливает тип переменной. Наиболее распространенными декларациями являются:
- целочисленный список переменных(integer)
- реальный список переменных(real)
- список переменных с двойной точностью(doubleprecision)
- сложный список переменных( complex)
- логический список переменных (logical)
- список символов переменных (character)
Список переменных должен состоять из имен переменных, разделенных запятыми. Каждая переменная должна быть объявлена ровно один раз. Если переменная не объявлена, Fortran 77 использует набор неявных правил для установления типа. Это означает, что все переменные, начинающиеся с букв i-n, являются целыми числами, а все остальные-вещественными.
Многие старые программы Fortran 77 используют эти неявные правила, но вы не должны! Вероятность ошибок в вашей программе резко возрастает, если вы не будете последовательно объявлять свои переменные.
Целые числа и переменные с плавающей запятой
Фортран 77 имеет только один тип для целочисленных переменных. Целые числа обычно хранятся в виде 32-битных (4 байта) переменных. Поэтому все целочисленные переменные должны принимать значения в диапазоне [-m, m], где m приблизительно равно 2*10^9.
Fortran 77 имеет два различных типа переменных с плавающей запятой, называемых вещественной и двойной точностью. Хотя реальное часто является адекватным, некоторые численные вычисления требуют очень высокой точности, и следует использовать двойную точность.
Обычно real — это 4-байтовая переменная, а двойная точность-8 байт, но это зависит от машины. Некоторые нестандартные версии Fortran используют синтаксис real*8 для обозначения 8-байтовых переменных с плавающей запятой.
Оператор параметра
Некоторые константы появляются в программе много раз. Поэтому часто желательно определить их только один раз, в начале программы. Для этого и существует оператор parameter. Это также делает программы более удобочитаемыми. Например, программа circlearea должна была быть написана примерно так:
program circle
real r, area, pi
parameter (pi = 3.14159)
c Эта программа считывает действительное число r и печатает
c площадь окружности с радиусом r.write (*,*) ‘Give radius r:’
read (*,*) r
area = pi*r*r
write (*,*) ‘Area = ‘, areastop
end
Синтаксис оператора parameter таков
параметр (name = constant, … , name = constant)
Правила для оператора parameter следующие:
- Имя, определенное в операторе parameter, является не переменной, а константой. (Вы не можете изменить его значение на более позднем этапе программы.)
- Имя может появиться не более чем в одном операторе параметра.
- Оператор(ы) параметра должен стоять перед первым исполняемым оператором.
Вот некоторые веские причины для использования оператора parameter:
- Это помогает уменьшить количество опечаток.
- Это облегчает изменение константы, которая появляется много раз в программе.
- Это повышает читабельность вашей программы.
Выражения и присвоение
Константы
Простейшей формой выражения является константа. Существует 6 типов констант, соответствующих 6 типам данных. Вот некоторые целочисленные константы:
1
0
-100
32767
+15
Тогда у нас есть реальные константы:
1.0
-0.25
2.0E6
3.333 Е-1
Обозначение Е означает, что вы должны умножить константу на 10, возведенную в степень, следующую за буквой «Е». Следовательно, 2.0E6-это два миллиона, а 3.333 E-1-примерно одна треть.
Для констант, которые больше наибольшего допустимого реального значения или требуют высокой точности, следует использовать двойную точность. Обозначение такое же, как и для вещественных констант, за исключением того, что «Е» заменено на «D». Примеры:
2.0 D-1
1D99
Здесь 2.0 D-1-это двойная точность одна пятая, в то время как 1D99-это единица, за которой следуют 99 нулей. Следующий тип — комплексные константы. Это обозначается парой констант (целочисленных или вещественных), разделенных запятой и заключенных в круглые скобки. Примеры таковы:
(2, -3)
(1., 9.9 E-1)
Первое число обозначает действительную часть, а второе-мнимую. Пятый тип — логические константы. Они могут иметь только одно из двух значений:
— ВЕРНО.
— ЛОЖЬ.
Обратите внимание, что точки, заключающие буквы, обязательны. Последний тип — символьные константы. Они чаще всего используются в виде массива символов, называемого строкой. Они состоят из произвольной последовательности символов, заключенных в апострофы (одинарные кавычки):
«Азбука»
-Все идет!
— Сегодня хороший день.
Строки и символьные константы чувствительны к регистру. Проблема возникает, если вы хотите иметь апостроф в самой строке. В этом случае вам следует удвоить апостроф:
— Сегодня хороший день.
Выражения
Простейшие непостоянные выражения имеют вид operandoperatoroperand и пример:
x + y
Результат выражения сам по себе является операндом, поэтому мы можем вложить выражения вместе, например:
x + 2 * y
В связи с этим возникает вопрос о приоритете: означает ли последнее выражение x + (2*y) или (x+2)*y? Приоритет арифметических операторов в Фортран 77 (от самого высокого до самого низкого):
- ** {возведение в степень}
- *,/ {умножение, деление}
- +,- {сложение, вычитание}
Все эти операторы вычисляются слева направо, за исключением оператора возведения в степень **, который имеет приоритет справа налево. Если вы хотите изменить порядок оценки по умолчанию, вы можете использовать круглые скобки.
Все вышеперечисленные операторы являются бинарными операторами.существует также унарный оператор — для отрицания, который имеет приоритет над другими. Следовательно, выражение типа-x+y означает то, что вы ожидаете.
Необходимо соблюдать крайнюю осторожность при использовании оператора деления, который имеет совершенно другое значение для целых и вещественных чисел. Если оба операнда являются целыми числами, выполняется целочисленное деление, в противном случае выполняется действительное арифметическое деление. Например, 3/2 равно 1, а 3./2. равно 1,5 (обратите внимание на десятичные точки).
Назначение
Задание имеет вид:
variable_name = выражение
Интерпретация заключается в следующем: Вычислите правую часть и назначьте полученное значение переменной слева. Выражение справа может содержать другие переменные, но они никогда не изменяют значения! Например, площадь = pi * r**2 не изменяет значения pi или r, только площадь.
Преобразование типов
Когда в одном и том же выражении встречаются разные типы данных, преобразование типов должно происходить явно или неявно. Fortran будет выполнять некоторое преобразование типов неявно. Например,
realx
x = x + 1
преобразует целое число один в действительное число один и имеет желаемый эффект увеличения x на единицу. Однако в более сложных выражениях хорошей практикой программирования является явное принудительное преобразование необходимых типов. Для чисел доступны следующие функции:
int реал
real
dble
ichar
char
Первые три имеют очевидный смысл. ichar берет символ и преобразует его в целое число, в то время как char делает прямо противоположное.
Пример: Как умножить две вещественные переменные x и y с помощью двойной точности и сохранить результат в переменной двойной точности w:
w = dble(x)*dble(y)
Обратите внимание, что это отличается от
w = dble(x*y)
Логические выражения
Логические выражения могут иметь только значение .TRUE. или .FALSE.. Логическое выражение может быть сформировано путем сравнения арифметических выражений с использованием следующих реляционных операторов:
..LT.означает <.LE. <=».GT.»>
.GE.>=
.EQ. =
.NE. /=
Таким образом, вы не можете использовать символы, такие как логические выражения, которые могут быть объединены логическими операторами .И. ИЛИ .НЕ., которые имеют очевидное значение.
Логические переменные и присвоение
Истинностные значения могут храниться в логических переменных. Задание аналогично арифметическому заданию. Пример:
логические a, b
a = .TRUE.
b = a .AND. 3 .LT. 5/2
Порядок приоритета важен, как показывает последний пример. Правило состоит в том, что сначала вычисляются арифметические выражения, затем реляционные операторы и, наконец, логические операторы. Следовательно, b будет присвоен .ЛОЖНЫЙ. в приведенном выше примере. Среди логических операторов приоритет (при отсутствии скобок) состоит в том, что .NOT. выполняется первым, затем .AND., затем .OR. выполняется последним.
Логические переменные редко используются в Fortran. Но логические выражения часто используются в условных операторах, таких как оператор if.
Операторы if
Важной частью любого языка программирования являются условные операторы. Наиболее распространенным таким утверждением в Fortran является утверждение if, которое на самом деле имеет несколько форм. Самым простым из них является логическое утверждение if:
if (логическое выражение) исполняемый оператор
Это должно быть написано в одной строке. В этом примере найдено абсолютное значение x:
if (x .LT. 0) x = -x
Если внутри if должно быть выполнено более одного оператора, то следует использовать следующий синтаксис:
if (логическое выражение) then операторы
and if
Наиболее общая форма оператора if имеет следующий вид:
if (логическое выражение) then операторы
elseif (логическое выражение)
, then операторы
:
:
else
заявления
endif
Поток выполнения идет сверху вниз. Условные выражения вычисляются последовательно до тех пор, пока одно из них не окажется истинным. Затем соответствующие операторы выполняются, и управление возобновляется после end if.
Вложенные операторы if
операторы if могут быть вложены в несколько уровней. Чтобы обеспечить читабельность, важно использовать правильный отступ. Вот пример:
if (x .GT. 0), then
if (x .GE. y), then
write(*,*) ‘x is positive and x >= y’
else
write(*,*) ‘x ispositivebut x
Вам следует избегать вложенности многих уровней операторов if,так как за ними становится трудно следить.
Циклы
Для повторного выполнения подобных вещей используются циклы. Если вы знакомы с другими языками программирования, вы, вероятно, слышали о for-loops, while-loops и until-loops. Фортран 77 имеет только одну конструкцию цикла, называемую do-loop. Цикл do соответствует тому, что в других языках называется циклом for. Другие конструкции цикла должны быть построены с использованием операторов if и goto.
Цикл do
Цикл do-loop используется для простого подсчета. Вот простой пример, который выводит кумулятивные суммы целых чисел от 1 до n (предположим, что n было присвоено значение в другом месте):
целое число i, n, сумма
integer i, n, sum
sum = 0
do 10 i = 1, n
sum = sum + i
write(*,*) ‘i =’, i
write(*,*) ‘sum =’, sum
10 continue
Число 10 — это метка оператора. Как правило, в одной программе будет много циклов и других операторов, требующих метки оператора. Программист отвечает за присвоение уникального номера каждой метке в каждой программе (или подпрограмме).
Напомним, что позиции столбцов 1-5 зарезервированы для меток операторов. Числовое значение меток операторов не имеет значения, поэтому можно использовать любые целые числа в любом порядке. Как правило, большинство программистов используют последовательные кратные 10.
Переменная, определенная в операторе do, по умолчанию увеличивается на 1. Однако вы можете определить шаг как любое число, кроме нуля. Этот сегмент программы печатает четные числа от 1 до 10 в порядке убывания:
integer i
do 20 i = 10, 1, -2
write(*,*) ‘i =’, i
20 continue
Общая форма цикла do выглядит следующим образом:
do label var = expr1, expr2, expr3
var — это переменная цикла (часто называемая индексом цикла), которая должна быть целочисленной. expr1 задает начальное значение var, expr2 — конечную границу, а expr3 — инкремент (шаг).
Примечание: Переменная do-loop никогда не должна изменяться другими операторами внутри цикла! Это вызовет большую путаницу.
Индекс цикла может иметь тип real, но из-за ошибок округления может не принимать точно ожидаемую последовательность значений.
Многие компиляторы Fortran 77 позволяют закрывать циклы do с помощью оператора enddo. Преимущество этого заключается в том, что метка оператора может быть опущена, поскольку предполагается, что enddo закрывает ближайший предыдущий оператор do. Конструкция enddo широко используется, но она не является частью ANSI Фортран 77.
Следует отметить, что в отличие от некоторых языков программирования, Fortran вычисляет выражения start, end и step только один раз, перед первым прохождением тела цикла. Это означает, что следующий цикл do-loop будет умножать неотрицательный j на два (трудный путь), а не работать вечно, как эквивалентный цикл на другом языке.
integeri,j
read (*,*) j
do 20 i = 1, j
j = j + 1
20 continue
write (*,*) j
while-циклы
Самый интуитивный способ написать цикл while — это:
while (logical expr) do
заявления
anddo
или альтернативно,dowhile (логическое выражение)
заявления
and do
Программа будет чередовать тестирование условия и выполнение операторов в теле до тех пор, пока условие в операторе while истинно. Несмотря на то, что этот синтаксис принят многими компиляторами, это не ANSI Fortran 77. Правильный способ использовать if и goto:
label if (logical expr) затем
заявление
gotolabel
endif
Вот пример, который вычисляет и печатает все степени двух, которые меньше или равны 100:
integern
n = 1
10 if (n .le. 100), then
write (*,*) n
n = 2*n
goto 10
end if
Цикл until
Если критерий завершения находится в конце, а не в начале, его часто называют циклом до. Псевдокод выглядит так:
do
заявление
until(logicalexpr)
Опять же, это должно быть реализовано в Fortran 77 с помощью if и goto:
метка continue
заявление
if (logicalexpr) gotolabel
Обратите внимание, что логическое выражение в последней версии должно быть отрицанием выражения, данного в псевдокоде!
Массивы
Многие научные вычисления используют векторы и матрицы. Тип данных, используемый Fortran для представления таких объектов, — массив. Одномерный массив соответствует вектору, а двумерный-матрице. Чтобы полностью понять, как это работает в Фортран 77, вам нужно знать не только синтаксис использования, но и то, как эти объекты хранятся в памяти в Fortran 77.
Одномерные массивы
Простейшим массивом является одномерный массив, который представляет собой просто последовательность элементов, последовательно хранящихся в памяти. Например, декларация realа(20) объявляет a как реальный массив длины 20. То есть а состоит из 20 вещественных чисел, непрерывно хранящихся в памяти.
По соглашению массивы Fortran индексируются от 1 и выше. Таким образом, первое число в массиве обозначается a(1), а последнее-a(20). Однако вы можете определить произвольный диапазон индексов для ваших массивов, используя следующий синтаксис:
realb(0:19), weird(-162:237)
Здесь b точно похож на a из предыдущего примера, за исключением того, что индекс проходит от 0 до 19. weird-это массив длины 237-(-162)+1 = 400. Тип элемента массива может быть любым из основных типов данных. Примеры:
integeri(10)
logicalаа(0:1)
doubleprecisionx(100)
Каждый элемент массива можно рассматривать как отдельную переменную. Вы ссылаетесь на i-й элемент массива a через a(i). Вот сегмент кода, который хранит 10 первых квадратных чисел в массиве sq:
integeri, sq(10)
do 100 i = 1, 10
sq(i) = i**2
100 continue
Распространенная ошибка в Fortran заключается в том, что программа пытается получить доступ к элементам массива, которые находятся вне границ или не определены. Это ответственность программиста, и компилятор Fortran не обнаружит таких ошибок!
Двумерные массивы
Матрицы очень важны в линейной алгебре. Матрицы обычно представляются двумерными массивами. Например, декларация Real A(3,5) определяет двумерный массив из 3*5=15 вещественных чисел. Полезно думать о первом индексе как о индексе строки, а о втором-как об индексе столбца. Отсюда мы получаем графическую картину:
(1,1) (1,2) (1,3) (1,4) (1,5)
(2,1) (2,2) (2,3) (2,4) (2,5)
(3,1) (3,2) (3,3) (3,4) (3,5)
Двумерные массивы также могут иметь индексы в произвольном определенном диапазоне. Общий синтаксис объявлений таков:
name (low_index1 : hi_index1, low_index2 : hi_index2)
Тогда общий размер массива будет равен
size = (hi_index1-low_index1+1)*(hi_index2-low_index2+1)
В Fortran довольно часто объявляются массивы, которые больше, чем матрица, которую мы хотим сохранить. (Это связано с тем, что Fortran не имеет динамического распределения памяти.) Это совершенно законно.
Пример:
Real А(3,5)
Integer i,j
c
c Мы будем использовать только верхнюю часть этого массива размером 3 на 3.
c
do 20 j = 1, 3
do 10 i = 1, 3
a(i,j) = real(i)/real(j)
10 continue
20 continue
Элементы подматрицы А(1:3,4:5) не определены. Не предполагайте, что эти элементы инициализируются компилятором до нуля (некоторые компиляторы сделают это, но не все).
Формат хранения для 2-мерных массивов
Fortran хранит многомерные массивы как непрерывную последовательность элементов. Важно знать, что 2-мерные массивы хранятся по столбцам. Таким образом, в приведенном выше примере элемент массива (1,2) будет следовать за элементом (3,1). Затем следует остальная часть второго столбца, затем третий столбец и так далее.
Рассмотрим еще раз пример, где мы используем только верхнюю подматрицу 3 на 3 массива 3 на 5 A(3,5). 9 интересных элементов будут затем сохранены в первых девяти ячейках памяти, в то время как последние шесть не используются. Это работает аккуратно, потому что ведущее измерение одинаково как для массива, так и для матрицы, которую мы храним в массиве.
Однако часто ведущее измерение массива будет больше, чем первое измерение матрицы. Тогда матрица не будет храниться непрерывно в памяти, даже если массив является непрерывным. Например, предположим, что объявление было A(5,3) вместо этого. Тогда между концом одного столбца и началом следующего будут две «неиспользуемые» ячейки памяти (опять же мы предполагаем, что матрица равна 3 на 3).
Это может показаться сложным, но на самом деле это довольно просто, когда вы привыкнете. Если вы сомневаетесь, может быть полезно посмотреть, как вычисляется адрес элемента массива. Каждый массив будет иметь некоторый адрес памяти, назначенный началу массива, то есть элементу (1,1). Адрес элемента (i,j) затем задается addr[A(i,j)] = addr[A(1,1)] + (j-1)*lda + (i-1) где lda — ведущее (т. е. строковое) измерение A. Обратите внимание, что lda в целом отличается от фактического матричного измерения. Многие ошибки Фортрана вызваны этим, поэтому очень важно, чтобы вы поняли различие!
Многомерные массивы
Fortran 77 допускает массивы до семи измерений. Синтаксис и формат хранения аналогичны двумерному случаю, поэтому мы не будем тратить на это время.
Существует альтернативный способ объявления массивов в Fortran 77.
realA, x
sizex(50)
dimensionА(10,20) эквивалентнаrealA(10,20), x(50)
Это заявление об измерении сегодня считается старомодным стилем.
Заключение
В этой статье вы узнали основы языка Фортнан! Всем начинающим программистам удачи в написании к