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

Вниз

процедурные типы   Найти похожие ветки 

 
einsam   (2002-08-15 00:56) [0]

Здравствуйте.
Следующий код является ошибочным:
type
TMyProc: procedure (Param: integer);
PMyProc: ^TMyProc;
...
begin
...
PointToProc := @SomeProc;
PointToProc^(1);
...
end;

Ошибка возникает при разыменовывании указателя - неверный
доступ к памяти. А вот почему такое действие нельзя произвести?


 
Юрий Зотов   (2002-08-15 01:38) [1]

Произвести можно, но немного иначе.

Процедуры и функции - сами по себе уже указатели. Компилятор трактует @SomeProc и SomeProc как один и тот же адрес, а операция @ здесь нужна лишь для обхода синтаксической неоднозначности - чтобы в неявных случаях подчеркнуть, что надо не вызвать процедуру, а взять ее адрес.

procedure Proc(Param: integer);
begin
ShowMessage(IntToStr(Param))
end;

type
TProc = procedure(Param: integer);

procedure TForm1.Button1Click(Sender: TObject);
var
P: TProc; // а не ^TProc
begin
P := @Proc; // можно и без @
P(1) // без всяких разыменований
end;


 
einsam   (2002-08-15 01:56) [2]

>Юрий Зотов © (15.08.02 01:38)
Здесь я код несколько упростил. В действительности же ситуация несколько иная. Моя процедура получает данный указатель в качестве параметра. Далее происходит этакий Callback-вызов. Можно, конечно, сделать этот параметр обычного процедурного типа (как предлагаете Вы), но хотелось бы учесть ситуацию, когда в параметр процедуру передавать не надо, и вместо нее передается nil. Посему и решил пойти через указатели.
Стоп. А может быть можно спокойно передать nil и при использовании обычного процедурного типа? Вы это имеете ввиду?


 
Юрий Зотов   (2002-08-15 02:04) [3]

Почему бы и нет?

Мы же получаем nil, когда GetProcAddress не находит функцию в DLL - и никаких проблем. Но проверять надо с @:

if @Proc <> nil then Proc(...)

Можно даже сделать этот параметр необязательным:

procedure MyEnumProc(..., CallbackProc: TProc = nil);
begin
if @CallbackProc <> nil then CallbackProc(...)
end;


 
einsam   (2002-08-15 02:29) [4]

А вот за это большое спасибо вам.



Страницы: 1 вся ветка

Текущий архив: 2002.08.26;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.016 c
1-85001
sammy
2002-08-16 09:22
2002.08.26
Как очистить канвас формы?


3-84916
Виталий Панасенко
2002-08-06 17:45
2002.08.26
Как победить исключение


1-85040
Chandr
2002-08-13 11:59
2002.08.26
Диалоги


1-84975
jessis
2002-08-15 17:07
2002.08.26
TDatabase


14-85207
гончий
2002-07-31 13:59
2002.08.26
Господа, как законнектить ICQ днем?!