Воскресенье, 05 Май 2024, 14:27
Uchi.ucoz.ru
Меню сайта
Форма входа

Категории раздела
Высшая математика [11]
Экономическая социология [95]
Основы Менеджмента [64]
Бухгалтерский учёт [157]
Философия [163]
Мировая Экономика [603]
Бизнес планирование [29]
Финансирование и кредитование инвест [105]
Ценообразование [46]
Гражданское право [196]
Права Человека [173]
Основы Маркетинга [207]
Основы энергосбережения [55]
Информатика [0]
Экология и устойчивое развитие [0]
Физика для студентов [0]
Основы права [0]
Политология [0]
Не стандартные примеры на Delphi [169]
Примеры на Delphi7 [108]
Алгоритмы [94]
API [110]
Pascal [152]
Базы Данных [6]
Новости
Чего не хватает сайту?
500
Статистика
Зарегистрировано на сайте:
Всего: 51635


Онлайн всего: 9
Гостей: 9
Пользователей: 0
Яндекс.Метрика
Рейтинг@Mail.ru

Каталог статей


Главная » Статьи » Студентам » Pascal

Пример переменного количества параметров
program
VarPar;

{ Простая программа, демонстрирующая пример
использования переменного

числа параметров заданного типа в Delphi.

Создано в марте 1995, автор Hallvard Vassbotn
hallvard@falcon.no}

uses WinCrt,
SysUtils;

{ предопределения в System:
const

vtInteger = 0;
vtBoolean = 1;
vtChar = 2;
vtExtended = 3;
vtString = 4;
vtPointer = 5;
vtPChar = 6;
vtObject = 7;
vtClass = 8;

type
TVarRec = record
case Integer of
vtInteger: (VInteger: Longint; VType: Byte);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: Char);
vtExtended: (VExtended: PExtended);
vtString: (VString: PString);
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: PChar);
vtObject: (VObject: TObject);
vtClass: (VClass: TClass);
end;}

const

TypeNames : array [vtInteger..vtClass] of PChar
=
('Integer', 'Boolean', 'Char', 'Extended', 'String',
'Pointer', 'PChar', 'Object', 'Class');
{
Согласно on-line
документации (поиск по слову TVarRec), массив параметров
array of const
интерпретируется компилятором подобно массиву array of TVarRec.
Данный пример
будет работать подобно тому, как если бы вы изменили
объявление TestMultiPar
на:

procedure TestMultiPar(const Args: array of TVarRec);
Вы
можете сделать реализацию обычного "очистителя" (без объявления
переменных),
но интерфейс был бы менее понятным пользователям
данного
модуля.

Компилятор видит параметры и формирует массив
непосредственно в
стеке. Для каждого элемента массива также устанавливается
поле
VType с одной из предопределенных констант vtXXXX.
Фактически
значение всегда передается в виде четыре байта информации.
Для
типов Boolean и Char полезную информацию содержит только
первый
байт.

Теперь вы можете писать все те же хорошие программы, но
вдобавок
поддерживающие переменное количество параметров с проверкой
типов!
}

function PtrToHex(P: pointer):
string;
begin

Result := IntToHex(Seg(P^), 4) + ':' + IntToHex(Ofs(P^), 4);end;

procedure
TestMultiPar(const Args: array of const);
var

ArgsTyped : array [0..$fff0 div sizeof(TVarRec)] of TVarRec
absolute Args;
i : integer;begin

for i := Low(Args) to High(Args) do
with ArgsTyped[i] do
begin
Write('Args[', i, '] :
', TypeNames[VType], ' = ');
case VType of
vtInteger: writeln(VInteger);
vtBoolean: writeln(VBoolean);
vtChar: writeln(VChar);
vtExtended: writeln(VExtended^:0:4);
vtString: writeln(VString^);
vtPointer: writeln(PtrToHex(VPointer));
vtPChar: writeln(VPChar);
vtObject: writeln(PtrToHex(Pointer(VObject)));
vtClass: writeln(PtrToHex(Pointer(VClass)));
end;
end;end;

var

MyObj : TObject;begin

Writeln('Проверка выполнения функции с
переменным количеством параметров и проверкой типов:');
MyObj := TObject.Create;
TestMultiPar([123, 45.67, PChar('ASCIIZ'), 'Здравствуй, мир!', true, 'X',
@ShortDayNames, TObject, MyObj]);
MyObj.Free;

{ Для того, чтобы обеспечить предварительную проверку типа при
передаче параметров,
попробуйте следующее: }
writeln(Format('%d', ['привет']));
{ Переданный параметр не является ожидаемым
типом. Строка формата '%d'
говорит о том, что параметр должен быть целой величиной, но вместо
этого мы передаем
строку. Во время выполнения это вызовет исключительную ситуацию, и
если вы не организовали
ловушку для объектов исключения, то Delphi выведет вам строку с
описанием ошибки.
Использование функции C-типа sprintf в этом случае может привести
к непредсказуемым
последствиям (читай: крах системы, GP и все что угодно)
}end.
Категория: Pascal | Добавил: Lerka (22 Ноя 2012)
Просмотров: 393 | Рейтинг: 1.0/ 5 Оштрафовать | Жаловаться на материал
Похожие материалы
Всего комментариев: 0

Для блога (HTML)


Для форума (BB-Code)


Прямая ссылка

Профиль
Воскресенье
05 Май 2024
14:27


Вы из группы: Гости
Вы уже дней на сайте
У вас: непрочитанных сообщений
Добавить статью
Прочитать сообщения
Регистрация
Вход
Улучшенный поиск
Поиск по сайту Поиск по всему интернету
Наши партнеры
Интересное
Популярное статьи
Портфолио ученика начальной школы
УХОД ЗА ВОЛОСАМИ ОЧЕНЬ ПРОСТ — ХОЧУ Я ЭТИМ ПОДЕЛИТ...
Диктанты 2 класс
Детство Л.Н. Толстого
Библиографический обзор литературы о музыке
Авторская программа элективного курса "Практи...
Контрольная работа по теме «Углеводороды»
Поиск
Главная страница
Используются технологии uCoz