Форум: "Основная";
Текущий архив: 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. Я бы создал целую иерархию классов и определил бы параметр, как экземпляр класса их главного предка. В самой процедуре я бы анализировал класс переданного объекта и принимал соответствующие решения, как это все интерпретировать.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c