Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1085836974
Drakon
2004-05-29 17:22
2004.06.13
Перенос Linux-приложений на Linux


1-1085716666
Глеб
2004-05-28 07:57
2004.06.13
Скомпилировать файл


14-1085629034
Rentgen
2004-05-27 07:37
2004.06.13
Графические форматы


1-1085665499
Lena19
2004-05-27 17:44
2004.06.13
как узнать какие элементы масива принадлежат другому масиву


1-1085929480
Seldon
2004-05-30 19:04
2004.06.13
Размеры и координаты макс. окна





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский