Язык фортран для чайников

Fortran 2003: учим Фортран и С дружить

Язык фортран для чайников. Смотреть фото Язык фортран для чайников. Смотреть картинку Язык фортран для чайников. Картинка про Язык фортран для чайников. Фото Язык фортран для чайников

На языке Фортран написано огромное количество кода, отлаженного и работающего многие годы. Я не собираюсь поднимать вопрос «что лучше — Фортран или С?». У каждого языка есть свои сильные и слабые стороны. Но, учитывая большое распространение языка С, всё более популярными в определенных кругах становятся случаи «гибридных» приложений, когда часть кода пишется (скорее, уже написана) на языке Фортран, а другая – на С. Вот только у этих языков есть определенная специфика, про которую я частично уже говорил, и чтобы написанное нами приложение работало корректно, нужно учитывать много нюансов. Различия в типах данных, соглашениях о вызове (calling convention), именах (naming convention) делают задачу создания mixed language приложения далеко нетривиальной. Хорошо, что в стандарте Fortran 2003 появился целый набор средств, специально разработанный для решения задачи интероперабельности C и Фортрана. Кстати, не помню других языков, которые бы стандартизировали подобную работу — ещё один «плюсик» Фортрану за протянутую «руку дружбы».

Что же такое эта интер-опер- и так далее? Под термином «интероперабельность» имеется в виду возможность вызова в коде на языке Фортран функции С и наоборот. Кроме этого, можно использовать глобальные переменные, а так же объявлять локальные переменные, структуры данных и перечисления, имеющие соответствие в С. Основная идея — всё должно работать одинаково как в С, так и в Фортране. Стоит отметить, что под С подразумевается стандарт С99 (ISO/IEC 9899:1999). Кстати, конкретная реализация компилятора Фортран вправе выбирать, с кем из компиляторов C дружить. В случае Intel Fortan, это Microsoft Visual C++ на Windows и gcc на Linux и OS X. А что с Intel C++? Так как он совместим с Visual C++ и gcc — никаких проблем с ним нет (что и следовало ожидать).

Фортран реализует поддержку той самой интероперабельности через следующие средства:

Вот те объекты С, которые могут быть доступны для приложения на Фортране:

Теперь давайте посмотрим, как всё работает на примере. Если мы в Фортране напишем

То использование KIND=C_LONG гарантирует нам, что у переменной I не возникнет проблем с типом при её использовании в коде C, и там она будет типа long int (в соответствии с табличкой). С встроенными типам всё просто – ищем соответствующую константу для KIND в табличке и дело в шляпе. Кстати, раз уж весь этот функционал доступен в виде модуля, то нам стоит его подключить с помощью ключевого слова USE:

Таким образом нам будут доступны все константы для типов из модуля. Чтобы не засорять пространство имен, рекомендуется ограничивать область видимости только теми типами, которые мы реально собираемся использовать, например так:

Кроме самих типов, существует так же конструкция BIND (не является частью модуля — часть стандарта Fortran 2003), который говорит компилятору языка Фортран о том, что соответствующее имя – объект С. Причем делать это можно явно и неявно. Например, у нас имеются такие глобальные переменные в С:

И мы хотим правильно использовать их в нашем коде на Фортране, например, в модуле:

Такая «связка» нужна для объектов. В данном примере мы сможем работать в коде на Фортране с теми самыми глобальными переменными, созданными в С. Если же у нас имеется некоторая функция, например

То в качестве аргументов можно использовать такие данные, и BIND делать не нужно:

Одна из проблем Фортрана и С заключалась в различиях при работе со строками. Поэтому для того, чтобы в такую функцию можно было передать строку:

Нужно использовать KIND=C_CHAR и символ окончания строки C_NULL_CHAR (аналог \0 в Фортране):

И наша строка из Фортрана будет здорово «дружить» с С – можно смело передавать в функцию!
Но функцию тоже нужно как-то связать с её аналогом из С. Делается это в Фортране с помощью интерфейсов:

И вот теперь мы можем смело писать

Самое интересное – это работа с указателями. Для функции с указателями в качестве аргументов

можно использовать следующие переменные в Фортране:

Кроме того, что для указателей есть свой параметр KIND, имеется ещё и ряд дополнительных возможностей, например есть «нулевой» указатель C_NULL_PTR – аналог null из С. В распоряжении так же специальные функции.

C_F_POINTER ассоциирует указатель Фортрана с объектом С. Синтаксис у данной функции следующий:

В качестве входного аргумента CPTR передаем указатель на объект в С, на выходе имеем Фортрановский указатель FPTR на этот объект.

