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

11. Операции над внешними файлами

11.15. Функция EOF

Функция возвращает .TRUE., если подсоединенный к устройству u-файл позиционирован на специальной записи "конец файла" или после этой записи. Иначе EOF возвращает .FALSE. Синтаксис функции:

flag = EOF(u)

u - устройство В/В (разд. 10.2).

11.16. Организация быстрого ввода/вывода

Затраты времени на В/В снизятся, если придерживаться следующих правил:

1)по возможности используйте неформатные файлы вместо форматных. Так, вывод в файл, подсоединенный к устройству 10, выполнится значительно быстрее вывода в файл, который подсоединен к устройству

20:

real(4), dimension(100, 20) :: array = 1.0

 

open(10, file = 'a.dat', form = 'unformatted')

! или form = 'binary'

open(20, file = 'a.txt', form = 'formatted')

 

write(10) array

! Доступ к файлу a.dat происходит

write(20, '(20f8.3)') array

! быстрее, чем к файлу a.txt

2)выполняйте В/В всего массива или всей строки, не используя циклов;

3)если все же при передаче многомерных массивов необходимо организовать вложенные циклы, то применяйте естественный порядок передачи элементов массива: во внутреннем цикле должен изменяться самый левый индекс, а во внешнем - самый правый. Это обеспечит доступ к элементам массива в порядке их размещения в памяти, что, понятно, ускорит передачу данных;

4)используйте, если позволяют ресурсы, для хранения промежуточных результатов оперативную память, а не внешние файлы;

5)применяйте в случае форматного В/В при программировании формата целочисленное выражение вместо символьной строки, поскольку в первом случае формат определяется единожды - при компиляции, а во втором - спецификация формата, строка form, - формируется в процессе исполнения программы:

real(4), dimension(1000) :: array integer(4) :: i

character(15) :: form

! Вычисляется значение переменной n

...

!Этот способ заданий формата лучше, чем формирование строки form,

!содержащей спецификацию формата

!<n> - выражение в дескрипторе преобразований

print '(1x, <n> f8.3)', (array(i), i = 1, n)

373

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

write(form, '(a, i5, a)') '(1x', n, 'f8.3)'

! Формируем строку формата form

print form, (array(i), i = 1, n)

! Вывод по формату form

6) создавайте условия для декомпозиции используемых в операторах В/В циклических списков. Для этого переменная цикла должна быть целочисленной, не должна быть формальным параметром, принадлежать оператору EQUIVALENCE и обладать атрибутом VOLATILE, а спецификация формата в случае форматной передачи данных не должна иметь целочисленных выражений в дескрипторе преобразований. Пример циклического списка:

write(10, '(20f8.3)') (array(i), i = 1, n)

! Циклический список из n элементов

Пояснение. Обычно каждый элемент списка В/В обращается к процедурам В/В библиотеки CVF. Временные затраты на эти обращения значительны. С целью их уменьшения неявный цикл замещается компилятором на несколько (до семи) вложенных DO-циклов, использующих для вывода оптимизированную процедуру В/В, которая может осуществлять передачу порциями, содержащими несколько элементов В/В;

7)для увеличения объема передаваемых данных при одном обращении к диску попытайтесь увеличить значение спецификатора BUFFERCOUNT оператора OPEN, но не меняйте значение спецификатора BLOCKSIZE того же оператора, поскольку оно подбирается оптимальным для используемого устройства. Влияние BUFFERCOUNT на скорость передачи данных должно быть установлено экспериментально;

8)не задавайте значение спецификатора RECL оператора OPEN большим, чем размер буфера В/В (этот размер определяется спецификатором BLOCKSIZE), так как передача избыточных данных, незначительно заполняющих буфер, малопроизводительна;

9)значение спецификатора RECL = recl выбирайте таким образом, чтобы буфер В/В заполнялся наилучшим образом. Буфер будет заполнен полностью, если его размер кратен recl или, наоборот, значение RECL кратно размеру буфера, например: размер буфера равен 8192, а в операторе OPEN задан спецификатор RECL = 1024 или RECL = 16384;

10)используйте оптимальный с позиции быстродействия тип записей, задаваемый в операторе OPEN спецификатором RECORDTYPE:

для файлов с последовательной организацией наибольшую производительность обеспечит задание записей фиксированной длины

(RECORDTYPE = 'FIXED');

в случае неформатных файлов последовательной организации используйте записи переменной длины (RECORDTYPE = 'VARIABLE');

374

11. Операции над внешними файлами

в форматных файлах последовательной организации с записями переменной длины задавайте RECORDTYPE = 'STREAM_LF'.

375

12. Конструктор модулей для объектов

ActiveX

12.1. Некоторые сведения об объектах ActiveX

Технология использования в приложениях, в том числе и написанных на Фортране, объектов, созданных в других приложениях, называется

Автоматизацией, ранее известная как OLE Автоматизация. Сами же созданные в рамках этой технологии объекты называются объектами ActiveX. Доступ к объекту осуществляется при помощи интерфейса или напрямую через таблицу виртуальных функций. Объекты ActiveX поддерживают модель многокомпонентных объектов COM.

Интерфейс Автоматизации - это группа взаимосвязанных функций, обеспечивающих доступ к методам и свойствам объекта, а также обработку распознаваемых объектом событий. Метод - это действие, которое может выполнять объект. Свойство - это функция-член, обеспечивающая доступ к информации о состоянии объекта. Большинство свойств имеет две функции доступа - одна возвращает значение свойства, вторая его устанавливает. Событие - это действие, распознаваемое объектом, например щелчок мышью или нажатие клавиши. Событие является методом, вызываемым объектом. В общем случае объект может поддерживать несколько интерфейсов. Указатель на любой из них вернет подпрограмма COMQueryInterface.

Приложение, осуществляющее доступ к объектам ActiveX, называется клиентом ActiveX. Сам же объект ActiveX - это экземпляр класса, предоставляющий клиенту ActiveX свои свойства, методы и события. Объекты ActiveX создаются компонентами ActiveX, в качестве которых могут выступать или приложения, или библиотеки. Так, компонентом

ActiveX является Microsoft Excel. Как правило, компонент ActiveX

предоставляет множество объектов. Например, Excel содержит объект с именем Application (приложение), для инициализации и создания которого в Фортран-приложении потребуется выполнить команды

call COMInitialize(status) ! Инициализируем COM и создаем объект Excel call COMCreateObject("Excel.Application.8", excelapp, status)

Свойство Visible объекта excelapp изменит команда call $Application_SetVisible(excelapp, .true.)

Кроме чисто объектов, компонент ActiveX может предоставлять объекты-наборы, которые в общем случае состоят из различных экземпляров некоторого объекта. Например, Excel может предоставить клиенту ActiveX несколько "Рабочих книг", а в пределах каждой

376