#20 О том, что никогда не меняется. часть II.

Вступление

Здравствуйте!
Радостная новость - нас уже больше чем 2000 !!! А посему (да и не только поэтому:) я наконец дополнил архив рассылки и выложил его на сайте
http://www.web-pascal.narod.ru/ras.htm - качайте, читайте, изучайте :)
Сегодня разговор пойдёт о двух вещах - о типизированых константах и о запуске внешних программ с помощью exec.

Возвращаясь к предыдущему выпуску хочу принести извинения за допущенные ошибки. Речь идёт об операциях над множествами. Произошли ошибки при написании о следующем (жирным/подчёркнутым показаны отсутствующие или не правильные моменты):

+
объединение множест - результат содержит элементы первого множества, дополненные недостоющими элементами второго множества. s4 + s5 содержит [0,1,2,3,4,5, 6]
>=, <=
    вхождение (проверка на подмножество)
  • <= - true если первое множество включено во второе
  • >= - true, если второе множество включено в первое
Хочется поблагодарить внимательных читателей, и сказать ещё раз - если что-то кажется вам странным, требующим разъяснения - обязательно их требуйте. Я ведь не машина и вполне могу допустить ошибку/опечатку и не заметить её.

Новости сайта

Итак главная новость - появился форум. Он конечно не обладает особыми наворотами, но какой уж есть. На первое время подойдёт. Адресс форума - http://www.borda.ru/index.pl?ibp7

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

Теория

Итак сегодня мы продолжим разговор о константах. Первый раз мы с ними столкнулись в теперь уже далёком выпуске #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 без параметров, а значит просто появится командная строка с которой можно будет работать. Например так:
переходим в режим командной строки
 для выхода в программу введите exit


Microsoft(R) Windows 98
   (C)Copyright Microsoft Corp 1981-1999.

D:\>E:

E:\>cd bp

E:\BP>bla-bla
Имя команды или файла указано неправильно

E:\BP>exit
наша программа завершена
Вот в очередной раз и всё.

Голосование

Моё повествование о Паскале подходит к концу. И поэтому надо думать: что дальше? Мои варианты:

  • Изучение Object Pascal - расширение Паскаля до объектно ориентированного языка. Именно на нём основан Delphi. Освоить его очень просто, тем более что осваивать будем на том же BP 7.
  • Изучение программирования под Windows. Не на Delphi - а именно на Паскале. Тут пойдет конкретное повествование об особенностях построения пользовательского интерфейса - вообщем как создавать окна, отдельные элементы и т.п. Можно было бы изучить и на BP 7, но лучше будет использовать какой-либо 32-х разрядный компилятор, так что возможно придётся что-то и скачать.
  • Писать про реализацию различных алгоритмов, не привязываясь к какой-либо ОС. Самые различные алгоритмы - понемногу (или многу) обо всём.
  • Или четвёртая дорога - одобрить мой план: сначала Object Pascal, потом Windows, потом немного о Delphi, а потом уже алгоритмы.
Если есть другие предложения - просьба не стесняться - пишите. Проголосовать и посмотреть как это сделали другие можно по этой ссылке: http://narod.yandex.ru/survey/?id=96923

Лидирующие позициии по прежнему удерживает программирование под Windows.

Это должен посетить каждый!

мои запасы ссылок подходят к концу :( сегодня только три ссылочки:

  • http://bbs.ru/cgi-bin/bbs2html?pub/language/pascal - замечательная колекция. Не пожалеете, если посетите (к тому ж страница не обремена графикой и грузится в мгновение).
  • http://www.codingrulez.narod.ru - как заявленно на главной странице - Сайт программиста. Что вообщем то является правдой :) человек выкладывает свои исходники (это я так понял), коих там довольно много и на разные темы.
  • http://asmdev.narod.ru/asmos.html - если интересно узнать, как пишутся операционные системы, то вам сюда. Довольно интересное введение в написание собственной ОС типа Linux. Исходники на Ассемблере. Жаль, что проект по всей видимости загнулся.

[Назад] [Содержание] [Дальше]
Hosted by uCoz