Bibliotheken: TypeToBytes - Seite 6

 

Der Code wandelt eine Struktur in eine Zeichenkette um

#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) // Ein Analogon zu einer Zeichenkette mit maximal 128 Zeichen.
#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


Wie wird die umgekehrte Konvertierung durchgeführt? (von String zu Struktur)

 
Sergey Likho:

Der Code wandelt die Struktur in eine Zeichenkette um

Wie kann man die umgekehrte Konvertierung durchführen? (von String zu Struktur)

const string Str = DATA_STRING::ToString(a); // Übersetzt die Struktur in eine Zeichenkette.

str_Message Tmp[1];

// Abrufen eines Arrays von Strukturen aus der Zeichenkette
if (DATA_STRING::FromString(Str, Tmp))   
{
  ArrayPrint(Tmp);
  Print(Tmp[0].str[]);   
  
  Print(_R(Tmp) == a); // Überprüfen Sie, ob die Daten mit den Originaldaten übereinstimmen.
}

// Holen Sie die Struktur aus der Zeichenkette.
// Tmp[0] = DATA_STRING::FromString<str_Message>(Str); // Dies ist möglich, wenn es keinen Zuweisungsoperator gibt (siehe STRING120::operator =).
 
Eine weitere Anwendung der Möglichkeiten der Bibliothek.
 
//+------------------------------------------------------------------+
//|test.mq5 |
//|Urheberrecht 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);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+


Die gelbe Codezeile lässt sich nicht mehr kompilieren. Es gibt den folgenden Fehler (Build 2980):

Hat jemand eine Idee, wie das Problem gelöst werden kann?

 
Enrique Dangeroux:

Die gelbe Codezeile lässt sich nicht mehr kompilieren. Sie erzeugt den folgenden Fehler (Build 2980):

Hat jemand eine Idee, wie das Problem gelöst werden kann?

 
Ich danke Ihnen.
 

Aktualisiert. Umgeht eine Funktion, die gefunden wurde. Zuvor konnte sich negativ auf _ArrayCopy und CONTAINER auswirken.

 

Ich habe eine Funktion zum Speichern von Zeichenketten beliebiger Länge in globalen Variablen mit Hilfe Ihrer Bibliothek geschrieben. Ich verstehe nicht alles, daher bin ich sicher, dass ich sie nicht zu 100% genutzt habe.

Irgendwelche Ideen für eine effizientere Nutzung?

#include <TypeToBytes.mqh>


//--------------------------------------------------------------------------------------------------
string
GVarGetString(string name) {
        double dbl[];
        
        // Lesen Sie die Teile der Variablen: 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)
                // Unkomprimiert
                return CharArrayToString(tmp0);
        else {
                // Mit Kompression
                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)) {
                // Unkomprimiert
                string str[1];
                str[0] = val;
                _ArrayCopy(dbl, str);
        }
        else {
                // Mit Kompression
                _ArrayCopy(dbl, zero, 0, 0, 1);         // Byte[0] == 0 - mit Komprimierung
                _ArrayCopy(dbl, tmp, 1);                // Aus Byte[1] Daten
        }
        
        // Schreiben Sie die Bestandteile der Variablen: 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 globalen Variablen mit Hilfe Ihrer Bibliothek geschrieben. Ich verstehe nicht alles, daher bin ich sicher, dass ich sie nicht zu 100 % genutzt habe.

Irgendwelche Ideen für eine effizientere Nutzung?

Schauen Sie sich diese Option an.


Es wäre auch praktisch, CONTAINER<double> für globale Variablen zu verwenden .

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

Probieren Sie diese Option aus.


Es wäre auch praktisch, CONTAINER<double> für globale Variablen zu verwenden .

Danke