Ч А С Т Ь 2. СТАНДАРТНЫЕ БИБЛИОТЕКИ. ГЛАВА 10. МОДУЛЬ SYSTEM. Модуль System является библиотекой Turbo Pascal времени выполнения. Он реализует низко-уровневые программы для всех встроенных возможностей , таких как ввод/вывод, обработка строк, эмуляция 8087, плавающую точку, управление оверлеями и динамическое распределение памяти. Модуль System используется автоматически любым модулем или программой и никогда не требуется указывать его в утверждении uses. Стандартные процедуры и функции. В данном разделе описываются все стандартные процедуры и функции, использующиеся в Turbo Pascal, кроме тех процедур и функций ввода/вывода, которые обсуждаются в разделе "Ввод и вывод". Более подробная информация содержится в Справочном руководстве по библиотеке. Стандартные процедуры и функции являются предопределенными. Поскольку все предопределенные элементы действуют точно так же, как если бы они были объявлены в окружающем программу блоке, то при объявлении, переопределяющем тот же самый идентификатор внутри программы, конфликта не возникает. Процедуры управления обработкой. ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── Exit Позволяет немедленно выйти из текущего блока Halt Останавливает выполнение программы и возвращает в операционную систему RunError Останавливает выполнение программы и генерирует ошибку времени выполнения ─────────────────────────────────────────────────────────────────── Процедуры динамического распределения. Эти процедуры и функции используются для управления кучей - областью памяти, которая занимает всю свободную память, остающуюся при выполнении программы. Полное описание методов, используемых для управления динамически распределяемой областью памяти, приводится в разделе "Менеджер кучи" в главе 16 "Память". ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── Dispose Уничтожает динамическую переменную FreeMem Уничтожает динамическую переменную данного размера GetMem Создает новую динамическую переменную заданного размера и устанавливает переменную-указатель для нее Mark Записывает в переменной-указателе состояние кучи New Создает новую динамическую переменную и устанавливает на нее переменную-указатель Release Возвращает кучу в заданное состояние ─────────────────────────────────────────────────────────────────── Функции динамического распределения. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── MaxAvail Возвращает размер наибольшего непрерывного свободного блока кучи, соответствующей размеру наибольшей динамической переменной, которая может быть распределена в момент вызова MaxAvail MemAvail Возвращает количество имеющихся в куче свободных байт ─────────────────────────────────────────────────────────────────── Функции преобразования. Процедуры Pack и UnPack, определенные в стандартном Паскале, в Turbo Pascal не реализованы. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Chr Возвращает символ с заданным порядковым номером Ord Возвращает порядковый номер, имеющий значение порядкового типа Round Округляет значение вещественного типа до значения типа LongInt Trunc Усекает значение вещественного типа до значения типа LongInt ─────────────────────────────────────────────────────────────────── Арифметические функции. Примечание: При компиляции в режиме числового сопроцессора, {$ N+}, возвращаемые значения в программах с плавающей точкой в модуле System (Sqrt, Pi, Sin и т.д.) имеют тип Еxtended вместо Real. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Abs Возвращает абсолютное значение аргумента ArcTan Возвращает арктангенс аргумента Cos Возвращает косинус аргумента Exp Возвращает экспоненту аргумента Frac Возвращает дробную часть аргумента Int Возвращает целую часть аргумента Ln Возвращает натуральный логарифм аргумента Pi Возвращает значение числа Pi {3.1415926535897932385} Sin Возвращает синус аргумента Sqr Возвращает аргумент в квадрате Sqrt Возвращает квадратный корень аргумента ─────────────────────────────────────────────────────────────────── Процедуры порядкового типа. ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── Dec Уменьшает значение переменной Inc Увеличивает значение переменной ─────────────────────────────────────────────────────────────────── Функции порядкового типа. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Odd Проверяет, является ли аргумент нечетным числом Pred Возвращает предшествующее значение аргумента Succ Возвращает его последующее значение ─────────────────────────────────────────────────────────────────── Строковые процедуры. ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── Delete Удаляет подстроку из строки Insert Вставляет подстроку в строку Str Преобразует численное значение в его строковое представление Val Преобразует строковое значение в его численное представление ─────────────────────────────────────────────────────────────────── Строковые функции. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Concat Выполняет конкатенацию последовательности строк Copy Возвращает подстроку из строки Length Возвращает динамическую длину строки Pos Производит поиск подстроки в строке ─────────────────────────────────────────────────────────────────── Функции для работы с указателями и адресами. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Addr Возвращает адрес заданного объекта CSeg Возвращает текущее значение регистра CS DSeg Возвращает текущее значение регистра DS Ofs Возвращает смещение заданного объекта Ptr Преобразует базовый адрес сегмента и смещение в значение типа указатель Seg Возвращает сегмент для заданного объекта SPtr Возвращает текущее значение регистра SP SSeg Возвращает текущее значение регистра SS ─────────────────────────────────────────────────────────────────── Другие процедуры. ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── FillChar Заполняет заданное число последовательных байт указанным значением Move Копирует заданное число последовательных байт из источника в назначение Randomize Инициализирует случайным значением встроенный генератор случайных чисел ─────────────────────────────────────────────────────────────────── Другие функции. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Hi Возвращает старший байт аргумента Lo Возвращает младший байт аргумента ParamCount Возвращает число параметров, переданных программе в командной строке ParamStr Возвращает заданный параметр командной строки Random Возвращает случайное число SizeOf Возвращает число байт, занимаемых аргументом Swap Производит перестановку старших и младших байт аргумента UpCase Преобразует символ в прописной ─────────────────────────────────────────────────────────────────── Ввод и вывод. В данном разделе кратко описываются стандартные (встроенные) функции и процедуры ввода-вывода Turbo Pascal. Для более детальной информации см. главу 19. Введение во ввод/вывод. Файловая переменная в Паскале - это любая переменная файлового типа. В Паскале имеются три класса файлов : типированный файл, текстовый файл, нетипированный файл. Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Assign. Внешним файлом обычно является поименнованный файл на диске, но он также может представлять собой устройство, как например, клавиатуру или дисплей. Во внешних файлах сохраняется записанная в файл информация, или они служат источниками информации, которая считывается из файла. Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть "открыта". Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с помощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset, доступны только для чтения, а текстовые файлы, открытые с помощью процедуры Rewrite и Append, доступны только для записи. Типированные и нетипированные файлы всегда допускают как чтение, так и запись, независимо от того, были они открыты с помощью процедуры Reset или с помощью процедуры Rewrite. Когда начинается выполнение программы, всегда автоматически открываются стандартные текстовые файловые переменные Input и Output (ввод и вывод). Input - это доступный только для чтения файл, связаный с клавиатурой, а Output - это доступный только для записи файл, связанный с дисплеем. Любой файл представляет собой линейную последовательность элементов, каждый из которых имеет сложный тип (или тип записи) файла. Каждый элемент файла имеет номер. Первый элемент файла считается нулевым элементом. Обычно доступ к файлам организуется последовательно, то есть, когда элемент считывается с помощью стандартной процедуры Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующему по порядку элементу файла. Однако к типированным и нетипированным файлам можно организовать прямой доступ с помощью стандартной процедуры Seek, которая перемещает текущую позицию файла к заданному элементу. Текущую позицию в файле и текущий размер файла можно определить с помощью стандартных функций FilePos и FileSize. Когда программа завершит обработку файла, он должен закрываться с помощью стандартной процедуры Close. После полного закрытия файла, связанный с ним внешний файл обновляется. Затем файловая переменная может быть связана с другим внешним файлом. По умолчанию, при всех обращениях к стандартным функциям и процедурам ввода/вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибки программа прекращает работу и выводит на экран сообщение об ошибке. С помощью директив компилятора {$I+} и {$I-} эту автоматическую проверку можно включить или выключить. Когда автоматическая проверка отключена, то есть когда процедура или функция была скомпилирована с директивой {$I-}, ошибки ввода/вывода, возникающие при работе программы, не приводят к ее останову. При этом, чтобы проверить результат выполнения операции ввода/вывода, нужно использовать стандартную функцию IOResult. Процедуры В/В. ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── Assign Присваивает имя внешнего файла файловой переменной ChDir Меняет текущий справочник Close Закрывает открытый файл Erase Удаляет внешний файл GetDir Возвращает текущий справочник на заданном диске MkDir Создает подсправочник Rename Переименовывает внешний файл Reset Открывает существующий файл Rewrite Создает и открывает новый файл RmDir Удаляет пустой подсправочник Seek Передвигает текущую позицию файла на указанную компоненту (не используется с текстовыми файлами). Truncate Усекает размер файла до текущей позиции в файле. (Не используется с текстовыми файлами) ─────────────────────────────────────────────────────────────────── Функции В/В. ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Eof Возвращает для файла состояние end-of-file (конец файла) FilePos Возвращает текущую позицию в файле. (Не испольтзуется с текстовыми файлами) FileSize Возвращает текущий размер файла. (Не испольтзуется с текстовыми файлами) IOResult Возвращает целое значение, являющееся состоянием последней выполненной операции ввода/вывода. ─────────────────────────────────────────────────────────────────── Текстовые файлы. В этом разделе описываются операции ввода/вывода, использующие файловую переменную стандартного типа Text. Заметим, что в Turbo Pascal тип Text отличается от типа file of char. При открытии текстового файла внешний файл интерпретируется особым образом: считается, что он представляет собой последовательность символов, сгруппированных в строки, где каждая строка заканчивается символом конца строки (end of line), который представляет собой символ перевода каретки, за которым, возможно, следует символ перевода строки. Для текстовых файлов существует специальный вид операций чтения и записи (Read и Write), которые позволяют вам считывать и записывать значения, тип которых отличается от типа Char. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(F, i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i. Как было отмечено ранее, имеются две стандартные переменные текстового типа - Input и Output. Стандартная файловая переменная Input - это доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Output - это доступный только для записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы файлы Input и Output автоматически открываются, как если бы были выполнены следующие операторы : Assign(Input,''); Reset(Input); Assign(Output,''); Rewrite(Output); Аналогично, после выполнения программы эти файлы автоматически закрываются. Если программа использует стандартный модуль Crt, то файлы Input и Output не будут по умолчанию относиться к стандартным файлам ввода/вывода. Для некоторых стандартных процедур, список которых приведен в данном разделе, не требуется явно указывать в качестве параметра файловую переменную. Если этот параметр опущен, то по умолчанию будут рассматриваться Input и Output, в зависимости от того, будет ли процедура или функция ориентирована на ввод или вывод. Например, Read(Х) соответствует Read(Input,Х) и Write(Х) соответствует Write(Output,Х). Если при вызове одной из процедур или функций из этого раздела вы задаете файл, этот файл должен быть связан с внешним файлом с помощью процедуры Assign и открыт с помощью процедуры Reset, Rewrite, или Append. Если для ориентированной на вывод процедуры или функции Вы указываете на файл, который был открыт с помощью процедуры Reset, то выведется сообщение об ошибке. Аналогично, будет ошибкой задавать для ориентированной на ввод процедуры или функции файл, открытый с помощью процедур Rewrite или Append . Процедуры: ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── Append Открывает существующий файл для добавления Flush Выталкивает буфер файла вывода Read Считывает одно или более значений из текстового файла в одну или более переменных Readln Выполняет те же действия, что и Read, а потом делает пропуск до начала следующей строки файла SetTextBuf Назначает буфер ввода/вывода для текстового файла Write Записывает в текстовый файл одно или более значений Writeln Выполняет те же действия, что и Write, а затем до- бавляет к файлу маркер конца строки ─────────────────────────────────────────────────────────────────── Функции: ─────────────────────────────────────────────────────────────────── Функция Описание ─────────────────────────────────────────────────────────────────── Eoln Возвращает для файла состояние end-of-line (конец строки) SeekEof Возвращает для файла состояние end-of-file (конец файла) SeekEoln Возвращает для файла состояние end-of-line (конец строки) ─────────────────────────────────────────────────────────────────── Нетипированные файлы. Нетипированные файлы представляют собой каналы ввода/вывода нижнего уровня, используемые в основном для прямого доступа к любому файлу на диске, независимо от его типа и структуры. Любой нетипированный файл объявляется со словом file без атрибутов, например: var Datafile : file; Для нетипированных файлов в процедурах Reset и Rewrite допускается указывать дополнительный параметр, чтобы задать размер записи, использующийся при передаче данных. По умолчанию длина записи равна 128 байт. Предпочтительной длиной записи является длина записи, равная 1, поскольку это единственное значение, которое точно отражает размер любого файла (если длина записи равна 1, то неполные записи невозможны). За исключением процедур Read и Write для всех нетипированных файлов допускается использование любой стандартной процедуры, которую разрешено использовать с типированными файлами. Вместо процедур Read и Write здесь используются соответственно процедуры BlockRead и BlockWrite, позволяющие пересылать данные с высокой скоростью. Процедуры. ─────────────────────────────────────────────────────────────────── Процедура Описание ─────────────────────────────────────────────────────────────────── BlockRead Считывает в переменную одну или более записей BlockWrite Записывает одну или более записей из переменной ─────────────────────────────────────────────────────────────────── Переменная FileMode. Переменная FileMode, определенная в модуле System, устанавливает код доступа, который передается в DOS, когда типированные и нетипированные файлы (но не текстовые) открываются с помощью процедуры Reset. По умолчанию задается значение FileMode равное 2, которое разрешает и чтение, и запись. Присваивание другого значения переменной FileMode приводит к тому, что все последующие вызовы процедуры Reset будут использовать этот режим. Диапазон возможных значений FileMode зависит от используемой версии DOS. Однако для всех версий задаются следующие режимы : 0 : только чтение 1 : только запись 2 : чтение/запись Версия 3.X DOS задает дополнительные режимы, которые главным образом связаны с разделенным использованием файлов в сетях. (Для получения более подробной информации, обратитесь к руководству программиста по DOS). Примечание: Новые файлы, созданные с помощью процедуры Rewrite, всегда открываются в режиме Read/Write, соответствующем значению переменной FileMode = 2. Устройства в Turbo Pascal. В Turbo Pascal и в операционной системе DOS внешняя аппаратура, как например, клавиатура, устройство печати, дисплей, рассматриваются, как устройства. С точки зрения программиста устройство можно рассматривать как файл и с ним можно работать с помощью того же набора стандартных функций, что и с файлом. В Turbo Pascal поддерживается два типа устройств - устройства DOS и устройства для текстовых файлов. Устройства DOS. Устройства DOS реализованы с помощью зарезервированных имен устройств, которые имееют специальный смысл. Устройства DOS полностью прозрачны : в Turbo Pascal неизвестно даже, когда файловая переменная связана с устройством, а когда с файлом на диске. Например, программа: var Lst : Text; begin Assign(Lst, 'LPT1'); Rewrite(Lst); Writeln(Lst, 'Hello World ...'); Close(Lst); end. выведет строку 'Hello World ...' на устройство печати, хотя синтаксис точно такой же, как если бы она выводилась в файл на диске. Устройства, реализованные в операционной системе DOS, используются для одновременного ввода или вывода. Таким образом, устройства в DOS используются , обычно, для вывода текстовых файлов. В редких случаях для работы с устройствами DOS может оказаться полезным использование также нетипированного файла. Каждое из устройств DOS описывается в следующем разделе. В других реализациях DOS может быть предусмотрено использование дополнительных устройств, поэтому мы не можем предусмотреть все возможные случаи для описываемых в данном руководстве устройств. Устройство CON. Устройство CON означает консоль, посредством которой выводимая информация пересылается на экран дисплея, а вводимая информация воспринимается с клавиатуры. Если не было изменено направление ввода или вывода, то стандартные файлы Input и Output и все файлы, которым присвоено пустое имя, ссылаются на устройство CON. Вводимая с устройства CON информация является строчно - ориентированной и использует средства редактирования строки, которые описаны в руководстве по DOS. Символы считываются из буфера строки, а когда буфер становится пустым, вводится новая строка. При нажатии клавиши CTRL-Z генерируется символ конца файла (end-of-file), после которого функция eof будет возвращать значение True. Устройства LРT1, LРT2, LРT3. В качестве возможного построчного устройства печати допускается использование трех устройств печати. Если присоединено одно устройство печати, на него обычно ссылаются как на устройство LРT1. Для этого устройства можно также использовать синоним PRN. Построчное устройство печати - это устройство, предназначенное только для вывода. При любой попытке использовать процедуру Reset для открытия файла, связанного с одним из этих устройств, немедлен- но генерируется признак конца файла. Примечание: Стандартный модуль Printer описывает текстовую файловую переменную с именем Lst и устанавливает ее связь с устройством LРT1. Чтобы обеспечить вывод какой-либо информации из вашей программы на устройство печати, включите в предложение uses в своей программе модуль Printer, а для вывода используйте процедуры Write(Lst, ...). Устройства COM1 и COM2. Устройствами коммуникационного порта являются два последовательных коммуникационных порта. Вместо COM1 можно использовать синоним AUX. Устройство NUL. Нулевое устройство игнорирует любую запись на него и немедленно генерирует признак конца файла при попытке считывания с этого устройства. Его следует использовать, если вы не хотите создавать отдельный файл, а в программе требуется указать имя входного или выходного файла. Устройство, предназначенное для текстовых файлов. Устройство предназначенное для текстовых файлов, используется для реализации устройств, не поддерживаемых DOS, или для того, чтобы сделать доступным набор средств, отличающийся от того, который предусмотрен для аналогичного устройства DOS. Хорошим примером устройства, предназначенного для текстового файла, является устройство CRT, реализованное с помощью стандартного модуля Crt. Его основной функцией является обеспечение интерфейса с дисплеем и клавиатурой, аналогично устройству CON в DOS. Однако устройство CRT является более быстрым и поддерживает такие неоценимые средства, как использование цветов и окон. В отличие от устройств DOS, устройства, предназначенные для вывода текстовых файлов, не имеют зарезервированных имен. Фактически у них вообще отсутствуют имена. Вместо этого файл связывается с устройством с помощью обычной процедуры Assign. Например, стандартный модуль Crt реализует процедуру AssignCrt, которая связывает текстовые файлы с устройством CRT. Кроме устройства CRT, в Turbo Pascal для устройств, предназначенных для текстовых файлов, Вы можете писать свои собственные драйверы. Полностью этот вопрос освещается в разделе "Драйвер устройства текстового файла" в главе 19 "Ввод и вывод". Предопределенные переменные. Кроме процедур и функций модуль System обеспечивает ряд предопределенных переменных. Неинициализированные переменные. ─────────────────────────────────────────────────────────────────── Переменная Тип Описание ─────────────────────────────────────────────────────────────────── Input Text стандартный файл ввода Output Text стандартный файл вывода SaveInt00 Pointer сохранение прерывания $00 SaveInt02 Pointer сохранение прерывания $02 SaveInt1B Pointer сохранение прерывания $1B SaveInt21 Pointer сохранение прерывания $21 SaveInt23 Pointer сохранение прерывания $23 SaveInt24 Pointer сохранение прерывания $24 SaveInt35 Pointer сохранение прерывания $35 SaveInt36 Pointer сохранение прерывания $36 SaveInt37 Pointer сохранение прерывания $37 SaveInt38 Pointer сохранение прерывания $38 SaveInt39 Pointer сохранение прерывания $39 SaveInt3A Pointer сохранение прерывания $3A SaveInt3B Pointer сохранение прерывания $3B SaveInt3C Pointer сохранение прерывания $3C SaveInt3D Pointer сохранение прерывания $3D SaveInt3F Pointer сохранение прерывания $3F SaveInt3E Pointer сохранение прерывания $3E SaveInt75 Pointer сохранение прерывания $75 ─────────────────────────────────────────────────────────────────── Инициализированные переменные. ─────────────────────────────────────────────────────────────────── Переменная Тип Начальное Описание значение ─────────────────────────────────────────────────────────────────── OvrCodeList Word 0 список оверлейных сегментов кода OvrHeapSize Word 0 начальный размер буфера оверлеев OvrDebugPtr Pointer nil вектор отладчика оверлеев OvrHeapOrg Word 0 начало буфера оверлеев OvrHeapPrt Word 0 указатель буфера оверлеев OvrHeapEnd Word 0 конец буфера оверлеев OvrLoadList Word 0 список загруженных оверлеев OvrDosHandle Word 0 обработчик DOS оверлеев OvrEmsHandle Word 0 обработчик EMS оверлеев HeapOrg Pointer nil начало кучи HeapPtr Pointer nil указатель кучи HeapEnd Pointer nil конец кучи FreeList Pointer nil список свободных блоков кучи HeapError Pointer nil функция обработки ошибок кучи ExitProc Pointer nil процедура выхода ExitCode Integer 0 выходной код ErrorAddr Pointer nil адрес ошибки времени выполнения PrefixSeg Word 0 префикс программного сегмента StackLimit Word 0 указатель на нижнюю границу стека InOutRes Integer 0 буфер результата в/в RandSeed LongInt 0 опорное значение генератора случайных чисел FileMode Byte 2 режим открытия файла Test8087 Byte 0 результат теста 8087 ─────────────────────────────────────────────────────────────────── OvrCodeList, OvrHeapSize, OvrDebugPtr, OvrHeapOrg, OvrHeapPtr, OvrHeapEnd, OvrHeapList, OvrDosHandle и OvrEmsHandle используются модулем Overlay для реализации менеджера оверлеев Turbo Pascal. Буфер оверлеев размещается между сегментом стека и кучей и OvrHeapOrg и OvrHeapEnd содержат адреса начала и конца сегмента. Размер буфера оверлеев по умолчанию соответствует размеру максимального оверлея в программе; если в программе нет оверлеев, то размер оверлейного буфера равен нулю. Размер буфера оверлеев может быть увеличен через вызов процедуры OvrSetBuf из модуля Overlay, в этом случае размер кучи соответственно уменьшается, увеличивая значение HeapOrg. HeapOrg, HeapPtr, HeapEnd, FreeList, HeapError используются монитором кучи для реализации программ распределения динамической памяти Turbo Pascal. Монитор кучи полностью описан в главе 16 "Память". Переменные ExitProc, ExitCode и ErrorAddr реализуют процедуры выхода. Они так же описаны в главе 18 "Вопросы контроля". PrefixSeg - это переменная типа слово (Word), содержащая адрес сегмента префикса сегмента программы (PSP), создаваемый DOS, когда программа выполняется. Полное описание префикса сегмента программы смотрите в руководстве по операционной системе. StackLimit содержит смещение от нижней границы сегмента стека, соответствующее наименьшему значению регистра SP допустимому до того, пока стек не будет переполнен. Обычно StackLimit равен нулю, но, если программа откомпилирована с опциями {$N+,E+} эмулятор 8087 будет устанавливать его равным 224 для резервирования рабочего пространства на нижней границе сегмента стека, если 8087 нет в системе. InOutRes используется встроенными программами ввода/вывода для запоминания значения возвращаемого при последующем вызове стандартной функции IOResult. RandSeed содержит опорное число генератора случайных чисел. При присваивании необходимого значения переменной RandSeed, функция Random будет генерировать определенную последовательность случайных чисел снова и снова. Это полезно в приложениях, где необходимо шифрование данных, в статистике и симулировании. FileMode позволяет Вам изменить режим доступа, с которым открываются типированные и нетипированные файлы. (Стандартной процедурой Reset). Для больших деталей смотри раздел "Переменная FileMode". Test8087 хранит результат теста автообнаружения сопроцессора, который выполняется при запуске программы, откомпилированной с {$N+}. Для больших деталей смотри главу 14 "Использование 8087". Input и Output - стандартные файлы , необходимые в каждой реализации языка Паскаль. По умолчанию они ссылаются на стандартные входные и выходные файлы в DOS. Для больших деталей смотри раздел "Ввод/вывод". Модуль System устанавливает некоторые вектора прерывания. До установки собственных программ обработки прерываний, System запоминает старые вектора в переменных SaveIntXX. Заметим, что модуль System содержит обработчик прерывания INT 24 для перехвата критических ошибок. В программах Turbo Pascal критические ошибки в DOS обрабатываются как любые другие ошибки ввода/вывода; в состоянии {$ I+} программа завершается с ошибкой времени выполнения, а в состоянии {$I-} IOResult возвращает ненулевое значение. Здесь приводится основа программы, восстанавливающей первоначальный вектор и, следовательно, первоначальную логику обработки критических ситуаций. programm Restore; uses Dos; begin SetIntVeg ($24, SaveInt 24); ........ end. Процедура SwapVectors в модуле Dos переставляет содержимое переменных SaveIntXX с текущим содержимым векторов прерывания. SwapVectors должна быть вызвана непосредственно перед и непосредственно после вызова процедуры Exec, для того чтобы быть уверенным что запускаемый через Exec процесс не использует какой - либо обработчик прерывания, установленный в текущем процессе и наоборот. Для большей информации смотри описание процедуры SwapVectors в Справочном руководстве по библиотеке.