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

Вниз

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

 
pathfinder ©   (2006-11-19 11:08) [0]

Добрый день!
Помогите, пожалуйста, разобраться в следующем:

type
 THtmlHelp = function(hwndCaller : THandle; pszFile : PChar; uCommand : cardinal; dwData : longint) : integer; stdcall;

var
 HtmlHelpProc : THtmlHelp;
 HHCtrlHandle : THandle;
...
//загружаю библиотеку
HHCtrlHandle := LoadLibrary("HHCtrl.ocx");
//импортирую оттуда функцию
if (HHCtrlHandle <> 0) then
 @HtmlHelpProc := GetProcAddress(HHCtrlHandle, "HtmlHelpA");  

как я понимаю здесь происходит присвоение адреса ф-ции HtmlHelpA процедурному указателю HtmlHelpProc..а что произойдет, если убрать @ перед HtmlHelpProc? Работает вроде также..


 
jack128 ©   (2006-11-19 11:35) [1]

pathfinder ©   (19.11.06 11:08)
Работает вроде также..

работает. В некоторых случаях @ перед названием переменной процедурного типа писать не нужно...


 
palva ©   (2006-11-19 11:37) [2]

Насколько я понимаю, у функции нет адреса, у нее есть точка входа. Поэтому договорились, что если к имени функции применить @ то получим адрес точки входа. Если переменная имеет функциональный тип и содержит точку входа функции, то имя этой переменной можно использовать точно также как имя фукнции. Поэтому логично выглядит, когда оператор @, примененный, к такой переменной дает не адрес этой переменной, а снова точку входа этой функции. Если же вам нужен адрес этой переменной, то применяйте @@.
Вот я попробовал такой пример на Turbo Delphi.

{$APPTYPE CONSOLE}
type
 Tf = function(i: Integer): Integer;
 Pf = ^Tf;
var
 f1, f2: Tf;
 p: Pf;
function f(i: Integer): Integer;
begin
 f := 555 + i;
end;

begin
 f1 := f;
 f2 := f1;
 p := @@f2;
 WriteLn(p^(1)); // 556
 Readln;
end.


 
pathfinder ©   (2006-11-19 19:21) [3]

..просто хотелось бы понять чем по существу отличается запись
@HtmlHelpProc := GetProcAddress(HHCtrlHandle, "HtmlHelpA"); от
HtmlHelpProc := GetProcAddress(HHCtrlHandle, "HtmlHelpA");  
или в данном случае они равноценны?


 
palva ©   (2006-11-19 20:21) [4]

Что-то я здесь уже запутался. По-моему, начиная с некоторой версии здесь сделали очень свободный синтаксис, зависящий к тому же от контекста. Я такими вопросами стараюсь не задаваться. Работает код - и ладно. С другой стороны, если ты препод, а студент задает вопрос? Я слава богу не препод.


 
jack128 ©   (2006-11-19 22:40) [5]

pathfinder ©   (19.11.06 19:21) [3]
или в данном случае они равноценны?

в данном случае - да


 
pathfinder ©   (2006-11-20 09:52) [6]


> palva ©   (19.11.06 20:21) [4]

я тоже не препод) просто хочется понять суть..то что работает конечно хорошо, но мне как-то не по себе когда я пишу код и не до конца понимаю что он делает..


 
clickmaker ©   (2006-11-20 10:27) [7]


> [6] pathfinder ©   (20.11.06 09:52)

ну добавили интеллектуальности компилятору. Он по контексту определяет, что ты от него хочешь собственно, а код-то генерит в любом случае один и тот же.
Лично я всегда пишу с @. Для единообразия и чтоб неоднозначности не было


 
pathfinder ©   (2006-11-20 11:12) [8]

понятно..всем спасибо!


 
palva ©   (2006-11-20 11:21) [9]


{$APPTYPE CONSOLE}
//  {$T+}
type
 Tf = function: Integer;
function f:Integer;
begin
 Result := 6;
end;
var
 f1, f2: Tf;
 n: Integer;
begin
 // f - вызов функции
 // @f - адрес точки входа
 // f1 занимает 4 байта и хранит адрес точки входа
 // f1 используется как вызов функции
 // @f1 содержимое переменной f1 - адрес входа функции тип Pointer
 // @@f1 адрес переменной f1
 @f1 := @f;
 @f2 := @f1;
 n := f1;              // Здесь вызов функции
 WriteLn(n);           // 6
 n := Integer(@f1);    // Здесь адрес точки входа
 WriteLn(n);           // 4209892
 n := Integer(@f2);    // Здесь та же точка входа
 WriteLn(n);           // 4209892
 n := Integer(@@f1);   // Здесь адрес переменной f1
 WriteLn(n);           // 4216412
 n := Integer(@@f2);   // Адрес другой переменной f2
 WriteLn(n);           // 4216416
 @f1 := @f;            // Корректная форма оператора
 f1 := f;              // Это тоже правильно работает.
 f1 := @f;             // А это не компилируется, если стоит режим {$T+}
                       // сообщение: Incompatible types "Tf" and "Pointer"
end.




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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
15-1164194164
Qwee
2006-11-22 14:16
2006.12.10
Помогите решить задачу!


2-1164106222
JetuS
2006-11-21 13:50
2006.12.10
Передача пользовательского типа из функции в DLL


3-1159871123
ККВ
2006-10-03 14:25
2006.12.10
Как получить значение поля?


15-1163785390
[_]
2006-11-17 20:43
2006.12.10
Шифрование открыто-закрытым ключом.


1-1161812639
VeLeS
2006-10-26 01:43
2006.12.10
Как одновременно редактировать дату и время в TDatetime?