END
Обращение к подпрограмме-функции в вызывающей подпрограмме (программе) является выражением, например в операторе присваивания:
<...>= ... <имя>(<список фактических параметров>) ...
По смыслу использования подпрограммы функции все ее формальные параметры являются параметрами-значениями. Формально допустимо использовать в подпрограмме-функции параметры-переменные. Присутствие таких параметров-переменных в списке формальных параметров означает, что функция в качестве результата своей работы возвращает не одну величину, присваиваемую переменной с именем функции, но и другие величины, также являющиеся результатом работы функции. Такую ситуацию называют побочным эффектом. Побочный эффект – нежелателен.
Пример
REAL FUNCTION MAX(X, Y) | Вызов в основной программе |
MAX=X | Z=MAX(A, B)+1 |
IF(MAX. LT. Y)MAX=Y | Y1=MAX(5,B+5) |
RETURN | Y=MAX(MAX(A, B),MAX(C, D)) |
END |
13.5 Подпрограмма-процедура
Описание подпрограммы-процедуры – вся программная единица:
SUBROUTINE <имя>(<список формальных параметров>)
...
RETURN - оператор возврата в вызывающую программу
END
Обращение к подпрограмме-процедуре:
CALL <имя>(<список фактических параметров>) ...
Параметры-значения – исходные данные алгоритма, параметры-переменные – результат.
О соответствии фактических и формальных параметров
Формальный параметр – это имя, с помощью которого параметр обозначается в описании подпрограммы. Фактический параметр – это конкретная переменная, выражение, массив и т. д., передаваемый процедуре при вызове подпрограммы.
Формальные параметры: | Фактические параметры: |
Переменные | Константы, переменные, выражения |
Массив | Массив |
Имя внешней процедуры | Имя внешней процедуры |
13.6 Операторы EXTERNAL и INTRINSIC
Пример использования функций в качестве параметров
SUBROUTINE INT(F, a,b, N,S)
S=0
h=(b-a)/(N-1)
DO 17 i=1,N-1
x=a+(i-1)*h
S=S+h*F(x)
17 CONTINUE
RETURN
END
EXTERNAL F1,cos CALL INT(F1,0.,1.,11,S1) CALL INT(cos,0.,1.,11,S2) WRITE(*,*)S1,S2 STOP END | INTRINSIC sin, cos CALL INT(sin,0.,1.,11,S1) CALL INT(cos,0.,1.,11,S2) WRITE(*,*)S1,S2 STOP END |
FUNCTION F1(X)
F1 =sin(X)
RETURN
END
FUNCTION cos(X)
cos=1
RETURN
END
Пример (параметр-переменная и параметр-значение)
x=1 {в х действительная единица}
i=1 {в i целочисленная единица}
write(*,*)x, i,1.0,1
call sub(x, i,1.0,1)
write(*,*)x, i,1.0,1
stop
end
subroutine sub(a, b,i, j)
write(*,*)a, b,i, j
a=2
b=2
i=2
j=2
return
end
Результат:
^^^^^^^^^^1.0000000^^^^^^^^^^^^1^^^^^^^^^1.0000000^^^^^^^^^^^^1
^^^^^^^^^^1.0000000^^1.401298E-045^^^^^^^^^^^^^^^1
^^^^^^^^^^2.0000000^^^^^^^^^^^^1.0000000^^^^^^^^^^^^1
Еще пример (нереентерабельность подпрограммы)
subroutine ss
data s/0.0/
s=s+1
write(8,*)s
return
end
call ss
call ss
call ss
stop
end
Результат
1.0000000
2.0000000
3.0000000
Передача массивов
DIMENSION A9100),B(10,10)
READ(*,*)N, M1,M2
...
CALL S1(A, N,...)
CALL S2(B,10,10,M1,M2,...)
...
STOP
END
SUBROUTINE S1(A, N,...)
DIMENSION A(N) /можно А(1)/
SUBROUTINE S2(B, L1,L2,N, M,...)
DIMENSION B(L1,L2)
/достаточно B(L1,1)/
обработка в диап. N, M
Лекция 14
14.1 Файлы
Внешний файл - совокупность однотипных данных (записей) на внешних устройствах.
Форматы записей.
Фиксированной длины | +-----+-----+-----+ | |
Неопределенной длины | ----** | * признак конца записи |
Переменной длины | о----о-------о | о - описатель длины 4 байта |
Блокирование и сегментирование
Блокирование – объединение записей в блоки (для эффективности выполнения операций ввода и вывода на физическом уровне).
Сегментирование – разбиение слишком длинных записей на сегменты (по 128 байт).
14.2 Meтoды дocтупa.
По методам доступа файлы подразделяются на файлы пocлeдoвaтeльнoгo и пpямoгo дocтупa. Файлы прямого доступа могут быть созданы лишь на устройствах прямого доступа (винчестер). Файлы последовательного доступа могут быть созданы на любом устройстве.
Метод доступа задается параметром ACCESS:
ACCESS='SEQUENTIAL' (последовательный доступ – значение по умолчанию)
ACCESS='DIRECT' (прямой доступ)
Записи файла прямого доступа нумеруются по порядку. Зaпиcи имeют oдинaкoвую длину, oпpeдeляeмую пpи oткpытии фaйлa
14.3 Операторы ввода и вывода.
Для передачи данных | |
READ | |
WRITE | вывод данных |
вывод на системное печатающее устройство | |
Для присоединения и отсоединения | |
OPEN | открыть |
CLOSE | закрыть |
Для позиционирования | |
BACKSPACE | в начало предыдущей записи последовательного доступа |
ENDFILE | устанавливает признак конца файла |
REWIND | в начало файла последовательного доступа |
LOCKING | к записи файла прямого доступа |
Остальные | |
INQUIRE | выдает информацию о свойствах устройства или файла |
14.4 Параметры операторов ввода и вывода
FILE | задает имя файла |
UNIT | задает идентификатор устройства |
ACCESS | определяет метод доступа |
FORM | вид записи (форматные, бесформатные) |
ERR | управление ошибкой записи |
END | управление ситуацией "конец файла" |
BLOCKSIZE | устанавливает размер блока |
FMT | указывает способ передачи форматных записей |
IOSTAT | управление ошибкой В/В |
MODE | разрешение чтения, записи, чтения и записи (форма) |
STATUS | состояние файла |
RECL | длина записи |
REC | номер записи |
SHARE | задает форму обращения при совместной работе |
Открытие (присоединение) файла.
Явное (оператор OPEN)
Неявное (по обращению к операторам ввода и вывода)
Предварительное (по умолчанию)
Отмена присоединения - CLOSE
14.5 Операторы OPEN и CLOSE
OPEN(<список ключевых параметров>)
UNIT= <номер канала> целое число 2 байта
FILE='имя файла'
ACCESS='SEQUENTIAL'/'DIRECT'
FORM='FORMATTED'/'UNFORMATTED'
RECL=<длина записи>
STATUS='NEW'/'OLD'/'KEEP'сохранить/'DELETE'удалить/SCRATCH' временный
ERR=<метка>
IOSTAT=<целочисленная переменная> код ошибки ввода и вывода
CLOSE(<список ключевых параметров>)
UNIT= <номер канала> целое число 2 байта
STATUS= 'KEEP' / 'DELETE'
ERR=<метка>
IOSTAT=<целочисленная переменная>
14.6 Оператор READ
READ([UNIT=]U,
[FMT=] <метка формата, или список спецификаций, или имя списка спецификаций>
[,ERR=<метка>]
[,END=<метка>]
[,IOSTAT=<переменная>] - код ошибки ввода
[,REC=<номер записи>] - номер записи) <список элементов ввода>
Характерные наборы параметров для READ
а). Бесформатный ввод прямого доступа
READ([UNIT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]
б). Бесформатный ввод последовательного доступа
READ([UNIT=]...[,ERR=...][,END=...][,IOSTAT=...])[<...>]
в). Форматный ввод прямого доступа
READ([UNIT=]...,[FMT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]
г). Форматный ввод последовательного доступа
READ([UNIT=]...,[FMT=]...[,ERR=...][,END=...][,IOSTAT=...])[<...>]
14.7 Оператор WRITE
Характерные наборы параметров для WRITE
а). Бесформатный вывод в файл прямого доступа
WRITE([UNIT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]
б). Бесформатный вывод в файл последовательного доступа
WRITE([UNIT=]...[,ERR=...][,IOSTAT=...])[<...>]
в). Форматный вывод в файл прямого доступа
WRITE([UNIT=]...,[FMT=]...,REC=...[,ERR=...][,IOSTAT=...])[<...>]
г). Форматный вывод в файл последовательного доступа
WRITE([UNIT=]...,[FMT=]...[,ERR=...][,IOSTAT=...])[<...>]
14.8 Другие операторы
BACKSPACE([UNIT=]...[,ERR=...][,IOSTAT=...]) – на одну запись назад в файле последовательного доступа
REWIND([UNIT=]...[,ERR=...][,IOSTAT=...]) – в начало файла последовательного доступа
ENDFILE([UNIT=]...[,ERR=...][,IOSTAT=...]) – запись признака конца файла в текущую позицию файла последовательного доступа
LOCKING([UNIT=]...,REC=...[,ERR=...][,IOSTAT=...]) – устанавливает текущую позицию на запись с номером, указанным в REC, в файле прямого доступа.
Пример
Распечатать файл на экране
character BUF(79),FNAME*12
1 CONTINUE
WRITE(*,*) ' Введите имя файла'
READ(*,997)FNAME
997 FORMAT(A12)
OPEN(UNIT=15,FILE=FNAME, STATUS='OLD',ERR=2,IOSTAT=IERR)
IF(IERR. EQ.0)GOTO 10
WRITE(*,*)'Ошибка при открытии файла',IERR
GOTO 1
2 CONTINUE
WRITE(*,*)' Нет такого файла',IERR
GOTO 1
10 CONTINUE
READ(15,999,END=19,ERR=18,IOSTAT=IERR)BUF
999 FORMAT(79A1)
WRITE(*,998)BUF
998 FORMAT(' ',79A1)
GOTO 10
18 CONTINUE
WRITE(*,*)'Ошибочка чтения',IERR
GOTO 10
19 CONTINUE
STOP
END
Лекция 15
15.1 Другие средства Фортрана
Оператор COMMON
COMMON X, A(10) block1/C(100) | COMMON Y, I(5),A(5) /block1/I, J,C(98) | COMMON /block1/ C(50),I(50) |
Оператор EQUIVALENCE
DIMENSION A(100),B(200)
EQUIVALENCE (X, A(1),B(1)),(B(101),Y)
Межмодульные связи
Два механизма передачи данных между модулями – общие блоки и механизм формальных и фактических параметров.
15.2 BLOCK DATA
Единственная программная единица программы.
Содержит только декларативные операторы описания, COMMON, DATA, EQUIVALENCE.
Служит для инициализации начальных данных.
15.3 Контрольная точка
Сохранение в файле дампа памяти для продолжения счета в случае сбоя системы или оборудования.
OPEN(8,NAME='...',FORM='UNFORMATTED')
READ(*,*)IPR
IF(IPR. EQ.0)THEN
Формирование начального состояния
ELSE
READ(8)<Список переменных и массивов>
ENDIF
...
1 CONTINUE
Тело цикла итерационного процесса (цикл с постусловием)
IF(FLAGPR)THEN
Печать промежуточных результатов
ENDIF
IF(FLAGWR)THEN
REWIND(8)
WRITE(8)<Список переменных и массивов>
ENDIF
IF(.NOT. FLAGEND) GOTO 1
...
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 |


