современный фортран , Бортеньев. О. В. Бартеньев Современный Фортран
Скачать 2.24 Mb.
|
О.В. Бартеньев Современный Фортран Издание третье, дополненное и переработанное МОСКВА «ДИАЛОГ-МИФИ» 2000 1 О. В. Бартеньев. Современный ФОРТРАН УДК 519.682 ББК 32.97 Б24 Бартеньев О. В. Б24 Современный Фортран. - 3-е изд., доп. и перераб. - М.: ДИАЛОГ- МИФИ, 2000. - 449 с. ISBN 5-86404-113-0 Излагаются базовые свойства Фортрана фирм Compaq и Microsoft, основанные на стандартах Фортран 90 и 95. По существу, пособие является новой, усовершенствованной версией одноименного издания 1998 г. Дополнительно в книгу включены нововведения стандарта Фортран 95, рассмотрены отличительные особенности Фортрана Compaq и описаны методы использования объектов ActiveX. Как и ранее, пособие ориентировано как на пользователей со стажем, так и на начинающих программистов, для которых разбираются методы программирования и особенности их реализации на Фортране. Предназначено для студентов, преподавателей, аспирантов, инженеров и научных работников. Учебно-справочное издание Бартеньев Олег Васильевич Современный Фортран. 2 Предисловие Новое издание пособия обусловлено прежде всего расширяющимся интересом российских специалистов к современному Фортрану, и в частности к его реализациям фирмами Compaq и Microsoft, известными как Compaq Visual Fortran 6.1 (далее - CVF) и Microsoft Fortran PowerStation 4.0 (далее - FPS). Более продвинутой разработкой является CVF. Это неудивительно, поскольку Microsoft вот уже несколько лет не поддерживает FPS и он живет своей одинокой жизнью. В то же время CVF, включая все возможности FPS, постоянно совершенствуется и развивается. В дополнение к FPS, в Фортране Compaq реализованы стандарт 1995 г. и большое число дополнительных возможностей, в том числе новая версия математической библиотеки IMSL (IMSL Fortran 90 MP), конструктор модулей для объектов ActiveX, визуализатор массивов и др. Тем не менее, учитывая широкое распространение FPS среди российских пользователей, в книге рассматриваются и CVF и FPS. Впрочем, такое объединение не потребовало чрезмерных усилий, так как, во-первых, CVF наследует все черты FPS: практически все, что работает в FPS, будет работать и в CVF (определенные различия имеются в организации передачи данных), и, во-вторых, обе разработки эксплуатируют одну и ту же среду - Microsoft Developer Studio (далее - DS). Пособие содержит описание базовых, основанных на стандартах Фортран 90 и 95 свойств языка и имеющихся расширений, таких, как целочисленные указатели, объединения, целочисленные выражения в спецификаторе формата и др. Из дополнительных возможностей приводятся процедуры библиотеки DFLIB (MSFLIB), позволяющие, например, управлять файлами или операциями с плавающей точкой, а также рассматривается конструктор модулей - новое средство CVF, осуществляющее генерацию модулей, облегчающих использование в приложениях Фортрана объектов ActiveX, т. е. объектов, предоставляемых другими приложениями и поддерживающих модель многокомпонентных объектов COM. Например, Excel предоставляет множество иерархически связанных объектов, таких, как "Рабочая книга", "Рабочий лист" или "Диаграмма". Большое число иных, не предусмотренных стандартом специальных средств рассматривается в книгах [1-3], изучая которые пользователь получает возможностъ создавать диалоги, меню, обрабатывать события, выполнять многооконный, средствами QuickWin или OpenGL, графический вывод, писать разноязычные, например на Фортране и СИ, приложения, вызывать математические процедуры библиотеки IMSL и т. д. Однако главное назначение Фортрана - это быстрый счет в различных научно- технических приложениях. (Это та область, в которой у Фортрана нет конкурентов.) Поэтому основной задачей пользователя Фортрана является освоение техники высокопроизводительных вычислений, и поэтому основная цель разработчиков Фортрана - поиск и включение в язык соответствующих высокоскоростных средств. В этом плане прогресс несомненен, и его основой является отраженная в стандартах Фортран 90 и 95 концепция обработки массивов. 3 О. В. Бартеньев. Современный ФОРТРАН В соответствии с ней: • массивы, как и обычные скалярные переменные, могут быть использованы в выражениях, результатами которых также являются массивы; • в конструкциях WHERE и FORALL, заменяющих громоздкие циклы, можно под управлением маски выполнять сложные присваивания массивов. Причем для употребления в FORALL введен класс так называемых чистых, создаваемых пользователем процедур; • введено большое число функций для массивов, реализующих в том числе базовые операции линейной алгебры, например вычисляющих произведение матриц, скалярное произведение векторов или возвращающих транспонированную матрицу; • большинство встроенных процедур являются элементными, т. е. способными принимать массивы, выполнять поэлементно необходимые вычисления и возвращать массивы. Например, если x и y - это векторы одного размера, то вызов y = SIN(x) позволит сформировать вектор y, каждый элемент которого равен синусу соответствующего элемента вектора x; • свои собственные элементные процедуры, обладающие такими же, как и встроенные элементные процедуры, свойствами, может создать и программист; • введены подобъекты массивов, называемые сечениями, которые можно использовать так же, как и массивы (т. е. в выражениях, в качестве параметров элементных функций), и применяя которые можно заменить многие циклы, например неявные циклы операторов ввода/вывода; • при необходимости можно объявлять динамические (размещаемые, ссылочные, а в процедурах - автоматические) массивы; • можно реализовать массивоподобные функции, возвращающие массивы или ссылочные динамические массивы. Эти, далеко не в полной мере перечисленные, относящиеся к массивам нововведения в сочетании с другими усовершенствованиями позволяют создавать быстро работающие, компактные, хорошо читаемые и удобные для употребления программы. Больше того, при наличии многопроцессорной вычислительной системы и соответствующего компилятора языка Фортран применение вышеназванных новых свойств обеспечивает естественное распараллеливание вычислений и, как следствие, существенный рост производительности. 4 1. Элементы языка 1.1. Свободная форма записи программы Рассмотрим программу, в которой задаются два действительных числа, вычисляется их сумма и выводится результат: program p1 ! p1 - имя программы real x, y, z ! Объявляем 3 переменные вещественного типа x = 1.1 ! Присваиваем переменным x и y значения y = 2.2 z = x + y ! Присваиваем z результат сложения x и y print *, 'z = ', z ! Вывод результата на экран ! Результат вывода: z = 3.300000 end program p1 ! END - обязательный оператор завершения программы Приведенная программа называется главной. Она построена по схеме: сначала следует объявление типов используемых переменных, затем - операторы, выполняющие над объявленными переменными некоторые действия. Эта схема является типовой и неоднократно воспроизводится в пособии. Программа завершается оператором END, в котором имя программы p1 и одновременноPROGRAM p1могут быть опущены. Иными словами, программу можно завершить так:END PROGRAM или END. Программа имеет заголовок: PROGRAM имя-программы. Однако такой заголовок может быть опущен. В этом случае имя-программы не может присутствовать в операторе END. Имя-программы должно отличаться от используемых внутри главной программы имен. Программа записана в свободной форме. По умолчанию файл с текстом написанной в свободной форме программы имеет расширение F90. В нем не должно быть директивы $NOFREEFORM, а при компиляции нельзя задавать опцию компилятора /4Nf. Замечание. Здесь и далее указываются присущие FPS опции компилятора. Описание опций компилятора CVF и соответствие между опциями компиляторов FPS и CVF изложены в [1]. В свободной форме текст программы записывается по правилам: • длина строки текста равна 132 символам; • запись оператора может начинаться с любой позиции строки; • на одной строке могут размещаться несколько разделенных точкой с запятой (;) операторов; • если строка текста завершается символом &, то последующая строка рассматривается как строка продолжения; 5 О. В. Бартеньев. Современный ФОРТРАН • в операторе может быть до 7200 символов. Число строк продолжения в свободной форме не может быть более 54; • любые расположенные между восклицательным знаком и концом строки символы рассматриваются как комментарий, например: real x, y, & ! Комментарий в начальной строке z, a(5), & ! Строка продолжения r, b(10) ! Еще одна строка продолжения x = 1.1; y = 2.2; a = -5.5 ! Операторы присваивания Замечание. Помимо свободной программу можно записать и в фиксированной, унаследованной от Фортрана 77 форме (прил. 2). Файлы, содержащие текст в фиксированной форме, по умолчанию имеют расширения F или FOR. В файлах с такими расширениями можно перейти и к свободной форме, задав директиву $FREEFORM или опцию компилятора /4Yf [1]. Запустим теперь программу p1, используя приведенные в разд. 1.2 сведения. 1.2. Консоль-проект Программа рассматривается в FPS и CVF как проект. Для запуска новой программы необходимо прежде всего его создать. Существует несколько типов проектов, однако на первых порах мы будем работать с консоль- проектом - однооконным проектом без графики. 1.2.1. Создание проекта в CVF Начнем создание проекта с запуска DS. Для этого после запуска Win- dows 95 или Windows NT можно выполнить цепочку действий: пуск - программы - Compaq Visual Fortran - Developer Studio. Перейдем к созданию нового консоль-проекта CVF. Для этого выполним цепочку File - New - выбрать закладку Projects - Fortarn Console Application - задать имя проекта, например proj1, - задать папку размещения проекта, например D:\FORTRAN\proj1, - OK. В появившемся затем окне выбрать кнопку Anempty project и нажать Finish. Тогда будет создана директория (папка), имя которой совпадает с именем проекта. В этой папке будут размещены файлы проекта с расширениями DSP, DSW и NCB. Также будет создана папка Debug. Сам же проект отобразится на закладке FileView (рис. 1.1). 6 1. Элементы языка Рис. 1.1. Проект proj1 Создадим теперь файл, в который будет занесен текст программы, выполнив: File - New - выбрать закладку Files - выбрать Fortran Free Format Source File - активизировать опцию Add to project - задать имя файла, например myp (расширение опустить), - OK. Созданный файл получит расширение F90 и разместится в D:\FORTRAN\proj1. Если же файл уже существует, то для его добавления в проект в окне FileView выберите папку Source Files и выполните: нажать на правую кнопку мыши - Add Files to Folder - выбрать тип файлов и необходимые файлы (рис. 1.2) - OK. Рис. 1.2. Добавление файлов в проект 7 О. В. Бартеньев. Современный ФОРТРАН Чтобы отобразить на экране содержимое файла, достаточно ударить по нему дважды мышью. 1.2.2. Создание проекта в FPS FPS может быть оснащен более ранней версией DS, в которой схема создания проекта и добавления в него файла несколько иная. После запуска DS выполним цепочку File - New - Project Workspace – OK - Console Application - ввести имя проекта - задать расположение проекта на диске - Create. После нажатия кнопки Create будет создана директория (папка), имя которой совпадает с именем проекта. В этой папке будут размещены файлы проекта с расширениями MAK и MDP. Создадим теперь новый файл, выполнив File - New - Text File - OK. Наберем далее в правом окне текст программы и запишем его на диск: File - Save - выбрать на диске директорию для записи файла - задать имя файла с расширением, напримерmyp.f90, - сохранить. Добавим созданный файл в проект: Insert - File Into Project - выбрать файл myp.f90 - Add. 1.2.3. Операции с проектом Чтобы закрыть проект, следует выполнить: File - Close Workspace. Существующий проект открывается в результате выполнения цепочки File - Open Workspace - выбрать файл проекта - Open. Для удаления файла из открытого проекта достаточно выбрать этот файл в окне FileView и нажать Del. Выполним теперь компиляцию проекта: Build - Compile - и исправим обнаруженные ошибки, сообщения о которых вы найдете в нижнем окне на закладке Build. Создадим выполняемый EXE-файл: Build - Build. Запустим его для исполнения: Build - Execute - и получим результат. Для выхода из рабочего DOS-окна, в котором отобразились результаты, нажмем любую клавишу, например Esc или Enter. Компиляцию, сборку и запуск программы можно также выполнить, используя имеющиеся в среде кнопки (Compile, Build, GO) или выбирая на клавиатуре соответствующие сочетания клавиш, информация о которых размещается в пунктах меню DS. Здесь же отметим, что все три упомянутых выше этапа (компиляция, сборка и запуск) будут выполнены после нажатия Ctrl+F5. Впрочем, если в проекте несколько файлов, удобнее (с позиции выявления ошибок) компилировать файлы по отдельности, переходя к обработке следующего файла после устранения всех синтаксических ошибок в текущем. 8 1. Элементы языка 1.2.4. Файлы с исходным текстом В общем случае файлы с исходным текстом программы могут иметь расширения F90, F и FOR. Например, myp.f90, myp.f, myp.for. В первом случае компилятор считает, что файл написан в свободной форме. В двух последних по умолчанию предполагается, что исходный текст записан в фиксированной форме (прил. 2). Мы же будем использовать для файлов расширение F90 и свободную форму записи исходного текста. 1.3. Операторы Написанная на Фортране программа - это последовательность операторов языка программирования. Операторы разделяются на выполняемые и операторы, которые не участвуют в вычислениях и называются невыполняемыми. Выполняемый оператор описывает действия, которые должны быть произведены программой. Невыполняемые операторыописывают элементы программы, например данные или программные компоненты. Наиболее часто используется выполняемый оператор присваивания, имеющий вид: имя переменной = выражение В результате его выполнения переменной присваивается результат некоторого выражения. Например: real :: d, a = 1.2 ! Невыполняемый оператор объявления ! типа данных, в котором переменная a ! получила начальное значение 1.2 d = 2.3 ! Читается: d присвоить 2.3 a = a + 4.0 * sin(d) ! Значение a изменится с 1.2 на 4.182821 print *, a ! Вывод значения переменной a end ! Оператором END завершаем программу Замечание. Оператор присваивания будет лучше читаться, если перед и после знака оператора = поставить по одному пробелу. Все используемые в программе объекты данных, например переменные, следует предварительно объявить, т. е. явно указать их тип и при необходимости другие свойства. Для этих целей существуют невыполняемые операторы объявления типа, например: real x, y ! Невыполняемый оператор REAL объявляет две переменные ! x и y вещественного типа integer k ! Невыполняемый оператор INTEGER объявляет переменную ! k целого типа, принимающую целые положительные 9 О. В. Бартеньев. Современный ФОРТРАН ! и отрицательные значение и нуль, например: k = -55 Невыполняемые операторы объявления типа должны располагаться в программе ранее любого исполняемого оператора. 1.4. Объекты данных Программа выполняет обработку данных. Данные представлены в программе в виде переменных и констант. Объекты данных (переменные и константы) различаются именами, типами и другими свойствами. Переменная, имя которой присутствует в программе, считается существующей. Существующая переменная может быть определенной и неопределенной. Переменная становится определенной после того, как она получит значение, например в результате присваивания или выполнения ввода. Константы бывают именованными и буквальными (неименованными). Именованная константа объявляется с атрибутом PARAMETER. Значение именованной константы не может быть изменено в результате вычислений. Поэтому ее имя не может находиться в левой части оператора присваивания или быть элементом списка ввода. real a, b ! Объявляем вещественные переменные с именами a и b ! Задание именованной константы n integer, parameter :: n = 5 ! Все именованные константы имеют атрибут PARAMETER a = 4.5 ! Теперь переменная a определена, ей присвоено ! значение буквальной константы 4.5 read *, b ! После ввода будет определена переменная b Замечание. При записи не имеющей десятичных знаков вещественной константы следует использовать десятичную точку, например: real a a = 4 ! Так записывать не следует a = 4.0 ! Такая запись подчеркивает тип используемых данных и ! не требует дополнительных преобразований типов данных Начальное значение переменной может быть установлено оператором объявления типа или оператором DATA. В случае задания начальных значений (посредством присваивания) или атрибутов оператор объявления типа должен содержать разделитель :: . real :: a = 1.2, b, c ! Разделитель :: необходим real d / 4.5 / ! Разделитель :: может быть опущен data b, c / 1.5, 4.8 / ! или: data b / 1.5 /, c / 4.8 / В приводимых выше примерах переменные содержат одно значение. Такие переменные называются простыми. Однако можно задать составные 10 1. Элементы языка переменные, содержащие более одного значения. Примером такой переменной является массив. Используя имя составной переменной, можно обеспечить доступ сразу к нескольким значениям. Например: real a(5) ! Объявляем вещественный массив a из пяти элементов a(1) = 1.2 ! a(1) - имя первого элемента массива a a(2) = 1.3 ! Присвоим значение 1.3 второму элементу массива a a(3) = 1.4; a(4) = -4.2; a(5) = 0.0 print *, a ! Вывод всех элементов массива a ! Следующий вывод эквивалентен PRINT *, a print *, a(1), a(2), a(3), a(4), a(5) end Массив не может иметь в качестве элементов другие массивы. Рассмотренный в примере массив является одномерным. Могут быть заданы и многомерные (с числом измерений не более семи) массивы. Протяженность каждого измерения массива задается нижней и верхней границами, которые разделяются двоеточием. Если нижняя граница равна единице, она может быть опущена. В этом случае опускается и разделяющее двоеточие. Например, каждое из следующих объявлений задает массив из 10 элементов: real a(-4:5), b(0:9), c(1:10), d(10) Число измерений массива называется его рангом. Объект данных, ранг которого равен нулю, называется скаляром. В процессе вычислений значение переменной может быть определено или изменено, например, операторами ввода или присваивания. Есть ситуации, в которых значение переменной может стать неопределенным. Такой объект данных, как массив, считается неопределенным, если не определен хотя бы один из его элементов. Для определения массива или его изменения можно использовать конструктор массива. Он может быть применен и в операторах объявления типа, и среди исполняемых операторов, например: real :: a(5) = (/ 1.1, -2.1, 3.1, -4.5, 5.0 /) real b(5) b = (/ 1.1, -2.01, 3.1, 4.05, 50.0 /) Объекты данных различаются типом. Возможные типы данных: целый, вещественный, комплексный, логический, символьный и производный тип - структуры. Элементами массива могут быть объекты одного типа. Примеры объявления объектов данных разных типов: real :: c = 4.56, b(20) ! c и b - вещественные переменные complex :: z = (1.4142, 1.4142) ! z - переменная комплексного типа |