Ramificação Condicional - 'GoTo' Kluge ? - página 2

 
RaptorUK:
Eu usava GOTOs nos tempos da BBC Basic . . Eu até usei BBC BASIC em meu trabalho em tempo integral por aproximadamente 7 anos . . até a BBC Basic tinha GOSUB e RETURN para que subrotinas (funções) pudessem ser usadas . . por que você gostaria de usar qualquer coisa parecida com um GOTo em MQL4 ? talvez você possa explicar sua necessidade ?

Olá Raptor,

Como você mesmo disse, você mesmo usou tais coisas durante anos e assim está ciente da miríade de situações que podem ser utilizadas e que são muito úteis. As funções 'GoSub' e 'Return' são basicamente a mesma idéia que o 'GoTO' a que me refiro. Embora com as funções GoSub/RETURN, é preciso voltar ao mesmo ponto do programa de chamada. Ao contrário do 'GoTo', que não pode criar pesadelos muito confusos. Embora eu ache que Incluir, Biblioteca e capacidade de utilização de arquivos .dll em MQL são similares a isto. Mas isto não permite o tipo de controle que se pode obter com GoSub/RETURN etc.

Muitas iterações de programação para usinagem computadorizada também contêm os pares GoSub/RETURN e é de considerável utilidade nesse ambiente. Permite um alto grau de modulação e reutilização de numerosos 'ciclos fixos' padrão, bem como funções personalizadas e especializadas repetidas vezes em numerosos programas. Não é necessário 'reinventar' continuamente a roda' toda vez que é necessário. Quando comecei a fazer programação de usinagem computadorizada por contrato, me deparei com mais de 2.000 controladores CNC diferentes: todos com suas próprias variações na programação )< 8) Isto me obrigou a utilizar um software CAD-CAM muito caro, o que é muito ruim. Muitas vezes eu mesmo podia escrever consideravelmente melhores e mais eficientes que produziam melhores resultados em menos tempo de ciclo com melhor desgaste da ferramenta do que o software geraria.

 

GOSUB/RETURN é o mesmo que usar funções na MQL4

Eu fiz um pouco de programação CNC há muitos anos atrás . . . AeroSpace trabalho principalmente.

 
FourX:

Acho que C não tem um, não é mesmo?

Sim, é verdade. Está na segunda edição do K & R, página 65. Eles SAY não o usam no livro, então dêem exemplos dele na próxima página!

 

Acho que o que estamos tentando imitar aqui é

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

O que pode ser feito desta forma ...

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

mas não de forma muito elegante, especialmente para muitas etiquetas. Uma maneira melhor é

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

mas você realmente precisa colocar chamadas de função na declaração do switch, caso contrário, se o switch passar por várias páginas de código, você não poderá ver a estrutura do código.

 
FourX:

Olá SDC,

Como a maioria da programação, a MQL4 é virtualmente todas as 'funções' que, além de saltar algumas linhas, não tem uma verdadeira função 'GoTo' que estou tentando descobrir como fazer dentro de uma MQL4 EA Então não tenho certeza do que você está 'concordando' e do que você quer dizer e está se referindo no contexto desta busca? Por favor, amplie e explique. Não sendo argumentativo. Parece que você tem algo em mente e eu gostaria de saber o que é e como isso pode ser benéfico para nós.


Oi FourX Eu li mal os posts anteriores e pensei que alguém já tinha dito que o que eu queria dizer era que a chamada de função supera a idéia de GoTo e melhora a operacionalidade da mesma, não menos pelo fato de que é mais fácil ler o código depois quando ele está organizado em funções do que seguir o de GoTo, e como o dabbler mostrou com seu exemplo, a ramificação multidirecional usando o switch pode alcançar a mesma coisa que múltiplos GoTo.

 
dabbler:

Acho que o que estamos tentando imitar aqui é

O que pode ser feito desta forma ...

mas não de forma muito elegante, especialmente para muitas etiquetas. Uma maneira melhor é

mas você realmente precisa colocar chamadas de função na declaração do switch, caso contrário, se o switch passar por várias páginas de código, você não poderá ver a estrutura do código.


Olá Dabbler,

Uma verdadeira declaração/função 'GoTo' permite saltar para QUALQUER lugar dentro do programa, não apenas pular sobre as próximas (duas) Expressões / Declarações. Isto permite coisas como reutilizar as mesmas funções que são necessárias em mais de uma instância em um programa.

Daí tanto sua flexibilidade quanto sua conveniência. O que, como já mencionei, é uma espada de dois gumes, pois isso pode tornar muito fácil arranjar problemas com ela e criar programas que são pesadelos.

A MQL5 tem algo como 'GoSub/RETURN', 'GoTo' etc. ? E quanto ao Visual Basic, Java, PHP, etc. ?

 
RaptorUK:

GOSUB/RETURN é o mesmo que usar funções na MQL4

Eu fiz um pouco de programação CNC há muitos anos atrás . . . AeroSpace trabalho principalmente.

Até onde pude descobrir até agora Raptor, eles não são nada como os comandos GoSub / Return ou a capacidade de fazer tal função em MQL4. Daí minha tentativa de descobrir uma pista na MQL4 para realizar esta capacidade.

 
dabbler:

Acho que o que estamos tentando imitar aqui é

O que pode ser feito desta forma ...

mas não de forma muito elegante, especialmente para muitas etiquetas. Uma maneira melhor é

mas você realmente precisa colocar chamadas de função na declaração do switch, caso contrário, se o switch passar por várias páginas de código, você não poderá ver a estrutura do código.

MQL4 Reference - Basics - A sintaxe da MQL4 é muito semelhante à sintaxe C, além de algumas características:

  • sem aritmética de endereço;

  • nenhum operador faz ... enquanto;

  • nenhum operador ir para

  • nenhuma operação de [condição]?[expressão 1]:[expressão 2];

  • sem tipos de dados compostos (estruturas);

  • atribuições complexas são impossíveis; por exemplo, val1=val2=0; arr[i++]=val; cond=(cnt=OrdensTotal)>0; etc..;

  • o cálculo de uma expressão lógica é sempre completado, nunca terminado antecipadamente.

 

Olá 1withZachy,

Em essência, isto parece que é o MQL4 SOP que realmente só utiliza uma função padrão ou personalizada e depois "retorna" o resultado à função como a MQL4 faz. Embora pelo diagrama de fluxo eles possam ser uma distinção sutil que estou perdendo, mas eu não acho que seja assim. Infelizmente, a documentação dentro do código de amostra fornecido: CallFuntion.mq4' está em russo que não sou capaz de compreender de forma alguma.

 

Alguns trechos de uma artica interessante sobre GoTo na Wikipedia:

Muitos idiomas suportam a declaração goto, e muitos não. Em Java, goto é uma palavra reservada, mas é inutilizável.[1][2] Em PHP não havia suporte nativo para goto até a versão 5.3 (bibliotecas estavam disponíveis para imitar sua funcionalidade).[3]

O teorema do programa estruturado provou que a declaração goto não é necessária para escrever programas; alguma combinação das três construções de programação de seqüência, seleção/escolha e repetição/iteração são suficientes para qualquer cálculo que possa ser realizado por uma máquina Turing.

Nas décadas de 1960 e 1970, os cientistas da computação se afastaram das declarações GOTO em favor do paradigma da"programação estruturada". Alguns[quais? ] padrões de codificação de estilo de programação proíbem o uso de declarações GOTO, particularmente em vista do teorema de programação estruturada acima mencionado. A prova Böhm-Jacopini não resolveu a questão de adotar ou não a programação estruturada para o desenvolvimento de software, em parte porque a construção era mais susceptível de obscurecer um programa do que de melhorá-lo.

Provavelmente a crítica mais famosa ao GOTO é uma carta de Edsger Dijkstra de 1968 chamada Go To Statement Considerado Nocivo.[5] Nessa carta, Dijkstra argumentou que as declarações irrestritas da GOTO deveriam ser abolidas das línguas de nível superior porque elas complicavam a tarefa de analisar e verificar a exatidão dos programas (particularmente aqueles que envolvem loops).

Um ponto de vista alternativo é apresentado na Programação Estruturada de Donald Knuth, com o recurso a Declarações[6] que analisa muitas tarefas de programação comuns e descobre que em algumas delas GOTO é a construção de linguagem ideal para ser usada.

Razão: