Функции ParamCount и ParamStr необходимы для работы самостоятельных программ (ЕХЕ-файлов) с параметрами командной строки. Под последними понимается набор параметров, разделенных пробелами (реже знаками табуляции), который стоит после имени запускаемого файла в строке MS-DOS, например:
первый параметр
┌──┴──┐
C:\> format a: /S
└──┬──┘ └──┬──┘
имя выполняемого файла второй параметр
Сам по себе параметр может содержать все что угодно, кроме пробелов и табуляций. Правда, можно видеть, что некоторые утилиты требуют разделять параметры знаками типа «/» или «-». Они не являются разделителями по правилам MS-DOS, и программа сама должна разбираться, сколько параметров заложено в конструкциях типа /a/c/e/z/x или -a-g-c.
Если после имени файла в командной строке MS-DOS пусто, то ParamCount возвращает значение 0, в противном случае — число параметров в строке, разделенных пробелами или табуляцией. Это можно использовать для остановки программ, которым при запуске не были переданы параметры-аргументы (рис. 14.1). {295}
PROGRAM Uses_Parameters; { программа MyProg.pas } ... BEGIN { начало основного блока } if ParamCount=0 then begin { параметры отсутствуют } WriteLn; Write ('Запуск программы: '#10); WriteLn('MyProg Параметр1 [ Параметр2 ]'); WriteLn; Halt end; {... выполнение программы... } END. |
Рис. 14.1
После того как определено количество параметров, можно выбрать любой из них, используя функцию ParamStr(N), возвращающую в виде строки параметр номер N. Пусть запуск программы имеет вид
имя программы
┌──┴──┐
C:\TURBO\PAS> Myprog abc /z /c/d 123
└────┬────┘ └────┬────┘
приглашение MS-DOS параметры
В этом примере ParamCount вернула бы значение 4, a ParamStr имела бы такие значения типа String:
N | ParamStr(N) |
‘C:\TURBO\PAS\MYPROG.EXE’ | |
‘abc’ | |
‘z’ | |
‘/c/d’ | |
‘123’ | |
5 и более | ‘ ‘ |
Отметим два момента: во-первых, имеет смысл (всегда!) вызов ParamStr (0), возвращающий полное имя запущенной программы; во-вторых, цифры в строке параметров будут трактоваться как строка, а не как число, и их надо будет преобразовывать процедурой Val. {296}
При запуске из среды программирования ParamStr (0) вернет полное имя файла TURBO.EXE (с указанием пути к нему).
Чтобы обеспечить удобство пользования и «дружелюбность» программы, надо делать так, чтобы при отсутствии параметров при запуске программа начинала спрашивать их с экрана. Это легко сделать с помощью рассмотренных функций. Пусть, например, программа запрашивает имя файла данных, и если пользователь не вводит его, принимает некое значение имени по умолчанию. Тогда алгоритм может выглядеть так, как показано на рис 14.2.
{ Пример программы, принимающей имя файла } VAR s: String; BEGIN { начало основного блока } if ParamCount>0 { есть ли параметры? } then s:=ParamStr(1) {да } else begin {нет } Write('Введите имя файла [DEFAULT.DAT] '); ReadLn(s); if s=' ' then s:='DEFAULT.DAT' end; {... ВЫПОЛНЕНИЕ ПРОГРАММЫ— обработка файла s... } END. |
Рис. 14.2
При отладке программ в среде Турбо Паскаль, где нет командной строки MS-DOS, можно передать программе параметры через команду Parameters в меню системных команд Options.
Доступ к памяти ПЭВМ. Массивы Mem, MemW, MemL
Для простого доступа к любой физической ячейке памяти Турбо Паскаль вводит три предопределенных массива: Mem, MemW, MemL. Они как бы наложены на всю память ПЭВМ. Можно условно считать, что эти массивы известны по системному определению:
VAR
Mem: Array of Byte absolute 0:0;
MemW: Array of Word absolute 0:0;
MemL: Array of Longlnt absolute 0:0;
{297}
Но отличие их от обычных массивов — в задании индексов. Они должны задаваться не номером, а адресом интересующей нас ячейки памяти в формате СЕГМЕНТ:СМЕЩЕНИЕ. Так,
Mem [$B000:$0000] — значение байта (Byte) по данному адресу;
MemW[$B000:$0000] — значение слова (Word) по данному адресу;
MemL[$B000:$0000] — значение двойного слова (LongInt).
Во всем остальном массивы Mem очень похожи на обычные массивы. Если Mem [] стоит справа в операторе присваивания, то это — значение байта (слова, двойного слова), начинающегося с данного индекса-адреса. Но Mem[] может стоять и слева. Это будет означать модификацию байта (слова или двойного слова) по данному адресу, например:
Mem[ $50: 0 ]:= Mem [ $50: 0 ] xor 1;
{ вкл/выкл реакции на Shift+PrtScr }
Элементы массивов Mem могут подставляться как фактические параметры при вызовах процедур и функций. Наиболее часто массивы Mem, MemW и MemL используются для доступа к системным областям памяти, как в примере на рис. 14.3.
PROGRAM Devices; { Анализ байта конфигурации } VAR CFG: Word; { сюда запишется значение ячейки памяти } BEGIN CFG:= MemW[ $0000:$0410 ]; WriteLn(#10, 'Текущая конфигурация:', #10); WriteLn('Макс. число принтеров -->', CFG shr 14); WriteLn('Число серийных портов -->', (CFG shr 9) and 7); WriteLn('Число НГМД --> ', (CFG and 1)*(1 + (CFG shr 6) and 3)); WriteLn('Наличие игрового порта-—>',(CFG and 4096)=1); WriteLn; ReadLn END. |
Рис. 14.3