Подтвердить что ты не робот

Передавать неограниченное количество параметров в процедуру

в Delphi процедура записи может обрабатывать:

write(TF,st1)

и

write(TF,st1,st2,st3,st4);

Я хочу объявить процедуру, которая также может это сделать, что такое синтаксис?

и опции:

write(TF,[st1,st2,st3])

менее желателен, хотя я знаю, как это сделать.

Основная цель состояла в том, чтобы передать ShortString в функцию, которая сделала бы вызов чтения из файла и будет считываться по длине ShortString, как определено. однако после передачи его как варианта или в открытом массиве ShortString теряет свой "размер" и становится 255, что делает этот переход непригодным для меня. но ответ все равно получен, если вы хотите передать открытый массив.

4b9b3361

Ответ 1

Прежде всего Inc и Write являются плохими примерами, потому что они оба получают специальную обработку от компилятора. Вы не можете написать функцию, которая ведет себя точно так же, как эти два. Существуют альтернативы, которые вы должны исследовать.

Взгляните на перегрузки

Вы можете создать несколько версий вашего метода, используя различное количество параметров и различные типы. Что-то вроде этого:

procedure MyInc(var i:Integer); overload;
procedyre MyInc(var i:Integer; const N:Integer); overload;
procedure MyInc(var i:Integer; const N1, N2: Integer); overload;
procedure MyInc(var i:Integer; const N1, N2, N3: Integer):overload;

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

Использование открытых массивов в качестве параметров

Функция может принимать параметр типа array of YourType, и когда вы вызываете эту функцию, вы можете передать столько параметров, сколько вам может понадобиться:

procedure MyInc(var i:Integer; Vals: array of Integer);

И затем используйте его следующим образом:

MyInc(i, []); // no parameters
MyInc(i, [1]);
MyInc(i, [1, 34, 43, 12]);

Ответ 2

Просто для дополнения ответа Cosmin: если список параметров имеет разные типы, вы можете использовать параметр открытого массива (также известный как "массив const" ). Подробнее о документации Delphi.

Пример (из документация):

function MakeStr(const Args: array of const): string;
var
  I: Integer;
begin
  Result := '';
  for I := 0 to High(Args) do
     with Args[I] do
        case VType of
            vtInteger:  Result := Result + IntToStr(VInteger);
            vtBoolean:  Result := Result + BoolToStr(VBoolean);
            vtChar:     Result := Result + VChar;
            vtExtended: Result := Result + FloatToStr(VExtended^);
            vtString:   Result := Result + VString^;
            vtPChar:    Result := Result + VPChar;
            vtObject:   Result := Result + VObject.ClassName;
            vtClass:    Result := Result + VClass.ClassName;
            vtAnsiString:  Result := Result + string(VAnsiString);
            vtCurrency:    Result := Result + CurrToStr(VCurrency^);
            vtVariant:     Result := Result + string(VVariant^);
            vtInt64:       Result := Result + IntToStr(VInt64^);
  end;
end;

Ответ 3

Только для иллюстративных целей:

Delphi поддерживает способ записи "реальных" переменных аргументов, но он очень громоздкий и предназначен для использования в основном для объявления внешних функций C с переменными аргументами, такими как printf, поскольку он включает в себя выполнение некоторых низкоуровневых трюков для доступа к аргументы в стеке.

Он включает в себя модификаторы cdecl и varargs:

procedure MyWrite_; cdecl;
begin
  ... some magic here ...
end;

var
  MyWrite: procedure; cdecl varargs = MyWrite_;

begin
  MyWrite(1);
  MyWrite(1, 2);
  MyWrite(1, 2, 3);
end;

Более подробное объяснение можно найти в ответе Барри Келли на Как функция с "varargs" извлекает содержимое стека?