C_LOC возвращает адрес объекта С или Фортран:

C_ASSOCIATED проверяет, выставлен наш указатель в null или нет, а так же ассоциирован ли он с объектом С.

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

будет работать с типом FTYPE:

Конечно, подробно описать все детали стандарта в рамках поста не получится, да этой цели я и не ставил, но думаю, что пролил свет на то, как всё это дело работает. Ну и заключительный примерчик, приближенный к реальности, который показывает, как модуль ISO_C_BINDING может быть использован для вызова функций как из Фортрана, так и из С.
Начнем с примера Фортрана, вызывающего С функцию:

Итак, создаем интерфейс с нужными параметрами KIND:

А теперь непосредственно вызов функции:

И никаких проблем ни с именами, ни с типами данных.
Наоборот, если у нас стоит задача вызова некоторой Фортрановской функции (весьма частая задача), то данный модуль и здесь поможет в решении проблем. Если у нас имеется функция Simulation:

Декларируем в С структуру:

И можем её смело вызывать:

Вот и всё. Думаю, что использование этой фичи нового стандарта позволит многим разработчикам избежать большого количества проблем, а Фортран и С будут дружны как никогда.

Источник

Основы языка Fortran

Fortran — это язык программирования общего назначения, предназначенный для математических вычислений, например, в машиностроении. Фортран-это аббревиатура для перевода формул, и первоначально она была написана с заглавной буквы как FORTRAN. Однако, следуя нынешней тенденции использовать только заглавную букву в аббревиатурах, все называют его Fortran.

Фортран был первым в истории языком программирования высокого уровня. Работа над Fortran началась в 1950 — х годах в IBM, и с тех пор было много версий. По соглашению, версия Fortran обозначается двумя последними цифрами года, когда был предложен стандарт. Таким образом, мы имеем:

Наиболее распространенной версией Фортран сегодня по-прежнему является 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 = ‘, area

Строки, начинающиеся с буквы «с», являются комментариями и не имеют иной цели, кроме как сделать программу более читаемой для людей. Первоначально все программы на Фортране должны были быть написаны заглавными буквами. Большинство людей теперь пишут строчными буквами, так как это более разборчиво, и мы тоже. Вы можете смешать регистр, но Fortran не чувствителен к регистру, поэтому «X» и «x»-это одна и та же переменная.

Организация программы

Программа Fortran обычно состоит из основной программы (или драйвера) и, возможно, нескольких подпрограмм (процедур или подпрограмм). Пока мы поместим все утверждения в основную программу; подпрограммы будут рассмотрены позже. Структура основной программы такова:

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

Оператор stop необязателен и может показаться излишним, поскольку программа все равно остановится, когда достигнет конца, но рекомендуется всегда завершать программу с помощью оператора stop, чтобы подчеркнуть, что поток выполнения останавливается на этом. Обратите внимание, что у вас не может быть переменной с тем же именем, что и у программы.

Правила расположения столбцов

Fortran 77 не является языком свободного формата, но имеет очень строгий набор правил форматирования исходного кода. Наиболее важными правилами являются правила расположения столбцов:

Большинство строк в программе 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.

Выход из компиляции по умолчанию имеет несколько загадочное имя a.out, но при желании вы можете выбрать другое имя. Чтобы запустить программу, просто введите имя исполняемого файла, например a.out. (Это объяснение несколько упрощено.На самом деле компилятор переводит исходный код в объектный код, а компоновщик/загрузчик превращает его в исполняемый файл.)

Примеры:

В каталоге классов есть небольшая программа Fortran под названием circle.f. Вы можете скомпилировать и запустить его, выполнив следующие действия:

(Обратите внимание, что там есть несколько точек (точек), которые легко пропустить!) Если вам нужно иметь несколько исполняемых файлов одновременно, рекомендуется дать им описательные имена. Это можно сделать с помощью опции-o.

В предыдущих примерах мы не проводили различия между компиляцией и связыванием. Это два разных процесса, но компилятор Fortran выполняет их оба, поэтому пользователю обычно не нужно знать об этом. Но в следующем примере мы будем использовать два файла исходного кода.

Компиляция отдельных файлов, подобных этому, может быть полезна, если существует много файлов и только некоторые из них должны быть перекомпилированы. В Unix есть полезная команда make, которая обычно используется для обработки больших пакетов программного обеспечения с большим количеством исходных файлов. Эти пакеты поставляются с файлом makefile, и все, что нужно сделать пользователю, — это ввести make. Написание makefiles немного сложно, поэтому мы не будем обсуждать это в этом уроке.

