Библиотеки: TypeToBytes - страница 4

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

// Кастинг произвольных простых структур (если есть конструктор или кастомный оператор присваивания - нужен TYPETOBYTES_FULL_SLOW)
  STRUCT2 Struct2 = _C(STRUCT2, Tick);   // Аналог классического кастинга STRUCT2 Struct2 = (STRUCT2)Tick;
  PRINT(_R(Struct2) == Tick)             // Убедились, что Struct2 == Tick

  Struct2.Tick.time = __DATETIME__;      // Изменили Struct2
  PRINT(_R(Struct2) == Tick)             // Убедились, что Struct2 != Tick

  _W(Struct2) = Tick;                    // Побайтово скопировали Tick в Struct2
  PRINT(_R(Struct2) == Tick)             // Убедились, что Struct2 == Tick
 

Great job, Thanks you all guys.

 

Пример использования

  • Определение байтового смещения поля структуры по его имени.

Forum on trading, automated trading systems and testing trading strategies

Struct Casting Error

fxsaber, 2017.05.12 12:17

#include <TypeToBytes.mqh>
struct ID
{
    int num;  //4
    uchar name[255];
};

struct ID2
{
   uchar id[sizeof(ID)];
};


void OnStart()
{
     ID id = {0};       
     _W(id) = 1234;        
     _W(id)[_OFFSET(id, name)] = "someone";

     //---
     ID2 id2 = {0};
     _W(id2) = id;
     
     ID idx = {0};
     _W(idx) = id2;
     
     printf("idx.num = %d, idx.name = %s",idx.num,CharArrayToString(idx.name));    // 1234,someone       
}
 
Добавлено побайтовое извлечение строк
// Извлечение строк
  int ArrayINT[];
  string ArraySTR[] = {"123", "456", "789"};

  _ArrayCopy(ArrayINT, ArraySTR);        // Скопировали побайтово массив ArraySTR в массив ArrayINT
  ArrayPrint(_R(ArrayINT).Bytes);        // Посмотрели байты полученного массива

  string ArraySTR2[];

  _ArrayCopy(ArraySTR2, ArrayINT);       // Скопировали побайтово массив ArrayINT в массив ArraySTR2
  ArrayPrint(ArraySTR2);                 // Распечатали полученный массив

  PRINT(_R(ArraySTR) == ArraySTR2)       // Убедились, что ArraySTR == ArraySTR2

  PRINT(_R(ArrayINT)[(string)1])         // Извлекли строку из ArrayINT, начинующуюся с байта 1 - "23"
 
Получаем конфиденциальные данные владельцев облачных агентов
#include <TypeToBytes.mqh>

input int Range = 0;

template <typename T>
struct ARRAY
{
  T Array[];
  
  void operator +=( const T Value )
  {
    const int i = ArrayResize(this.Array, ArraySize(this.Array) + 1) - 1;
    
    this.Array[i] = Value;
  }
};

#define TOSTRING(A) #A + " = " + (string)(A)
#define ADD(A,B) Str += TOSTRING(TerminalInfo##A(B));

void GetPrivateData( ARRAY<string> &Str )
{
  Str += TOSTRING(MQLInfoString(MQL_PROGRAM_PATH));
  
  ADD(Integer, TERMINAL_BUILD)
  ADD(Integer, TERMINAL_COMMUNITY_ACCOUNT)
  ADD(Integer, TERMINAL_COMMUNITY_CONNECTION)
  ADD(Integer, TERMINAL_CONNECTED)
  ADD(Integer, TERMINAL_DLLS_ALLOWED)
  ADD(Integer, TERMINAL_TRADE_ALLOWED)
  ADD(Integer, TERMINAL_NOTIFICATIONS_ENABLED)
  ADD(Integer, TERMINAL_MAXBARS)
  ADD(Integer, TERMINAL_MQID)
  ADD(Integer, TERMINAL_CODEPAGE)
  ADD(Integer, TERMINAL_CPU_CORES)
  ADD(Integer, TERMINAL_DISK_SPACE)
  ADD(Integer, TERMINAL_MEMORY_PHYSICAL)
  ADD(Integer, TERMINAL_MEMORY_TOTAL)
  ADD(Integer, TERMINAL_MEMORY_AVAILABLE)
  ADD(Integer, TERMINAL_MEMORY_USED)
  ADD(Integer, TERMINAL_X64)
  ADD(Integer, TERMINAL_OPENCL_SUPPORT)
  ADD(Integer, TERMINAL_SCREEN_DPI)
  ADD(Integer, TERMINAL_PING_LAST)

  ADD(Double, TERMINAL_COMMUNITY_BALANCE)

  ADD(String, TERMINAL_LANGUAGE)
  ADD(String, TERMINAL_COMPANY)
  ADD(String, TERMINAL_NAME)
  ADD(String, TERMINAL_PATH)
  ADD(String, TERMINAL_DATA_PATH)
  ADD(String, TERMINAL_COMMONDATA_PATH)
}

void OnTesterPass()
{
  ulong Pass;
  string Name;
  long ID;
  double Value;
  uchar Data[];

  while (FrameNext(Pass, Name, ID, Value, Data))
  {
    string Str[];
    
    _ArrayCopy(Str, Data);
    
    ArrayPrint(Str);
  }
}

double OnTester()
{
  ARRAY<string> Str;  

  GetPrivateData(Str);
  
  FrameAdd("Temp", 0, 0, _R(Str.Array).Bytes);
  
  return(0);
}

Доступны имя пользователя Windows, битность, число ядер, размер памяти и т.д.

 
fxsaber:
Получаем конфиденциальные данные владельцев облачных агентов

Доступны имя пользователя Windows, битность, число ядер, размер памяти и т.д.

Остроумно. Можно собрать базу MQID для рассылки )
 
fxsaber:
Добавлено побайтовое извлечение строк
Две строчки с одинаковым результатом
StringSubstr(Str, Pos);
_R(Str)[(string)Pos];
 
fxsaber:
Две строчки с одинаковым результатом
ArrayCompare(Array1, Array2) == 0
_R(Array1) == Array2
 
// Чтение/Запись private-полей простых структур

#include <TypeToBytes.mqh>

template <typename T>
struct STRUCT
{
private:
  T Data; // private-поле
  
public:
  T GetData( void ) const
  {
    return(this.Data);
  }
};

void OnStart()
{    
  STRUCT<int> Struct = {0};  
  
  _W(Struct) = 2;          // Write-доступ к private-полю
  Print(Struct.GetData()); // убедились штатно, что это так
  
  Print(_R(Struct)[0]);    // Read-доступ к private-полю
}
 
В библиотеке прописан класс-контейнер, который в массиве заданного типа хранит переменные и массивы любых других простых типов.
// Пример работы с контейнером
#include <TypeToBytes.mqh>

#define PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{
  // Произвольные данные для примера
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;
  
  CONTAINER<long> Container;  // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран long)
  
  // Заполняем контейнер разными данными
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
  
  ArrayPrint(Container.Data); // Выводим содержимое массива, в котором контейнер хранит все данные
  
  // Распечатаем типы хранимых в контейнере данных
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())
    
  // Получим сами данные      
  string Str2[];
  Container[0].Get(Str2);                // Получили массив
  ArrayPrint(Str2);
  
  PRINT(Container[1].Get<double>())      // Получили число
  PRINT(Container[2].Get<MqlTick>().bid) // Получили структуру
  
  Container[1] = "Replace";   // Заменили по индексу данные
  
  // Убедились, что замена произошла  
  PRINT(Container[1].GetType())
  PRINT(Container[1].Get<string>())
}
Причина обращения: