Функция, структура, класс с переменным количеством параметров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
182944
Vladimir Karputov  
Возможно ли такое, при том, что эти параметры могут быть из разных встроенных MQL5 типов (int, double, bool, ENUM_...).
Alexey Viktorov
26006
Alexey Viktorov  

А документацию почитать? Я только-что читал об этом. Делаешь конструкторы с разным набором параметров и все дела.

Или вопрос в чём-то другом?

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
Vladimir Karputov
Модератор
182944
Vladimir Karputov  
Alexey Viktorov:

А документацию почитать? Я только-что читал об этом. Делаешь конструкторы с разным набором параметров и все дела.

Или вопрос в чём-то другом?

Количество параметров неизвестно заранее, поэтому нельзя под каждый случай сделать конструктор с определённым набором параметров.

Alexey Volchanskiy
27272
Alexey Volchanskiy  
Vladimir Karputov:

Количество параметров неизвестно заранее, поэтому нельзя под каждый случай сделать конструктор с определённым набором параметров.

На C# я такое делал, там при разборе можно получить тип передаваемого параметра. В MQL4/5 ведь такого нет. 

Можно попробовать извратится и сделать типа такого. Но я не пробовал. То есть передавать массив указателей на классы, производные от CBase, при этом они кастятся к CBase*.  Вроде должно сработать

enum TYPE_VAR {EInteger, EDouble,......, EEnd}

class CBase
{
public:
    TYPE_VAR type;
}

class DataDouble : public CBase
{
public:
    double d;
}

bool NextDay(CBase* &arr[])
{
}

void OnStart()
{
}
Artyom Trishkin
Модератор
53139
Artyom Trishkin  
Alexey Volchanskiy:

На C# я такое делал, там при разборе можно получить тип передаваемого параметра. В MQL4/5 ведь такого нет. 

Можно попробовать извратится и сделать типа такого. Но я не пробовал. То есть передавать массив указателей на классы, производные от CBase, при этом они кастятся к CBase*.  Вроде должно сработать

Есть ведь пример передачи параметров в индикаторы.
Vladimir Karputov
Модератор
182944
Vladimir Karputov  
Alexey Volchanskiy:

На C# я такое делал, там при разборе можно получить тип передаваемого параметра. В MQL4/5 ведь такого нет. 

Можно попробовать извратится и сделать типа такого. Но я не пробовал. То есть передавать массив указателей на классы, производные от CBase, при этом они кастятся к CBase*.  Вроде должно сработать

В MQL5 нельзя такое:

int Func(int a,...)
  {

  }
Alexey Volchanskiy
27272
Alexey Volchanskiy  
Vladimir Karputov:

В MQL5 нельзя такое:

Я разве писал о таком??? Я писал

bool Function(CBase* &arr[])
Vladimir Karputov
Модератор
182944
Vladimir Karputov  
Alexey Volchanskiy:

Я разве писал о таком??? Я писал

А я увидел это:

поэтому сразу и уточнил.

Но это лирика, пока вроде нет способа задать переменное количество разнотипных параметров.
Alexey Volchanskiy
27272
Alexey Volchanskiy  
Vladimir Karputov:

А я увидел это:

поэтому сразу и уточнил.

Но это лирика, пока вроде нет способа задать переменное количество разнотипных параметров.

А-а, ну это я просто не стал расписывать все типы параметров ))) Поставил многоточие. Вспомнил, у меня был подобный случай на MQL, я просто все типы данных передавал в массиве, как double. Ведь потом из double можно обратно каститься на любой тип данных.

Vladimir Karputov
Модератор
182944
Vladimir Karputov  

Решение оказалось уже есть: Структура входных параметров индикатора

struct MqlParam 
  { 
   ENUM_DATATYPE     type;                    // тип входного параметра, значение перечисления ENUM_DATATYPE 
   long              integer_value;           // поле для хранения целочисленного значения 
   double            double_value;            // поле для хранения значения double или float 
   string            string_value;            // поле для хранения значения строкового типа 
  };

И пример заполнения массива структур MqlParam для iMACD:

      //--- заполним структуру значениями параметров индикатора      
      MqlParam pars[4]; 
      //--- быстрый период 
      pars[0].type=TYPE_INT; 
      pars[0].integer_value=fast_ema_period; 
      //--- медленный период 
      pars[1].type=TYPE_INT; 
      pars[1].integer_value=slow_ema_period; 
      //--- период усреднения разницы между быстрой и медленной средними 
      pars[2].type=TYPE_INT; 
      pars[2].integer_value=signal_period; 
      //--- тип цены 
      pars[3].type=TYPE_INT; 
      pars[3].integer_value=applied_price; 
      handle=IndicatorCreate(name,period,IND_MACD,4,pars); 
fxsaber
16797
fxsaber  
Vladimir Karputov:
Возможно ли такое, при том, что эти параметры могут быть из разных встроенных MQL5 типов (int, double, bool, ENUM_...).

Возможно. И не только из встроенных, но и кастомных типов.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий