Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 217

 
fxsaber #:
Wie kann ich jetzt (b3110) eine komplexe Struktur auf Null setzen?

Konstrukteur mit Nullstellung.

Und wenn Sie während der Bearbeitung eine Nullstellung vornehmen wollen, gibt es auch eine zusätzliche Methode dafür:

struct MqlTick2 : private MqlTick
{
        string Str; // С этой строкой не обнулить.

        MqlTick2()
        {
                Init();
        }
        void Init()
        {
                Str = NULL;
        };
};

void OnStart()
{
        MqlTick2 tick;
        Print( tick.Str );  // NULL
        tick.Str = "123";
        Print( tick.Str );  // "123"
        tick.Init();
        Print( tick.Str );  // NULL
}
 
Andrey Khatimlianskii #:

Konstrukteur mit Nullstellung.

Und wenn Sie es während der Arbeit auf Null stellen wollen, dann gibt es dafür eine zusätzliche Methode:

Ich hätte gerne eine universelle Methode, wie sie ZeroMemory einmal erlaubt hat.

 
A100 #:

Nehmen wir an, ich habe etwas geändert - jetzt prüfe ich den 1. Term auf x[i].i == 0 (vorher war die Bedingung x[i].x == 0.0)

Ergebnis: false

Und mit ZeroMemory - wahr.

Danke, ich habe es korrigiert.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten von mql5, Tipps und Tricks

mktr8591, 2021.08.12 19:43

Ich habe ein Limit für ausstehende Zahlungen festgelegt. Dann ändere ich sie manuell und per Skript und ORDER_TIME_SETUP ändert sich.

Beispiel für die Änderungen.

Einstellungsprotokoll.

QG      0       22:00:02.376    Trades  '93912': accepted buy limit 13.1 AUDUSD at 0.71897 tp: 0.71927
IS      0       22:00:02.378    Trades  '93912': order #5774292 buy limit 13.1 / 13.1 AUDUSD at 0.71897 done in 33.487 ms

ORDER_TIME_SETUP wird geändert. Wanze?

 
fxsaber #:

Ich hätte gerne einen universellen Weg, wie ihn ZeroMemory einst ermöglichte.

Und wer wird den Puffer in der Zeichenfolge freigeben? ZeroMemory ist im Wesentlichen ein Analogon dazu.

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa366920(v=vs.85)

Es werden keine Destruktoren aufgerufen. Dementsprechend wird der Pufferzeiger in string gelöscht, während der Puffer selbst durchlässig wird. Die direkte Arbeit mit dem Gedächtnis ist wie ein Minenfeld - wenn man die Wachsamkeit verliert, war's das)))

Hier ist ein Beispiel für eine Leckage in Ihrem Fall:

#include <iostream>
#include <string>
#include <cstring>

int main()
{
    std::string example{"Leaked memory!!!"};
    std::cout<<"First: "<<example<<std::endl;
    const char* data=example.data();
    std::memset(&example,0,sizeof(example));
    std::cout<<"Second: "<<example<<std::endl;
    std::cout<<"Third: "<<data<<std::endl;
    return 0;
}
First: Leaked memory!!!
Second: 
Third: Leaked memory!!!

Das Objekt verfügt nicht mehr über einen Zeiger auf den Puffer, sondern der Puffer selbst ist "ausgelaufen".

PS. Fuck it nicht POD-Typen auf Null durch memset und ZeroMemory

 
Vladimir Simakov #:

PS. Nun, es ist kein POD-Typ, der über memset und ZeroMemory nullt

Ich habe es nicht getestet, aber ich denke, der String-Puffer wird auf Null gesetzt.

 
fxsaber #:

Ich habe es nicht überprüft, aber ich glaube, der String-Puffer wird zurückgesetzt.

Warum sollte sie zurückgesetzt werden?)))

#import "CPPTestDll.dll"
        long GetAddress(string &ptr);
        string Text(long data);
#import

struct A{
   string a;
   int b;
};

void OnStart()
{
  string t1="Test";
  string t2="text";
  Print(t1);
  Print(t2);
  A a={"",8};
  a.a+=t1+" "+t2;
  long ptr=GetAddress(a.a);
  Print(a.a," | ",a.b);
  Print(Text(ptr));
  Print("-------------------------");
  ZeroMemory(a);
  Print(a.a," | ",a.b);
  Print(Text(ptr));
}


2021.11.28 14:49:29.354 test (EURUSD,H4)        Test
2021.11.28 14:49:29.354 test (EURUSD,H4)        text
2021.11.28 14:49:29.354 test (EURUSD,H4)        Test text | 8
2021.11.28 14:49:29.354 test (EURUSD,H4)        Test text
2021.11.28 14:49:29.354 test (EURUSD,H4)        -------------------------
2021.11.28 14:49:29.354 test (EURUSD,H4)         | 0
2021.11.28 14:49:29.354 test (EURUSD,H4)        Test text

Es ist so erwachsen, wie es sein sollte)))

UPD: t1, t2 mit ihrer Ausgabe, damit der Compiler das Ganze nicht überoptimiert)

UPD2: Sie können delete für den Puffer aufrufen, aber ich kann nicht herausfinden, wie man es in einem Fall tun, wo String innerhalb der Struktur ist

UPD3: obwohl es in der Hilfe geschrieben ist, ist es für sie persönlich aufgerufen, so sollte es Puffer frei, ich hoffe, dass durch Zeiger auf freigegebenen Speicher bereits Daten gelesen.

Dateien:
 
Vladimir Simakov #:

Warum sollte er sich auf Null zurücksetzen?))

Es wäre gut zu sehen

Print(GetAddress(a.a));

Vorher und nachher.

 
fxsaber #:

Es wäre gut zu sehen

Vorher und nachher.

So sollte es auch sein. Im ersten Fall die Speicheradresse, im zweiten Fall 0

 
Vladimir Simakov #:

Warum sollte er sich darauf konzentrieren?)))


Hier ist alles ausgereift, so wie es sein sollte)))

UPD: t1, t2 mit ihrer Ausgabe, damit der Compiler das Ganze nicht überoptimiert)

UPD2: Sie können delete für den Puffer aufrufen, aber ich kann nicht herausfinden, wie man es in einem Fall tun, wo String innerhalb der Struktur ist

UPD3: obwohl es in der Hilfe geschrieben ist, ist es für sie persönlich aufgerufen, so sollte es den Puffer freigeben, ich hoffe, es ist durch einen Zeiger auf den freigegebenen Speicher bereits Daten gelesen.

Im Prinzip sollte alles dort recht trivial in der Umsetzung sein)

Grund der Beschwerde: