Как получить длину перечисления и элемента в MQL4/MQL5? - страница 2

 
Alain Verleyen:
Длина никогда не бывает неизвестной, и эта тема - просто результат плохого дизайна.
Это требование исходит из проекта AutoTester.
Во многих индикаторах/EA входные параметры содержат пользовательские перечисления, нам нужно выяснить, какой элемент (и относительное значение) в перечислении.
Так что не надо говорить "плохой дизайн". Бла...бла...
 
Xiangdong Guo:
Это требование исходит из проекта AutoTester.
Во многих индикаторах/EA входные параметры содержат пользовательские перечисления, нам нужно выяснить, какой элемент (и относительное значение) в перечислении.
Так что не надо говорить "плохой дизайн". Бла...бла...
Конечно, это плохой дизайн. Но для меня это не проблема.
 
Marco vd Heijden:
Что вы имеете в виду под "длиной перечисления"?
enum fruit
  {
   APPLE=0,//APPLE
   BANANA=1,//BANANA
   GRAPE=2,//GRAPE
   ORANGE=3,//ORANGE
   CARROT=4,//CARROT
  };
  
sinput fruit type;//PICK A FRUIT 

Возможно, морковь - не фрукт... Я до сих пор не понимаю, что Xiangdong Guo имеет в виду под "длиной перечисления".

Количество букв в строковом имени каждого варианта?

Сколько вариантов возможно?

Числовое значение опции?

Не только плохой дизайн, но и не очень понятно, что он имеет в виду.

 
Marco vd Heijden:
Количество значений, например, 5 в примере с фруктами.
 
Alain Verleyen:
Количество значений, так 5 в вашем примере фруктов.

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

Однако если Xiangdong Guo тестирует индикаторы, которые он не разрабатывал и не писал сам, и хочет узнать или определить входные параметры автоматически...

Не уверен, как знание количества доступных вариантов может помочь, возможно, он хочет провести перекрестное тестирование всех доступных вариантов и просто ищет количество тестов для запуска?

Я бы просканировал предполагаемые варианты для разрешения этих значений, как только вы попытаетесь преобразовать из границ доступных вариантов, он выдаст ошибку cannot convert enum error since it does not exist.

 
Marco vd Heijden:

MT4/MT5 используют функции C++/C# для извлечения элемента из перечисления. Но MetaQuotes не переносит эти функции на MQL4/MQL5. Хм... хм...

enum DURATION_INTERVALS  // Enumeration of named constants
   {
    month=1,     // Interval of one month
    two_months,  // Two months
    quarter,     // Three months - quarter
    halfyear=6,  // Half a year
    year=12,     // Year - 12 months
   };

input DURATION_INTERVALS HistoryDuration = month;

 
Xiangdong Guo:

MT4/MT5 используют функции C++/C# для извлечения элемента из перечисления. Но MetaQuotes не переносит эти функции на MQL4/MQL5. Хм... хм...

Какая функция? В чем проблема? Почему вы хотите перебирать элементы enum?
 
Alain Verleyen:
Какую функцию? В чем проблема? Почему вы хотите перебирать элементы перечисления?

Если кто-то хочет/не хочет сделать что-то, что невозможно в MQL, это не обязательно означает "плохой дизайн".

К началу темы: в текущей версии MQL невозможно сделать то, что вы хотите.

Единственный способ - скопировать все элементы в массив и сделать цикл, используя этот массив. Но это возможно только тогда, когда/если вы сможете модифицировать код.

 
Andrey Barinov:

Если кто-то хочет/не хочет сделать что-то, что невозможно в MQL, это не обязательно означает "плохой дизайн".

К началу темы: в текущей версии MQL невозможно сделать то, что вы хотите.

Единственный способ - скопировать все элементы в массив и сделать цикл, используя этот массив. Но это возможно только тогда, когда/если вы сможете модифицировать код.

Использование перечисления вместо массива - это плохой дизайн. Не так ли?

 
Alain Verleyen:

Использование перечисления вместо массива - это плохой дизайн. Не так ли?

Нет, использование массива вместо перечисления - это плохой дизайн.

Пример: Представьте, что у вас есть строковое значение. И задача состоит в том, чтобы выяснить, равна ли эта строка/содержит ли она одно из имен элементов перечисления (EnumToString()).

Как бы вы решили эту задачу?