Bedingte Verzweigung - "GoTo" Kluge ? - Seite 3

 
FourX:

Soweit ich bisher herausfinden konnte, Raptor, ihre ist nichts wie GoSub / Return-Befehle oder die Fähigkeit, eine solche Funktion in MQL4 zu machen. Daher mein Versuch, eine Kluge in MQL4 zu finden, um diese Fähigkeit auszuführen.

Eine Funktion tut das Gleiche wie GOSUB/RETURN...

start()
  {
  Print("About to call a function called, a_function . . .");
  a_function();                                               //  GOSUB
  Print("Just returned from a function called, a_function");
  return(0);
  } 
   
   
   
void a_function()
   {
   Print("a_function has been called . . . ");
   return;                                          // RETURN
   }
   
   
   
 
RaptorUK:

Eine Funktion tut das Gleiche wie GOSUB/RETURN...

Ich weiß, dass zahllose Standard- und benutzerdefinierte Funktionen an jeder beliebigen (geeigneten) Stelle "aufgerufen" und verwendet werden können, aber es gibt in MQL4 nichts wie ein GoSub und/oder GoTo an einer bestimmten Stelle im Programm, z. B. GoTo Line 185 oder ein bestimmtes Label/eine bestimmte Funktion usw., wie Sie selbst beschrieben haben. Führen Sie es dann aus und kehren Sie zu der Stelle im Programm zurück, von der aus es aufgerufen wurde; oder fahren Sie vielleicht von der aufgerufenen SubRoutine und/oder dem Programmabschnitt/Funktion aus fort, je nach dem bedingten Ergebnis dieser Subroutine. Wie Sie sagten, haben Sie selbst jahrelang GoSub verwendet, und ein bedingter Sprung über ein paar aufeinanderfolgende Codezeilen hinaus ist nicht dasselbe. Ich möchte nicht weiter über diese Unterscheidung debattieren, die uns bereits bekannt ist und die überhaupt nicht dieselbe Funktion erfüllt. Daher dieser Beitrag. Wir haben immer noch nicht herausgefunden, wie man einen echten "GoSub" einsetzen kann, der zum Beispiel zu einer früheren Stelle im Programm springt und dieselbe benötigte Funktion, die bereits im Programm vorhanden ist, wiederverwendet, anstatt sie jedes Mal neu zu codieren, wenn sie benötigt wird.

Zu Ihrer Information: Der MetaEditor stürzt in etwa 85% der Fälle ab, wenn ich Text in ihn kopiere. Dies geschieht auf VIELEN verschiedenen Instanzen von MT4 und zahlreichen verschiedenen Computern und auf 3 verschiedenen Windows-Versionen. Ohne die 32- und 64-Bit-Systeme einzubeziehen, auf denen ich MQL4 verwendet habe. MT4 ist in Ordnung, der MQL4-Editor ist es nicht. Daher ist Kopieren und Einfügen nicht wirklich eine praktikable Option für mich. Selbst wenn dies möglich ist, bietet dies immer noch nicht die gleichen Möglichkeiten wie ein "GoSub" oder "GoTo".

 

Hat das wirklich einen Sinn? Es ist eine Tatsache, dass mql4 mql4 ist, daher muss man, wenn man in mql4 kodiert, mql4 denken. Es macht keinen Sinn, in einer Sprache zu kodieren, während man überlegt, wie man es in einer anderen Sprache, die andere Konstrukte unterstützt, gelöst hätte. Wenn Sie ein Programmierproblem in mql4 haben, von dem Sie glauben, dass es nur durch den Einsatz von GoSub/Return und GoTo's gelöst werden kann, würde ich es gerne sehen, denn ich denke, Sie werden feststellen, dass es immer mehr als einen Weg gibt, eine Katze zu häuten.

 

FourX:

Selbst wenn dies der Fall ist, bietet dies immer noch nicht die gleichen Möglichkeiten wie ein "GoSub" oder "GoTo".

Es tut mir leid, aber es fällt mir wirklich schwer, Ihren Standpunkt zu verstehen, dass eine MQL4-Funktion und ein GOSUB in irgendeiner Weise unterschiedlich sind. (Goto ist eine ganz andere Sache.)

