'Diramazione condizionale - 'GoTo' Kluge ? - pagina 2

 
RaptorUK:
Ho usato i GOTO ai tempi del BBC Basic. Ho anche usato il BBC BASIC nel mio lavoro a tempo pieno per circa 7 anni . . . anche il BBC Basic aveva GOSUB e RETURN in modo che le subroutine (funzioni) potessero essere utilizzate . . . perché mai si dovrebbe voler utilizzare qualcosa che assomiglia a un GOTo in MQL4? Forse si può spiegare la vostra necessità?

Ciao Raptor,

Come hai detto tu stesso, tu stesso hai usato queste cose per anni e quindi sei consapevole della miriade di situazioni in cui possono essere utilizzate che sono molto utili. Le funzioni 'GoSub' e 'Return' sono fondamentalmente la stessa idea del 'GoTO' a cui mi riferisco. Anche se con le funzioni GoSub/RETURN, si deve tornare allo stesso punto del programma chiamante. A differenza di 'GoTo' che non lo fa e che può creare incubi molto incasinati. Anche se immagino che la capacità di utilizzo dei file Include, Library e .dll in MQL sia simile a questo. Ma questo non permette il tipo di controllo che si può ottenere con GoSub/RETURN ecc.

Molte iterazioni di programmazione per la lavorazione computerizzata contengono anche le coppie GoSub/RETURN ed è di notevole utilità in quell'ambiente. Permette un alto grado di modularizzazione e il riutilizzo di numerosi 'cicli inscatolati' standard e di funzioni personalizzate e specializzate più e più volte in numerosi programmi. Non si deve continuamente 'reinventare la ruota' ogni volta che se ne ha bisogno. Quando ho iniziato a fare la programmazione della lavorazione computerizzata per conto terzi, mi sono trovato di fronte a più di 2.000 diversi controllori CNC: tutti con le loro variazioni di programmazione (< 8) Questo mi ha costretto a utilizzare un software CAD-CAM molto costoso che non va bene. Spesso potevo scrivere io stesso dei programmi notevolmente migliori e più efficienti che producevano risultati migliori in meno tempo di ciclo con una migliore usura dell'utensile di quanto il software avrebbe generato.

 

GOSUB/RETURN è lo stesso che usare le funzioni in MQL4

Ho fatto un po' di programmazione CNC molti anni fa. Lavoro AeroSpace principalmente.

 
FourX:

Non credo che C ne abbia uno, vero?

Sì, è così. È in K & R seconda edizione, pagina 65. Dicono di non usarlo nel libro, poi ne danno esempi nella pagina successiva!

 

Penso che quello che stiamo cercando di emulare qui è

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

Che può essere fatto come questo ...

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;
}
   

ma non in modo molto elegante, specialmente per molte etichette. Un modo migliore è

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;
   }
}

ma hai davvero bisogno di mettere le chiamate di funzione nella dichiarazione di switch, altrimenti se lo switch va su diverse pagine di codice non puoi vedere la struttura del codice.

 
FourX:

Ciao SDC,

Come per la maggior parte della programmazione, MQL4 è praticamente tutto 'Funzioni' che oltre a saltare alcune linee, non ha una vera funzione 'GoTo' che sto cercando di capire come fare all'interno di un MQL4 EA Quindi non sono sicuro di cosa tu sia 'd'accordo' e cosa intendi e ti riferisci nel contesto di questa ricerca? Per favore espandi e spiega. Non sono polemico. Sembra che tu abbia qualcosa in mente e mi piacerebbe sapere cos'è e come potrebbe essere utile per noi.


Ciao FourX ho letto male i post precedenti pensavo che qualcuno avesse già detto quello che intendevo è la chiamata di funzione supera l'idea di GoTo e ne migliora la lavorabilità non ultimo per il fatto che è più facile leggere il codice dopo quando è organizzato in funzioni che seguire i GoTo, e come ha mostrato dabbler con il suo esempio, la ramificazione multiway usando lo switch può ottenere la stessa cosa di GoTo multipli.

 
dabbler:

Penso che quello che stiamo cercando di emulare qui è

Che può essere fatto come questo ...

ma non in modo molto elegante, specialmente per molte etichette. Un modo migliore è

ma hai davvero bisogno di mettere le chiamate di funzione nella dichiarazione di switch altrimenti se lo switch va su diverse pagine di codice non puoi vedere la struttura del codice.


