程序库: TypeToBytes - 页 6

 

代码将结构转换为字符串

#include <Data_String.mqh>
#define  DEFINE_STRING(A)                        \
  struct STRING##A                              \
  {                                             \
  private:                                      \
    short Array[A];                             \
                                                \
  public:                                       \
    void operator =( const string Str )         \
    {                                           \
      ::StringToShortArray(Str, this.Array);    \
      return;                                   \
    }                                           \
                                                \
    string operator []( const int = 0 ) const   \
    {                                           \
      return(::ShortArrayToString(this.Array)); \
    }                                           \
  };
DEFINE_STRING(120) // 类似于字符串,最多有 128 个字符。
#undef  DEFINE_STRING

struct str_Message
  {
   int               cnt;
   bool              res;
   double            ter;
   STRING120          str;
  };
void OnStart()
  {
//---
   str_Message a;
   a.cnt = 10;
   a.res = false;
   a.ter = 20.0123;
   a.str = "hello world";
   Print(DATA_STRING::ToString(str1););
  }

// Результат
//2020.03.31 10:43:18.320	StructTest2 (EURUSD,H1)	CgAAAAClvcEXJgM0QGgAZQBsAGwAbwAgAHcAbwByAGwAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


如何进行反向转换?(从字符串到结构体)

 
Sergey Likho:

代码将结构转换为字符串

如何进行反向转换?(从字符串到结构体)

const string Str = DATA_STRING::ToString(a); // 将结构转换为字符串。

str_Message Tmp[1];

// 从字符串中获取结构数组
if (DATA_STRING::FromString(Str, Tmp))   
{
  ArrayPrint(Tmp);
  Print(Tmp[0].str[]);   
  
  Print(_R(Tmp) == a); // 验证数据是否与原始数据一致。
}

// 从字符串中获取结构。
// Tmp[0] = DATA_STRING::FromString<str_Message>(Str);// 如果没有赋值运算符(参见 STRING120::operator =),则可以这样做。
 
图书馆功能的另一种应用
 
//+------------------------------------------------------------------+
//|测试。mq5
//|2021 年 MetaQuotes 有限公司版权所有。|
//|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);
  }
//+------------------------------------------------------------------+
//| 专家去初始化函数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| 专家勾选功能|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+


黄色一行代码已无法编译。它给出了以下错误(版本号 2980):

有什么办法可以解决问题吗?

 
Enrique Dangeroux:

黄色代码行不再编译。它会产生以下错误(版本号 2980):

有什么办法可以解决问题吗?

关于交易、自动交易系统和测试交易策略的论坛

库:SingleTesterCache

fxsaber, 2021.06.21 02:42 pm.

在 TypeToBytes.mqh 中,将{0} 替换为{}

 
谢谢。
 

已更新。绕过了发现的一个功能。以前该功能会对_ArrayCopyCONTAINER 产生负面影响。

 

我用你们的库编写了一个函数,可以将任意长度的字符串保存到全局变量 中。我并不完全理解,所以我肯定没有百分之百地使用它。

有没有更有效的使用方法?

#include <TypeToBytes.mqh>


//--------------------------------------------------------------------------------------------------
string
GVarGetString(string name) {
        double dbl[];
        
        // 读取变量的各个部分:Name、Name(1)、Name(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);         // Byte[0] == 0 - 已压缩
                _ArrayCopy(dbl, tmp, 1);                // 来自字节[1]的数据
        }
        
        // 写出变量的各个部分:Name、Name(1)、Name(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 全局变量 中。我并没有完全理解,所以我肯定没有百分之百地使用它。

有没有更有效的使用方法?

看看这个选项


对全局变量使用CONTAINER<double> 也很方便

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

查看此选项


对全局变量使用CONTAINER<double> 也很方便

谢谢