Bleiben wir einfach bei dieser Gosub-Sache. Eine MQL4-Funktion ist eine Unterroutine. Sie kann einen Wert zurückgeben, muss es aber nicht. Alle Unterprogrammaufrufe kehren zur nächsten Zeile im Hauptcode zurück, von der aus sie aufgerufen wurden. Ich stimme Raptor in diesem Punkt zu 100% zu.

(Ich stimme auch mit dem obigen Standpunkt von SDC überein).

 

Der Sinn des Threads ist es, herauszufinden, ob es möglich ist, bedingte Verzweigungen zu IRGENDWELCHER Stelle innerhalb des Programms oder sogar extern von anderen Programmen aus zu machen, um Programmmodule/Funktionen wiederholt zu verwenden, wie sie in anderen Umgebungen vorgesehen sind, wie z.B. die anfangs genannten: fGoTo, fGoSub. Ich weiß bereits, dass MQL4 dies nicht direkt vorsieht. Das ist der Sinn dieses Threads: Ist es möglich, eine "Umgehung (SubRoutine?)" usw. zu erstellen, um diese Funktionalität zu erreichen? Konzeptionell hat dies auch Ähnlichkeiten mit den "include"-Dateien in MQL4.

Ähnlich wie der Workaround, den wir alle benutzen, um die begrenzten Kapazitäten des MQL4-Debuggers zu kompensieren, indem wir die Werte der GetLastError()-Funktion 'alarmieren' oder 'drucken'.

Dies ist überhaupt nicht vergleichbar mit den normalen MQL4-Funktionen, die eine Reihe von bedingten Booleschen Operatoren wie if, while, loop, continue, return usw. enthalten, die innerhalb der Funktion vor- oder zurückspringen können. Einmal deklarieren, mehrfach verwenden, und zwar meist überall dort im Programm, wo man die Funktionalität benötigt, ist bereits vorgesehen. Der fGoSub in einigen Umgebungen erlaubt es Benutzern, solche anderen fSubRoutinen zu importieren und zu verwenden , oft aus separaten kleinen Programmen, die Module sind, die eine bestimmte Funktion ausführen. Vielleicht so ähnlich wie bei den 'Include'-Dateien von MQL4.

Nur weil es sie jetzt nicht gibt, heißt das nicht, dass wir diese leistungsstarke Programmierfunktionalität nicht nutzen sollten, wenn wir eine "Umgehung" dafür schaffen können?

Wie wir alle wissen, gibt es zahlreiche Möglichkeiten, etwas zu programmieren, um das gleiche Ergebnis zu erzielen. Hier geht es nicht um die Frage: "Zeig mir dein Problem und ich sage dir, wie du es ohne fGoTo oder fGoSub lösen kannst". Es ist ein Fall von: WENN wir die Funktionalität erstellen können, dann haben wir diese zusätzliche Programmierflexibilität und -kapazität, die wir auf viele verschiedene Arten in vielen verschiedenen Situationen nutzen können.

 

Ich glaube, Sie verstehen nicht, was eine benutzerdefinierte Funktion in mql4 ist ... vielleicht können Sie ein Beispiel dafür geben, warum eine mql4 benutzerdefinierte Funktion nicht genau das tut, was Sie beschreiben? Ich denke, das tut sie... Ich habe viele Funktionen, die ich in vielen anderen EAs, Indikatoren und Skripten wiederverwende.

Stellen Sie sich start() als das Programm vor. . von jeder Stelle innerhalb von start kann ich eine benutzerdefinierte Funktion aufrufen ... wenn die Funktion fertig ist, kehrt das Programm zu der Zeile nach der Zeile zurück, in der die benutzerdefinierte Funktion aufgerufen wurde ... genau wie ein GOSUB.

 

FourX:

Der Sinn dieses Threads ist es, herauszufinden, ob es möglich ist, bedingte Verzweigungen zu IRGENDWELCHER Stelle innerhalb des Programms oder sogar extern von anderen Programmen aus durchzuführen, um Programmmodule/Funktionen wiederholt zu verwenden, wie es in anderen Umgebungen möglich ist, wie z.B. in den anfangs genannten: fGoTo, fGoSub.

Ich bin bestrebt, Fähigkeiten wie die Beispiele aus anderen Umgebungen bereitzustellen, in denen man ein beliebiges Programmiermodul / eine beliebige Funktion wiederholt wiederverwenden kann, oft von (viel) früher im Programm.

