Fehler, Irrtümer, Fragen - Seite 2330

 
Ilyas:

Ich habe den Grund dafür ungefähr herausgefunden. Ich habe eine globale Variable.

CArrayObj actobjects;

Etwas mit der Initialisierungsreihenfolge von mcl environment und mission anscheinend, wenn actobjects einen Zeiger und ein Array dort selbst, nichts abstürzt. Klasse in globalen Variablen - schlechte Praxis, natürlich, ich werde es umschreiben. Aber es gibt Probleme mit statischen Arrays in Funktionen (in µl funktioniert die Regel - Initialisierung beim ersten Eintritt in die Funktion - nicht).

Wenn es sich um einen Fehler handelt, kann ich ihn wahrscheinlich eingrenzen, wenn ich die Ursache ungefähr kenne.

 
pavlick_:

Wie auch immer, wenn es als Fehler zählt, kann ich ihn, wenn ich die Ursache ungefähr kenne, wohl lokalisieren.

Nein, ich kann es nicht fangen, es verschwindet auf wundersame Weise nach dem Ausschneiden des Codes. Selbst das Auskommentieren einiger Zeilen (die vor dem Absturz nicht ausgeführt werden) hat Auswirkungen.

 

Es gibt eine lange Codeklasse, die in mqh liegt. Wir müssen genau die gleiche Klasse erstellen, die sich nur in zwei Zeilen von der ursprünglichen unterscheidet (statt weniger Vorzeichen sollte es mehr Vorzeichen geben).

Ist dies möglich, ohne eine weitere fast identische mqh zu erstellen?


Wenn die Klasse kurz ist, kann man sie leicht mit einem mehrzeiligen Makro erstellen, und alles geht leicht von der Hand. Aber der Code hier ist lang.

Ich möchte keinen MQH-Klon erstellen, denn wenn ich einen MQH repariere, muss ich alle meine Aktionen im zweiten MQH wiederholen. Hinzu kommt der menschliche Faktor der Vergesslichkeit und Unaufmerksamkeit.


Sie können es immer noch mit einer Vorlagenklasse machen. Es ist jedoch nicht klar, wie sich dies auf die Geschwindigkeit der Ausführung auswirken wird. Die Klasse wird für schnelle Läufe benötigt.

 
fxsaber:
#ifdef
 
TheXpert:
#ifdef

Es wird nicht funktionieren. Beide Klassen müssen in Betrieb sein.

 
fxsaber:

Es wird nicht funktionieren. Beide Klassen sollten in Betrieb sein.

Ich sehe da kein Problem.

_____________

Vererbung

Aufteilung der Unterschiede in getrennte Kleinklassen

 
TheXpert:

Ich sehe da kein Problem.

_____________

Vererbung

Aufteilung der Unterschiede in getrennte kleine Klassen

In einer Klasse gibt es mehrere Methoden von angemessener Größe. Bei jeder Methode müssen Sie nur das ">"-Zeichen durch ein "<"-Zeichen ersetzen.

Sie können eine virtuelle wie diese verwenden
class A
{
private:
  virtual bool Compare()
  {
    return(true);
  }
public:

  bool f()
  {
    return(this.Compare());
  }
};

class B : public A
{
private:
  virtual bool Compare()
  {
    return(false);
  }
};


void OnStart()
{
  A a;
  B b;
  
  Print(a.f());
  Print(b.f());
}


Aber leider müssen wir immer noch den Initialisierungswert der Klasse übergeben. Wir werden also wohl doch eine Vorlage verwenden müssen.

 
fxsaber:

Ich würde einige Adapter über Template-Parameter übergeben (da sollte es keine Bremsen geben), aber wenn Sie so ungeschickt sein wollen, können Sie das auch. Erstellen Sie einen harten Link auf die Header-Datei (mklink /H <link> <target>, wenn ich mich nicht irre. Sie können "windows create hard link" googeln). Und dann aktivieren Sie diese Dinge auf die übliche Weise

#define _N C1    // имя класса
#define _M "c1"  // какой-то параметр
#include <qq.mqh>
#undef _N
#undef _M
#define _N C2
#define _M "c2"
#include <ee.mqh> // жёсткая ссылка на qq.mqh
#undef _N
#undef _M
 
pavlick_:

Ich würde einige Adapter über Template-Parameter übergeben (da sollte es keine Bremsen geben), aber wenn Sie so ungeschickt sein wollen, können Sie das auch. Erstellen Sie einen harten Link auf die Header-Datei (mklink /H <link> <target>, wenn ich mich nicht irre. Sie können "windows create hard link" googeln). Und dann schließen Sie es einfach auf die übliche Weise an.

Du verstehst nicht, worum es geht.

 
fxsaber:

Sie haben die Frage nicht verstanden.

Nur für den Fall, dass die Auflistung qq.mqh und ee.mqh ist (eine Entität, die Änderung einer ändert die andere)

class _N
{
public:
   void f() {Alert(_M);}
};

Alle wie bestellt, Klasse nicht inmacros, fast gleich außer _M.

Grund der Beschwerde: