PLO. Fragen zur Anwendung - Seite 13

 
TheXpert:
Zeigen Sie mir ein Beispiel, damit es keine Verwirrung gibt, dann werde ich antworten.

//1-ый вариант. Переменная-член strA инициализируется автоматически
class A
  {
public:
   string            strA;
                     A(void) { Print("strA=",strA); };
                    ~A(void){};
  };
//2-ой вариант. Переменная-член strB инициализируется при помощи инициализатора пользовательским значением
class B
  {
public:
   string            strB;
                     B(const string str) : strB(str) { Print("strB=",strB); }
                    ~B(void){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a1;
   B b1("Пользовательское значение");
  }

Ein Beispiel ist einfach. Angenommen, 15 "Computerzyklen" werden für die automatische Initialisierung des Mitglieds a1.strA verbraucht. Ich bin zu dem vorläufigen Schluss gekommen, dass auch 15 Zyklen für die Initialisierung des Mitglieds b1.strB verbraucht werden. Ist das richtig?

 

In der Klasse CExpert der Standardbibliothek gibt es folgende geschützte Deklarationen

//--- trading objects
CExpertTrade     *m_trade;    // trading object
CExpertSignal    *m_signal;   // trading signals object
CExpertMoney     *m_money;    // money manager object
CExpertTrailing  *m_trailing; // trailing stops object

Gleichzeitig enthält der Konstruktor dieses Objekts die folgenden Zeichenketten

m_trade    =NULL;
m_signal   =NULL;
m_money    =NULL;
m_trailing =NULL;

Ich habe versucht, etwas Ähnliches in meiner Klasse zu erstellen, aber ohne weitere Initialisierung (wie Init und InitXXX).

Der Compiler kompilierte alles ohne Warnungen oder Fehler, aber als ich versuchte, den EA auf dem Chart zu installieren, erhielt er einen kritischen Fehler 281 (Ungültiger Zeigerzugriff) und der EA wurde aus dem Chart gelöscht.

In diesem Zusammenhang habe ich einige Fragen:

1. Was sollte ich im Konstruktor tun (NULL angeben oder den Zeiger auf das spezifische Objekt angeben)?

2. Ist die Initialisierung des InitTrade-Zeigers obligatorisch?

 
Interesting:

In der Klasse CExpert der Standardbibliothek gibt es folgende geschützte Deklarationen

Gleichzeitig enthält der Konstruktor dieses Objekts die folgenden Zeichenketten

Ich habe versucht, etwas Ähnliches in meiner Klasse zu erstellen, aber ohne weitere Initialisierung (wie Init und InitXXX).

Der Compiler kompilierte alles ohne Warnungen oder Fehler, aber als ich versuchte, den EA auf dem Chart zu installieren, erhielt er einen kritischen Fehler 281 (Ungültiger Zeigerzugriff) und der EA wurde aus dem Chart gelöscht.

In diesem Zusammenhang habe ich einige Fragen:

1. Was sollte ich im Konstruktor tun (NULL angeben oder den Zeiger auf das spezifische Objekt angeben)?

2. Ist die Initialisierung des InitTrade-Zeigers obligatorisch?

1. Beides ist richtig. Es hängt alles von der jeweiligen Implementierung der Klasse ab (nicht speziell von CExpert). Es ist jedoch besser, dynamische Objekte in der InitXXX-Methode zu erstellen, die bool zurückgibt (da der Konstruktor kein Ausführungsergebnis zurückgibt und Sie das Initialisierungsflag zurücksetzen und dann analysieren müssen (das Flag).

2. Natürlich ist sie das. Andernfalls wird der kritische Fehler 281 (Ungültiger Zeigerzugriff) auftreten.

PS. Übrigens, vielen Dank. Ich werde vor der Verwendung Zeigerprüfungen einfügen müssen.

 
Yedelkin:

Ein Beispiel ist einfach. Angenommen, 15 "Computerzyklen" werden für die automatische Initialisierung des Mitglieds a1.strA verbraucht. Ich bin zu dem vorläufigen Schluss gekommen, dass auch 15 Zyklen für die Initialisierung des Mitglieds b1.strB verbraucht werden. Ist dies richtig?

Nein, es geht überhaupt nicht um die Taktik. Oder vielleicht geht es gar nicht um die Uhr.
 
TheXpert:
Nein, es geht überhaupt nicht um die Uhr. Na ja, oder nicht wirklich über die Uhr.

OK, dann eine sehr einfache Frage: was ist schneller zu initialisieren in der Zeit, Mitglied a1.strA oder Mitglied b1.strB aus dem obigen Beispiel?

Oder was ist "Punkt für Punkt" zu lesen? Physikalisch gesehen gibt es keine Möglichkeit, das Programmieren auf einer "Maschinenprozessor"-Ebene zu lernen.

 
Yedelkin:

OK, dann eine sehr einfache Frage: was ist schneller zu initialisieren in der Zeit, Mitglied a1.strA oder Mitglied b1.strB aus dem obigen Beispiel?

Oder was ist "Punkt für Punkt" zu lesen? Es gibt eigentlich keine Möglichkeit, das Programmieren auf einer "Maschinenprozessor"-Ebene zu lernen.

a1.strA wird schneller initialisiert, weil der Initialisierungsprozess einfach auf Null gesetzt wird. Für b1.strB wird eine Speicherzuweisung vorgenommen.

Dieser Unterschied ist jedoch recht schwer zu messen, da er weit unter einem Prozent liegt, wenn man den Code rund um die Initialisierung berücksichtigt

 
Yedelkin:

die sich schneller initialisiert

die Frage ist falsch.
 
stringo:

Für b1.strB wird eine Speicherzuweisung vorgenommen.

Bitte sehr, danke - das fehlende Glied in meiner Logik.

TheXpert, danke für die Hilfe. Ich habe versucht, den Punkt mit meinen eigenen Worten zu erklären. Ich stimme zu, dass eine wirklich richtige Frage von denen gestellt wird, die sich auskennen. Aber normalerweise stellen sie keine Fragen auf meinem Niveau :)

 
uncleVic:

1. Sie ist in beiderlei Hinsicht korrekt. Es hängt alles von der spezifischen Implementierung der Klasse ab (nicht speziell von CExpert). Es ist jedoch besser, dynamische Objekte in der InitXXX-Methode zu erstellen, die bool zurückgibt (weil der Konstruktor kein Ausführungsergebnis zurückgibt und wir das Initialisierungsflag zurücksetzen/aufheben und dann analysieren müssen (das Flag).

2. Natürlich tut sie das. Ansonsten kritischer Fehler 281 (ungültiger Zeigerzugriff).

PS. Übrigens, vielen Dank. Ich werde vor der Verwendung Zeigerprüfungen einfügen müssen.

Danke, jetzt ist alles an seinem Platz. Es gibt jedoch noch eine weitere Frage: Nehmen wir an, der Fehler 281 tritt auf, aber es ist besser, wenn der Expert Advisor nicht entladen wird. Was sollte ich tun?

Lassen Sie mich meine Frage zu klären - Was zu tun ist, wenn 281 Fehler nach allen Schritten der Initialisierung auftritt, aber es würde nicht beeinträchtigen die Hauptarbeit der Expert Advisor kritisch genug, um es überhaupt nicht ausführen?

 
Interesting:

Angenommen, der Fehler 281 tritt auf, aber es ist erwünscht, dass der EA nicht entladen wird. Was sollten wir dann tun?

Lassen Sie mich meine Frage zu klären: Was zu tun ist, wenn Fehler 281 tritt nach allen Schritten der Initialisierung, aber es wird nicht die Hauptarbeit des Expert Advisor kritisch genug, um es überhaupt nicht ausführen?

"Ungültiger Zeigerzugriff" =="Versuch des Zugriffs auf einen ungültigen Zeiger"? Wenn ja, dann

Der Versuch, auf einen ungültigen Zeiger zuzugreifen, führt zu einem Programmabsturz. Deshalb ist es notwendig, die Funktion CheckPointer() zu verwenden, bevor ein Zeiger verwendet wird. Ein Zeiger kann in den folgenden Fällen ungültig sein