varargs
функция не имеет автоматизированный способ определения количества аргументов, передаваемых, потому что только абонент знает, сколько параметров она ставит в стеке вызовов. Функция должна определить аргументы вручную, либо с помощью:
требует вызывающего передать фактическое число параметров в качестве фиксированного параметра:
function _Print(NumStrings: Integer; const Strings: string): string; cdecl;
var
Args: Array[0..100] of Pointer absolute Strings;
I: Integer;
begin
for I := 0 to NumStrings-1 do
begin
WriteLn(PString(@Strings[I])^);
end;
end;
const
Print: function(NumStrings: Integer; const Strings: string): string; cdecl varargs = _Print;
var
A, B: String;
begin
A := 'ABC';
B := 'CDE';
Print(5, a, b, 'asdasd', 'fasd', ' ');
end.
положить значение сторожевого в конце список параметров, который функция может искать. Ваша функция уже закодированы для этого (он ищет nil
указатель), так что просто разъехаться:
Print(a, b, 'asdasd', 'fasd', ' ', nil);
Это, как говорится, либо подход подвержен ошибкам вызывающего абонента и, таким образом, потенциально опасно, если неправильно, поэтому функции varargs
-style используются не очень часто. Вы должны рассмотреть возможность использования параметра открытого массива вместо:
program Project1;
{$APPTYPE CONSOLE}
{$POINTERMATH ON}
function _Print(const Args: array of string): string;
var
I: Integer;
begin
for I := Low(Args) to High(Args) do
begin
WriteLn(Args[I]);
end;
end;
const
Print: function(const Args: array of string): string = _Print;
var
A, B: String;
begin
A := 'ABC';
B := 'CDE';
Print([a, b, 'asdasd', 'fasd', ' ']);
end.
Почему вам нужно сделать все это? Delphi поддерживает массивы и имеет функции, которые позволяют вам получать индексы индекса «Длина», «Низкий» и «Высокий» в массиве. Вы можете просто передать массив своей функции и пропустить ее, не пытаясь перепрыгнуть через все эти обручи. Объявление вашей функции затем становится 'procedure Print (Значения: массив строки);'. –
Это не * быстрее *. Откуда у вас эта смешная идея? * Я предпочитаю указатели * ерунда. Для того, что вы пытаетесь сделать здесь, нет улучшения скорости, и это лишний уровень сложности. (Я оставляю этот комментарий, даже если вы удалили свой комментарий, на который он ответил, сразу после того, как я разместил этот ответ. В интересах других он сказал * Потому что он быстрее. Я предпочитаю понтеры *.) –