Понедельник, 18 Ноября 2024, 08:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Функция с произвольным количеством аргументов?
nilremДата: Среда, 01 Августа 2012, 11:12 | Сообщение # 1
Просветленный разум
Сейчас нет на сайте
Вопрос - есть ли в делфи возможность создавать функции с произвольным количеством аргументов?
В с++ это выглядит так функция(...). Вместо троеточия можно вписать хоть тысячу аргументов.

Кто знает или найдет, пример использования, пожалуйста, выложите сюда. Ходить по сторонних ссылках я сейчас не могу.


Windmill 2

WindMill 2D Game Engine
FERAMONДата: Среда, 01 Августа 2012, 11:35 | Сообщение # 2
Dansy Riter
Сейчас нет на сайте
Quote (nilrem)
Вопрос - есть ли в делфи возможность создавать функции с произвольным количеством аргументов?


Ты супер модератор и такие вопросы элементарные задаёшь.

Каждой функции может быть, как мы уже говорили, список аргументов. С помощью этих аргументов в функцию передается различная информация (например, значение числа, факториал которого надо подсчитать). Каждый аргумент представляет собой переменную или константу.

С помощью аргументов данные в функцию можно передавать тремя различными способами. Это передача аргументов по значению


Наш проект "ИСТОРИЯ АНГЕЛА "
-=WarChief=-Дата: Среда, 01 Августа 2012, 11:40 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Посмотри тут.
ArchidoДата: Среда, 01 Августа 2012, 12:22 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Еще можно через varargs:
Code

type
   VarProc = procedure (Hello: PChar) stdcall varargs;
   
procedure Test(Hello: PChar; Params: Pointer); stdcall;
var
   p : array [0..31] of record
     case Integer of
       0 : (i : LongInt);
       1 : (s : PChar);
     end absolute Params;
begin
   Writeln(Hello, #9, p[0].i, #9, p[1].i, #9, p[2].i, #9, p[3].s);
end;
...
   VarProc(@Test)('Hi', 1, 2, 3, 'test'); // вызов


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
nilremДата: Среда, 01 Августа 2012, 12:24 | Сообщение # 5
Просветленный разум
Сейчас нет на сайте
FERAMON, Не лезь в то, в чем ни бита не смыслишь.
Супермодераторство не делает меня супермозгом, оно лишь налагает некоторые обязанности и дает определенные привилегии. Например, казнить тебя за флуд, коим является твой, совершенно не в тему, пост.

Quote (-=WarChief=-)
Посмотри тут.

У меня в роутере 5 разрешенных IP. IP делфисорса среди них нет. Я же попросил примеры кода постить сюда.


Windmill 2

WindMill 2D Game Engine
mobipakДата: Среда, 01 Августа 2012, 12:56 | Сообщение # 6
Подрывник
Сейчас нет на сайте
Вообще вот, что было с того сайта:
Code


program VarPar;

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

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

}

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.
ArchidoДата: Среда, 01 Августа 2012, 13:02 | Сообщение # 7
Сэнсэй
Сейчас нет на сайте
Мм, кстати, если разные типы не требуются, то можно ведь через массив передавать, вроде этого:
Code


procedure Proc(Params: array of Integer);
var
   I: Integer;
begin
   for I := 0 to High (Params) - 1 do ...
end;

...

Proc([12, 34, 56]);


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг