Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Вниз

Передача параметров в функцию 


shane54   (2002-03-02 19:46) [0]

ВОПРОС! Подскажите пожалуйста, что делать, если я не знаю, сколько параметров мне надо будет обработать в функции? Т.е. может быть будет передан 1 параметр, а может быть 50.
Итог: мне нужна функция с динамическим определением кол-ва параметров.



Sasha9   (2002-03-02 20:25) [1]

используй динамический массив



Фэ   (2002-03-02 20:54) [2]

To Sasha9 © (02.03.02 20:25)
Вот интересный подход...
И ты сможешь это продемонстрировать ?

To shane54
procedure My(x: int; s: string; a: double=0; b: integer = 0);

My(x,s,a,b);
My(x,s,a);
My(x,s);



Anatoly Podgoretsky   (2002-03-02 20:59) [3]

В некоторых случаях подойдет array of const, при этом количество и типы не ограничены, так и порядок.
Автору бы не мешало уточнить вопрос, желательно с примером вызова.



Фэ   (2002-03-02 21:32) [4]

Насчет array of const согласен, но мороки больше

procedure DoWithArgs(Args: array of const);
var
I: Integer;
begin
for I := Low(Args) to High(Args) do
begin
case Args[I].VType of
vtInteger: //Args[I].VInteger;
vtBoolean: //Args[I].VBoolean then
vtChar: //Args[I].VChar;
vtExtended://Args[I].VInteger;
vtString: //Args[I].VString^;
vtPointer: //Args[I].VPointer;
vtPChar: //Args[I].VPChar;
vtClass: //Args[I].VClass.ClassName;
vtObject: //Args[I].VObject.ClassName;
//..
end;
end;



drpass   (2002-03-02 23:09) [5]

>Фэ
А почему бы и нет? Никто ведь не говорил, что тип параметров может иметь столько вариаций.
Но, что касается самой проблемы - если в программе возникает необходимость передавать такое количество параметров, то это значит, что сам подход к решению задачи в корне неверен. Всегда можно найти красивое решение.



DK   (2002-03-03 02:13) [6]

Есть одна задумка, только я её не проверял, поэтому прошу камнями не закидывать :)

type
TParam=record
A, B: Integer;
C, D: Char;
end;

//--вызов------
var
Param: TParam;
begin
MyProc(@Param);
end;

//----процедура------
procedure MyProc(P: Pointer);
begin
....
end;


то есть в процедуру передавать указатель на структуру параметров



Набережных С.   (2002-03-03 08:25) [7]


> DK © (03.03.02 02:13)

Не закидают :) Этот прием достаточно широко используется, только запись должна содержать поле идентификатора версии.



Sasha9   (2002-03-03 10:35) [8]

2Фэ © (02.03.02 20:54)
procedure proc(a:array of SomeType);
var i:integer;
.........
begin
..........
for i:=0 to high(a) do
....................



Anatoly Podgoretsky   (2002-03-03 10:40) [9]

А автор так и молчит, какую именно емк реализацию нужно.



Davojan   (2002-03-03 12:07) [10]

По-моему, если возникла такая необходимость, то скорее всего это архитектурный просчёт в программе. Все предложенные выше методы известны, но ни один не является универсальным, да оно и правильно, потому что автор вопроса не сказал ничего конкретного, а такую задачу нужно решать в частном случае. Одно дело, когда передаваемые параметры однотипны, другое - когда это не так.
На мой взгляд, если уж сильно припекло передавать неопределённое число параметров и это в программе используется широко, то лучше написать простенький контейнерный класс, экземпляры которого будут их в себе содержать и передавать один объект. А если это используется в одном месте, то использовать один из предложенных выше методов, оптимальный для данной конкретной ситуации.



[NIKEL]   (2002-03-03 13:16) [11]

...а в С++ есть такая классная штука, как перегрузка функций :), но это так, к слову...



drpass   (2002-03-03 13:40) [12]

А в Паскале тоже есть... правда, программисты на Сях Паскаля не знают :) но это так, к слову



[NIKEL]   (2002-03-03 13:50) [13]

2dpass
%-)



Фэ   (2002-03-03 15:53) [14]

To Sasha9 © (03.03.02 10:35)
Слишком частный случай, чтобы считать за метод.
Кроме того, правильно здесь разъяснили, что
надо искать корректные решения решения.
С подачи Подгорецкого Anatoly Podgoretsky © (02.03.02 20:59)
я уже привел известный пример
Фэ © (02.03.02 21:32)



drpass   (2002-03-03 21:37) [15]

>[NIKEL]
Так, для развития :)))
procedure A(i:integer);overload;
procedure A(r:real; z:integer);overload;
И т.д.
Так же, как и в Сях, перегруженные методы различаются только по параметрам



shane54   (2002-03-04 11:26) [16]

To ALL.
Возможно, как заметили многие, я неправильно подошел к проблеме.
Необходимо сформировать строку в соответствии с некой спецификацией. Строка состоит из ЗАГОЛОВКА и из ТЕЛА. ЗАГОЛОВОК целиком зависит от ТЕЛА. ТЕЛО иногда зависит от 1 переменной, иногда от 50. Каждая переменная содержит название и значение.
Вот, в общих чертах, проблема. Могу еще конкретизировать...



kaif   (2002-03-04 12:05) [17]

Может, передавать переменную типа TStrings ?
procedure MyProcedure(Params: TStrings);
А в нее предварительно запихивать параметры:

with Params do
begin
Values["Параметр1"]= "Вася";
Values["Возраст"]= "23";
Values["Is Приколист"]= "1";
Values["День рождения"]= "01.01.2001";
end;
MyProcedure(Params);
Так хранятся параметры в компоненте TIBDatabase.
При таком подходе только байтовый поток не передашь, но мне так кажется, в данном случае этого и не требуется.
-----------
А если совсем приспичило передавать байтовый поток, то лучше все это передать вообще как TStream. А кишки Stream-а организовать, как душе угодно.
Умные люди тут предлагали передавать экземпляр класса. Это вообще идеальное решение для такой задачи, IMHO. Я бы создал целую иерархию классов и определил бы параметр, как экземпляр класса их главного предка. В самой процедуре я бы анализировал класс переданного объекта и принимал соответствующие решения, как это все интерпретировать.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.019 c
7-57546           DNT                   2001-12-16 20:09  2002.03.18  
Биос + температура процессора + обороты вентилятора


1-57458           ARmaN                 2002-03-01 12:56  2002.03.18  
Сокеты


3-57328           SZap                  2002-02-19 16:58  2002.03.18  
+ поле


1-57426           igorr                 2002-03-03 05:25  2002.03.18  
Пропорциональность при загрузке изображения, когда Stretch=True.


14-57502          Дмитрий_Б             2002-01-18 15:34  2002.03.18  
Работает ли кто-нибудь в электросвязи ?