Необходим механизм передачи функции в функцию!

 

Здравствуйте уважаемые форумцы!

Расскажите мне, или давайте придумаем вместе некий механизм, посредством которого можно в функцию передать функцию! =)

Зачем передавать функцию, когда ее можно было бы вызвать при прямом обращении уже внутри другой функции? Затем, чтобы создать включаемый файл, который будет иметь ряд функций, допустим "применить ко всем открытым графикам" и заинклудив вызвать ее, передать ей функцию, допустим ChartClose или ObjectCreate, cоответственно с параметрами и уже в функции "применить ко всем открытым графикам" будет создаваться объект (соответственно до тех пор, пока ChartNext не выдаст -1) или закроются все открытые окна...

 

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

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 
BESSONoff:
...
Ничего не понял. Опишите лучше задачу, которую Вам не удалось реализовать с тем, что уже есть. )))
 
Используйте виртуальные функции и соответствующую обьектную модель.
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 
А виртуальные функции чем не нравятся?
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5
 

Renat:
Используйте виртуальные функции и соответствующую обьектную модель.

 

TheXpert:
А виртуальные функции чем не нравятся?

 

Забываете про ключевой посыл "Расскажите мне..." :D

 

Тут дело не в полиморфизме...

//ФАЙЛ ИНКЛУДА
bool func(функция которую нужно применить ко всем графикам (ФКНПКВГ))
{
long chartID_Begin = ChartFirst();
long chartID_End = ChartNext(chartID);
while (chartID_End != -1)
        {
        ФКНПКВГ(chartID_Begin... );
        chart_Begin = chartID_End;
        chartID_End = ChartNext(chartID_Begin);
        }
return (true);
}

//ТЕЛО ОСНОВНОГО ФАЙЛА (вар. 1)
void OnStart()
  {
   func(ChartClose(0));
  }

//ТЕЛО ОСНОВНОГО ФАЙЛА (вар. 2)
void OnStart()
  {
   func(ChartApplyTemplate(0,template.tpl);
  }

 т.е. в любом месте, где нам необходимо применить какую-либо функцию ко всем открытым графикам - мы инклудим файл с функцией func() и применяем свой код или функцию ко всем графикам без надобности в каждой новой программе воспроизводить код перехода по графикам... вроде бы объяснил =)

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
BESSONoff:

Тут дело не в полиморфизме...

 т.е. в любом месте, где нам необходимо применить какую-либо функцию ко всем открытым графикам - мы инклудим файл с функцией func() и применяем свой код или функцию ко всем графикам без надобности в каждой новой программе воспроизводить код перехода по графикам... вроде бы объяснил =)

Средствами MQL вы не сумеете передать указатель на функцию, зато вполне можете передать объект, инкапсулирующий нужное поведение в одном из своих полиморфных методов. Получится многословнее, но вашу задачу это решит.

Подробнее можно почитать у GoF, паттерн проектирования Action.

 

Либо я не допонял автора, либо пытаемся удалить миндалены галогеном через анус. Простите за лирику. :)

Не проще ли сделать две функции: 

1. Цикл, перебирающий все чарты. При каждоый итерации управление передается второй функции с передачей аргумента идентификатора чарта.

2. Функция, получающая ИД чарта в качестве аргумента, возращающая успех/неудачу своего выполнения.

void BustAllChart(void) {
  for (...)
    ChartFunction(...);
}

bool ChartFunction(const long ChartID) {
  // some action...
}
Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
voix_kas:

Либо я не допонял автора, либо пытаемся удалить миндалены галогеном через анус. Простите за лирику. :)

Не проще ли сделать две функции: 

1. Цикл, перебирающий все чарты. При каждоый итерации управление передается второй функции с передачей аргумента идентификатора чарта.

2. Функция, получающая ИД чарта в качестве аргумента, возращающая успех/неудачу своего выполнения.

Вся тема высосана из пальца.  Перебор чартов пишется в одну строку:

for (long ID=ChartNext(0);ID!=-1;ID=ChartNext(ID))  { ФКНПКВГ(ID); }

если влом каждый раз прописывать такой фор, можно в макрос свернуть:

#define ForEachChart(ID)  for(long ID=ChartNext(0);ID!=-1;ID=ChartNext(ID))

...
...
  ForEachChart(ID) { ФКНПКВГ(ID); }


 
Vladix:

Средствами MQL вы не сумеете передать указатель на функцию, зато вполне можете передать объект, инкапсулирующий нужное поведение в одном из своих полиморфных методов. Получится многословнее, но вашу задачу это решит.

Подробнее можно почитать у GoF, паттерн проектирования Action.

Вот код для тех, кто не знает, как использовать паттерн Action вместо указателя на функцию.

// "include.mqh"
class CAction
  {
protected:
   virtual void      doExecute() {return;}    // внутренняя реализация
public:
   void              Execute() {doExecute();} // внешний интерфейс класса 
  };

void CommonBehaviorFunction(CAction action)
{
   // ...какие-то действия...

   if (action != null)
      action.Execute(); 

   // ...какие-то действия...

   return;
}


//"example1.mq5"

#include <include.mqh> 

class CExample1Action: public CAction
  {
protected:
   virtual void      doExecute() { ...какие-то действия... } // например, ChartClose(0);
  };

CExample1Action example1Action;

void OnStart()
  {
   CommonBehaviorFunction(example1Action);
  }


//"example2.mq5"

#include <include.mqh> 

class CExample2Action: public CAction
  {
protected:
   virtual void      doExecute() { ...какие-то действия... } // например, ChartApplyTemplate(0,template.tpl);
  };

CExample2Action example2Action;

void OnStart()
  {
   CommonBehaviorFunction(example2Action);
  }

 

 
Vladix:

Вот код для тех, кто не знает, как использовать паттерн Action вместо указателя на функцию.

"Лучший микроскоп для ваших гвоздей!" (це) я

;)

Причина обращения: