Fehler, Irrtümer, Fragen - Seite 1838

 

Das ist normal und absolut richtig. Sie haben nach der internen Größe (ohne Nutzlast) eines dynamischen Objekts gefragt.

Verwenden Sie ArraySize für dynamische Objekte und wenden Sie sizeof nur auf statische Objekte an. Sizeof wird zur Kompilierzeit gezählt und ist immer eine Konstante.

 
Renat Fatkhullin:

Das ist normal und absolut richtig.

Verwenden Sie ArraySize für dynamische Objekte und wenden Sie sizeof nur auf statische Objekte an.

Ich danke Ihnen! Bitte bringen Sie die Hilfe in Einklang mit dieser Empfehlung.
 

Lesen Sie die Dokumentation vollständig durch

Вычисления размера происходит на этапе компиляции.

 

Ich bitte um Hilfe, ich bin selbst ratlos. Ich habe dieses Skript geschrieben, um es zu erklären.

struct STRUCT 
{
  int a;
};

class CLASS
{
public:
  int a;
};

STRUCT f1()
{  
  static int i = 0;
  
  STRUCT Res;
  
  Res.a = i++;   
  
  return(Res);
}

CLASS* f2()
{
  static int i = 0;
  
  CLASS* Res = new CLASS;
  
  Res.a = i++;
  
  return(Res);
}

void OnStart()
{
  int i1 = f1().a + f1().a;  
  int i2 = f2().a + f2().a;
}

Es gibt eine Struktur und es gibt eine ähnliche Klasse. Ich möchte, dass nach der i2-Berechnung die entsprechenden Klassenobjekte spontan gelöscht werden, so wie es bei Strukturobjekten geschieht, wenn die gleiche i1-Berechnung durchgeführt wird. Wie kann man das tun?

 

fxsaber:

Wie kann ich das tun?

Verpacken Sie es in einen intelligenten Zeiger, nicht sicher, ob es mit mql möglich ist
 
Комбинатор:
Verpacken Sie es in einen intelligenten Zeiger, ich bin nicht sicher, ob das mit mql möglich ist.
Das Problem selbst wird durch die Unfähigkeit verursacht, eine komplexe Struktur zurückzugeben. Wenn zum Beispiel im obigen Code statt int a; string a; steht, dann wird f1() bei der Rückkehr fehlschlagen. Deshalb fiel mein Blick auf den Unterricht, aber dort wartete die beschriebene Falle.
 

Im Allgemeinen können Sie den Konstruktor copy und operator= außer Kraft setzen.

Dies wird nicht für Klassen funktionieren, sie sollen nur per Zeiger zurückgegeben werden, Strukturen können per Wert zurückgegeben werden.

 
Комбинатор:

Im Allgemeinen können Sie den Konstruktor copy und operator= außer Kraft setzen

Dies wird nicht für Klassen funktionieren, sie sollen nur per Zeiger zurückgegeben werden, Strukturen können per Wert zurückgegeben werden.

Ich danke Ihnen! Ich wurde durch eine kürzlich aufgehobene Einschränkung an dieser Lösung gehindert. Jetzt funktioniert es
struct STRUCT
{
  string Str;

  template <typename T>
  void operator =( const T Value )
  {
    Print(__FUNCTION__);
  }
  
  void operator =( const STRUCT &Struct )
  {
    this.Str = Struct.Str;
  }
};

STRUCT f()
{
  STRUCT Res;
  
  return(Res);
}

void OnStart()
{
  f() = 1;
}
 

Während der Optimierung des Expert Advisors erhalte ich folgenden Fehler

Die (0, 3) getestet mit Fehler "kritischer Laufzeitfehler 512 in OnTimer-Funktion (sleep-Funktion erreicht Ende des Tests)" bei 0:37:20.429 + Geschichte Synchronisation 0:00:43.395

Einzelner Test verläuft ohne Fehler.

Die Version von MT5 und MetaEditor ist 1571.

 
pivomoe:

Während der Optimierung des Expert Advisors erhalte ich folgenden Fehler

Der Fehler "Kritischer Laufzeitfehler 512 in der Funktion OnTimer (sleep-Funktion erreicht das Testende)" bei 0:37:20.429 + Verlaufssynchronisierung 0:00:43.395

Entfernen Sie so viel Code wie möglich aus dem Expert Advisor, damit der Fehler reproduzierbar ist. Und veröffentlichen Sie den restlichen Code.