![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Универсальная переменная [D6, WinXP]
DDA © (2004-06-16 01:06:00)как бы мне сделать такую процедуру чтоб в параметрах можно было передавать любую переменую любого вида?
Возможноли это?
Danilka (2004-06-16 15:35:00) [1]Кстати, в Д7, в модуле MathUtils (если не ошибаюсь) есть процедура IfThen, которая как-раз описывается как аналог оператора "?:", у нее точно также, аргументы вычисляются перед вызовом, или все-таки компилятор знает про нее и расписывает ее как конструкцию if .. then .. else ..?
Нет под рукой Д7, а интересно.
Anatoly Podgoretsky (2004-06-16 15:29:00) [2]Игорь Шевченко © (16.06.04 14:59) [13]
Сравни a := iif (true, 123, 'abc')
panov (2004-06-16 15:19:00) [3]Игорь Шевченко © (16.06.04 15:16) [15]
угу.
Проверил пример из Игорь Шевченко © (16.06.04 14:59) [13],
результат - 2
если вызвать a := iif (False, 2, 1/0) - Exception, как и предполагал-)
Игорь Шевченко (2004-06-16 15:16:00) [4]panov © (16.06.04 15:11)
Обычно функция iif позиционируется, как замена оператора ? : в C.
Ее отличие от оператора заключается в первую очередь в том, что все ее аргументы вычисляются перед вызовом функции, поэтому ее применение иногда может сопровождаться весьма интересными эффектами.
panov (2004-06-16 15:11:00) [5]>Игорь Шевченко © (16.06.04 14:59) [13]
Сравни:
Не понял, что сравнить?
Игорь Шевченко (2004-06-16 14:59:00) [6]panov © (16.06.04 14:52)
Сравни:
a := iif (true, 2, 1/0)
и
a = 1 ? 2 : 1/0;
panov (2004-06-16 14:52:00) [7]function iif(isTrue: Boolean;aVar1,aVar2: Variant): Variant;
begin
if isTrue then Result := aVar1 else Result := aVar2;
end;
Igorek (2004-06-16 14:49:00) [8]
> DDA © (16.06.04 01:06)
> как бы мне сделать такую процедуру чтоб в параметрах можно
> было передавать любую переменую любого вида?
> Возможноли это?
Конечно возможно.
Anatoly Podgoretsky (2004-06-16 12:11:00) [9]ПсихЪ (16.06.04 11:36) [9]
Это не политкоректно
ПсихЪ (2004-06-16 11:36:00) [10]Мне подобное понадобилось при создании универсальной процедуры криптования record'ов. Я использовал такой приём:
procedure ProcName( var Data; Size : integer );
var
i : integer;
begin
for i := 0 to Size - 1 do
begin
TBytes(Data)[i] := {присваиваем что-нибудь байту c номером i}
end;
end;
Вот пример простого шифрования произвольных record'ов:
procedure CryptData( var Data; Size : integer );
var
i : integer;
begin
for i := 0 to Size - 1 do
begin
TBytes(Data)[i] := TBytes(Data)[i] xor i;
end;
end;
Вызывается так:
type
RecordName1 = record
r1 : integer;
r2 : string[5];
end;
RecordName2 = record
r1 : string[5];
r2 : RecordName1;
end;
var
rn1 : RecordName1;
rn2 : RecordName2;
begin
rn1.r1 := 10;
rn1.r2 := 'niger';
rn2.r1 := 'niga';
rn2.r2 := rn1;
CryptData( rn1, SizeOf( RecordName1 ) );
CryptData( rn2, SizeOf( rn2 ) );
end.
Вот.
y-soft (2004-06-16 07:53:00) [11]Есть еще распространенный способ - использование указателей на указатели
pasha_golub (2004-06-16 06:11:00) [12]Про обнуление это к IronHawk'y. :=)
Gero (2004-06-16 01:49:00) [13]
> вот теперь мне нужно эту переменную сбросить(обнулить,стереть,уничтожить,очистить)
Какую переменную?
GuAV (2004-06-16 01:47:00) [14]
> сбросить(обнулить,стереть,уничтожить,очистить)
не зная что нельзя знать как.
зы - посмотри Variant types - может что надо.
DDA (2004-06-16 01:34:00) [15]вот теперь мне нужно эту переменную сбросить(обнулить,стереть,уничтожить,очистить)
GuAV (2004-06-16 01:09:00) [16]Gero © (16.06.04 01:08) [1]
:) да, я торможу :)
Gero (2004-06-16 01:08:00) [17]procedure a(const x);
begin
end;
GuAV (2004-06-16 01:08:00) [18]Procedure P1(var A);
Procedure P2(const A);