Руководство по языку B.Pascal 7

         

Разделы инициализации в оверлейных модулях


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

Взяв в качестве примера ранее рассмотренную программу Editor, предположим, что модули EdInOut и EdMain содержат код инициализации. При этом требуется, чтобы процедура OvrInit вызы- валась перед кодом инициализации модуля EdInOut, и единственный способ осуществить это состоит во введении дополнительного нео- верлейного модуля, который следует перед EdInOut и вызывает в своем разделе инициализации процедуру OvrInit.

unit EdInit; interface implementation uses Overlay; const OvrMaxSize = 80000; begin OvrInit('EDITOR.OVR'); OvrInitEMS; OvrSetBuf(OvrMaxSize); end.

В операторе uses программы модуль EdInit должен следовать перед всеми оверлейными модулями:

program Editor; {$F} uses Overlay,Crt,Dos,EdInit,EdInOut,EdFormat,EdPrint,EdMain; {$O EdInOut } {$O EdFormat } {$O EdPrint } {$O EdFind } {$O EdMain }

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

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

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



Содержание раздела