Mql4 ist eine Sprache alten Stils, ihr Niveau ist etwa 1990. Aber Ihre goto und gosub sind noch ältere Konstruktionen, etwa von 1970. Welchen Sinn hat es, Ihren Programmierstil älter als mql4 zu machen? Es ist viel besser, eine echte Programmiersprache wie C# über dll-s zu verwenden. Die meisten Erfindungen aus den 1990er und 2000er Jahren (wie Klasse, Schnittstelle, Objekt, Entwurfsmuster wie Ereignis und Listener, Programmiermethoden wie testgesteuerte Programmierung usw.) dienen dazu, Wiederholungen im Code zu vermeiden und Ihnen zu helfen, schnell wiederverwendbaren, zuverlässigen und lesbaren Code zu schreiben. Ich denke, Sie sollten dieses ganze Goto-Projekt vergessen.
 
FourX:

Ich weiß, dass unzählige Standard- und benutzerdefinierte Funktionen an jeder beliebigen (geeigneten) Stelle "aufgerufen" und verwendet werden können, aber in MQL4 gibt es nichts wie ein GoSub und/oder GoTo an einer bestimmten Stelle im Programm, wie z. B. GoTo Line 185 oder ein bestimmtes Label/eine bestimmte Funktion usw., wie Sie selbst beschrieben haben. Führen Sie die Funktion aus und gehen Sie dann zu der Stelle im Programm zurück, von der aus sie aufgerufen wurde;

Der Return innerhalb einer Funktion führt dazu, dass sie an die Stelle zurückkehrt, von der aus sie aufgerufen wurde. Es ist ein 100%iger Ersatz für das alte gosub/return. und zusätzlich erlaubt die Funktion die Übergabe von Werten und die Rückgabe von Werten, sie haben sogar ihren eigenen Namespace und Stackframe, so dass auch kein globales Variablenchaos mehr nötig ist. Ich verstehe Ihr Problem wirklich nicht. Bitte geben Sie ein konkretes Beispiel (vielleicht in Pseudocode oder BASIC) für das, was Sie eigentlich tun wollen, und wir könnten Ihnen zeigen, wie dasselbe Beispiel auf eine viel klarere und besser wiederverwendbare und wartbare Weise mit if/else, switch/case und Funktionsaufrufen durchgeführt werden könnte.

Das einzige, was wirklich fehlt, sind Ausnahmen. Versuchen Sie, Ausnahmen zu simulieren? Das können Sie auch nicht mit GOTO machen, Sie müssten sich dabei auch um den Aufrufstapel kümmern (und ihn abwickeln).

Sie KÖNNEN mehrere Rücksprunganweisungen innerhalb derselben Funktion haben, und Sie können Schleifen auch mit break verlassen. Das ist das, was einem GOTO in einer strukturierten Sprache am nächsten kommt, und diese Dinge (mehrere Ausgänge) sind bei einigen strengen Puristen bereits verpönt.

 
erzo:
Viel besser ist es, eine echte Programmiersprache wie C# über DLLs zu verwenden.

C# wird nicht empfohlen, um DLLs zu erstellen, die mit dieser flachen C-Aufrufkonventions-API auf niedriger Ebene interagieren. C# ist perfekt, wenn Sie mit anderen C# und verschiedenen Microsoft-Produkten interagieren wollen, aber es ist nicht so universell einsetzbar wie andere Umgebungen. Es ist sehr spezialisiert.

Wenn Sie DLLs erstellen wollen, die sich leicht mit C-Aufrufkonventionen in einer modernen Programmiersprache verbinden lassen, empfehle ich ObjectPascal (Free Pascal) oder Delphi.

 
7bit:

C# wird nicht für die Erstellung von DLLs empfohlen, die mit dieser flachen C-Aufrufkonventions-API auf niedriger Ebene interagieren.

Ich weiß, Java besser, und als zu verwenden, aber es ist schwer, eine Brücke zu machen. Aber wenn Sie nicht empfehlen C#, dass ich dachte, es wäre einfacher, ich werde versuchen, Java jedoch. (Pascal ist nicht mein Stil.) Vielen Dank für Ihren Rat!