Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
ВнизКак написать функцию? Найти похожие ветки
← →
Ruslan (2004-06-01 18:50) [0]А как написать функцию, которая должна возвращать переменные разных типов, например integer и boolean ? Приведите код пожалуйста....
← →
Vlad © (2004-06-01 18:53) [1]
> Ruslan (01.06.04 18:50)
overload + F1
← →
pasha_golub © (2004-06-01 18:54) [2]Vlad © (01.06.04 18:53) [1]
Опередил блин. :-)
← →
Palladin © (2004-06-01 18:54) [3]Procedure Func1(Var rp_nResult);
← →
Ruslan (2004-06-01 18:57) [4]А поподробнее пожалуйста...
← →
Vlad © (2004-06-01 19:00) [5]
> Ruslan (01.06.04 18:57) [4]
Вот пример перегружаемых функций (из справки)
You can declare more than one routine in the same scope with the same name. This is called overloading. Overloaded routines must be declared with the overload directive and must have distinguishing parameter lists. For example, consider the declarations
function Divide(X, Y: Real): Real; overload;
begin
Result := X/Y;
end;
function Divide(X, Y: Integer): Integer; overload;
begin
Result := X div Y;
end;
← →
Palladin © (2004-06-01 19:21) [6]>
> Vlad © (01.06.04 19:00) [5]
А если в параметрах различия нет?
> Ruslan (01.06.04 18:57) [4]
Const
rkBoolean=0;
rkInt=1;
Procedure Func1(p_nResultKind:Integer;Var rp_utResult);
Begin
Case p_nResultKind of
rkBoolean: Boolena(rp_utResult):=False;
rkInt: Integer(rp_utResult):=Random(100);
// что нибудь еще
End;
End;
Procedure Form1.Button1Click(Sender:TObject);
Var
C:Integer;
B:Boolean;
Begin
Func1(rkBoolean,B);
If B Then ShowMessage("True") Else ShowMessage("False");
Func1(rkInt,C);
ShowMessage(IntToStr(C));
End;
Это первый способ, второй способ.Type
TMultiType=Record
Case Integer of
0: ( BoolValue:Boolean);
1: ( IntValue:Integer);
End;
Function Func1(...):TMultiType;
Begin
End;
Можно и упростить первый сопсоб, через oveload;Procedure Func1(Var rp_bRes:Boolean); Overload;
Procedure Func1(Var rp_nRes:Integer); Overload;</CODE
Красивый второй способ и более безопасный, третий способ не очень, первый способ более гибкий чем второй.
← →
Vit@ly © (2004-06-01 19:30) [7]> Palladin © (01.06.04 18:54) [3]
Procedure Func1(Var rp_nResult);
Все это хорошо, но тем не менее, это не функция (как было в посте), а процедура
← →
Vlad © (2004-06-01 19:32) [8]
> Palladin © (01.06.04 19:21) [6]
по поводу второго способа...
Я вот иногда в VCL встречаю подобные конструкции:
TMultiType=Record
Case Integer of
0: ( BoolValue:Boolean);
1: ( IntValue:Integer);
End;
иногда бывает case byte of ....
и никак не могу понять ее смысл, и как это работает ?
← →
Palladin © (2004-06-01 19:32) [9]
> Vit@ly © (01.06.04 19:30) [7]
Кроме чуть больших телодвижений для получения результата разницы не вижу.
← →
Sergey_Masloff (2004-06-01 19:35) [10]Palladin © (01.06.04 19:32) [9]
>Кроме чуть больших телодвижений для получения результата >разницы не вижу.
Я же не вижу причин применения
TMultiType=Record
Case Integer of
...
при наличии стандартного типа Variant...
← →
Тимохов © (2004-06-01 19:36) [11]
> Vlad © (01.06.04 19:32) [8]
никак не работате, если вы имеете в виду самостоятельное функционирование такой конструкции.
это всего лишь информаци компилятору о том, чтобы он boolvalue и intvalue (из текущего примера) разместил в одной области памяти и возволил обращаться либо к одной переменной, либо к другой.
замечу, что в такой конструкции не может быть дин. массивов, строк, интерфейсов.
← →
jack128 © (2004-06-01 19:37) [12]
> и никак не могу понять ее смысл, и как это работает ?
Variant parts in records + F1
← →
panov © (2004-06-01 19:37) [13]Аналог функции iif из FoxPro:
function iif(isTrue: Boolean;aVar1,aVar2: Variant): Variant;
begin
if isTrue then Result := aVar1 else Result := aVar2;
end;
Возвращает разные типы.
← →
Palladin © (2004-06-01 19:37) [14]
> Vlad © (01.06.04 19:32) [8]
Это всего лишь разная интерпритация одного и того же участка памяти. SizeOf(TMultiType) будет равно 4, ибо берется максимальный по размеру тип. Если работать как TMultiType.BoolValue будет использован лишь только первый байт из 4. Если IntValue будут задействованы все 4.
Можно работать с Integer как с массивом байт или двумя словами.
Type
TIntRec=Record
Case Byte Of
0: ( bytes:array [1..4] of byte );
1: ( Hi,Lo:Word );
2: ( intV:Integer);
end;
← →
Vlad © (2004-06-01 19:38) [15]
> Тимохов © (01.06.04 19:36) [11]
> jack128 © (01.06.04 19:37) [12]
Спасибо, понял
(сорри за ламерский вопрос)
:-)
← →
Vlad © (2004-06-01 19:38) [16]
> Palladin © (01.06.04 19:37) [14]
Тоже спасибо ! :-)
← →
Palladin © (2004-06-01 19:39) [17]
> Sergey_Masloff (01.06.04 19:35) [10]
Быстрее. Только и всего.
← →
jack128 © (2004-06-01 19:44) [18]
> function iif(isTrue: Boolean;aVar1,aVar2: Variant): Variant;
> begin
> if isTrue then Result := aVar1 else Result := aVar2;
> end;
лудше пяток перегруженных функций сделать. Оверхед на обработку вариантов будет на порядок больше самой функции...
← →
Sergey Masloff (2004-06-01 23:32) [19]Palladin © (01.06.04 19:39) [17]
>Быстрее. Только и всего.
Кстати, насколько быстрее?
И стоит ли выигрыш во времени неиспользование стандартных средств?
Ответ на первый вопрос я знаю.
Ответ на второй зависит от задачи. Но стоит помнить что функция типа приведенной Panov(с) выполнится миллион раз за примерно 50 миллисекунд (на Celeron 700) а замена ее на Record с вариантной частью даст выигрыш в 2.5 раза - казалось бы как много. Но это 30мс. экономии на миллионе! вызовов.
← →
Palladin © (2004-06-01 23:52) [20]
> Sergey Masloff (01.06.04 23:32) [19]
Все действительно зависит от задачи. В простых прикладных приложениях конечно можно и избежать нагромождения кода. Я же не спорю и не настаиваю на своем варианте. Но задавший вопрос - новичок. (Который даже еще не совсем осознает что делает), а тут ему панацея такая в виде Variant. Он просто имеет право знать и о Case в Record.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.099 c