Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как передать уазатель функции!

272
01 ноября 2004 года
vladsoft
512 / / 20.08.2000
всем привет!
Как сделать вот что пользователь сам где определяет фунуцию, а
я потом в своем компоненте должен её запустить, как мне передать указатель на функцию в компонент для исполнения...
Интресен сам механизм, буду рад любой реализации!!
310
01 ноября 2004 года
fellow
853 / / 17.03.2003
Как определяет? Макрос на скриптоподобном языке? Или выбирает из предложенного списка готовых функций? А может быть, пишет модуль на С++ и отдаёт его твоему компоненту?

[COLOR=silver]Правильно поставленный вопрос содержит в себе половину ответа[/COLOR]
246
01 ноября 2004 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by vladsoft
всем привет!
Как сделать вот что пользователь сам где определяет фунуцию, а
я потом в своем компоненте должен её запустить, как мне передать указатель на функцию в компонент для исполнения...
Интресен сам механизм, буду рад любой реализации!!


см. например TList::Sort()
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
void __fastcall Sort(TListSortCompare Compare);

3
01 ноября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by vladsoft
всем привет!
Как сделать вот что пользователь сам где определяет фунуцию, а
я потом в своем компоненте должен её запустить, как мне передать указатель на функцию в компонент для исполнения...
Интресен сам механизм, буду рад любой реализации!!



Пользователь это кто? Пользователь приложением или программист, использующий твой класс?

А обязательно указатель? Куда проще и надежнее использовать в данном случае параметр шаблона, тогда это паттерн "Стратегия" получается.

272
01 ноября 2004 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by Green


Пользователь это кто? Пользователь приложением или программист, использующий твой класс?

А обязательно указатель? Куда проще и надежнее использовать в данном случае параметр шаблона, тогда это паттерн "Стратегия" получается.


Пользователь это программист, который пишет свою функцию(она может быть любой), которая к примеру выводит сообщение "Вася дурак", мне в своем компоненте необходимо сделать что:
1 как -то передать указатель в компонент(не для исполнения а для хранения)-> не знаю как определить cd-во которое бы хранило указатель на эту функцию
2 Потом как-то её запустить!!!
ТО есть принцип какой компонент работает себе работает и все время смотрит на cd-во в котором хранися указатель на функцию если NULL то нечего исполнять, если не NULL то нужно исполнить....
Мне бы, если честно рабочий примерчик увидеть (хотя бы маленький а то времени нет разбираться что и как, нуно срочно все сделать а то кирдык!!! )
P(

310
01 ноября 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by vladsoft

Пользователь это программист, который пишет свою функцию(она может быть любой), которая к примеру выводит сообщение "Вася дурак", мне в своем компоненте необходимо сделать что:
1 как -то передать указатель в компонент(не для исполнения а для хранения)-> не знаю как определить cd-во которое бы хранило указатель на эту функцию
2 Потом как-то её запустить!!!
ТО есть принцип какой компонент работает себе работает и все время смотрит на cd-во в котором хранися указатель на функцию если NULL то нечего исполнять, если не NULL то нужно исполнить....
Мне бы, если честно рабочий примерчик увидеть (хотя бы маленький а то времени нет разбираться что и как, нуно срочно все сделать а то кирдык!!! )
P(



Значится так. Пусть посторонний программист имеет у себя "интерфейсную" функцию, имеющую определённую сигнатуру, например:
void InvokeMyFunc()
Затем пусть он в этой "интерфейсной" функции вызывает свою хитрую функцию с произвольной сигнатурой.
Чтобы хранить пользовательскую функцию в течении одной сессии, нужно иметь всего лишь навсего указатель на "интерфейсную" функцию.
Сложнее, если пользовательскую функцию нужно хранить от одной сессии до другой. Тут не обойтись без вспомогательных средств записи/восстановления экземпляров пользовательских классов (если программы ООП) или пользовательских управляющих структур (в случае традиционного структурного программирования).

За пять минут никакого толкового примерчика набросать я не могу. За двадцать пять тоже не рискну :D. Так что, вот тебе ночь, ведро купеческого чая, и пиши/отлаживай на здоровье :D

310
01 ноября 2004 года
fellow
853 / / 17.03.2003
А проще - не изобретай велосипед, а используй OLE
3
01 ноября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by fellow
А проще - не изобретай велосипед, а используй OLE


Да, действительно. А ещё лучше RPC. :)
Может не надо усложнять?

Цитата:
Originally posted by vladsoft

Пользователь это программист, который пишет свою функцию(она может быть любой), которая к примеру выводит сообщение "Вася дурак", мне в своем компоненте необходимо сделать что:
1 как -то передать указатель в компонент(не для исполнения а для хранения)-> не знаю как определить cd-во которое бы хранило указатель на эту функцию
2 Потом как-то её запустить!!!
ТО есть принцип какой компонент работает себе работает и все время смотрит на cd-во в котором хранися указатель на функцию если NULL то нечего исполнять, если не NULL то нужно исполнить....
Мне бы, если честно рабочий примерчик увидеть (хотя бы маленький а то времени нет разбираться что и как, нуно срочно все сделать а то кирдык!!! )


Несколько наводящих вопросов:
1. Для данного компонента будет вызываться только одна подобная функция или функция (указатель) может менятся?
2. И соотв-но, в какой момент времени устанавливается указатель? При инициализации экземпляра класса, в любое время?
3. Вызов по этому указателю происходит внутри данного класса или извне, а в данном классе он только хранится?
4. Вызываемая функция должна иметь какой-то типовой интерфейс или нет? Т.е. известно к примеру, что функция будет всегда иметь тип void() или может иметь и вид void(int), int(char*) и т.п.

310
01 ноября 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Green

Да, действительно. А ещё лучше RPC. :)
Может не надо усложнять?


