PLO. Fragen zur Anwendung - Seite 14

 
Yedelkin:

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

Ein Zeiger kann in den folgenden Fällen ungültig sein:

Der erste Fall ist meiner.

Ich würde gerne CheckPointer() und andere Prüfmethoden verwenden (ich bin nicht am Morgen geboren), aber EA aus dem Chart herauszureißen, gibt mir keine Chance.

Lassen Sie mich es gerade bekommen - wenn ich im Konstruktor angeben, dass Zeiger gleich NULL und stoppen Sie alle Aktionen mit ihm, Expert Advisor wird 281 erhalten und beenden (während nach meiner Idee sollte es nicht).

Aber wenn Sie Init oder InitXXX nach dem Konstruktor aufrufen (ähnlich wie bei CExpert) , funktioniert alles richtig...

 
Interesting:

Die erste Option ist mein Fall.

Ich würde gerne CheckPointer() und andere Prüfmethoden verwenden (ich wurde am selben Tag geboren), aber der Absturz von EA aus dem Diagramm gibt mir keine Chance, dies zu tun.

Lassen Sie mich es gerade bekommen - wenn ich im Konstruktor angeben, dass Zeiger gleich NULL ist und brechen alle möglichen Aktionen mit ihm, EA bekommt 281 und spaltet nach unten (und nach meiner Idee sollte es nicht).

Aber wenn Sie Init oder InitXXX nach dem Konstruktor aufrufen (ähnlich wie bei CExpert) , funktioniert alles richtig...


Wenn Sie Ausnahmen behandelt hätten, könnten Sie leicht herausfinden, wo das Problem liegt und es beheben.
 
Interesting:

Die erste Option ist mein Fall.

Ich würde gerne CheckPointer() und andere Prüfmethoden verwenden (ich glaube, ich bin nicht von gestern), aber der Absturz von EA aus dem Chart gibt mir keine Chance.

Lassen Sie mich es gerade bekommen - wenn ich im Konstruktor angeben, dass Zeiger gleich NULL und stoppen Sie alle Aktionen mit ihm, Expert Advisor wird 281 erhalten und beenden (während nach meiner Idee sollte es nicht).

Wenn Sie Init oder InitXXX nach dem Konstruktor aufrufen (ähnlich wie bei CExpert) , funktioniert alles wie es sollte...

Ich habe mich noch nicht mit Init- oder InitXXX-Methoden beschäftigt, aber ich würde "EA wird heruntergezogen" an sich wie folgt interpretieren: Das Programm stößt zur Laufzeit auf einen falschen Zeiger und dieser Engpass muss im Code gesucht werden. Mein Konstruktor initialisiert auch einen Zeiger auf NULL, aber nichts fliegt raus.

Wenn ich die Frage falsch verstanden habe, tut es mir leid.

 
Interesting:

Danke, jetzt ist alles an seinem Platz. Es stellt sich jedoch eine weitere Frage: Angenommen, der Fehler 281 tritt auf, aber es ist wünschenswert, dass der EA nicht entladen wird. Wie sollten wir damit umgehen?

Lassen Sie mich meine Frage klären: Was ist zu tun, wenn der Fehler 281 nach allen Schritten der Initialisierung auftritt, aber er wird die Hauptarbeit des Expert Advisors nicht kritisch genug beeinflussen, um ihn überhaupt nicht auszuführen?

Es wird keine Ausnahmebehandlung geben.

Es gibt nur einen Ausweg: Verwenden Sie keine falschen Zeiger.

Wenn die Möglichkeit besteht (außer Null), dass ein Zeiger falsch sein könnte, sollten Sie ihn überprüfen, bevor Sie ihn verwenden.

 
uncleVic:

Es wird keine Ausnahmebehandlung geben.

Der einzige Ausweg besteht darin, keine ungültigen Zeiger zu verwenden.

Wenn die Möglichkeit besteht (außer Null), dass ein Zeiger falsch sein könnte, sollten Sie ihn vor der Verwendung unbedingt testen.


Die Möglichkeit (außer Null), dass ein Zeiger ungültig sein könnte, ist IMMER wahrscheinlicher!

Überprüfen Sie daher vor JEDER Verwendung die Gültigkeit! Nicht erst nach der Schöpfung.

Nicht immer, aber in kritischen Momenten tue ich das :(


Oh Scheiße, was für ein rein transparenter Code wird :), wenn man Ihre Empfehlung verwendet.

 
Yedelkin:

Ich habe mich noch nicht mit Init- oder InitXXX-Methoden befasst, aber ich würde "EA von der Karte nehmen" an sich wie folgt interpretieren: Das Programm stößt bei seiner Ausführung auf einen falschen Zeiger, und es ist dieser Engpass im Code, der gesucht werden muss. Mein Konstruktor initialisiert auch einen Zeiger auf NULL, aber nichts fliegt raus.

Wenn ich die Frage missverstanden habe, tut es mir leid.

Wenn es sich um die Klasse CExpert handelt, müssen Sie mindestens Init(...) aufrufen. Alle Zeiger werden dort als Zeiger auf Objekte von Basisklassen initialisiert...
 
falkov:

Die Möglichkeit (außer Null), dass ein Zeiger ungültig sein könnte, ist ABSOLUT IMMER möglich!

Überprüfen Sie daher vor JEDER Verwendung die Gültigkeit!

Nicht immer, aber in kritischen Bereichen schon :(


Heilige Scheiße, was für ein rein transparenter Code wird :), wenn man Ihre Empfehlung verwendet.

Alternative: Haben Sie sauberen transparenten Code, der bei einem ungültigen Zeiger abfliegt?
 
uncleVic:
Alternative: Sie haben einen sauberen, transparenten Code, der bei einem ungültigen Zeiger fehlschlägt?

Alternative: Ein sauberer, transparenter Code.

Bei ungültigen Zeigern und anderen Ausnahmesituationen (Stromausfall, Festplattenplatz, usw. EXKLUSIVE Situationen) geht das Programm in den Block für die Ausnahmebehandlung, wo der Interessierte (und auch ich :) die Variablenwerte und den Fehler ausgeben, die Situation analysieren und verstehen kann, was das Problem ist. Und wenn es keine Reaktion auf das gibt, was in diesem Block passiert ist, lassen Sie es sein.

Dies bedeutet natürlich nicht, dass die üblichen und notwendigen Kontrollen nicht durchgeführt werden. Dies gilt NUR in AUSSERGEWÖHNLICHEN SITUATIONEN.

 
uncleVic:
Wenn es sich um die Klasse CExpert handelt, müssen Sie mindestens Init(...) aufrufen. Alle Zeiger werden dort als Zeiger auf Objekte von Basisklassen initialisiert...

Was passiert zum Beispiel, wenn Init oder InitXXX mit einem Fehler ausgeführt wird (false zurückgibt)?

Oder was ist zu tun, wenn der EA während der Ausführung immer noch 281 erhält (trotz aller Prüfungen und Tricks), aber kein Händler in der Nähe ist?

Dasist keine gute Idee:

Hätten Sie Ausnahmen gehandhabt, könnten Sie leicht herausfinden, was falsch war und die Situation in den Griff bekommen.

Die Kontrollen sind bei fast jedem Schritt vorhanden, aber leider ist die Verarbeitung nicht vorhanden...

PS

Also, über EA fallen aus dem Diagramm - was zu tun, um EA "lebendig" in jeder Initialisierung zu machen?

 
uncleVic:
Alternative: Um sauberen transparenten Code zu haben, der durch einen ungültigen Zeiger abstürzt?

Nun, das ist der Punkt, an dem es herausfliegt, "mich" selbst in diesem Fall entscheiden zu lassen, ob der Experte abgezogen werden soll oder nicht.

Schließlich geht es nicht einmal darum, dass ein "kaputter" Zeiger irgendwo angewendet wird, obwohl ich persönlich eine Prüfung vornehme, bevor ich ihn anwende (obwohl ich eine weitere Prüfung in den Timer einbauen kann).

Ich habe irgendwie gelernt, in Harmonie mit Indikatoren zu leben, und ich kümmere mich nicht viel um die Ergebnisse der Initialisierung, aber ich kann mich nicht mit Zeigern anfreunden.

Yedelkin:

Ich habe mich noch nicht mit Init- oder InitXXX-Methoden beschäftigt, aber ich würde das "EA pulling down" an sich wie folgt interpretieren: Das Programm stößt während seiner Ausführung auf einen falschen Zeiger und dieser Engpass muss im Code gesucht werden. Mein Konstruktor initialisiert auch einen Zeiger auf NULL, aber nichts fliegt raus.

Sollte ich die Frage missverstanden haben, bitte ich um Entschuldigung.

Derzeit, um das Problem zu lösen, gebe ich im Initialisierungsblock 0 zurück.

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

So wie ich es verstanden habe, ist das der beste Weg für mich (damit EA bei der Initialisierung nicht abstürzt). D.h. in jedem Fall Ergebnis OnInit = 0, kann ich nicht beurteilen, wie korrekt es ist.