Програма може повністю поміщатися в одному блоці. Але, як правило, реальні програми мають значний обсяг, і розміщення в одному блоці ускладнює їх написання і налагодження. Крім того, будь-яке завдання може бути розділена на відносно самостійні підзадачі. Оформлення кожної підзадачі у вигляді окремого блоку сприяє розділенню роботи над програмою на незалежні етапи і оперативному внесенню змін.
Блоки, виділені для подзадач, називаються програмними одиницями. У Фортране розрізняються три види незалежних програмних одиниць:
Незалежні програмні одиниці мають незалежні системи позначень і можуть компілюватися окремо. Всі елементи незалежної програмної одиниці локальні. тобто доступні всередині цієї одиниці і недоступні поза нею.
Частиною незалежних програмних одиниць можуть бути внутрішні процедури - процедури, опис яких укладено всередині програми-носія.
Головна програма є обов'язковим компонентом будь-якої програми. При запуску програми операційна система передає управління операторам головної програми. Головна програма повинна бути єдиною, інакше неможливо визначити точку входу - оператор, з якого починається виконання програми.
Структура головної програми така:
У квадратні дужки укладені необов'язкові частини тексту програми, які можуть бути відсутніми. Як видно, єдиним обов'язковим елементом головної програм є операторend. Відмітною ознакою головної програми є відсутність спеціальних операторів (subroutine, function іліmodule) в її заголовку: саме це характеризує цей компонент як головну програму.
Оператор end головної програми не тільки відзначає кінець програмного компонента, а й є сигналом до зупинки всієї програми. Хороша організація програми передбачає повернення управління в головну програму на завершальній стадії роботи, але якщо необхідно зупинити програму в іншому місці, використовується оператор stop.
Якщо оператор end містить ім'я програми, то воно має збігатися з ім'ям, зазначеним в операторі program в заголовку.
Блок Оператори опису. якщо він є, повинен передувати блоку Виконувані оператори. Відсутність блоку Виконувані оператори можливо, але безглуздо.
Оператор contains відокремлює виконувані оператори від опису внутрішніх процедур.
Зовнішні процедури - це програмні одиниці, які служать для виконання окремих підзадач в рамках загальної задачі програми в цілому.
Нерідко послідовність команд, що виконують конкретні дії, необхідно повторити в декількох конкретних точках програми. Послідовність операторів для виконання таких дій можна записати у вигляді процедури.
Загальний вигляд зовнішньої процедури:
Для того, щоб процедура почала виконуватися, необхідно її викликати. Програмна одиниця, з якої здійснюється виклик процедури, називається викликає програмної одиницею. Процедури викликаються з головної програми або з інших процедур і при завершенні повертають управління викликає програмної одиниці.
Повернення управління з процедури в зухвалу програмну одиницю, в точку виклику процедури, здійснюється оператором return. Операторend не тільки вказує на кінець процедури, але і діє як оператор return. Оператор return може припинити виконання процедури в будь-якому її місці і передати управління в місце виклику. Як і оператор stop. він може бути частиною умовного оператора.
Всі процедури повинні мати можливість обмінюватися даними з зухвалими програмними одиницями - отримати вхідні дані від зухвалої програми і передати їй результати своєї роботи. Обмін інформацією з процедурами може відбуватися через параметри (аргументи) процедур і / або через глобальні дані. Організація глобальних даних розглядається в розділі «Модулі».
При передачі даних через параметри в заголовку процедури вказується список формальних параметрів - перелік змінних і / або масивів, які використовуються в ході виконання процедури.
В операторах виклику процедури вказується список фактичних параметрів. При виклику процедури відбувається підстановка фактичних параметрів замість формальних параметрів.
Кожен параметр процедури має наступні основні характеристики:
- ранг - розмірність або кількість вимірювань; ранг змінної дорівнює 0;
- призначення параметра - вхідний, вихідний або універсальний (змінний).
Призначення формального параметра визначає атрибут intent:
intent (in) - вхідний параметр;
intent (out) - вихідний параметр;
intent (inout) - універсальний параметр.
Якщо атрибут призначення параметра не вказано, то за замовчуванням параметр вважається універсальним (inout).
Є два основних види процедур: процедури-функції function і процедури-подпрограммиsubroutine.
Структура процедури-функції має вигляд:
[Тип] functionімя функції (список формальних параметрів)
Процедура-функція обчислює значення заданого типу і повертає управління в зухвалу програмну одиницю разом з цим значенням. Отримане значення називається повертається значенням. У зухвалій програмі повертається значення може бути присвоєно змінної або підставлено в вираз.
Оператор function називається заголовком функції. Тип функції, вказаний в її заголовку, є типом значення, що повертається. Крім того, в заголовку вказується унікальне ім'я функції, складене за правилами Фортрана, і список формальних параметрів в круглих дужках.
Серед операторів опису повинні бути присутніми опису формальних параметрів функції і внутрішніх (локальних) змінних і масивів.
Серед виконуваних операторів обов'язково має визначатися повертається значення функції, ім'я якого збігається з ім'ям функції.
Якщо в операторі end вказано ім'я функції, воно має збігатися з ім'ям в заголовку функції.
Виклик функції не вимагає спеціального оператора. Зверненням до функції є ім'я функції і список фактичних параметрів в круглих дужках, наприклад:
A = ім'я функції (список фактичних параметрів)
Приклади звернення до функції:
a = sqrt (x) + sqrt (s)
Оформити у вигляді функції знаходження в речовій матриці елемента з максимальним абсолютним значенням. У головній програмі потрібно унормувати матрицю, тобто розділити всі її елементи на отриманий елемент.
real function Max_Abs (Array, cRows, cCols)
заголовок функції; яке значення дійсного типу
implicit none. оператор повинен бути в кожній програмної одиниці
формальні параметри функції - масив, кількість його рядків і стовпців
integer, intent (in). cRows, cCols
integer. i, j. змінні циклів
integer. NumI, NumJ. координати елемента матриці
NumI = 1; NumJ = 1. максимальним по модулю вважаємо Array (1,1)