Несколько наводящих вопросов:
1. Для данного компонента будет вызываться только одна подобная функция или функция (указатель) может менятся?
2. И соотв-но, в какой момент времени устанавливается указатель? При инициализации экземпляра класса, в любое время?
3. Вызов по этому указателю происходит внутри данного класса или извне, а в данном классе он только хранится?
4. Вызываемая функция должна иметь какой-то типовой интерфейс или нет? Т.е. известно к примеру, что функция будет всегда иметь тип void() или может иметь и вид void(int), int(char*) и т.п.



4 - любая сигнатура покрывается "интерфейсной" функцией, имеющей стандартный интерфейс.
3 - обобщим: реализации независима от источника вызова
2 - ещё раз обобщим: инициализация класса и создание функции асинхронны
1 - исходим их наиболее общих допущений - в любое время возможен вызов любой функции пользовательского уровня.

Что получаем? Получаем COM:
1 - OLE Automation
2 - DCOM
3 - Apartments
4 - IUnknown

3
01 ноября 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by fellow


4 - любая сигнатура покрывается "интерфейсной" функцией, имеющей стандартный интерфейс.
3 - обобщим: реализации независима от источника вызова
2 - ещё раз обобщим: инициализация класса и создание функции асинхронны
1 - исходим их наиболее общих допущений - в любое время возможен вызов любой функции пользовательского уровня.

Что получаем? Получаем COM:
1 - OLE Automation
2 - DCOM
3 - Apartments
4 - IUnknown



Ну давай обобщать дальше. Обобщим языковые аспекты, обобщим платформу и т.д. Еще немного и можно будет заявлять об использовании ИИ.

Я хотел бы получить ответ от автора топика.

Универсальное - враг хорошего.
В зависимости от требований, эту задачу можно решить либо шаблонами (а-ля аллокатор в STL контейнерах), либо хранением указателя. Думаю, COM - это из пушки по воробьям.

310
02 ноября 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by Green
В зависимости от требований, эту задачу можно решить либо шаблонами (а-ля аллокатор в STL контейнерах), либо хранением указателя. Думаю, COM - это из пушки по воробьям.


Конечно, способ зависит от того, что хочет создать vladsoft. Скорее всего ему не понадобятся ни шаблоны, ни голые указатели. Сделает по аналогии с событиями в VCL - на __closure.

272
02 ноября 2004 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by fellow

Конечно, способ зависит от того, что хочет создать vladsoft. Скорее всего ему не понадобятся ни шаблоны, ни голые указатели. Сделает по аналогии с событиями в VCL - на __closure.


Имеено так, тока мне пример нужен того, как это все замутить, а универсальность мне нафиг не нужна :{

272
02 ноября 2004 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by Green

Да, действительно. А ещё лучше RPC. :)
Может не надо усложнять?


Несколько наводящих вопросов:
1. Для данного компонента будет вызываться только одна подобная функция или функция (указатель) может менятся?
2. И соотв-но, в какой момент времени устанавливается указатель? При инициализации экземпляра класса, в любое время?
3. Вызов по этому указателю происходит внутри данного класса или извне, а в данном классе он только хранится?
4. Вызываемая функция должна иметь какой-то типовой интерфейс или нет? Т.е. известно к примеру, что функция будет всегда иметь тип void() или может иметь и вид void(int), int(char*) и т.п.


Ответы:
1 Указатель меняться не будет один на всю жизнь!
2 указатель устанавливается только послде создания класса
3 Вызов по этому указателю происходит внутри класса
4 да можно void vasya(void)

272
02 ноября 2004 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by Green


Ну давай обобщать дальше. Обобщим языковые аспекты, обобщим платформу и т.д. Еще немного и можно будет заявлять об использовании ИИ.

Я хотел бы получить ответ от автора топика.

Универсальное - враг хорошего.
В зависимости от требований, эту задачу можно решить либо шаблонами (а-ля аллокатор в STL контейнерах), либо хранением указателя. Думаю, COM - это из пушки по воробьям.


Через Ole и COM точно делать не буду! нужно простыми средствами!

310
02 ноября 2004 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by vladsoft
1 Указатель меняться не будет один на всю жизнь!
2 указатель устанавливается только послде создания класса
3 Вызов по этому указателю происходит внутри класса
4 да можно void vasya(void)



Что-то наподобие:

Код:
typedef void (*pfunc)();

YourClass: public YourBaseClass {
 private:
  pfunc  ExternFunc;
 public:
  void   SetExternFunc(pfunc);
  void   MegaProcessing();
};

YourClass::YourClass()
 : YourBaseClass(),ExternFunc(NULL)
{
}
void YourClass::SetExternFunc(pfunc extfunc)
{
 ExternFunc = extfunc;
}
void YourClass::MegaProcessing()
{
 if(ExternFunc) ExternFunc();
}

:D
272
02 ноября 2004 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by fellow


Что-то наподобие:
Код:
typedef void (*pfunc)();

YourClass: public YourBaseClass {
 private:
  pfunc  ExternFunc;
 public:
  void   SetExternFunc(pfunc);
  void   MegaProcessing();
};

YourClass::YourClass()
 : YourBaseClass(),ExternFunc(NULL)
{
}
void YourClass::SetExternFunc(pfunc extfunc)
{
 ExternFunc = extfunc;
}
void YourClass::MegaProcessing()
{
 if(ExternFunc) ExternFunc();
}

:D


спасибо сейчас времени нет чтоб проверить но когда приду домой то обезательно проверю....
fellow рулит! :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог