Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 217

 
fxsaber #:
Come faccio ora (b3110) ad azzerare una struttura complessa?

Costruttore con azzeramento.

E se volete azzerare in corso, c'è anche un metodo aggiuntivo per farlo:

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 #:

Costruttore con azzeramento.

E se volete azzerarlo mentre lavorate, allora metodo aggiuntivo per questo:

Vorrei un metodo universale, come permetteva una volta ZeroMemory.

 
A100 #:

Considerate che ho cambiato - ora controllo il 1° termine per x[i].i == 0 (prima la condizione era x[i].x == 0.0)

Risultato: falso

E con ZeroMemory - vero.

Grazie, l'ho aggiustato.

 

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Peculiarità di mql5, consigli e trucchi

mktr8591, 2021.08.12 19:43

Ho impostato un limite di attesa. Poi lo cambio manualmente e tramite script e ORDER_TIME_SETUP cambia.

Esempio di cosa cambia.

Registro delle impostazioni.

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 è cambiato. Bug?

 
fxsaber #:

Vorrei un modo universale, come permetteva una volta ZeroMemory.

E chi rilascerà il buffer in stringa? ZeroMemory è essenzialmente un analogo di questo.

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

Nessun distruttore sarà chiamato. Corrispondentemente, il puntatore del buffer sarà cancellato nella stringa, mentre il buffer stesso sarà perso. Il lavoro diretto con la memoria è come un campo minato - se si perde la vigilanza, è finita)))

Ecco un esempio di perdita nel vostro caso:

#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!!!

L'oggetto non possiede più un puntatore a un buffer e il buffer stesso "perdeva".

PS. Fanculo non i tipi POD a zero attraverso memset e ZeroMemory

 
Vladimir Simakov #:

PS. Beh, non è un azzeramento di tipo POD tramite memset e ZeroMemory

Non l'ho testato, ma penso che il buffer delle stringhe venga azzerato.

 
fxsaber #:

Non ho controllato, ma credo che il buffer delle stringhe venga resettato.

Perché dovrebbe resettare?)))

#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

È maturo come dovrebbe essere)))

UPD: t1, t2 con il loro output, in modo che il compilatore non ottimizzi troppo il tutto)

UPD2: possono chiamare la cancellazione per il buffer, ma non riesco a capire come farlo in un caso in cui la stringa è dentro la struttura

UPD3: anche se è scritto in aiuto, è chiamato per esso personalmente, quindi dovrebbe liberare il buffer, spero, che con il puntatore alla memoria liberata già leggere i dati.

File:
 
Vladimir Simakov #:

Perché dovrebbe azzerarsi?)).

Sarebbe bello vedere

Print(GetAddress(a.a));

Prima e dopo.

 
fxsaber #:

Sarebbe bello vedere

Prima e dopo.

Come dovrebbe essere. Nel primo caso l'indirizzo di memoria, nel secondo 0

 
Vladimir Simakov #:

Perché dovrebbe resettare?)))


Tutto qui è maturo, come dovrebbe essere)))

UPD: t1, t2 con il loro output, in modo che il compilatore non ottimizzi troppo il tutto)

UPD2: possono chiamare la cancellazione per il buffer, ma non riesco a capire come farlo in un caso in cui la stringa è dentro la struttura

UPD3: anche se è scritto in aiuto, è chiamato personalmente, significa che il buffer dovrebbe essere liberato, spero che sia già liberata la memoria per puntatore.

In linea di principio, tutto lì dovrebbe essere abbastanza banale nell'implementazione)

Motivazione: