Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.18;
Скачать: CL | DM;

Вниз

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

 
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. Я бы создал целую иерархию классов и определил бы параметр, как экземпляр класса их главного предка. В самой процедуре я бы анализировал класс переданного объекта и принимал соответствующие решения, как это все интерпретировать.



Страницы: 1 вся ветка

Текущий архив: 2002.03.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
3-57307
Yan B.
2002-02-13 20:33
2002.03.18
Table Language в Paradox


3-57321
AndrewK
2002-02-19 17:48
2002.03.18
Как составить запрос


1-57350
Юрий Л
2002-03-04 13:15
2002.03.18
Проблема с компонентами


1-57432
phenix
2002-03-03 12:44
2002.03.18
по существу (delphi 6)


1-57362
Анонимщик
2002-03-01 19:01
2002.03.18
Два THintWindow