Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.20;
Скачать: CL | DM;

Вниз

Использование указателей   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
1-64183
SeNtiMeL
2003-03-06 01:03
2003.03.20
как в RichEdit добавить линию разделитель, на весь его размер ?


14-64338
kaif
2003-03-03 14:09
2003.03.20
Зацените сайт


6-64251
BoB
2003-01-27 11:06
2003.03.20
DialUp соединения


1-64053
xZero
2003-03-07 01:01
2003.03.20
Ф-ии в разных модулях...


8-64240
Cosmic
2002-11-26 21:48
2003.03.20
Заголовок MP3?