Работа с командной строкой. Функции ParamCount и ParamStr




Функции 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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: