![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос !!! [D7, XP]
Vladi78 © (2008-05-21 16:51:00)Подскажите можно ли передавать функции неопределенное количество парметров, не создавая массивов или еще каких ни будь списков ?
Например, одной функции иногда передавать 2 параметра, иногда три ...
Или обязательно нужно сажать все параметры в массив, затем передавать массив в целом ???
palva (2008-05-21 18:22:00) [1]Имеется директива varargs, которая правда довольно ограничена по сфере применения. Цитирую справку:
When importing a C function that takes a variable number of parameters, use the varargs directive. For example,
function printf(Format: PChar): Integer; cdecl; varargs;
The varargs directive works only with external routines and only with the cdecl calling convention.
Renegat (2008-05-21 17:45:00) [2]А вообще телепатор нашёптывает, что нужны всего-навсего параметры "по умолчанию". Проставь в заголовке функции третьему параметру некое значение, показывающее, что параметр передан не был:
func DoSmth(param1:DWORD; param2:string; param3:Byte=255);
MsGuns (2008-05-21 17:41:00) [3]А-а-а-а.. Не в теме ;(
Умище (2008-05-21 17:36:00) [4]
> не создавая массивов или еще каких ни будь списков ?
Renegat (2008-05-21 17:35:00) [5]Юзай стэк! PUSH + CALL и вся недолга! Главное, положить ДО параметров какое-нибудь терминирующее значение, типа 0BADC0DEh итп, по которому функция будет определять, что больше вынимать из стека ничего не надо.
ЗЫ: блин, плачут по мне лавры Кулибина %)
MsGuns (2008-05-21 17:28:00) [6]TList
Умище (2008-05-21 17:27:00) [7]Можно и без массива, если число параметров ограничено известным числом и типами данных.
function FuncTest(aStr: String=''; aInt: Integer=-1; aBool; Boolean=False): Boolean;
han_malign (2008-05-21 17:25:00) [8]function f(params: array of integer): integer;
begin
Result:= Low(Params);
while(Result <= High(Params))do begin
if(Params[Result] = 17)then exit;
inc(Result);
end;
end;
...............
var ar: array[byte]of integer;
dar: array of integer;
............
res:= f(ar);
res:= f(dar);
res:= f([1, -1, 17, 3245872934]);
-------------------------------------------------
function f2(params: array of const): integer;
begin
Result:= Low(Params);
while(Result <= High(Params))do begin
if((Params[Result].VType = vtInteger) and (Params[Result].VInteger = 17))then exit;
inc(Result);
end;
end;
...................
f2([@ar, 'boo', true, 17, TForm]);
Kolan (2008-05-21 17:16:00) [9]> Можно, смотри тему OpenArrays
Я конечно поняимаю, что он сначала Open, а потом все остальное, но таки массив.
Vladi78 (2008-05-21 17:13:00) [10]Не соображу как использовать в данном случаи OpenArrays, подскажите ... Под рукой ни одного учебника а интернет лимитный :((
Anatoly Podgoretsky (2008-05-21 16:54:00) [11]> Vladi78 (21.05.2008 16:51:00) [0]
Можно, смотри тему OpenArrays
Putnik (2008-05-21 16:53:00) [12]Директива overload не подходит?