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

Приложение 3. Дополнительные процедуры

CVF и FPS, помимо предусмотренных стандартом Фортрана встроенных процедур, содержат большое число дополнительных процедур, которые в документации распределены по разделам:

Раздел

Модуль

 

 

Запуск программ

DFLIB (MSFLIB)

 

 

Управление программой

"

 

 

Работа с системой, дисками и директориями

"

 

 

Управление файлами

"

 

 

Случайные числа

"

 

 

Процедуры даты и времени

"

Процедуры клавиатуры и звука

"

 

 

Обработка ошибок

"

 

 

Аргументы в командной строке

"

Сортировка и поиск в массиве

"

 

 

Процедуры управления операциями с плавающей точкой

"

 

 

Процедуры QuickWin

"

 

 

Графические процедуры

"

Создание диалогов

DIALOGM

 

 

Работа с национальным языком

DFNLS (MSFNLS)

 

 

Обеспечение совместимости с другими платформами

PORTLIB

 

 

Перечислим и опишем назначение дополнительных процедур (кроме процедур QuickWin и графических процедур), интерфейс к которым находится в модуле MSFLIB. Для вызова таких процедур необходимо к вызывающей программной единице подключить этот модуль, применив оператор USE MSFLIB. Графические процедуры подробно рассмотрены в гл. 12. Там же рассмотрена часть процедур QuickWin.

П.-3.1. Запуск программ

Выполняет функция RUNQQ; вызывает другую программу и ожидает ее завершения.

427

О. В. Бартеньев. Современный ФОРТРАН

П.-3.2. Управление программой

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

Процедура

Назначение

 

 

RAISEQQ

Передает сигнал прерывания выполняемой программе,

 

моделирующий прерывание операционной системы

SIGNALQQ

Управляет обработкой сигналов

 

 

CALL SLEEPQQ

Задерживает исполнение программы на указанный в

 

миллисекундах промежуток времени

Пример:

program sleep

 

use dflib

! Обязательная ссылка на модуль DFLIB

print *, 'Before sleep'

 

call sleepqq(500)

! Задержка на 500 миллисекунд

print *, 'After sleep'

 

end program sleep

 

П.-3.3. Работа с системой, дисками и директориями

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

Процедура

Назначение

 

 

CHANGEDIRQQ

Делает указанную директорию текущей или

 

установленной по умолчанию

CHANGEDRIVEQQ

Делает указанный диск текущим

 

 

DELDIRQQ

Удаляет указанную директорию

GETDRIVESIZEQQ

Возвращает размер указанного диска

 

 

GETDRIVESQQ

Возвращает имена имеющихся в системе дисков

 

 

MAKEDIRQQ

Создает новую директорию с указанным именем

 

 

GETENVQQ

Получает значение из текущего окружения

CALL SETENVQQ

Добавляет новую переменную окружения или

 

устанавливает значение существующей переменной

SYSTEMQQ

Выполняет команду путем передачи командной строки

 

интерпретатору команд операционной системы

Пример:

428

Приложение 3. Дополнительные процедуры

program drive_dir

 

use dflib

 

character(40) :: temp

 

integer(4) :: fres, total, available

 

logical(4) :: sres

 

temp = getdrivesqq( )

 

print *, trim(temp)

! A CDE

!Функция GETDRIVESIZEQQ в случае успеха вернет .TRUE. sres = getdrivesizeqq(temp(3:3), total, available)

!Общее и свободное число байт на диске C:

print '(2i15)', total, available

! 1099956224 256737280

! Создаем переменную окружения path2

sres = setenvqq('path2=c:\')

! строку 'path2=c:\' записываем без пробелов

fres = getenvqq('path2', temp)

 

print *, temp

! c:\mine

temp = 'c:\'

! Будем искать рабочую директорию на диске c:\

fres = getdrivedirqq(temp)

! Поиск рабочей директории

print *, temp

! C:\Program Files\ArrayVisualizer\SAMPLES

sres = makedirqq('c:\temp2')

! Создаем директорию c:\temp2

sres = changedirqq('c:\temp2')

! Делаем директорию c:\temp2 рабочей

temp = 'c:\'

! Ищем рабочую директорию на диске c:\

fres = getdrivedirqq(temp)

 

print *, temp

! c:\temp2

sres = deldirqq('c:\temp2')

! Удаляем директорию c:\temp2

end program drive_dir

 

П.-3.4. Управление файлами

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

Процедура

Назначение

 

 

DELFILESQQ

Удаляет указанные файлы в указанной директории

 

 

FINDFILEQQ

Ищет указанный файл в директориях, содержащихся в

 

переменной окружения

FULLPATHQQ

Возвращает полное имя для указанного файла или

 

директории

GETDRIVEDIRQQ

Возвращает текущий диск и путь к текущей директории

 

 

GETFILEINFOQQ

Возвращает информацию о файлах, имена которых

 

содержат заданную строку

CALL

Упаковывает время для использования функцией

PACKTIMEQQ

SETFILETIMEQQ

RENAMEFILEQQ

Изменяет старое имя файла на новое

429

О. В. Бартеньев. Современный ФОРТРАН

SETFILEACCESSQQ

Устанавливает способ доступа к заданному файлу

 

 

SETFILETIMEQQ

Устанавливает дату изменения для указанного файла

 

 

SPLITPATHQQ

Выделяет в полном имени файла его 4 компонента

 

 

CALL

Распаковывает упакованное время и дату в отдельные

UNPACKTIMEQQ

компоненты

Пример. Открываем файл c:\test.txt как новый, но прежде выполняется попытка его удаления функцией DELFILESQQ.

program files use dflib

character(40) :: fn = 'c:\test.txt', pathname

character(40) :: directory, file

 

character(4) :: drive, extension

 

integer(4) :: ios, fres

 

logical(4) :: sres

! Удаляем файл fn, если он существует

fres = delfilesqq(fn)

sres = setenvqq('path=c:\')

! Устанавливаем переменную окружения path

!Функция FINDFILEQQ вернет нуль, если файл не найден fres = findfileqq('test.txt', 'path', pathname)

!Подсоединяем файл fn к устройству 10

open(10, file = fn, status = 'new', iostat = ios)

if(ios == 0) then ! ios равен нулю, если файл удалось открыть ! Функция FINDFILEQQ возвращает длину полного пути к файлу

fres = findfileqq('test.txt', 'path', pathname)

print *, 'Full path to file test.txt: ', pathname! C:\test.txt else

stop 'Cannot open file c:\test.txt' end if

sres = renamefileqq('c:\test.txt', 'c:\test2.txt')! Изменяем имя файла sres = splitpathqq(pathname, drive, directory, file, extension)

print *, 'path = ', trim(pathname), '; drive = ', trim(drive)! path = c:\test.txt; drive = c: print *, 'directory = ', trim(directory), '; file = ', trim(file)! directoty = \; file = test2

print *, 'extension = ', trim(extension)

! extension = .txt

fres = delfilesqq('c:\test2.txt')

! Удаляем файл 'c:\test2.txt'

end program files

 

П.-3.5. Генерация случайных чисел

Помимо предусмотренных стандартом подпрограмм (разд. 6.19) CALL RANDOM_NUMBER и CALL RANDOM_SEED

для получения случайных чисел можно использовать следующие подпрограммы:

Подпрограмма

Назначение

430