Ciao Dabbler,

Una vera dichiarazione/funzione 'GoTo' permette di saltare a QUALSIASI posto all'interno del programma, non solo saltare la prossima (coppia di) espressioni / dichiarazioni. Questo permette cose come il riutilizzo delle stesse funzioni che sono necessarie in più di un'istanza in un programma.

Da qui sia la sua flessibilità che la convenienza. Il che, come ho detto, è un'arma a doppio taglio, perché questo può rendere molto facile mettersi nei guai con esso e creare programmi che sono incubi.

MQL5 ha qualcosa come un 'GoSub/RETURN', 'GoTo' ecc? E Visual Basic, Java, PHP ecc.

 
RaptorUK:

GOSUB/RETURN è lo stesso che usare le funzioni in MQL4

Ho fatto un po' di programmazione CNC molti anni fa. Lavoro AeroSpace principalmente.

Per quanto sono stato in grado di capire finora Raptor, non c'è nulla come i comandi GoSub / Return o la capacità di fare una tale funzione in MQL4. Da qui il mio tentativo di capire un kluge in MQL4 per svolgere questa capacità.

 
dabbler:

Penso che quello che stiamo cercando di emulare qui è

Che può essere fatto come questo ...

ma non in modo molto elegante, specialmente per molte etichette. Un modo migliore è

ma è davvero necessario mettere le chiamate di funzione nella dichiarazione di switch, altrimenti se lo switch va su diverse pagine di codice non si può vedere la struttura del codice.

MQL4 Reference - Basics - La sintassi di MQL4 è molto simile a quella del C, a parte alcune caratteristiche:

  • nessuna aritmetica degli indirizzi;

  • nessun operatore do ... while;

  • nessun operatore goto ...;

  • nessuna operazione di [condizione]?[espressione 1]:[espressione 2];

  • nessun tipo di dati composto (strutture);

  • le assegnazioni complesse sono impossibili; per esempio, val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; ecc;

  • il calcolo di un'espressione logica è sempre completato, mai terminato in anticipo.

 

Ciao 1withZachy,

In sostanza sembra che sia MQL4 SOP che in realtà utilizza solo una funzione standard o personalizzata e poi 'restituisce' il risultato alla funzione come fa MQL4. Anche se dal diagramma di flusso potrebbe esserci una sottile distinzione che mi manca, ma non credo. Purtroppo la documentazione all'interno del codice di esempio fornito: CallFuntion.mq4' è in russo, che non sono in grado di comprendere affatto.

 

Alcuni estratti da un interessante articolo su GoTo su Wikipedia:

Molti linguaggi supportano l'istruzione goto, e molti non lo fanno. In Java, goto è una parola riservata, ma è inutilizzabile.[1][2] In PHP non c'era un supporto nativo per goto fino alla versione 5.3 (erano disponibili librerie per emulare la sua funzionalità).[3]

Il teorema del programma strutturato ha dimostrato che l'istruzione goto non è necessaria per scrivere programmi; una qualche combinazione dei tre costrutti di programmazione di sequenza, selezione/scelta e ripetizione/iterazione sono sufficienti per qualsiasi calcolo che possa essere eseguito da una macchina di Turing.

Gli anni '60 e '70 hanno visto gli scienziati informatici allontanarsi dalle dichiarazioni GOTO in favore del paradigma della "programmazione strutturata". Alcuni[quali? ] standard di codifica dello stile di programmazione proibiscono l'uso delle dichiarazioni GOTO, in particolare in vista del suddetto teorema del programma strutturato. La prova di Böhm-Jacopini non ha risolto la questione dell'adozione della programmazione strutturata per lo sviluppo del software, in parte perché la costruzione aveva più probabilità di oscurare un programma che di migliorarlo.

Probabilmente la critica più famosa di GOTO è una lettera del 1968 di Edsger Dijkstra chiamata Go To Statement Considered Harmful.[5] In quella lettera Dijkstra sosteneva che le dichiarazioni GOTO illimitate dovevano essere abolite dai linguaggi di livello superiore perché complicavano il compito di analizzare e verificare la correttezza dei programmi (in particolare quelli che coinvolgono i loop)

Un punto di vista alternativo è presentato in Structured Programming with go to Statements di Donald Knuth[6] che analizza molti compiti di programmazione comuni e trova che in alcuni di essi GOTO è il costrutto di linguaggio ottimale da usare.