Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2591

 
grezky #:


У меня на определенном этапе строковый массив был сохранен в файл.
Позже из другого индикатора данные считываются из этого файла в строковый массив. Часть параметров необходимо преобразовать из string в enum. Как это сделать, готовой функции судя по всему нет?

В ENUM переводить нет необходимости. Достаточно явного приведения типа string в int 

  string arr[]= {"первый", "2","сотый"};
  ENUM_OBJECT tr=(int)arr[1];
  Print(EnumToString(tr));

Я не сразу понял проблему…

Видимо записано в массив "OBJ_HLINE" и эту строку вам надо перевести в ENUM_OBJECT…

Но вот беда… Это сложней чем может казаться на первый взгляд.

Решение гораздо проще, если в файл писать не EnumToString(OBJ_HLINE) а (string)OBJ_HLINE… Тогда в файл запишется "1" что при прочтении легко переведётся в int или другой целочисленный тип.

 
lynxntech #:
может проще string в файл писать цифрами, и в switch получать нужный результат?

В стринговом массиве записаны слова (например имя объекта) и цифры, но потом при считывании надо преобразовать некоторые стринги (типа OBJ_HLINE в виде цифр) в enum.

 
Alexey Viktorov #:

В ENUM переводить нет необходимости. Достаточно явного приведения типа string в int 

Вечером проверю. Спасибо!

 
grezky #:

Вечером проверю. Спасибо!

Я не сразу понял проблему

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Alexey Viktorov, 2025.04.14 06:24

В ENUM переводить нет необходимости. Достаточно явного приведения типа string в int 

  string arr[]= {"первый", "2","сотый"};
  ENUM_OBJECT tr=(int)arr[1];
  Print(EnumToString(tr));

Я не сразу понял проблему…

Видимо записано в массив "OBJ_HLINE" и эту строку вам надо перевести в ENUM_OBJECT…

Но вот беда… Это сложней чем может казаться на первый взгляд.

Решение гораздо проще, если в файл писать не EnumToString(OBJ_HLINE) а (string)OBJ_HLINE… Тогда в файл запишется "1" что при прочтении легко переведётся в int или другой целочисленный тип.


 
Alexey Viktorov #:
а (string)OBJ_HLINE… Тогда в файл запишется "1" что при прочтении легко переведётся в int или другой целочисленный тип.

В массиве именно так и записано.
Но в ObjectCreate() с этим возникли какие-то проблемы (вечером буду проверять).

 
grezky #:

В массиве именно так и записано.
Но в ObjectCreate() с этим возникли какие-то проблемы (вечером буду проверять).

string obj_txt;
ENUM_OBJECT obj_type;
//-----
if(obj_txt=="OBJ_VLINE")
obj_type=OBJ_VLINE
 
if(obj_txt=="OBJ_HLINE")
obj_type=OBJ_HLINE;
 
Tretyakov Rostyslav #:

Вариант рабочий, но излишне громоздкий. Любое перечисление имеет целочисленное значение. Следовательно изгаляться с такими переводами никакого смысла нет. Просто надо поставить не перечисление, а целочисленное его значение.

 
Tretyakov Rostyslav #:
string obj_txt; ENUM_OBJECT obj_type; //----- if(obj_txt=="OBJ_VLINE") obj_type=OBJ_VLINE if(obj_txt=="OBJ_HLINE") obj_type=OBJ_HLINE;

На основе Вашего примера, совместно с ИИ, пришли к коду представленному ниже (может кому-нибудь пригодится).
Спасибо!

//+------------------------------------------------------------------+
//| Преобразует строку в ENUM_OBJECT                                  |
//+------------------------------------------------------------------+
ENUM_OBJECT ObjectTypeFromString(const string &obj_str) {
   int obj_num = StringToInteger(obj_str); // Преобразуем строку в целое число

// Проверяем успешность преобразования
   if (!MathIsValidNumber((double)obj_num))
      return -1; // Возвратим "-1", если преобразование неудачное

// Передаем преобразованное число в функцию для определения типа объекта
   return ObjectTypeFromNumber(obj_num);
}

// Вспомогательная функция для перевода цифрового представления в ENUM_OBJECT
ENUM_OBJECT ObjectTypeFromNumber(int obj_number) {
   switch(obj_number) {
   case OBJ_ARROW:
      return OBJ_ARROW;
   case OBJ_CHANNEL:
      return OBJ_CHANNEL;
   case OBJ_ELLIPSE:
      return OBJ_ELLIPSE;
   case OBJ_FIBOARC:
      return OBJ_FIBOARC;
   case OBJ_FIBOFAN:
      return OBJ_FIBOFAN;
   case OBJ_FIBOTIMES:
      return OBJ_FIBOTIMES;
   case OBJ_GANNFAN:
      return OBJ_GANNFAN;
   case OBJ_GANNLINE:
      return OBJ_GANNLINE;
   case OBJ_HLINE:
      return OBJ_HLINE; // Пример: OBJ_HLINE = 1
   case OBJ_LABEL:
      return OBJ_LABEL;
   case OBJ_PITCHFORK:
      return OBJ_PITCHFORK;
   case OBJ_RECTANGLE:
      return OBJ_RECTANGLE;
   case OBJ_TREND:
      return OBJ_TREND;
   case OBJ_TRIANGLE:
      return OBJ_TRIANGLE;
   case OBJ_VLINE:
      return OBJ_VLINE;

   default:
      return -1; // Если номер не найден
   }
}
//+------------------------------------------------------------------+
 
grezky #:

На основе Вашего примера, совместно с ИИ, пришли к коду представленному ниже (может кому-нибудь пригодится).
Спасибо!

Я ещё не видел ни одного нормального кода от искусственного идиотизма.

Проверьте вот это

ENUM_OBJECT ObjectTypeFromString(const string &obj_str) {
   int  obj_num = StringToInteger(obj_str); // Преобразуем строку в целое число

// Проверяем успешность преобразования
   if (!MathIsValidNumber((double)obj_num))
      return -1; // Возвратим "-1", если преобразование неудачное

// Передаем преобразованное число в функцию для определения типа объекта
   return ENUM_OBJECT(obj_num);
}

И проверьте что вернёт функция ObjectTypeFromNumber в таком случае

   default:
      return -1; // Если номер не найден
 
Alexey Viktorov #:

Проверьте вот это

И проверьте что вернёт функция ObjectTypeFromNumber в таком случае

Дело в том что случаи с '-1' в этом конкретном коде невозможны, т.к. данные записываются в массив с реальных объектов по заданным условиям. Я бы даже не стал использовать подобные проверки, но раз уж ИИ добавил их, пусть останутся как есть. Ну а если кому-то потребуется подобная функция, пусть подгоняет ее для себя.