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

Вниз

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

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

Наверх





Память: 0.48 MB
Время: 0.049 c
15-1163750262
Alx2
2006-11-17 10:57
2006.12.10
Учебники и задачники по Паскалю.


2-1164332339
Sp1r1t
2006-11-24 04:38
2006.12.10
Экспорт из DLL


15-1164019231
alex-drob
2006-11-20 13:40
2006.12.10
Раздача интернет трафика по сети на Delphi


2-1163878857
c0rben
2006-11-18 22:40
2006.12.10
Фиксированный вывод


6-1153381513
s_pavell
2006-07-20 11:45
2006.12.10
Аудит принтера в сети





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