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

 
FourX:

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 na MQL4. Daí minha tentativa de descobrir uma pista na MQL4 para realizar esta capacidade.

Uma função faz o mesmo que 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:

Uma função faz o mesmo que GOSUB/RETURN . .

Reconheço que inúmeras funções padrão e personalizadas podem ser 'chamadas' & utilizadas em qualquer um (apropriado) Raptor spot, mas elas não são nada em MQL4 como um GoSub &/ou GoTo qualquer lugar específico dentro do programa como GoTo Line 185 ou uma Etiqueta/função específica, etc., como você mesmo descreveu. Em seguida, execute-o e depois volte ao local do programa do qual foi chamado; ou talvez continue a partir daquela chamada SubRoutina e/ou seção/função do programa, dependendo do resultado condicional daquela subrotina. Como você declarou, você mesmo usou o GoSub durante anos e fazer um salto condicional para além de algumas linhas seqüenciais de código não é a mesma coisa. Não quero continuar debatendo esta distinção que já estamos cientes de que não desempenha a mesma função de forma alguma. Portanto, este lançamento. Ainda não descobrimos como utilizar um verdadeiro 'GoSub' que, como exemplo, talvez salte para um ponto anterior do programa e reutilize a mesma função necessária já estabelecida no programa em vez de ter que codificá-lo repetidamente toda vez que for necessário.

FYI: O MetaEditor trava cerca de 85% do tempo em que copio texto nele. Isto acontece em MUITAS instâncias diferentes do MT4 e em vários computadores diferentes e em 3 versões diferentes do Windows. Sem incluir ambos os sistemas de 32 e 64 bits em que usei o MQL4. O MT4 está bem, o editor da MQL4 não está. Portanto, copiar e colar não é realmente uma opção viável para mim. Mesmo que seja, isto ainda não oferece as mesmas capacidades que um 'GoSub' ou GoTo' oferece.

 

Há realmente algum sentido nisto? É um fato que mql4 é mql4, portanto, quando você codifica em mql4 você tem que pensar que mql4 não faz sentido tentar codificar em um idioma enquanto considera como você o teria resolvido em outro que suporta construções diferentes. Se você tem um problema de codificação em mql4 que você acredita que só poderia ser resolvido com o uso de GoSub/Return e GoTo's, eu gostaria de vê-lo, porque eu acho que você encontrará sempre mais de uma maneira de esfolar um gato.

 

FourX:

Mesmo que seja, isto ainda não oferece as mesmas capacidades que um 'GoSub' ou GoTo' oferece.

Sinto muito, estou tendo muita dificuldade em entender seu ponto de vista de que uma função MQL4 e um GOSUB são de qualquer forma diferentes. (Goto é toda outra chaleira de peixe).

Vamos apenas ficar com essa coisa do Gosub. Uma função MQL4 é uma sub-rotina. Ela pode ou não retornar um valor. Todas as chamadas de subrotina retornam para a próxima linha no código principal de onde foram chamadas. Concordo 100% com o Raptor sobre isto.

(Também concordo com o ponto de vista da SDC acima).

 

O objetivo da linha é ver se é possível fazer ramificações condicionais para QUALQUER CENTRAL dentro do programa, ou mesmo externamente de outros programas, para reutilizar os módulos/funções do programa repetidamente, tais como os previstos em outros ambientes, tais como os indicados no início: fGoTo, fGoSub. Eu já sei que a MQL4 não os fornece diretamente. Esse é o objetivo deste tópico: é possível fazer um "workaround (SubRoutine?)" etc. para realizar essa funcionalidade? Conceitualmente, isto também tem semelhanças com os arquivos 'incluir' na MQL4.

Similar à alternativa de trabalho que todos nós usamos para compensar as capacidades limitadas do depurador MQL4 através de 'Alerta' ou 'Impressão' dos valores da função GetLastError().

Isto não é nada parecido com as funções MQL4 normais que contêm um número de booleans condicionais, como se, enquanto, loop, continuar, retornar etc. que podem saltar à frente do loop de volta dentro da função, na medida em que a alternativa que estou procurando fornecer para as capacidades como os exemplos dados de outros ambientes onde se pode reutilizar qualquer módulo / função de programação repetidamente, muitas vezes de (muito) anteriores no programa. Declará-lo uma vez: usá-lo pode ser usado na maioria das vezes em qualquer outro lugar dentro do programa para o qual a funcionalidade já tenha sido fornecida. O fGoSub em alguns ambientes permite aos usuários importar e utilizar tais outros fSubRoutines, muitas vezes a partir de pequenos programas separados que são módulos que realizam uma função específica. Talvez algo semelhante aos arquivos 'Include' da MQL4.

Só porque não está lá agora, isso significa que não deveríamos utilizar essa poderosa funcionalidade de programação se pudermos criar um "trabalho ao redor" para ela?

