Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос !!! [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 не подходит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо