Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
4-57550
Death
2002-01-18 21:03
2002.03.18
Дебаг...


7-57525
mitya_m
2001-12-13 16:36
2002.03.18
Как проверить на NT/2K, что имя и пароль пользователя правильные


3-57290
bormanoud
2002-02-18 22:54
2002.03.18
Ох эти SQL-запросы...


3-57330
EsKor
2002-02-18 09:47
2002.03.18
Работа с таблицами находящихся в подкаталогах


14-57509
Niko_n
2002-02-04 21:04
2002.03.18
СОМ 2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский