Форум: "Потрепаться";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
ВнизИспользование указателей Найти похожие ветки
← →
euru (2003-03-04 14:53) [0]Напишем такую функцию:
function Max(a, b: PInteger): PInteger;
begin
if a^ > b^ then Result := a
else Result := b;
end;
Эта функция может быть как правосторонней, так и левосторонней. Пример:
var
a, b, r: Integer;
begin
a := 10; b := 20;
r^ := Max(@a, @b); // r = 20
Max(@a, @b)^ := 0; // b = 0
end;
← →
Digitman (2003-03-04 15:10) [1]гениальное, ну просто потрясающее открытие)
← →
vuk (2003-03-04 15:10) [2]>Эта функция может быть как правосторонней, так и левосторонней.
Понятия "левосторонних функций" в Delphi не существует. Это что-то из Basic.
← →
euru (2003-03-04 15:16) [3]>Digitman © (04.03.03 15:10)
Открытие, не открытие - а вдруг кому-то и пригодится.
>vuk © (04.03.03 15:10)
Функция левостороняя, когда ее можно вызывать слева от знака присваивания. По поводу Бейсика не знаю, а в C++ они точно есть.
← →
vuk (2003-03-04 15:19) [4]Звиняйте, но здесь у Вас не функция слева от знака присваивания, а результат её выполнения.
← →
vuk (2003-03-04 15:21) [5]Причем, не просто результат, а результат после проведения дополнительной операции (разыменовывание).
← →
Digitman (2003-03-04 15:24) [6]
> vuk
кратко и в точку !)
← →
vuk (2003-03-04 15:26) [7]to euru:
И вообще, вы написанное компилировали?
← →
euru (2003-03-04 15:31) [8]>vuk © (04.03.03 15:21)
Как будто в других языках (в том же С++) не то же самое делается. Однако там ведь такие функции "левосторонными" называются, и никого это не смущает. В понятие "левосторонний" я вложил только то, Что она может вызываться слева от знака присваивания. Не больше.
← →
euru (2003-03-04 15:37) [9]>vuk © (04.03.03 15:26)
Вообще компилировал. Сейчас вручную набирал (Delphi под рукой нет). После вашего замечания посмотрел исходник и увидел ошибку:
вместо
r^ := Max(@a, @b); // r = 20
должно быть
r := Max(@a, @b)^; // r = 20
Спасибо.
← →
stone (2003-03-04 15:42) [10]Только зачем тут указатели?
← →
vuk (2003-03-04 15:44) [11]>Как будто в других языках (в том же С++) не то же самое делается
Нет, не так.
Вот кусок из MSDN:
Dim MyString As String
MyString = "The dog jumps" " Initializes string.
Mid(MyString, 5, 3) = "fox" " MyString = "The fox jumps".
Mid - левосторонняя функция.
← →
uw (2003-03-04 15:47) [12]>euru © (04.03.03 15:37)
В Паскале это обычная ситуация, поэтому все и накинулись. Вот пример, в котором сразу и не скажешь, что и где стоит:
with TForm1.Create(Self) do begin
ShowModal;
Free;
end;
А твой пример и в С нормально работает.
← →
Suntechnic (2003-03-04 16:13) [13]>euru ©
Понятие "левосторонняя ф-ция" в С++ отсутствует. То, что вы имеете в виду в С++ называется lvalue т.е. то, что может стоять слева от знака = и то, от чего можно взять адрес
← →
vuk (2003-03-04 16:20) [14]Я ж говорю - из Basic это понятие. Приведенный пример показывает разницу - функция интерпретируется по-разному, в зависимости от того, с какой стороны от знака равенства она стоит.
← →
han_malign (2003-03-04 16:55) [15]функция интерпретируется по-разному
- интерпретируйте как хотите - а компилируется функция одинаково
← →
euru (2003-03-04 17:44) [16]>All
По-моему, как-то не на то вы реагируете. Я показал, как можно использовать обычные функции в паскале. Использование штатное (т.е. на открытие явно не тянет), хотя и не совсем стандартное. Лучше бы высказались, чем плох или хорош этот пример, а не как это выглядит или называется в других языках.
← →
vuk (2003-03-04 17:47) [17]>хотя и не совсем стандартное
Чем оно сильно отличается, например, от того, что ниже?
FindComponent("Button1").Tag := 1;
← →
euru (2003-03-04 18:03) [18]>vuk © (04.03.03 17:47)
По сути ничем не отличается. Я просто показал, что таким же образом можно использовать и обычные функции по отношению к обычным скалярным типам (точнее, указалям на них). В чем криминал?
Могу еще пример показать (из другой оперы). Вместо
if <условие> then begin
<операторы1>
try
<операторы2>
finally
<операторы3>
end;
end;
можно писать
if <условие> then try
<операторы1>
<операторы2>
finally
<операторы3>
end;
Тоже ничего особенного. Но, по-моему, красиво.
← →
vuk (2003-03-04 18:19) [19]>В чем криминал?
Криминала особого нет. Разве что Access Violation при неправильном использовании можно получить (причем, в обоих случаях).
>Тоже ничего особенного. Но, по-моему, красиво.
Красиво я тоже могу. :o) Например, так(кусок из программы):
with PtrArrayIterator( [dxbZoomFitWidth, dxbZoomFitImage, dxbZoomAsIs ] ) do
while not IsDone do
begin
TdxBarButton( Current ).Down := false;
Next;
end;
← →
panov (2003-03-04 18:20) [20]function Max(const a,b: Integer): Integer;
begin
if a>b then Result := a else Result := b;
end;
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c