Информационные системы ускорителей

ЛАБОРАТОРНЫЙ ПРАКТИКУМ:
«ПРОГРАММИРОВАНИЕ НА ФОРТРАНЕ»

СТРУКТУРА ПРАКТИКУМА

ВВЕДЕНИЕ

ВАЖНАЯ ИНФОРМАЦИЯ

1. ПРАВИЛА ЗАПИСИ ПРОГРАММЫ

1. Набор символов Фортрана

2. Форматы записи программы

3. Фиксированный формат

4. Свободный формат

2. ТРАНСЛЯЦИЯ ПРОГРАММЫ

1. Программа в одном исходном файле

2. Трансляция исходного файла

3. Трансляция нескольких исходных файлов

4. Трансляция модулей

3. КОНЦЕПЦИЯ ДАННЫХ ЯЗЫКА ФОРТРАН

1. Имена (идентификаторы)

2. Понятие типа

3. Буквальные константы

4. Разновидности типов и диапазоны значений

5. Скалярные переменные и константы

6. Массивы

7. Производные типы данных

4. ВЫРАЖЕНИЯ И ПРЕОБРАЗОВАНИЕ ТИПОВ

1. Скалярное присваивание

2. Арифметика Фортрана

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

4. Работа с текстовыми строками

5. Операции с массивами

5. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ

1. Условный оператор и конструкция IF

2. Оператор варианта – конструкция CASE

3. Циклы – разновидности конструкции DO

4. Оператор GO TO

6. ВВОД/ВЫВОД ДАННЫХ

1. Простейшие операции ввода/вывода

2. Форматный ввод/вывод данных

3. Ввод/вывод массивов в неявных циклах

4. Файловый ввод/вывод

7. ПРОГРАММНЫЕ КОМПОНЕНТЫ И ЭЛЕМЕНТЫ ООП

1. Структура программных компонентов

2. Внешние подпрограммы

3. Внутренние подпрограммы

4. Модули как библиотеки производных типов

5. Встроенные функции Фортрана

ЗАДАЧИ ДЛЯ ПРОГРАММИРОВАНИЯ

7.2. Внешние подпрограммы

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


Структура подпрограммы-процедуры:

SUBROUTINE имя процедуры (список формальных параметров)
...описание формальных параметров
...описание внутренних параметров
...исполняемые операторы
CONTAINS
...внутренние подпрограммы
END имя процедуры

Структура подпрограммы-функции:

тип функции FUNCTION имя функции (список формальных параметров)
...описание формальных параметров
...описание внутренних параметров
...исполняемые операторы
CONTAINS
...внутренние функции
END подпрограммы-процедуры

Запись операторов подпрограммы-процедуры ограничена операторными скобками: SUBROUTINE … END, а для подпрограммы-функции операторными скобками являются: FUNCTION … END.

После имени подпрограммы в круглых скобках указывается список формальных параметров, которые передаются в подпрограмму при ее вызове. Формальные параметры, переданные в подпрограмму-процедуру, изменяются алгоритмом процедуры и возвращаются в программную компоненту, из которой была вызвана подпрограмма.

Подпрограмма-процедура может вернуть в вызывающую программу только список формальных параметров – для ее вызова используется оператор CALL (Пример 7.1).


Пример 7.1. Подпрограмма-процедура, складывающая два числа.

program SUBPRG1
real :: X=1., Y=2., Z
call SUMAB(X, Y, Z)
print *, Z
end

subroutine SUMAB(A,B,C)
real :: A, B, C
C = A + B
return
end
	

Подпрограмма-функция может использоваться в вызывающей программе аналогично переменной соответствующего типа (Пример 7.2), в том числе в выражениях и присваиваниях – для этого функция должна быть объявлена внешней, с помощью оператора EXTERNAL. Точно так же используется внутри Подпрограммы-функции ее имя – переменной соответствующего типа, но перед завершением работы подпрограммы-функции эта переменная должна получить значение, которое вернется в вызывающую программу. При этом подпрограмма-функция, как и подпрограмма-процедура, может изменять значения элементов списка формальных параметров (но этого делать не рекомендуется).


Пример 7.2. Подпрограмма-функция, складывающая два числа.

program SUBPRG2
external SUM
real :: X=1., Y=2., Z
Z = SUM(X, Y)
print *, Z
end

real function SUM(A,B)
real :: A, B
SUM = A + B
return
end
	

Возврат управления в вызывающую процедуру осуществляется оператором RETURN, а если в силу каких-то причин, необходимо прекратить работу программы в целом, то можно воспользоваться оператором STOP.

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


Пример 7.3. Передача массива в подпрограмму.

program SUBPRG3
integer, parameter :: M=1, N=2
integer , dimension(M,N) :: A, B, C
data A /1, 2/ B /3, 4/
call SUMARR(A, B, C, M, N)
print *, C
end

subroutine SUMARR(X,Y, Z, K, L)
integer , dimension(K, L) :: X,Y, Z
Z = X+Y
return
end
	

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

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


Пример 7.4. Независимость имен (A и B) в программных компонентах.

program SUBPRG4
external SUM
real :: A=1., B=2.
print *,  SUM (A, B)
end

real function SUM(A, B)
real :: A, B
SUM = A + B
return
end