Fehler, Irrtümer, Fragen - Seite 1856

 
Andrey Dik:

Wie kann ich die Kodierung sehen?
Ich weiß, dass sie sich geändert hat, indem ich das Aussehen des Textes in einem Editor eines Drittanbieters geändert habe, aber wie ich die Kodierung erkennen kann, weiß ich nicht.
Andrey Khatimlianskii:
Hat gerade einen EA in ME 1580 erstellt: Win-1251 (ANSI)

Ja, mit Akepad sehe ich, dass die Kodierung Win-1251 (ANSI) ist, aber ältere Dateien haben UTF-16LE 1200.

Es ändert also die Standardkodierung für neue Dateien?

 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Merkmale der Sprache mql5, Feinheiten und Tricks

fxsaber, 2017.04.14 11:40

Ja, korrupte Makler. Sie würden dort auch negative Zahlen eingeben.

Es wäre schön, wenn die Entwickler den Bereich der möglichen Werte für jeden Parameter begrenzen würden, wenn die Makler die Symbole einrichten.

 

Mir ist aufgefallen, dass beim Aktualisieren von Produkten auf dem Marktplatz alle Einstellungen für dieses Produkt in den Diagrammen auf die Standardwerte zurückgesetzt werden.

Das ist nicht richtig, wie kann das vermieden werden?

 

ArrayMaximum() und ArrayMinimum() - die Reihenfolge, in der die Parameter übergeben werden, stimmt nicht mit der Hilfe überein:


 
fxsaber:
Ein wenig Know-how. Umgehung des Zuweisungsoperators

Ergebnis

Das ist kein Trinkgeld, das ist eine Perversion.

Das hätte ich von Ihnen nicht erwartet.

 
Koldun Zloy:

Das ist kein schlauer Trick, das ist eine Perversion.

Das habe ich von Ihnen nicht erwartet.

Dies ist also für Sie

Forum zum Thema Handel, automatische Handelssysteme und Strategietests

Bibliotheken: TypeToBytes

fxsaber, 2017.04.13 13:34

Ein Beispiel dafür, wie diese Funktion bei der Ermittlung potenzieller Fehler nützlich sein kann.

Schreiben und Ausführen des Skripts.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}


Ergebnis.

_WRONG_ASSIGN_OPERATOR(STRUCT) = true

Dies bedeutet, dass der Zuweisungsoperator die Struktur nicht in eine Struktur desselben Typs kopieren wird.


Wenn wir der Struktur mehr hinzufügen,

  void operator =( STRUCT &Value ) { this.i = 0; }

wird das Ergebnis dasselbe sein.


Es mag den Anschein erwecken, dass durch die Änderung dieses Operators in

  void operator =( STRUCT &Value ) { this.i = Value.i; }

aber die Bibliothek sagt etwas anderes.


Dies ist vielleicht der subtilste Punkt dieses Beispiels.

Korrigieren Sie es durch

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT() : i(0) {}
  
  template <typename T>
  void operator =( T& ) {}

  void operator =( const STRUCT &Value ) { this.i = Value.i; }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT))
}

und Sie erhalten das Ergebnis

_WRONG_ASSIGN_OPERATOR(STRUCT) = false


Jetzt ist der Kopieroperator korrekt!

Auf die gleiche Weise können wir die Korrektheit der Zuweisungs-/Kopieroperatoren einer beliebigen einfachen Struktur überprüfen.

 

1. Wenn wir so schreiben:

STRUCT StructCopy1 = Struct;
Es ist nicht operator=, das aufgerufen werden sollte, sondern der Kopierkonstruktor.

Aber das ist eher eine Frage für die Metaquotes.

2. Wenn der vom Compiler erstellte Kopierkonstruktor nicht aufgerufen wird, können wir ihn selbst schreiben.

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = other.i;
  }
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

Jetzt wird operator= nicht aufgerufen.

3. Da uns die Strukturelemente zur Verfügung stehen, können wir sie einfach auf diese Weise schreiben:

StructCopy1.i = Struct.i;

Aber wenn Sie sie privat machen, dann hilft auch Ihr Tiphook nicht weiter.

4. und vor allem: operator= wird verwendet, um sicherzustellen, dass alle Zuweisungen durch ihn hindurchgehen und nicht an ihm vorbei.

Normalerweise wird der Kopierkonstruktor zusammen mit ihm definiert.

Ja, ich habe mir die Probe angesehen. Ich habe nicht viel Gewinn gesehen.

 
Koldun Zloy:

1. Wenn wir so schreiben:

Es ist nicht operator=, das aufgerufen werden sollte, sondern der Kopierkonstruktor.

Aber das ist eher eine Frage für die Metaquotes.

2. Wenn der vom Compiler erstellte Kopierkonstruktor nicht aufgerufen wird, können wir ihn selbst schreiben.

Jetzt wird operator= nicht aufgerufen.

3. Da uns die Strukturelemente zur Verfügung stehen, können wir sie einfach auf diese Weise schreiben:

Aber wenn Sie sie privat machen, dann hilft auch Ihr Tiphook nicht weiter.

4. und vor allem: operator= wird verwendet, um sicherzustellen, dass alle Zuweisungen durch ihn hindurchgehen und nicht an ihm vorbei.

Normalerweise wird der Kopierkonstruktor zusammen mit ihm definiert.

Ja, ich habe mir die Probe angesehen. Ich habe nicht viel Gewinn gesehen.

Lifehack umgeht auch den Kopierkonstruktor. Und der Nutzen ist hier
#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  STRUCT(){}
  STRUCT( int _i ) : i(_i){}
  STRUCT( const STRUCT& other )
  {
      i = 2;
  }
  
  void operator =( const STRUCT& )
  {
//    Print(__FUNCSIG__);
    
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Struct(1);  

  ArrayPrint(_R(Struct).Bytes); // 1 0 0 0
  
  STRUCT StructCopy1 = Struct;  // STRUCT( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0
    
  StructCopy1 = Struct;         // void STRUCT::operator=( const STRUCT& )

  ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0
}

R ist eine universelle Sache. Deshalb brauchen wir keine fremden Strukturen mit eigenen Betreibern neu zu definieren.

#include <TypeToBytes.mqh>

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

void OnStart()
{
  STRUCT Structs[] = {{1}, {2}};
  
  ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0
}
 
Andrey Dik:

Ja, mit Akepad sehe ich, dass die Kodierung Win-1251 (ANSI) ist, aber ältere Dateien haben UTF-16LE 1200.

Hat sich die Standardkodierung für die neuen Dateien also doch geändert?

Nein, es war immer Win-1251 (ANSI) und UTF wurde irgendwann hinzugefügt. Aber nur für die Quelldateien, die Nicht-Ansi-Zeichen enthalten.
 
Andrey Khatimlianskii:
Nein, es war immer Win-1251 (ANSI) und irgendwann wurde UTF hinzugefügt. Aber nur für die Quellen, die Nicht-Ansi-Zeichen enthalten.
Ich verstehe. Ich danke Ihnen.