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

 

Подозреваю, что в чем-то сильно туплю, но сам пока не смог справиться. Задача в следующем:

Есть пользовательское перечисление enum по неким названиям, по цветам например... и есть функция которая должна выдавать результат в зависимости от того какой пункт (цвет) из этого перечисления в нее ввести. 

Допустим в свойствах функции я для этого создам переменную типа int, но с чем ее потом сравнивать внутри функции? Ведь это не текст... а просто число применять крайне  не хотелось бы, потому что вдруг порядок перечисления изменится.

 
enum ENUM_MY
{
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
};
input ENUM_MY MyParam = MY_PARAM_2;

//+------------------------------------------------------------------+
void OnStart()
{
   switch(MyParam)
   {
      case MY_PARAM_1:
         break;
      case MY_PARAM_2:
         break;
      case MY_PARAM_3:
         break;
      case MY_PARAM_4:
         break;
   }
}
Перечисления
 
Еще можно использовать EnumToString()
 
Konstantin Nikitin:
Перечисления

Небольшое уточнение: мне нужно засунуть обработку MyParam в функцию, которая будет вызываться через include, то есть напрямую туда глобальную переменную не внесешь, только через параметры.   Чтобы это выглядело примерно так:

enum ENUM_MY
  {
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
  };
input ENUM_MY MyParam = MY_PARAM_2;

void OnStart()
  {
   Alert(select_param(MyParam));
  }

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

   switch(param)
     {
      case MY_PARAM_1:
         result=1;
         break;
      case MY_PARAM_2:
         result=2;
         break;
      case MY_PARAM_3:
         result=3;
         break;
      case MY_PARAM_4:
         result=4;
         break;
     }
   return(result);
  }

И чтобы компилятор не ругался на неявное преобразование.

 
Ihor Herasko:
Еще можно использовать EnumToString()

Только так и никак иначе?

enum ENUM_MY
  {
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
  };
input ENUM_MY MyParam = MY_PARAM_2;

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

   Alert(select_param(param_string));
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string select_param(string 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_4")
      result="4";

   return(result);
  }
 
leon_17:

Только так и никак иначе?

enum ENUM_MY
  {
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
  };
input ENUM_MY MyParam = MY_PARAM_2;

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

   Alert(param_string);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
  }

Возвращаемое значение функции может быть любым.

 
leon_17:

Небольшое уточнение: мне нужно засунуть обработку MyParam в функцию, которая будет вызываться через include, то есть напрямую туда глобальную переменную не внесешь, только через параметры.   Чтобы это выглядело примерно так:

Тогда не понимаю, в чем проблема. Вы ведь сами привели решение.

И чтобы компилятор не ругался на неявное преобразование.

Присваивайте переменной result сразу строку, а не целое значение.

 
leon_17:

Только так и никак иначе?

Так Вам нужно вернуть именно порядковый номер перечисления? Тогда все просто:

Print(int(MyParam));
 
Sergey Kolemanov:

Возвращаемое значение функции может быть любым.

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

// i1.mqh 


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> 

enum ENUM_MY
  {
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
  };
input ENUM_MY MyParam = MY_PARAM_2;

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

   Alert(param_string);
  }
 
Ihor Herasko:

Присваивайте переменной result сразу строку, а не целое значение.

Блин точно, похоже именно в этом и затупил :/

//------------------------------------------------------------------

Но нет, в include функция все же не работает:

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

   switch(param)
     {
      case MY_PARAM_1:
         result="1";
         break;
      case MY_PARAM_2:
         result="2";
         break;
      case MY_PARAM_3:
         result="3";
         break;
      case MY_PARAM_4:
         result="4";
         break;
     }
   return(result);
  }

 
Походу остается вариант только с номером перечисления (

 
leon_17:

Небольшое уточнение: мне нужно засунуть обработку MyParam в функцию, которая будет вызываться через include, то есть напрямую туда глобальную переменную не внесешь, только через параметры.   Чтобы это выглядело примерно так:

И чтобы компилятор не ругался на неявное преобразование.

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

enum ENUM_MY
  {
   MY_PARAM_1,
   MY_PARAM_2,
   MY_PARAM_3,
   MY_PARAM_4
  };
input ENUM_MY MyParam = MY_PARAM_2;

void OnStart()
  {
   string param_string= IntegerToString((int)MyParam);
   if( MyParam == MY_PARAM_3 )
   {
        /* bla-bla */
   }
   if( (int)MyParam == 0 )
   {
        /* bla-bla */
   }
   if( MyParam == (ENUM_MY)0 )
   {
        /* bla-bla */
   }

   Alert(param_string);
  }

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

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