Особенности языка mql5, тонкости и приёмы работы - страница 38

 
fxsaber:

Функции-рудименты (не нужны)

  • StringToDouble
  • StringToInteger
  • StringToTime
  • StringToColor
  • StringAdd
  • StringConcatenate
  • GetPointer


почему?
 
Konstantin:
почему?
Все делается через соответствующие операторы.
 
fxsaber:
Все делается через соответствующие операторы.

не совсем понимаю, приведите пример
 
Konstantin:

не совсем понимаю, приведите пример

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.04.26 15:16

Все стандартные типы приводятся друг к другу
void OnStart()
{
  string Str = "1.23qwedfg";
  
  Print((int)Str);
  Print((double)Str);
}

Результат

1
1.23

 
fxsaber:



а, вон вы про что )) да пусть будут раз уж есть )) а то уберут и код неожиданно перестанет работать как было со структурами, ладно хоть union ввели и в некотором смысле можно костылем обойтись ))
 
fxsaber:

Функции-рудименты (не нужны)

  • GetPointer

А эта функция чем дублируется?
 
Vasiliy Pushkaryov:
А эта функция чем дублируется?
&Object
 

Использование union вместо кастинга структур

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

struct struct_double
{
   double value;
}sd;

struct struct_long
{
   ulong value;
}sl;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   sl = (struct_long)sd;
}
cannot cast 'struct_double' to 'struct_long'    CastingValues.mq5       33      9

Однако, теперь в MQL доступно объединение данных в структуру union. Благодаря этому возможно выполнить приведение типов через union:

union struct_union
{
   double d_value;
   ulong  l_value;
}su;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   su.l_value = 0;
   su.d_value = 3.14159;
   printf((string)su.l_value);
}
2017.04.27 13:20:03.375 CastingValues (Si-6.17,M1)      4614256650576692846

Данная структура уже доступна в новых билдах.

p.s. Просьба разработчикам, начать исправлять документацию в разделе casting: https://www.mql5.com/ru/docs/basis/types/casting

 
Vasiliy Sokolov:

Использование union вместо кастинга структур

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

Библиотеки: TypeToBytes

fxsaber, 2017.04.26 10:49

Доступен кастинг произвольных структур
struct STRUCT2
{
  MqlTick Tick;
};

// Кастинг произвольных простых структур
  STRUCT2 Struct2 = _C(STRUCT2, Tick);   // Аналог классического кастинга STRUCT2 Struct2 = (STRUCT2)Tick;
union не позволяет делать кастинг для структур с кастомным конструктором и/или оператором копирования.
 
fxsaber:
union не позволяет делать кастинг для структур с кастомным конструктором и/или оператором копирования.

О полной замене кастинга union'ом не говорилось.

p.s. Глянул Ваш код:

class CASTING
  {
  public:
    template <typename T1>
    static const T Casting( const T1 &Value )
    {
  #ifdef TYPETOBYTES_FULL_SLOW
      T Data = {0};

      const int handle = ::FileOpen("Casting.tmp", FILE_READ | FILE_WRITE | FILE_BIN);

      if (handle != INVALID_HANDLE)
      {
        ::FileWriteStruct(handle, Value);

        ::FileSeek(handle, 0, SEEK_SET);
        ::FileReadStruct(handle, Data);

        ::FileClose(handle);
      }

      return(Data);
  #else // TYPETOBYTES_FULL_SLOW
      union CAST

Произвольный кастинг через запись/чтение бинарника... Тушите свет. Дальше можно не читать... 

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