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

 
//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <TypeToBytes.mqh> 


CONTAINER <uchar> Container;


int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+


Желтая строка кода больше не компилируется. Выдает следующую ошибку (build 2980):

Есть идеи, что могло бы решить проблему?

 
Enrique Dangeroux:

Желтая строка кода больше не компилируется. Выдает следующую ошибку (build 2980):

Есть идеи, что могло бы решить проблему?

 
Спасибо.
 

Обновлен. Обходит найденную особенность. Ранее могло негативно сказываться на _ArrayCopy и CONTAINER.

 

Написал себе функции сохранения в глобальные переменные строк любой длины с применением Вашей библиотеки. Не всё понимаю, поэтому уверен, не использовал на 100%.

Есть мысли по более эффективному применению?

#include <TypeToBytes.mqh>


//--------------------------------------------------------------------------------------------------
string
GVarGetString(string name) {
        double dbl[];
        
        // Читаем части переменной: Имя, Имя(1), Имя(2), …
        for (int i = 0; ; ++i) {
                string s = (i == 0)? "" : "(" + (string)i + ")";
                double t = GlobalVariableGet(name + s);
                if (t == 0)
                        break;
                
                MyArrayResize(dbl, i + 1);
                dbl[i] = t;
        }
        
        uchar tmp0[], tmp[], tmp1[];  
        _ArrayCopy(tmp0, dbl);
        if (tmp0[0] != 0)
                // Без сжатия
                return CharArrayToString(tmp0);
        else {
                // Со сжатием
                ArrayCopy(tmp, tmp0, 0, 1);
                CryptDecode(CRYPT_ARCH_ZIP, tmp, tmp1, tmp1);
                return CharArrayToString(tmp1);
        }
}


//--------------------------------------------------------------------------------------------------
void
GVarSetString(string name, string val) {
        double dbl[];
        uchar tmp[];
        uchar zero[1];
        int cnt = CryptEncode(CRYPT_ARCH_ZIP, _R(val).Bytes, tmp, tmp);
        if (cnt >= StringLen(val)) {
                // Без сжатия
                string str[1];
                str[0] = val;
                _ArrayCopy(dbl, str);
        }
        else {
                // Со сжатием
                _ArrayCopy(dbl, zero, 0, 0, 1);         // Байт[0] == 0 - со сжатием
                _ArrayCopy(dbl, tmp, 1);                // С байта[1] данные
        }
        
        // Пишем части переменной: Имя, Имя(1), Имя(2), …
        cnt = ArraySize(dbl);
        for (int i = 0; i < cnt; ++i) {
                string s = (i == 0)? "" : "(" + (string)i + ")";
                GlobalVariableSet(name + s, dbl[i]);
        }
        GlobalVariablesFlush();
}
 
Edgar Akhmadeev #:

Написал себе функции сохранения в глобальные переменные строк любой длины с применением Вашей библиотеки. Не всё понимаю, поэтому уверен, не использовал на 100%.

Есть мысли по более эффективному применению?

Посмотрите этот вариант.


Также для глобальных переменных удобно было бы использовать CONTAINER<double>.

Нужны ли глобальные переменные терминала типа string? - Используйте темплейты, чтобы разработчики платформы отвлекались на всякую блажь.
Нужны ли глобальные переменные терминала типа string? - Используйте темплейты, чтобы разработчики платформы отвлекались на всякую блажь.
  • 2017.04.08
  • Mikhail Dovbakh
  • www.mql5.com
и динамическое формирование имени массива не обязательно строкового. Отдельный тип глобальных переменных - скорее всего не добавят. таким образом можно записывать и считывать из глобальных переменных строки
 
fxsaber #:

Посмотрите этот вариант.


Также для глобальных переменных удобно было бы использовать CONTAINER<double>.

Спасибо