Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Callback-функции


TUser ©   (2006-04-25 12:35:00) 

Можно ли использовать локальную процедуру (функцию) в качестве call-back. Например, можно использовать такой код

type
TAAA = function (...): ...;

function AAA (...): ...; // функция типа TAAA
begin
end;

procedure BBB (Func: TAAA);
begin
 Func (...)  
end;

procedure CCC;
begin
 BBB (AAA);
end;

Хотелось бы передавать функции BBB локально объявленную процедуру (функцию). Т.е. что такое

type
TAAA = function (...): ...;

procedure BBB (Func: TAAA);
begin
 Func (...)  
end;

procedure CCC;

function AAA (...): ...; // функция почти типа TAAA
begin
end;

begin
 BBB (AAA);
end;

К сожалению, Паскаль так не умеет. Не компилирует, ибо запрещено правилами языка (incomparable types). Можно ли как-нибудь обмануть компилятор?

Компилятор - Delphi 7.


TUser   (2006-04-25 15:20:00) [1]

Уже наступил на эти грабли. ААА теперь глобальная, аминь.


evvcom   (2006-04-25 15:08:00) [2]

Ну про количество процентов (99% или 99,99% :) ) спорить не буду, т.к. вычислить его практически невозможно. А вот то, что AAA локальная функция в ССС только сейчас обратил внимание. Ну а смысла ее делать локальной без использования лок.переменных CCC тоже не вижу. Посему способ явно не гуд.


jack128   (2006-04-25 14:55:00) [3]

jack128 ©   (25.04.06 14:52) [6]
точнее так: если AAA использует локальные переменные, объявленные в ССС - то AV гарантирован..


jack128   (2006-04-25 14:52:00) [4]

evvcom ©   (25.04.06 14:05) [5]
Главное - понимать, что делаешь, иначе скорее всего словишь AV.

в данном случае в 99% словишь AV.


evvcom   (2006-04-25 14:05:00) [5]

Через указатели и приведение типов можно обманывать компилятор, как вздумается (я уж не говорю про ассемблер). Главное - понимать, что делаешь, иначе скорее всего словишь AV.


TUser   (2006-04-25 12:56:00) [6]

begin...end ©   (25.04.06 12:46) [2]
Точно. Спасибо.


Гаврила   (2006-04-25 12:52:00) [7]

Нельзя.


begin...end   (2006-04-25 12:46:00) [8]

> TUser ©   (25.04.06 12:35)

> BBB (AAA);

BBB (TAAA(@AAA));


Сергей М.   (2006-04-25 12:43:00) [9]


> почти типа


Что значит "почти типа" ?

Паскаль таких "вольностей" не допускает ..


Наверх

Титульная страница Поиск, карта сайта Написать письмо