Características da linguagem mql5, subtilezas e técnicas - página 217

 
fxsaber #:
Como é que agora (b3110) zero uma estrutura complexa?

Construtor com zeragem.

E, se quiser zerar em progresso, há também um método adicional para o fazer:

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

Construtor com zeragem.

E se quiser zerá-lo enquanto trabalha, então método adicional para isso:

Eu gostaria de um método universal, como ZeroMemory uma vez permitido.

 
A100 #:

Considere que eu mudei - agora verifico o 1º termo para x[i].i == 0 (anteriormente a condição era x[i].x == 0.0)

Resultado: falso

E com ZeroMemory - verdade.

Obrigado, arranjou-o.

 

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades de mql5, dicas e truques

mktr8591, 2021.08.12 19:43

Eu estabeleço um limite pendente. Depois mudo-o manualmente e por script e alterações ORDER_TIME_SETUP.

Exemplo do que muda.

Diário de configuração.

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

A ORDER_TIME_SETUP é alterada. Bug?

 
fxsaber #:

Eu gostaria de uma forma universal, como a ZeroMemory uma vez permitiu.

E quem irá libertar o tampão em cadeia? ZeroMemory é essencialmente um análogo disto.

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

Não serão chamados destruidores. De forma correspondente, o ponteiro do tampão será limpo em cordel, enquanto o próprio tampão será libertado. Trabalho directo com a memória é como um campo minado - se se perde a vigilância, é isso))))

Aqui está um exemplo de fuga no seu 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!!!

O objecto já não possui um ponteiro para o tampão, mas o próprio tampão "vazou".

PS. Que se lixe os tipos POD a zero através de memset e ZeroMemory

 
Vladimir Simakov #:

PS. Bem, não é uma zeragem tipo POD via memset e ZeroMemory

Ainda não foi testado, mas penso que o tampão de cordas é zerado.

 
fxsaber #:

Ainda não verifiquei, mas penso que o buffer de cordas está a ser reiniciado.

Porque é que se reiniciaria?)))

#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

É tão maduro quanto deveria ser))))

UPD: t1, t2 com a sua saída, para que o compilador não otimize em demasia o conjunto)

UPD2: podem chamar apagar para o buffer, mas não consigo descobrir como fazê-lo num caso em que a corda está dentro da estrutura

UPD3: embora esteja escrito em ajuda, é chamado pessoalmente, por isso deve libertar buffer, espero, que por ponteiro para libertar memória já lida dados.

Arquivos anexados:
 
Vladimir Simakov #:

Porque é que ele reiniciaria?))

Seria bom ver

Print(GetAddress(a.a));

Antes e depois.

 
fxsaber #:

Seria bom ver

Antes e depois.

Como deve ser. No primeiro caso o endereço de memória, no segundo 0

 
Vladimir Simakov #:

Porque é que ele iria reiniciar?)))


Tudo aqui é maduro, como deve ser))))

UPD: t1, t2 com a sua produção, para que o compilador não optimize demasiado tudo)

UPD2: podem chamar apagar para o buffer, mas não consigo descobrir como fazê-lo num caso em que a corda está dentro da estrutura

UPD3: embora esteja escrito em ajuda, é chamado pessoalmente, significa que o tampão deve ser libertado, espero que já tenha libertado a memória por ponteiro.

Em princípio, tudo deve ser bastante trivial na implementação)