существует ли какая-то функция "StringToEnum" или альтернатива? - страница 2

 

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

Я обычно перекодирую вещи, делая их разными способами, чтобы в итоге получить конечный результат, который я искал, вещи могут быть сделаны разными способами.

 
Marco vd Heijden:

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

Я обычно перекодирую вещи, делая их разными способами, чтобы в итоге получить конечный результат, который я искал, вещи могут быть сделаны разными способами.

Спасибо, Марко. Конечно, все можно сделать разными способами (и обходными путями), иногда приходится выбирать один из них для достижения цели, но есть способы, которые проще, чем другие. В данном случае обходной путь, который я использовал для имитации функции: StringToEnum использовал множественные сравнения строк с "if", но, как я уже говорил, функция eval (не реализованная в mql5) могла бы помочь избежать всех этих if, а также помочь в обслуживании, потому что если константы меняют свое имя, то вам не нужно менять блок if.
 

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

Вы должны любить то, что вы делаете.

 
cyberglassed:
Спасибо, Марко. Конечно, все можно сделать многими способами (и обходными путями), иногда приходится выбирать один из них для достижения цели, но есть способы проще, чем другие. В данном случае обходной путь, который я использовал для имитации функции: StringToEnum использовал множественные сравнения строк с "if", но, как я уже говорил, функция eval (не реализованная в mql5) могла бы помочь избежать всех этих if, а также помочь в обслуживании, потому что если константы меняют свое имя, то вам не нужно менять блок if.

Объясните, пожалуйста, зачем вам нужен этот StringToEnum. Очевидно, что у вас есть строка со значением перечисления, но почему она находится в строке? Мне интересно знать.

Другими словами, с помощью функции eval(...) мы могли бы решить множество задач одновременно.

Этого НИКОГДА не произойдет, не теряйте на это время. Функция Eval() - это открытая дверь для утечки безопасности, Metaquotes не будет добавлять такую функцию.

 
Marco vd Heijden:

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

Вы должны любить то, что вы делаете.

Ваша проблема НЕ может быть решена с помощью StringToEnum(), вы уже знаете это (я думаю).
 
Alain Verleyen:
Ваша проблема НЕ может быть решена с помощью StringToEnum(), вы уже знаете это (я думаю).

Правильно, но это можно сделать и в обратном порядке.

  int b=0;
  
  if(EnumToString(MODE_SMMA)=="MODE_SMMA"){b=2;Print("b= ",b);}

Но это было бы бессмысленно, поскольку MODE_SMMA уже имеет целочисленное значение 2, поэтому я и написал, что не понимаю, чего пытается добиться cyberglassed.

 
Marco vd Heijden:

Правильно, но это можно сделать и в обратном порядке.

Но это было бы бессмысленно, поскольку MODE_SMMA уже имеет целочисленное значение 2, поэтому я и написал, что не понимаю, чего пытается добиться cyberglassed.

Обходной путь, который я использую, выглядит примерно так (очень минималистичная версия):

int StringToEnum(string strId) {
        if (false) {}
        else if (strId == "PRICE_CLOSE")     return 1;
        else if (strId == "PRICE_OPEN")      return 2;
        else if (strId == "PRICE_HIGH")      return 3;
        else if (strId == "PRICE_LOW")       return 4;
        else if (strId == "PRICE_MEDIAN")    return 5;
        else if (strId == "PRICE_TYPICAL")   return 6;
        else if (strId == "PRICE_WEIGHTED")  return 7;
        // ...
        return -1;
}

void OnStart() {
        string strId = "PRICE_MEDIAN";
        printf("%s: %d ", strId, StringToEnum(strId));
}

Конечно, я не начинаю с константы, я начинаю со строки, я говорю вам это, потому что в вашем коде вы написали следующее:

EnumToString(MODE_SMMA)

как если бы у вас с самого начала была сама константа.

Извините, если я вас неправильно понял, мой английский не слишком хорош.

С уважением.

 
Alain Verleyen:

