Caractéristiques du langage mql5, subtilités et techniques - page 217

 
fxsaber #:
Comment faire maintenant (b3110) zéro une structure complexe ?

Constructeur avec mise à zéro.

Et si vous voulez faire un zéro en cours, il existe aussi une méthode supplémentaire pour le faire :

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

Constructeur avec mise à zéro.

Et si vous voulez le mettre à zéro tout en travaillant, il existe une méthode supplémentaire pour cela :

J'aimerais une méthode universelle, comme le permettait autrefois ZeroMemory.

 
A100 #:

Considérez que j'ai changé - maintenant je vérifie le 1er terme pour x[i].i == 0 (précédemment la condition était x[i].x == 0.0)

Résultat : faux

Et avec ZeroMemory - vrai.

Merci, c'est réparé.

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités de mql5, trucs et astuces

mktr8591, 2021.08.12 19:43

J'ai fixé une limite d'attente. Ensuite, je le modifie manuellement et par script et ORDER_TIME_SETUP change.

Exemple de ce qui change.

Journal des réglages.

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 est modifié. Bug ?

 
fxsaber #:

J'aimerais un moyen universel, comme le permettait autrefois ZeroMemory.

Et qui va libérer le tampon en ficelle ? ZeroMemory est essentiellement un analogue de ceci.

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

Aucun destructeur ne sera appelé. En conséquence, le pointeur du tampon sera effacé dans la chaîne, tandis que le tampon lui-même sera fui. Le travail direct avec la mémoire est comme un champ de mines - si vous perdez la vigilance, c'est fini)))

Voici un exemple de fuite dans votre cas :

#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'objet ne possède plus de pointeur vers le tampon, mais le tampon lui-même a "fui".

PS. Fuck it not POD types to zero through memset and ZeroMemory

 
Vladimir Simakov #:

PS. Eh bien, ce n'est pas une mise à zéro de type POD via memset et ZeroMemory.

Je ne l'ai pas testé, mais je pense que le tampon de la chaîne est remis à zéro.

 
fxsaber #:

Je n'ai pas vérifié, mais je pense que le tampon des chaînes de caractères est réinitialisé.

Pourquoi se réinitialiserait-il ?)))

#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

C'est aussi mature qu'il se doit)))

UPD : t1, t2 avec leur sortie, afin que le compilateur ne sur-optimise pas l'ensemble)

UPD2 : ils peuvent appeler delete pour le tampon, mais je n'arrive pas à trouver comment le faire dans le cas où la chaîne est à l'intérieur de la structure.

UPD3 : bien qu'il soit écrit dans l'aide, il est appelé pour cela personnellement, donc il devrait libérer le tampon, j'espère, que par pointeur vers la mémoire libérée déjà lu des données.

Dossiers :
 
Vladimir Simakov #:

Pourquoi se serait-il remis à zéro ?))

Il serait bon de voir

Print(GetAddress(a.a));

Avant et après.

 
fxsaber #:

Il serait bon de voir

Avant et après.

Comme il se doit. Dans le premier cas, l'adresse de la mémoire, dans le second 0

 
Vladimir Simakov #:

Pourquoi ferait-il une remise à zéro ?)))


Tout ici est mature, comme il se doit)))

UPD : t1, t2 avec leur sortie, afin que le compilateur ne sur-optimise pas l'ensemble)

UPD2 : ils peuvent appeler delete pour le tampon, mais je n'arrive pas à trouver comment le faire dans le cas où la chaîne est à l'intérieur de la structure.

UPD3 : bien que ce soit écrit dans l'aide, je l'ai appelé personnellement, donc il devrait libérer le tampon, j'espère que c'est par un pointeur vers la mémoire libérée déjà lu les données.

En principe, tout ce qui s'y trouve devrait être assez simple à mettre en œuvre.)

Raison: