Bedingte Verzweigung - "GoTo" Kluge ? - Seite 2

 
RaptorUK:
Ich habe schon zu BBC-Basic-Zeiten GOTOs verwendet. Ich habe sogar ca. 7 Jahre lang hauptberuflich BBC BASIC verwendet ... sogar BBC Basic hatte GOSUB und RETURN, so dass Unterprogramme (Funktionen) verwendet werden konnten ... warum sollten Sie jemals etwas verwenden wollen, das einem GOTo in MQL4 ähnelt? vielleicht können Sie Ihren Bedarf erklären?

Hallo Raptor,

Wie Sie selbst sagten, haben Sie selbst jahrelang mit diesen Funktionen gearbeitet und kennen daher die unzähligen Situationen, in denen sie sehr nützlich sein können. Die Funktionen "GoSub" und "Return" sind im Grunde dasselbe wie das "GoTO", auf das ich mich beziehe. Allerdings muss man mit den GoSub/RETURN-Funktionen an dieselbe Stelle im aufrufenden Programm zurückkehren. Im Gegensatz zu 'GoTo', wo das nicht der Fall ist, kann das zu sehr unangenehmen Albträumen führen. Obwohl ich vermute, dass die Kapazität der Include-, Library- und .dll-Dateien in MQL ähnlich ist. Aber das erlaubt nicht die Art von Kontrolle, die man mit GoSub/RETURN usw. bekommen kann.

Viele Iterationen der Programmierung für die computergestützte Bearbeitung enthalten auch die GoSub/RETURN-Paare und sind in dieser Umgebung von großem Nutzen. Sie ermöglichen ein hohes Maß an Modularisierung und die Wiederverwendung zahlreicher Standardzyklen sowie kundenspezifischer und spezieller Funktionen in zahlreichen Programmen. Man muss nicht jedes Mal das Rad neu erfinden, wenn man es braucht. Als ich anfing, computergestützte Bearbeitungen zu programmieren, sah ich mich mit über 2.000 verschiedenen CNC-Steuerungen konfrontiert: alle mit ihren eigenen Variationen in der Programmierung )< 8) Dadurch war ich gezwungen, sehr teure CAD-CAM-Software zu verwenden, die zu schlecht ist. Ich konnte oft selbst wesentlich bessere und effizientere Programme schreiben, die in kürzerer Zykluszeit bessere Ergebnisse bei besserem Werkzeugverschleiß erbrachten, als die Software erzeugen würde.

 

GOSUB/RETURN ist dasselbe wie die Verwendung von Funktionen in MQL4

Ich habe vor vielen Jahren ein wenig CNC-Programmierung betrieben. Hauptsächlich AeroSpace-Arbeiten.

 
FourX:

Ich glaube nicht, dass C eine hat, oder?

Ja, das stimmt. Es steht in der zweiten Auflage von K & R auf Seite 65. Sie SAGEN, dass sie es in dem Buch nicht verwenden, und geben dann auf der nächsten Seite Beispiele dafür!

 

Ich denke, was wir hier zu emulieren versuchen, ist

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

Was so gemacht werden kann ...

while(true){
   
   // dog:
   if( GOTOstate == DOG ){
   }
   
   // cat:
   if( GOTOstate == DOG || GOTOstate== CAT ){
   }
   
   // mouse:
   //no test needed here, just do MOUSE stuff
   
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
   
   GOTOstate = DOG;
}
   

aber nicht sehr elegant, besonders bei vielen Etiketten. Ein besserer Weg ist

while(true){
   
   switch(GOTOstate){
      case DOG:
         // do DOG stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case CAT:
         // do CAT stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case MOUSE:
         // do MOUSE stuff
         break;
      default:
         break;     
   }
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
}

aber Sie müssen die Funktionsaufrufe wirklich in die switch-Anweisung einfügen, sonst können Sie die Struktur des Codes nicht erkennen, wenn sich die switch-Anweisung über mehrere Seiten Code erstreckt.

 
FourX:

Hallo SDC,

Wie bei den meisten Programmierungen besteht MQL4 praktisch nur aus "Funktionen", die außer dem Springen über einige Zeilen keine echte "GoTo"-Funktion haben, die ich versuche herauszufinden, wie man innerhalb eines MQL4 EA arbeitet. Bitte erläutern Sie das. Ich bin nicht argumentativ. Es klingt so, als hätten Sie etwas im Sinn und ich würde gerne wissen, was es ist und wie es für uns von Nutzen sein könnte.


Hallo FourX, ich habe die vorherigen Beiträge falsch gelesen, ich dachte, jemand hätte bereits gesagt, was ich meinte, ist, dass der Funktionsaufruf die Idee von GoTo übertrifft und die Praktikabilität verbessert, nicht zuletzt aufgrund der Tatsache, dass es einfacher ist, Code im Nachhinein zu lesen, wenn er in Funktionen organisiert ist, als GoTo's zu folgen, und wie dabbler mit seinem Beispiel gezeigt hat, kann die Verzweigung in mehrere Richtungen unter Verwendung des Schalters das Gleiche erreichen wie mehrere GoTo.

 
dabbler:

Ich denke, was wir hier zu emulieren versuchen, ist

Was so gemacht werden kann ...

aber nicht sehr elegant, besonders bei vielen Etiketten. Ein besserer Weg ist

aber man muss die Funktionsaufrufe wirklich in die switch-Anweisung einfügen, sonst kann man die Struktur des Codes nicht sehen, wenn die switch-Anweisung über mehrere Seiten Code geht.


Hallo Dabbler,

Eine echte "GoTo"-Anweisung/Funktion erlaubt es, zu JEDER Stelle im Programm zu springen, nicht nur die nächsten (paar) Ausdrücke/Anweisungen zu überspringen. Dies ermöglicht z.B. die Wiederverwendung der gleichen Funktionen, die in mehr als einer Instanz in einem Programm benötigt werden.

Daraus ergeben sich sowohl die Flexibilität als auch die Bequemlichkeit. Wie ich bereits erwähnt habe, ist dies ein zweischneidiges Schwert, da man damit sehr leicht in Schwierigkeiten geraten kann und Programme zum Albtraum werden können.

Hat MQL5 so etwas wie ein 'GoSub/RETURN', 'GoTo' usw.? Was ist mit Visual Basic, Java, PHP usw.?

 
RaptorUK:

GOSUB/RETURN ist dasselbe wie die Verwendung von Funktionen in MQL4

Ich habe vor vielen Jahren ein wenig CNC-Programmierung betrieben. Hauptsächlich AeroSpace-Arbeiten.

Soweit ich bisher in der Lage war, herauszufinden, Raptor, gibt es 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.

 
dabbler:

Ich denke, was wir hier zu emulieren versuchen, ist

Was so gemacht werden kann ...

aber nicht sehr elegant, besonders bei vielen Etiketten. Ein besserer Weg ist

aber Sie müssen wirklich Funktionsaufrufe in die switch-Anweisung einfügen, sonst können Sie die Struktur des Codes nicht sehen, wenn der switch über mehrere Seiten Code geht.

MQL4-Referenz - Grundlagen - Die Syntax von MQL4 ist im Wesentlichen eine C-ähnliche Syntax, abgesehen von einigen Besonderheiten:

  • keine Adressarithmetik;

  • kein Operator do ... while;

  • kein Operator goto ...;

  • keine Operation von [Bedingung]?[Ausdruck 1]:[Ausdruck 2];

  • keine zusammengesetzten Datentypen (Strukturen);

  • komplexe Zuweisungen sind unmöglich; z.B. val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; usw.;

  • die Berechnung eines logischen Ausdrucks wird immer abgeschlossen, niemals vorzeitig abgebrochen.

 

Hallo 1withZachy,

Im Wesentlichen scheint dies, dass es MQL4 SOP ist, die wirklich nur eine Standard- oder benutzerdefinierte Funktion verwendet und dann "gibt" das Ergebnis an die Funktion als MQL4 tut. Obwohl durch das Flussdiagramm ihre kann eine subtile Unterscheidung, die ich verpassen auf, aber ich glaube nicht so. Leider ist die Dokumentation im bereitgestellten Beispielcode: CallFuntion.mq4' ist auf Russisch, was ich überhaupt nicht verstehen kann.

 

Einige Auszüge aus einem interessanten Artikel über GoTo auf Wikipedia:

Viele Sprachen unterstützen die goto-Anweisung, viele aber auch nicht. In Java ist goto ein reserviertes Wort, das aber unbrauchbar ist.[1][2] In PHP gab es bis zur Version 5.3 keine native Unterstützung für goto (Bibliotheken waren verfügbar, um seine Funktionalität zu emulieren).[3]

Das Theorem des strukturierten Programms bewies, dass die goto-Anweisung nicht notwendig ist, um Programme zu schreiben; eine Kombination der drei Programmierkonstrukte Sequenz, Auswahl/Auswahl und Wiederholung/Iteration ist für jede Berechnung, die von einer Turing-Maschine ausgeführt werden kann, ausreichend.

In den 1960er und 1970er Jahren wandten sich die Informatiker von GOTO-Anweisungen ab und wandten sich dem Paradigma der "strukturierten Programmierung" zu. Einige[welche? ] Programmierstandards verbieten die Verwendung von GOTO-Anweisungen, insbesondere im Hinblick auf das oben erwähnte Theorem der strukturierten Programmierung. Der Böhm-Jacopini-Beweis hat die Frage, ob die strukturierte Programmierung für die Softwareentwicklung übernommen werden sollte, nicht gelöst, zum Teil deshalb, weil die Konstruktion ein Programm eher verschleiert als verbessert.

Die wohl berühmteste Kritik an GOTO ist ein Brief von Edsger Dijkstra aus dem Jahr 1968 mit dem Titel Go To Statement Considered Harmful. [5] In diesem Brief argumentierte Dijkstra, dass uneingeschränkte GOTO-Anweisungen in höheren Sprachen abgeschafft werden sollten, da sie die Aufgabe der Analyse und Überprüfung der Korrektheit von Programmen (insbesondere von solchen mit Schleifen) erschwerten.

Ein alternativer Standpunkt wird in Donald Knuths Structured Programming with go to Statements[6] vertreten, das viele gängige Programmieraufgaben analysiert und zu dem Ergebnis kommt, dass GOTO in einigen dieser Fälle das optimale Sprachkonstrukt ist.