Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
272
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

8. Программные единицы

SAVE, STRUCTURE, UNION - и операторы объявления типа.

Использование исполняемых операторов в BLOCK DATA недопустимо. Присутствующие в BLOCK DATA операторы объявления типа не могут

содержать атрибуты ALLOCATABLE, EXTERNAL, INTENT, OPTIONAL, PRIVATE и PUBLIC.

Имя блока данных может появляться в операторе EXTERNAL. Это позволит при сборке программы загрузить из библиотеки нужный BLOCK DATA.

Пример:

block data bd2

! Этот блок может следовать сразу за

complex z

! программой gocom предыдущего примера

common /vab/ z

! Инициализация объекта common-блока

data z /(2.0, 2.0)/

end block data bd2

 

8.17. Рекурсивные процедуры

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

прямой, во втором - косвенной.

Процедура также является рекурсивной, если содержит оператор ENTRY и обращается к любой задаваемой этим оператором процедуре.

Оператор объявления рекурсивной процедуры должен предваряться префиксом RECURSIVE. Внутри рекурсивной процедуры интерфейс к этой процедуре является явным.

Пример. Разработать подпрограмму subst, которая в данной строке заменяет все вхождения подстроки sub1 на подстроку sub2. Так, если дана строка 'abc1abc2abc3' и sub1 = 'abc', а sub2 = ' d', то результатом должна быть строка ' d1 d2 d3'.

program stgo

character(len = 20) :: st = 'abc1abc2abc3'

call subst(st, 'abc', ' d')

! subst содержит прямую рекурсию

write(*, *) st

! d1 d2 d3

end

 

recursive subroutine subst(st, sub1, sub2)

character(len = *) st, sub1, sub2 ! Длина каждой строки определяется

integer ip

! длиной соответствующего

ip = index(st, sub1)

! фактического параметра

if(ip > 0) then

 

st = st(:ip - 1) // sub2 // st(ip + len(sub1):)

call subst(st, sub1, sub2)

! Рекурсивный вызов подпрограммы

265