Теория
Итак сегодня мы продолжим разговор о константах. Первый раз мы с ними столкнулись в теперь уже далёком выпуске #08 - давненько это было. Однако нам необходимо вернуться к теме констант. Там ведь не всё так просто, как могло показаться с первого раза... Оказывается (вот так сюрприз :))) константа может иметь тип (такого подвоха вы не ожидали?)... такие константы называются типизированными.
Полное объявление констант выглядит так:
имя : тип = значение
Например,
name : string = 'Вася Пупкин';
x : real = 0.123;
days : 1..31 = 1;
Ну это было просто. Гораздо интереснее использовать чего-нить более сложное. Например константы-массивы. Для задания значения необходимо написать их в круглых скобках () через запятую:
someconst : array [1..5] of byte = (0, 1, 2, 3, 4);
Для масивов типа char есть очередная халява. Два следующих объявления идеентичны:
a1 : array [0..9] of char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
a2 : array [0..9] of char = '0123456789';
Но иногда может понадобится создать константу -запись. Что ж не проблемма. Для значений полей используется список из последовательности вида имя поля, двоеточие и константа. Например:
point = record
x, y : real;
end;
const
p1 : point = (x : 0; y : 12);
Поля должны указываться в той последовательности, в какой они перечислены в определении типа. Если в записи есть поле файлового типа, то такая запись не может быть константой.
Константы множества задаются с помощью конструктора множества:
type
day = set of 1 .. 31;
const
someday : day = [1..5, 8, 10];
Вот вообщем и всё про константы. Так же сегодня по просьбе одного из чиателей я раскажу об запуске внешних программ. Иногда просто необходимо перед (или даже во время) исполнения вашей запустить другую. Например ну лениво вам писать текстовый редактор, а надо что б в программе можно было отредактировать файл - пожалуйста запускайте любой внешний!
Для этого надо использовать процедуру exec из модуля Dos.
procedure Exec(Path, CmdLine: string);
Процедура получает две строки: Path - путь и имя файла с программой и CmdLine - командная строка.
Однако не всё так просто, как хотелось бы. Использование этй процедуры имеет некоторые особенности. Во первых вызывающая программа остаётся в памяти, поэтому она не должна съесть всю доступную память. Объём памяти для программы можно установить здеся Options -> Memory Sizes. По умолчанию вся доступная память отводится вашей программе, поэтому внешней программе будет некуда грузиться :( Так же размеры памяти можно установить с помощью директивы $M, которая имеет следующий формат:
{$M stack, low, hight}
где stack - размер стека, low - нижняя граница динамической памяти, hight - верхняя граница. Все размеры указываются в байтах.
Особенности исполнения программ на Паскале так же требует изменения некоторых стандартных векторов прерываний. К ним относятся:
00h 02h 18h 23h 24h 34h 35h 36h 37h 38h 39h 3Ah 3Bh 3Ch 3Dh 3Eh 3Fh 75h
Начальные значения хранятся в переменных SaveIntXX (где XX - номер прерывания в Hex виде). Поэтому перед вызовом внешней программы и после него рекомендуется вызывать процедуру SwapVectors, которая обменивает содержимое векторов прерываний и перечисленных перменных. Вот и все. Теперь рассмотрим пример
{$M 1024, 0, 0}
uses Dos;
begin
writeLn ('переходим в режим командной строки');
writeLn (' для выхода в программу введите exit');
SwapVectors;
Exec (GetEnv ('COMSPEC'), '');
SwapVectors;
writeLn ('наша программа завершена')
end.
Я не стал придумывать ничего свехъестественного и запустил командный процессор command.com. Для получения имени файла я использовал функцию GetEnv
function GetEnv(EnvVar: string): string;
которая возвращает значение переменной среды. Для того что бы увидеть все возможные переменные напишем такую программу:
uses Dos;
var I: Integer;
begin
for I := 1 to EnvCount do
Writeln(EnvStr(I));
end.
Посмотрите что выведет на экран эта программа. И увидите, что у значение параметра COMSPEC - это путь к файлу command.com. В этой програмке я использовал соответственно функции
function EnvCount: Integer;
возвращает число переменных ДОС. И функцией
function EnvStr(Index: Integer): string;
Которая возвращает строку типа Name = Value, где Name - имя переменной, Value - значение.
Так вот вызов Exec (GetEnv ('COMSPEC'), '') - означает, что мы вызвали command.com без параметров, а значит просто появится командная строка с которой можно будет работать. Например так: