'条件分支--'GoTo' Kluge ? - 页 3

 
FourX:

到目前为止,我已经能够弄清楚Raptor,在MQL4中没有任何像GoSub/Return这样的命令,也没有能力制作这样的功能。因此,我试图在MQL4中找出一种方法来执行这种能力。

一个函数 的作用与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:

一个函数的作用与GOSUB/RETURN相同 . . .

我认识到无数的标准和自定义函数 可以在任何一个(适当的)地方被 "调用 "和使用,但在MQL4中没有任何东西可以像你自己描述的那样,在程序中的任何特定地方,如GoSub 和/或GoTo第185行或特定的标签/函数等。然后运行它,然后回到程序中被调用的地方;或者根据子程序的条件结果,从被调用的子程序和/或程序部分/函数继续下去。正如你所说的,你自己使用GoSub已经很多年了,让一个条件跳过几行连续的代码是完全不一样的。我不想继续争论这个我我们已经知道的根本不执行相同功能的区别。因此发了这个帖子。我们仍然没有弄清楚如何利用一个真正的 "GoSub",作为一个例子,它可能会跳到程序中较早的地方,重新利用程序中已经建立的相同的需要的功能,而不是每次需要时都要重复地编码它。

顺便说一下:在我用MetaEditor复制文本的时候,它有85%的时间会崩溃。这是在许多不同的MT4实例和许多不同的电脑以及3个不同版本的windows上发生的。不包括我使用MQL4的32和64位系统。MT4是好的,但MQL4编辑器却不是。 因此,复制和粘贴对我来说不是一个真正可行的选择。即使是这样,这仍然不能提供与 "GoSub "或 "GoTo "一样的能力。

 

这真的有什么意义吗?mql4就是mql4,这是一个事实,因此当你在mql4中编码时,你必须考虑mql4,在考虑如何在另一种支持不同结构的语言中解决这个问题时,试图用一种语言编码是没有意义的。如果你有一个在mql4中的编码问题,你认为只能通过使用GoSub/Return和GoTo's来解决,我希望看到它,因为我认为你会发现总有一种以上的方法来剥掉一只猫的皮。

 

FourX:

即使是这样,这仍然不能提供与 "GoSub "或 "GoTo "一样的能力。

对不起,我很难理解你的观点,即MQL4函数GOSUB 在任何方面都不同。(Goto是另一码事)。

让我们继续讨论这个GOSUB的事情。一个MQL4函数 一个子程序。它可能会或可能不会返回一个值。所有的子程序调用都会返回到它们被调用的主代码中的下一行。在这一点上,我100%同意Raptor的观点。

(我也同意SDC的上述观点)。

 

这个主题的重点是看是否有可能在程序中的任何地方进行条件性分支,甚至从其他程序的外部进行条件性分支,以重复利用程序模块/函数,如在其他环境中提供的,如早期所说的:fGoTo,fGoSub。我已经知道MQL4并没有直接提供这些功能。 这就是这个主题的全部意义:是否 有可能 做一个'变通(SubRoutine?)'等来完成这个功能? 从概念上讲,这也与MQL4中的 "包含 "文件有相似之处。

类似于我们都用来弥补MQL4调试器能力有限的工作方法,即 "警告 "或 "打印 "GetLastError()函数 值。

这与正常的MQL4函数完全不同,这些函数包含一些条件布尔,如if、while、loop、continue、return等,可以在函数中跳过前面的循环,我所寻求的解决方法是为其他环境中的例子提供能力,在这些环境中,人们可以重复使用任何编程模块/函数,通常是从程序中(更早)开始。 声明一次:在程序中需要功能的任何地方都可以重复使用,这一点在大多数情况下已经得到体现。在一些环境中,fGoSub 允许用户导入和利用这样的其他fSubRoutines, 通常来自单独的小程序,是执行特定功能的模块。 也许有点类似于MQL4的'Include'文件。

仅仅因为它现在不存在,这是否意味着我们不应该利用这个强大的编程功能,如果我们可以为它创造一个 "工作环境"?

我们都知道,有许多方法可以通过编程来获得相同的结果。 这不是一个 "告诉我你的问题,我会告诉你如何在没有fGoTofGoSub 的情况下做到这一点 "的案例。 这是一个问题。如果我们能够创建这个功能,那么我们就有了额外的编程灵活性和能力,我们可以在许多不同的情况下以不同的方式加以利用。

 

我不认为你理解mql4中的自定义函数 是什么 . . . 也许你可以举个例子说明为什么mql4的自定义函数不能做你所描述的事情?我认为它可以 . .我有很多函数,我在很多其他的EA、指标和脚本中重复使用。

把start()想象成程序.......从start的任何地方我都可以调用一个自定义函数 ......当函数完成后,程序会返回到调用自定义函数的那一行之后 ......就像GOSUB。

[Deleted]  

FourX:

这个主题的重点是看是否有可能在程序中的任何地方做条件性分支,甚至从其他程序的外部做条件性分支,以重复利用程序模块/函数,如在其他环境中提供的,如早期所说的:fGoTo,fGoSub。

我正在寻求提供诸如其他环境中的例子的能力,在这些环境中,人们可以重复使用任何编程模块/函数,通常是在程序的(更)早期。

Mql4是一种老式的语言,它的水平大约是1990年。但是你的goto和gosub是更老的结构,大约是1970年的。让你的编程风格比Mql4更老有什么意义呢?使用真正的编程语言要好得多,比如C#,通过dll-s。20世纪90年代和2000年的大多数发明(如类、接口、对象、设计模式如事件和监听器、编程方法如测试驱动编程等)都是为了防止代码重复,帮助你快速写出可重复使用、可靠和可读的代码。我认为你应该忘记所有这些Goto项目
 
FourX:

我认识到无数的标准和自定义函数可以在任何一个(适当的)地方被 "调用 "和使用,但在MQL4中没有任何东西可以像你自己描述的那样,在程序中的任何特定位置,如GoSub 和/或GoTo第185行或特定的标签/函数等。然后运行它,然后回到程序中被调用的地方。

函数 中的回车将使它返回到函数被调用的地方。它100%地替代了以前的gosub/return。另外,函数允许传递值和返回值,它们甚至有自己的命名空间和堆栈框架,所以也不再需要全局变量的混乱。我真的不明白你的问题。请提供一个具体的例子(也许是伪代码或BASIC),说明你真正想做的事情,我们可以告诉你同样的例子是如何通过if/else、switch/case和函数调用以更清晰、更可重复使用和维护的方式完成的。

唯一真正缺少的是异常。你是想模拟异常吗?你也不能用GOTO来做这个,在做这个的时候,你还需要适当地关心(和解除)调用栈。

你可以在同一个函数内有多个返回语句,你也可以用break来跳出循环,这是你在结构化语言中能得到的最接近GOTO的东西,这些东西(多个退出)已经被一些严格的纯粹主义者所反对了。

 
erzo:
通过dll-s使用真正的编程语言,如C#,要好得多。

不建议用C#来制作与这种扁平的低级C调用约定API交互的DLLs。如果你想与其他C#和各种微软的东西互动,C#是完美的,但它不像其他环境那样通用。它非常专业。

如果你想在现代编程语言中制作容易与C语言调用习惯对接的DLLs,那么我建议使用ObjectPascal(Free Pascal)或Delphi。

[Deleted]  
7bit:

不建议用C#来制作与这种平坦的低级C语言调用惯例API交互的DLL。

我对java比较了解,也考虑过要用,但很难做一个桥梁。但如果你不推荐C#,那我想它会更容易,不过我会试试java。(Pascal不是我的风格。)谢谢你的建议!