Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.009 c
14-85190
Дремучий
2002-07-30 11:10
2002.08.26
Не хочу показаться озабоченым... но хотелось бы узнать...


1-85089
greenrul
2002-08-14 16:22
2002.08.26
Посоветуйте компонент ->


7-85272
ZavDim
2002-06-12 17:16
2002.08.26
Ресурсы окошек


4-85305
Doctor Deejay
2002-06-21 17:06
2002.08.26
Перехват клавиш в ДОС-окне или консоли (FAR)


14-85256
Cr@sh
2002-08-02 13:57
2002.08.26
Помогите найти библиотеку компонентов...




   Наверх