Не могли бы вы объяснить, зачем вам нужен этот StringToEnum. Очевидно, что у вас есть строка со значением перечисления, но почему она находится в строке? Мне интересно знать.

Другими словами, с помощью функции eval(...) мы могли бы решить многие вещи одновременно.

Этого НИКОГДА не произойдет, не теряйте на это время. Функция Eval() - это открытая дверь для утечки безопасности, Metaquotes не будет добавлять такую функцию.

Привет, Алена, я удовлетворил твое любопытство :P

Представьте, что вы используете несколько внешних mql5-кодов, имеете дело с несколькими типами данных "enum", определенными на них, и, конечно, как человеку, вам лучше запомнить строковое имя каждого значения каждого "enum". Затем в какой-то части вы хотите указать значение какого-то перечисления в строковом формате, но вы не можете сделать это напрямую, поэтому вам придется использовать обходной путь, как я писал выше. Это имеет два больших недостатка, первый - вам нужно собрать все значения всех перечислений, и второй недостаток - это обслуживание, так что если вы обновите какой-то внешний код mql5, где разработчик изменил значение int, связанное с некоторым константным представлением, то вы можете получить неожиданное поведение, поэтому вам нужно постоянно проверять обновления кода.

Что касается темы утечки безопасности... Я не совсем согласен с тем, что вы сказали о том, что это открытая дверь для утечки безопасности. Конечно, это может быть открытой дверью, но вы как программист должны установить границы и позаботиться о возможных критических ситуациях, я имею в виду, что вы можете прекрасно справиться с такими ситуациями, как в PHP, даже в SQL с инъекцией кода, где вы должны разобрать некоторые критические возможные входные данные от пользователей в случае, если они имеют доступ к вашему коду.

Может быть, в будущем нам повезет, и команда разработчиков поможет нам в этом направлении, а пока мы можем использовать обходные пути :P

 
cyberglassed:

Марко, обходной путь, который я использую, это что-то вроде следующего (очень минималистичная версия):

Конечно, я не начинаю с константы, я начинаю со строки, я говорю вам это, потому что в вашем коде вы написали следующее:

как если бы у вас с самого начала была сама константа.

Извините, если я вас неправильно понял, мой английский не слишком хорош.

С уважением.

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

int b;
if(EnumToString(MODE_SMA)=="MODE_SMA"){b=0;}
if(EnumToString(MODE_EMA)=="MODE_EMA"){b=1;}
if(EnumToString(MODE_SMMA)=="MODE_SMMA"){b=2;}
if(EnumToString(MODE_LWMA)=="MODE_LWMA"){b=3;}

Print(b);


Но разве это не одно и то же?

Неважно, с какой стороны вы сравниваете строку, если есть совпадение, то значение будет записано в b.

int b;
if("MODE_SMA"==EnumToString(MODE_SMA)){b=0;}
if("MODE_EMA"==EnumToString(MODE_EMA)){b=1;}
if("MODE_SMMA"==EnumToString(MODE_SMMA)){b=2;}
if("MODE_LWMA"==EnumToString(MODE_LWMA)){b=3;}

Print(b);

Так что здесь мы начинаем со строкового значения, но в чем разница?

Нет.

 
Marco vd Heijden:

...

но разве это не одно и то же?

Не имеет значения, с какой стороны вы сравниваете жало, если есть совпадение, оно подпишет значение b.

int b;
if("MODE_SMA"==EnumToString(MODE_SMA)){b=0;}
if("MODE_EMA"==EnumToString(MODE_EMA)){b=1;}
if("MODE_SMMA"==EnumToString(MODE_SMMA)){b=2;}
if("MODE_LWMA"==EnumToString(MODE_LWMA)){b=3;}

Print(b);

Итак, здесь мы начинаем со строкового значения, но в чем разница?

Никакой.

Ваш код выше бесполезен, потому что он всегда будет возвращать "b = 3" (последнее "если", потому что вы не используете "else if").

Если вы используете "else if", то всегда будет возвращаться "b = 0".

в любом случае, информация: "b = 3" каждый раз, не дает никакой информации.