Переменные, типы и объявления

Имена переменных

Имена переменных в Фортран должны быть из 1-6 символов(допустимые буквы a-z и цифры 0-9).Кроме того, первый символ должен быть буквой. Fortran 77 не различает верхний и нижний регистр, фактически, он предполагает, что все входные данные являются верхним регистром. Однако почти все компиляторы Фортран 77 принимают нижний регистр. Если вы когда-нибудь столкнетесь с компилятором Fortran 77, который настаивает на верхнем регистре, обычно легко преобразовать исходный код во все верхние регистры.

Слова, составляющие язык Фортран, называются зарезервированными словами и не могут использоваться в качестве имен переменных. Некоторые из зарезервированных слов, которые мы видели до сих пор, — это «program», «real», «stop» и «end».

Типы и объявления

Каждая переменная должна быть определена в объявлении. Это устанавливает тип переменной. Наиболее распространенными декларациями являются:

Список переменных должен состоять из имен переменных, разделенных запятыми. Каждая переменная должна быть объявлена ровно один раз. Если переменная не объявлена, 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 = ‘, area

Синтаксис оператора parameter таков

Правила для оператора parameter следующие:

Вот некоторые веские причины для использования оператора parameter:

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

Константы

Простейшей формой выражения является константа. Существует 6 типов констант, соответствующих 6 типам данных. Вот некоторые целочисленные константы:

Тогда у нас есть реальные константы:

Обозначение Е означает, что вы должны умножить константу на 10, возведенную в степень, следующую за буквой «Е». Следовательно, 2.0E6-это два миллиона, а 3.333 E-1-примерно одна треть.

Для констант, которые больше наибольшего допустимого реального значения или требуют высокой точности, следует использовать двойную точность. Обозначение такое же, как и для вещественных констант, за исключением того, что «Е» заменено на «D». Примеры:

Здесь 2.0 D-1-это двойная точность одна пятая, в то время как 1D99-это единица, за которой следуют 99 нулей. Следующий тип — комплексные константы. Это обозначается парой констант (целочисленных или вещественных), разделенных запятой и заключенных в круглые скобки. Примеры таковы:

Первое число обозначает действительную часть, а второе-мнимую. Пятый тип — логические константы. Они могут иметь только одно из двух значений:

Обратите внимание, что точки, заключающие буквы, обязательны. Последний тип — символьные константы. Они чаще всего используются в виде массива символов, называемого строкой. Они состоят из произвольной последовательности символов, заключенных в апострофы (одинарные кавычки):

Строки и символьные константы чувствительны к регистру. Проблема возникает, если вы хотите иметь апостроф в самой строке. В этом случае вам следует удвоить апостроф:

Выражения

Простейшие непостоянные выражения имеют вид operandoperatoroperand и пример:

Результат выражения сам по себе является операндом, поэтому мы можем вложить выражения вместе, например:

В связи с этим возникает вопрос о приоритете: означает ли последнее выражение x + (2*y) или (x+2)*y? Приоритет арифметических операторов в Фортран 77 (от самого высокого до самого низкого):

Все эти операторы вычисляются слева направо, за исключением оператора возведения в степень **, который имеет приоритет справа налево. Если вы хотите изменить порядок оценки по умолчанию, вы можете использовать круглые скобки.

Все вышеперечисленные операторы являются бинарными операторами.существует также унарный оператор — для отрицания, который имеет приоритет над другими. Следовательно, выражение типа-x+y означает то, что вы ожидаете.

Необходимо соблюдать крайнюю осторожность при использовании оператора деления, который имеет совершенно другое значение для целых и вещественных чисел. Если оба операнда являются целыми числами, выполняется целочисленное деление, в противном случае выполняется действительное арифметическое деление. Например, 3/2 равно 1, а 3./2. равно 1,5 (обратите внимание на десятичные точки).

Назначение

Интерпретация заключается в следующем: Вычислите правую часть и назначьте полученное значение переменной слева. Выражение справа может содержать другие переменные, но они никогда не изменяют значения! Например, площадь = pi * r**2 не изменяет значения pi или r, только площадь.

Преобразование типов

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

преобразует целое число один в действительное число один и имеет желаемый эффект увеличения x на единицу. Однако в более сложных выражениях хорошей практикой программирования является явное принудительное преобразование необходимых типов. Для чисел доступны следующие функции:

Первые три имеют очевидный смысл. ichar берет символ и преобразует его в целое число, в то время как char делает прямо противоположное.

Пример: Как умножить две вещественные переменные x и y с помощью двойной точности и сохранить результат в переменной двойной точности w:

