![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переменные процедурного типа [D7, XP]
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]а почему может возникнуть несовпадение?