Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.006 c
6-85154
simps
2002-06-18 11:35
2002.08.26
Приложение на удаленном компьютере


14-85167
Sten
2002-07-28 01:38
2002.08.26
свой Proxy сервер


3-84934
Gri
2002-08-07 10:48
2002.08.26
Как ускорить цикл для считывания данных


3-84877
iconstanta
2002-08-05 18:54
2002.08.26
ORACLE + SELECT ... FOR UPDATE


14-85187
Пыжев Антон
2002-07-29 07:40
2002.08.26
Эмулятор Linux на Delphi





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