Características del lenguaje mql5, sutilezas y técnicas - página 217

 
fxsaber #:
¿Cómo hago ahora (b3110) para poner a cero una estructura compleja?

Constructor con puesta a cero.

Y si quieres ponerte a cero en el progreso, también hay un método adicional para hacerlo:

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

Constructor con puesta a cero.

Y si quieres ponerlo a cero mientras trabajas, entonces método adicional para esto:

Me gustaría un método universal, como el que en su día permitió ZeroMemory.

 
A100 #:

Considera que he cambiado - ahora compruebo el primer término para x[i].i == 0 (antes la condición era x[i].x == 0.0)

Resultado: falso

Y con ZeroMemory - verdadero.

Gracias, lo he arreglado.

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades de mql5, consejos y trucos

mktr8591, 2021.08.12 19:43

He establecido un límite pendiente. Entonces lo cambio manualmente y por script y ORDER_TIME_SETUP cambia.

Ejemplo de lo que cambia.

Registro de ajustes.

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 se modifica. ¿Bicho?

 
fxsaber #:

Me gustaría una forma universal, como la que en su día permitió ZeroMemory.

¿Y quién va a liberar el buffer en cadena? ZeroMemory es esencialmente un análogo de esto.

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

No se llamará a ningún destructor. En consecuencia, el puntero del búfer se borrará en la cadena, mientras que el propio búfer se filtrará. El trabajo directo con la memoria es como un campo de minas: si pierdes la vigilancia, se acabó))

Este es un ejemplo de fuga en su 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!!!

El objeto ya no posee un puntero al buffer, sino que el propio buffer se ha "filtrado".

PS. Joder no tipos POD a cero a través de memset y ZeroMemory

 
Vladimir Simakov #:

PS. Bueno, no es una puesta a cero de tipo POD a través de memset y ZeroMemory

No lo he probado, pero creo que el buffer de cadenas se pone a cero.

 
fxsaber #:

No lo he comprobado, pero creo que el buffer de cadenas se está restableciendo.

¿Por qué iba a reiniciarse?))

#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 todo adulto, como debe ser)))

UPD: t1, t2 con su salida, para que el compilador no sobreoptimice el conjunto)

UPD2: pueden llamar a delete para el buffer, pero no consigo averiguar cómo hacerlo en un caso en el que la cadena está dentro de la estructura

UPD3: aunque está escrito en la ayuda, se llama para ello personalmente, por lo que debe liberar buffer, espero, que por puntero a la memoria liberada ya leer los datos.

Archivos adjuntos:
 
Vladimir Simakov #:

¿Por qué iba a ponerse a cero?)

Sería bueno ver

Print(GetAddress(a.a));

Antes y después.

 
fxsaber #:

Sería bueno ver

Antes y después.

Como debe ser. En el primer caso la dirección de memoria, en el segundo 0

 
Vladimir Simakov #:

¿Por qué iba a reiniciar?))


Aquí todo es maduro, como debe ser)))

UPD: t1, t2 con su salida, para que el compilador no sobreoptimice el conjunto)

UPD2: pueden llamar a delete para el buffer, pero no consigo averiguar cómo hacerlo en un caso en el que la cadena está dentro de la estructura

UPD3: aunque está escrito en la ayuda, se le llama personalmente, significa que el buffer debe ser liberado, espero que ya se haya liberado la memoria por puntero.

En principio, todo debería ser bastante trivial en la aplicación)