Как завести в параметры функции пользовательскую константу? - страница 2

 
Konstantin Nikitin:

Сами ENUM лучше объявлять так чтоб они были видны глобально везде по вашему коду. Ну а далее работайте как хотите.

Это конечно чтоб не было лишних предупреждений о преобразовании параметров. А так проблем работать с ENUM как таковое ни каких. Главное чтоб имена были оригинальными.

Так у меня enum и объявлен глобально. когда весь код в одном файле, все работает. А когда функцию выношу в include, тогда 'MY_PARAM_2' - undeclared identifier

 
leon_17:

Так у меня enum и объявлен глобально. когда весь код в одном файле, все работает. А когда функцию выношу в include, тогда 'MY_PARAM_2' - undeclared identifier

Объявляйте ENUM выше подключения файлов. Можете все ENUMы вынести в один файл и подключить его первым.

 
leon_17:

Внутри include не работает:


Основной код:

Перечисления нужно тоже объявить в .mqh и всё заработает

enum ENUM_MY
{
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
};

string select_param(ENUM_MY param)
{
   string result="";

   if(param==MY_PARAM_1)
      result="1";
   if(param==MY_PARAM_2)
      result="2";
   if(param==MY_PARAM_3)
      result="3";
   if(param==MY_PARAM_1)
      result="4";

   return(result);
}
#include <i1.mqh>
input ENUM_MY MyParam = MY_PARAM_2;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{
   string param_string=select_param(MyParam);

   Alert(param_string);
}

Вы бы подробней описали что хотите получить, а так можно только гадать... Если input параметры объявить в .mqh тоже будет работать, но не уверен что Вам это нужно...

 
Sergey Kolemanov:

Перечисления нужно тоже объявить в .mqh и всё заработает

Вы бы подробней описали что хотите получить, а так можно только гадать... Если input параметры объявить в .mqh тоже будет работать, но не уверен что Вам это нужно...

Учусь писать код на инклюдах. И насколько я понимаю, от глобальных переменных в таком случае придется полностью отказаться. Но вот, если обычные глобальные переменные можно без особых проблем передать в параметры функции, то вот как передать избранное значение перечисления (из extern enum например) до сих пор не очень понятно.   

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные - Переменные - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
leon_17:

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

Всё зависит от последовательности строк кода. Если в инклюднике есть объявленная переменная или создан enum, а в коде советника первой строкой подключен инклюдник, то всё это будет видно и доступно. Так-же и в случае, если надо сделать так, чтобы были какие-то переменные доступны в инклюднике, то они должны быть объявлены до подключения инклюдника…

Вот так будет работать

//i1.mqh

string select_param(ENUM_MY param)
 {
  string result="";

  if(param==MY_PARAM_1)
    result=EnumToString(MY_PARAM_1);
  if(param==MY_PARAM_2)
    result=EnumToString(MY_PARAM_2);
  if(param==MY_PARAM_3)
    result=EnumToString(MY_PARAM_3);
  if(param==MY_PARAM_1)
    result=EnumToString(MY_PARAM_4);

  return(result);
 }


enum ENUM_MY
 {
  MY_PARAM_1,
  MY_PARAM_2,
  MY_PARAM_3,
  MY_PARAM_4
 };

#include <i1.mqh>

input ENUM_MY MyParam = MY_PARAM_2;

/********************Script program start function*******************/
void OnStart()
 {
  string param_string=select_param(MyParam);
  Alert(param_string);
 }/*******************************************************************/

Результат

2021.02.22 15:49:46.960 !00 (EURJPY,M1) Alert: MY_PARAM_2
 
leon_17:

Учусь писать код на инклюдах. И насколько я понимаю, от глобальных переменных в таком случае придется полностью отказаться. Но вот, если обычные глобальные переменные можно без особых проблем передать в параметры функции, то вот как передать избранное значение перечисления (из extern enum например) до сих пор не очень понятно.   

// ENUM.mqh

enum ENUM_MY
 {
  MY_PARAM_1,
  MY_PARAM_2,
  MY_PARAM_3,
  MY_PARAM_4
 };
// functions.mqh
string select_param(ENUM_MY param)
 {
  string result="";

  if(param==MY_PARAM_1)
    result=EnumToString(MY_PARAM_1);
  if(param==MY_PARAM_2)
    result=EnumToString(MY_PARAM_2);
  if(param==MY_PARAM_3)
    result=EnumToString(MY_PARAM_3);
  if(param==MY_PARAM_1)
    result=EnumToString(MY_PARAM_4);

  return(result);
 }
// menu.mqh

input ENUM_MY MyParam = MY_PARAM_2;
#include "ENUM.mqh"
#include "menu.mqh"
#include "functions.mqh"

И все будет видно

 
leon_17:

...то вот как передать избранное значение перечисления (из extern enum например) до сих пор не очень понятно.   

.mqh

template <typename T>
int select_param(T &param)
{
   return param;
}

скрипт

#include <i1.mqh>
enum ENUM_MY
 {
  MY_PARAM_1,
  MY_PARAM_2,
  MY_PARAM_3,
  MY_PARAM_4
 };

input ENUM_MY MyParam = MY_PARAM_1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Alert(select_param(MyParam));   
}
//+------------------------------------------------------------------+
 
Sergey Kolemanov:

Да будет, но смущает тот факт, что при компиляции инклудника ошибки.

Что за бред… Кто вам сказал, что инклюдник надо компилировать?
 
Alexey Viktorov:

Всё зависит от последовательности строк кода. Если в инклюднике есть объявленная переменная или создан enum, а в коде советника первой строкой подключен инклюдник, то всё это будет видно и доступно. Так-же и в случае, если надо сделать так, чтобы были какие-то переменные доступны в инклюднике, то они должны быть объявлены до подключения инклюдника…

Вот так будет работать


Результат

Как такое может быть? Вроде и работает, но инклюдник не компилируется: 11 ошибок... а исходник компилируется

 
Alexey Viktorov:
Что за бред… Кто вам сказал, что инклюдник надо компилировать?

А не надо?

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