Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
4-64430
[lamer]Barmaglot
2003-01-27 09:43
2003.03.20
Смена Font a у кнопки средствами WINAPI


3-63939
Pat
2003-03-03 12:17
2003.03.20
Paradox ---> Access


1-64170
Radd
2003-03-07 18:33
2003.03.20
Шифрование


14-64381
wicked
2003-03-05 19:07
2003.03.20
ZINC library......


7-64418
paul777_new
2003-01-23 16:50
2003.03.20
Как выяснить под какой ОС работает программа (98,NT4,2000,XP)





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