Обратите внимание, что это отличается от

Логические выражения

Логические переменные и присвоение

Истинностные значения могут храниться в логических переменных. Задание аналогично арифметическому заданию. Пример:

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

Операторы if

Важной частью любого языка программирования являются условные операторы. Наиболее распространенным таким утверждением в Fortran является утверждение if, которое на самом деле имеет несколько форм. Самым простым из них является логическое утверждение if:

if (логическое выражение) исполняемый оператор

Это должно быть написано в одной строке. В этом примере найдено абсолютное значение x:

Если внутри if должно быть выполнено более одного оператора, то следует использовать следующий синтаксис:

if (логическое выражение) then операторы

Наиболее общая форма оператора if имеет следующий вид:

if (логическое выражение) then операторы

elseif (логическое выражение)
, then операторы
:
:
else
заявления
endif

Поток выполнения идет сверху вниз. Условные выражения вычисляются последовательно до тех пор, пока одно из них не окажется истинным. Затем соответствующие операторы выполняются, и управление возобновляется после end if.

Вложенные операторы if

операторы if могут быть вложены в несколько уровней. Чтобы обеспечить читабельность, важно использовать правильный отступ. Вот пример:

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

Циклы

Для повторного выполнения подобных вещей используются циклы. Если вы знакомы с другими языками программирования, вы, вероятно, слышали о for-loops, while-loops и until-loops. Фортран 77 имеет только одну конструкцию цикла, называемую do-loop. Цикл do соответствует тому, что в других языках называется циклом for. Другие конструкции цикла должны быть построены с использованием операторов if и goto.

Цикл do

Цикл do-loop используется для простого подсчета. Вот простой пример, который выводит кумулятивные суммы целых чисел от 1 до n (предположим, что n было присвоено значение в другом месте):

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 в порядке убывания:

Общая форма цикла 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 на два (трудный путь), а не работать вечно, как эквивалентный цикл на другом языке.

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:

Цикл until

Если критерий завершения находится в конце, а не в начале, его часто называют циклом до. Псевдокод выглядит так:

Опять же, это должно быть реализовано в Fortran 77 с помощью if и goto:

метка continue
заявление
if (logicalexpr) gotolabel

Обратите внимание, что логическое выражение в последней версии должно быть отрицанием выражения, данного в псевдокоде!

Массивы

Многие научные вычисления используют векторы и матрицы. Тип данных, используемый Fortran для представления таких объектов, — массив. Одномерный массив соответствует вектору, а двумерный-матрице. Чтобы полностью понять, как это работает в Фортран 77, вам нужно знать не только синтаксис использования, но и то, как эти объекты хранятся в памяти в Fortran 77.

Одномерные массивы

Простейшим массивом является одномерный массив, который представляет собой просто последовательность элементов, последовательно хранящихся в памяти. Например, декларация realа(20) объявляет a как реальный массив длины 20. То есть а состоит из 20 вещественных чисел, непрерывно хранящихся в памяти.

По соглашению массивы Fortran индексируются от 1 и выше. Таким образом, первое число в массиве обозначается a(1), а последнее-a(20). Однако вы можете определить произвольный диапазон индексов для ваших массивов, используя следующий синтаксис:

Здесь b точно похож на a из предыдущего примера, за исключением того, что индекс проходит от 0 до 19. weird-это массив длины 237-(-162)+1 = 400. Тип элемента массива может быть любым из основных типов данных. Примеры:

Каждый элемент массива можно рассматривать как отдельную переменную. Вы ссылаетесь на i-й элемент массива a через a(i). Вот сегмент кода, который хранит 10 первых квадратных чисел в массиве sq:

do 100 i = 1, 10
sq(i) = i**2
100 continue

Распространенная ошибка в Fortran заключается в том, что программа пытается получить доступ к элементам массива, которые находятся вне границ или не определены. Это ответственность программиста, и компилятор Fortran не обнаружит таких ошибок!

Двумерные массивы

Матрицы очень важны в линейной алгебре. Матрицы обычно представляются двумерными массивами. Например, декларация Real A(3,5) определяет двумерный массив из 3*5=15 вещественных чисел. Полезно думать о первом индексе как о индексе строки, а о втором-как об индексе столбца. Отсюда мы получаем графическую картину:

Двумерные массивы также могут иметь индексы в произвольном определенном диапазоне. Общий синтаксис объявлений таков:

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.

Это заявление об измерении сегодня считается старомодным стилем.

Заключение

В этой статье вы узнали основы языка Фортнан! Всем начинающим программистам удачи в написании к

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *