Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 216

 
Igor Makanu #:

ZS: Ich habe auch Makros gesehen wie

Das verstehe ich nicht.

 
fxsaber #:

Das verstehe ich nicht.

Es gibt viele Informationen online über die Bequemlichkeit eines solchen Makros, googeln Sie "macro while 0"

https://russianblogs.com/article/9410298326/

 

In diesem Thread gab es vor langer Zeit ein Beispiel für while(0)

https://www.mql5.com/ru/forum/170952/page141#comment_12897922

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
Um es klar zu machen, es ist nur für statische (hier geht es um C++). Bei lokalen Variablen gibt es kein Nullsetzen, wenn es einen Benutzer-Cursor gibt.

Mir hat die Erklärung selbst gefallen, die in keiner Weise im Widerspruch zu OOP steht.

Wenn Sie ein einfaches Strukturobjekt erstellen, geschieht Folgendes:

  1. Für die Struktur wird Speicher zugewiesen - jeglicher Müll wird dort abgelegt.
  2. Der Konstruktor wird an diesem Stück gestartet.

Wenn die Deklaration durch {} geht, wird eine weitere zwischen den Positionen 1-2 eingefügt, wodurch der zugewiesene Speicher mit Nullen gefüllt wird.


Unter dieser Logik leidet die OOP in keiner Weise. Es ist ein gültiger Mechanismus.

 
fxsaber #:

    Wenn {} deklariert wird, wird zwischen den Punkten 1-2 ein weiterer eingefügt, wodurch der zugewiesene Speicher mit Nullen gefüllt wird.

    Unter dieser Logik leidet die OOP in keiner Weise. Gültiger Mechanismus.

    Die Logik leidet hier: Warum müssen wir es auf Null setzen, wenn es danach sowieso einen Konstruktor gibt?

     
    A100 #:

    Die Logik selbst leidet hier: Warum Nullen, wenn es danach sowieso einen Konstruktor gibt?

    Denn eine Struktur mit einem Konstruktor kann nicht in einer Union verwendet werden.

     
    Ilyas #:

    Für union initialisieren Sie nur das erste Mitglied, tauschen Sie die Felder aus und der Test wird ausgeführt.
    Überlegen wir, ob es sich lohnt, das Verhalten so zu ändern, dass es den Erwartungen der meisten Nutzer entspricht.

    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)

    union X {
        int i;
        double x;
    };
    void OnStart()
    {
        X x[10000] = {}; //(*)
        bool b = true;
        for ( int i = 0; i < ArraySize(x) && (b = (x[i].i == 0)); i++ );
        Print( b );
    }

    Ergebnis: false

    Und mit ZeroMemory - wahr

     
    Igor Makanu #:

    Es gibt viele Informationen online über die Bequemlichkeit eines solchen Makros, googeln Sie "macro while 0"

    https://russianblogs.com/article/9410298326/

    Dieses ganze Durcheinander besteht nur darin, ein Semikolon an das Ende eines Makros zu setzen. Ich verwende überall geschweifte Klammern in Makros und habe damit keine Probleme.

     
    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.

    Ja. mql-Fehler

    (und in C++ gibt sie true zurück).

     
    Wie kann ich jetzt (b3110) eine unkomplizierte Struktur aufspüren?
    struct MqlTick2 : private MqlTick
    {
    //  string Str; // С этой строкой не обнулить.
    };
    
    
    template <typename T>
    void ZeroMemoryStruct( T &Struct )
    {
      uchar Bytes[sizeof(T)];
      
      ::CharArrayToStruct(Struct, Bytes);
    }
    
    void OnStart()
    {
      MqlTick2 Tick;
    
      ZeroMemoryStruct(Tick);  
    }