Como todos sabemos, há inúmeras maneiras de programar algo para obter o mesmo resultado. Este não é um caso de "Mostre-me seu problema e eu lhe direi como fazê-lo sem um fGoTo nem um fGoSub". É um dos: SE pudermos criar a funcionalidade, então temos esta flexibilidade e capacidade de programação adicional que podemos utilizar de muitas maneiras diferentes em muitas situações diferentes.

 

Eu acho que você não entende o que é uma função personalizada em mql4 . . talvez você possa dar um exemplo de porque uma função personalizada em mql4 não faz exatamente o que você está descrevendo ? Eu acho que ela faz . . . Eu tenho muitas funções que reutilizo em muitos outros EAs, Indicadores e Scripts.

Pense em start() como o programa . . de qualquer lugar dentro do start posso chamar uma função personalizada . . quando a função é feita o programa retorna à linha após a linha onde a função personalizada foi chamada . . tal qual um GOSUB.

 

FourX:

O objetivo da linha é ver se é possível fazer ramificações condicionais para QUALQUER CENTRAL dentro do programa, ou mesmo externamente de outros programas, para reutilizar os módulos/funções do programa repetidamente, tais como os previstos em outros ambientes, tais como os indicados no início: fGoTo, fGoSub.

Estou procurando fornecer os recursos como os exemplos dados em outros ambientes onde se pode reutilizar qualquer módulo/função de programação repetidamente, muitas vezes de (muito) anteriores no programa.

O Mql4 é uma linguagem de estilo antigo, seu nível é cerca de 1990. Mas seu goto e gosub são construções ainda mais antigas, a partir de cerca de 1970. Qual é o objetivo de tornar seu estilo de programação mais antigo do que o mql4? Muito melhor usar uma linguagem de programação real, como C#, através de dll-s. A maioria das invenções dos anos 90 e 2000 (como classe, interface, objeto, padrões de design como evento e ouvinte, métodos de programação como programação dirigida a testes, etc.) são para evitar a repetição de códigos e ajudá-lo a escrever rapidamente códigos reutilizáveis, confiáveis e legíveis. Acho que você deve esquecer todo este projeto goto.
 
FourX:

Reconheço que inúmeras funções padrão e personalizadas podem ser "chamadas" e utilizadas em qualquer um (apropriado) Raptor spot, mas elas não são nada em MQL4 como um GoSub &/ou GoTo qualquer lugar específico dentro do programa como GoTo Line 185 ou uma Etiqueta/função específica etc., como você mesmo descreveu. Em seguida, execute-o e volte para o local do programa do qual foi chamado;

o retorno dentro de uma função fará com que ela retorne ao lugar de onde a função foi chamada. É um substituto de 100% do antigo gosub/retorno. e adicionalmente a função permite passar valores e retornar valores, eles têm até mesmo seu próprio espaço de nomes e estrutura de empilhamento, de modo que não é mais necessária nenhuma confusão global de variáveis. Eu realmente não entendo seu problema. Por favor, dê um exemplo concreto (talvez em pseudo-código ou BASIC) do que você realmente quer fazer e podemos mostrar-lhe como o mesmo exemplo seria feito de uma forma muito mais clara e reutilizável e de fácil manutenção com if/else, switch/case e chamadas de função.

A única coisa que realmente está faltando são exceções. Você está tentando simular exceções? Você também não pode fazer isso com GOTO, você também precisaria se preocupar adequadamente com (e desenrolar) a pilha de chamadas ao fazer isso.

Você pode ter múltiplas declarações de retorno dentro da mesma função e também pode romper os laços com a interrupção, isto é o que mais se aproxima de um GOTO em uma linguagem estruturada e estas coisas (saídas múltiplas) já são desaprovadas por alguns puristas rigorosos também.

 
erzo:
Muito melhor usar uma linguagem de programação real, como C#, através de dll-s.

O C# não é recomendado para fazer DLLs que interagem com esta API de convenção de chamadas de baixo nível C plana. O C# é perfeito se você quiser interagir com outros C# e várias coisas da microsoft, mas não tem um propósito tão geral quanto outros ambientes. É muito especializado.

Se você quiser fazer DLLs que facilmente façam interface com as convenções de chamada em C em uma linguagem de programação moderna, sugiro ObjectPascal (Free Pascal) ou Delphi.

 
7bit:

O C# não é recomendado para fazer DLLs que interagem com esta API de convenção de chamadas de baixo nível C plana.

Eu conheço melhor a java, e considero o seu uso, mas é difícil fazer uma ponte. Mas se você não recomendar C#, que eu pensei que seria mais fácil, eu tentarei java no entanto. (Pascal não é meu estilo.) Obrigado por seu conselho!
Razão: