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

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

Переменные процедурного типа [D7, XP]


Страницы:   1 2 3

checkmate-maker ©   (2008-10-14 12:45:00) 

Здравствуйте, знатоки.
 Помогите, пожалуйста, разобраться с задачей проверки корректности присваивания.
 Имеется код:

...
var
 f: procedure(a0: Integer; a1:String); stdcall;
begin
 @f := GetPtr();
end;

 Функция GetPtr возвращает указатель на процедуру(либо функцию). Если параметры процедуры f идентичны параметрам в возвращенной процедуры, то все нормально. Если совпадение не достигнуто, то ненормально. Как до вызова f определить корректность параметров?
 Спасибо.


oxffff   (2008-10-14 14:22:00) [41]


> возвращает указатели на разные процедуры(функции) - Что
> делать в этом случае?


Контракт этих процедур совпадает?


clickmaker   (2008-10-14 14:09:00) [42]

> Например если параметр = 0, то это процедура без параметров,
> если = 1, то с одним

заведи массив указателей на процедуры
параметр сделай индексом в нем


checkmate-maker   (2008-10-14 14:04:00) [43]


> каждый раз с разным числом параметров?

Совершенно верно. По сути дела в зависимости от параметра возвращает разные процедуры. Например если параметр = 0, то это процедура без параметров, если = 1, то с одним. Понимаю, что в зависимости от параметра следует использовать разное объявление переменной f, но хочется подстраховаться перед вызовом f, хочется знать, на процедуру с каким числом и каких параметров воззвращен указатель.
 Надеюсь, большой текст не затуманит мысль.
 Спасибо.


Сергей М.   (2008-10-14 14:00:00) [44]


> checkmate-maker   (14.10.08 13:25) [6]


Возвратив pointer ты сознательно "обезличил" подпрограмму.
Получить в ран-тайм инф-цию о прототипе подпрограммы, точка входа в которую представлена нетипизированным указателем, невозможно.


clickmaker   (2008-10-14 13:40:00) [45]

> функция GetPtr параметризована(мои извинения, что не обрисовал
> это сразу), возвращает указатели на разные процедуры(функции)

каждый раз с разным числом параметров?


Slym   (2008-10-14 13:31:00) [46]

checkmate-maker   (14.10.08 13:25) [6]
я застрелил тебя из щетки


checkmate-maker   (2008-10-14 13:25:00) [47]


> Сергей М.

 Спасибо, Сергей. Но хочу уточнить, реальная ситуация диктует, что функция GetPtr параметризована(мои извинения, что не обрисовал это сразу), возвращает указатели на разные процедуры(функции) - Что делать в этом случае?


checkmate-maker   (2008-10-14 13:22:00) [48]


> Я чищу зубы... как мне удостовериться что я в рот засунул
> щетку а не строл дробовика? И что это за странный рычажок
> на моей щетке?


К сожалению щетки производишь не ты. Не стоит быть уверенным в том, что  параметры щетки постоянны во времени - может и выстрелить.


Slym   (2008-10-14 13:08:00) [49]

Я чищу зубы... как мне удостовериться что я в рот засунул щетку а не строл дробовика? И что это за странный рычажок на моей щетке?


Сергей М.   (2008-10-14 13:01:00) [50]


> Функция GetPtr возвращает указатель на процедуру(либо функцию)


Делай так

type
 TMyProc = procedure(a0: Integer; a1:String); stdcall;
var
f: TMyProc;

function GetPtr(): TMyProc;

и ни о чем не задумывайся - чуть что не так, умный компилятор тут же даст по рукам)


Сергей М.   (2008-10-14 12:56:00) [51]


> до вызова f определить корректность параметров?


До вызова f нет никаких параметров, кроме формальных.


clickmaker   (2008-10-14 12:54:00) [52]

а почему может возникнуть несовпадение?


Страницы:   1 2 3

Наверх

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