错误、漏洞、问题 - 页 1016 1...100910101011101210131014101510161017101810191020102110221023...3184 新评论 Vladimir Gomonov 2013.07.21 14:56 #10151 A100: 是的,谢谢,我在简化源代码时犯了一个错误--现在我已经以不同的方式重写了这个错误 为了避免混淆,我删除了之前的那篇。太可怕了,真的太可怕了,活在世上是多么可怕的事...--听着,这对你有什么好处? 如果没有秘密的话。你用Lisp写你的顾问? 我向你致敬,但我建议你改用Haskell。;-) A100 2013.07.21 15:09 #10152 MetaDriver: 听着,你需要它做什么? 如果这不是什么秘密。 嗯,MQL5没有内联函数(在表单中),我使用参数化的宏来代替,这并不完全正确,因为没有类型控制 Vladimir Gomonov 2013.07.21 15:22 #10153 A100: MQL5没有内联函数(在表格中),我使用参数化的宏来代替。是的,我也使用它们,只是没有那么令人毛骨悚然的筑巢。))))供你参考,mql5将所有的小函数翻译成内联替换,换句话说,我们可以假设每个用户定义的函数中都默认有关键字 "内联"。替换宏或编译成函数的决定最终是由编译器做出的(顺便说一下,就像C++一样)。所以,试图用这种方式来加速是没有意义的,反正所有的简单函数都是内联的。// 顺便说一句--有了类型控制!:) A100 2013.07.21 15:58 #10154 MetaDriver: 作为参考,mql5将所有的小函数翻译成内联替换,换句话说--你可以假设每个用户函数中默认都有关键词 "内联"。 我不是想让它更快,而是为了方便。它们在本质上可能是内联的,但在形式上不是(!)。如果你在.mqh中定义inline,然后在几个.ex5中使用它,就会出现困难。我现在会试着找到这个链接 https://www.mql5.com/ru/forum/1111/page1013#comment_520221int B() { return ( A( 0 ) ); } 1.mqh 中的B()应该是内联的--但所有这些--不能正常编译--只能单独编译。ServiceDesk提到电话的模糊性,没有深入到问题的本质,并建议以不同的方式组织项目。如何能以不同的方式进行?只有当我把B()的实现从.mqh删除到.ex5时,一切才会正常。那么什么是内联形式呢? 顺便说一下,在MQL4中,这个例子是有效的--没有错误,尽管B()事实上不是内联的,而是形式上的--内联。 Vladimir Gomonov 2013.07.21 17:13 #10155 A100: 而且我不是为了速度,而是为了方便。实质上,它们可能是内联的,但不是形式的(!)。那么形式呢。 " 谁是Studebaker的人?这是你的Studebaker亲戚吗?你爸爸是Studebaker公司的?"如果你在.mqh中定义inline,然后在几个.ex5中使用它,就会出现困难。 如果你不犯逻辑上的错误,并正确理解编译器的工作原理,就不会有任何困难。我现在试着找一下链接 https://www.mql5.com/ru/forum/1111/page1013#comment_520221 这里的B()函数本质上是内联的 我还没有设法摆脱 "以相同的参数模糊地调用重载函数 "这样的错误--除非你把它放到一个单独的.ex5中,否则它们不会出现。你在源代码层面上的递归基本上是不可识别的。 编译器很仁慈地对你皱起了眉头,就在优点上。你试图连接到inluder a libu,它定义了你正在编译的同一个inluder。那么你想要什么?如果你是一个编译器,你会怎么做?这对你来说可能是个新闻,但是一个写在DLL中的内联函数绝对不能作为这个DLL之外的 宏来使用,//在运行时,源代码不再存在了。我想给你的第二个消息是:mql(4, 5)中的所有lib都是动态链接的。这就是DLL的本质。一句话:你实际上是想从一个lib指到它自己,指到它自己,指到它自己...... 等。同意,如果都是无异议地编译,然后在运行时lib试图递归地加载自己,直到内存耗尽,那会更糟....。:))? 这就是为什么在C/C++中会有内联关键字的原因这根本不是原因。 我敢肯定,链接中的例子在C++中是无法编译的。 // 我懒得检查,这根本说不通。 如果我不明白如何构建递归组织的源代码,编译器也不会明白。 Vladimir Gomonov 2013.07.21 17:19 #10156 A100: 顺便说一下,这个例子在MQL4中是可行的--没有错误,尽管B()不是内联的,而是在形式上--内联的。 虽然......由于没有函数重载,也许编译器甚至没有尝试暗示不正确的重载--它只是愚蠢地忽略了重复的定义。 A100 2013.07.21 17:26 #10157 MetaDriver: 我不知道。虽然......由于那里没有函数重载,也许编译器并不试图暗示那里有错误的重载--它只是愚蠢地忽略了重复定义。 如果你在B()之前写内联,它可以在MQL4中编译(!),也可以在C/C++中编译。 那里根本就没有递归,事实上有 int A( int ) 和 #define B( ) A( 0 ) 那里非常简单--如果你不太懒的话--用你的新脑袋看看--只是把函数的声明和实现分开 :) Vladimir Gomonov 2013.07.21 17:31 #10158 A100: 1.mqh 中的B()应该是内联的--但所有这些都不能正常编译--只能单独编译。ServiceDesk提到了电话的模糊性,但没有深入到问题的核心,并建议以另一种方式组织项目。那还能怎样? 他只是自己回答。只有当你从.ex5中的.mqh中删除B()的实现时,它才能发挥作用。那么什么是内联形式呢? 问题根本不在于内联B(),而在于它的重新定义。 由于lib是一个DLL,在重新编译1的过程中,它所包含的内联程序的信息(它们的名字)已经丢失。mqh(第一次编译是在lib形成的时候),所以在编译内联的时候,发现了重新定义的B()函数,由于参数相同,编译器认为这是一次错误的(不正确的)重载函数的尝试。 他完全有权利。 很有礼貌,他可以发誓不干。 A100 2013.07.21 17:33 #10159 MetaDriver: 你刚刚回答了你自己的问题。 这里的内联是正常的。 问题根本不在于B()的ineity,而在于它的重新定义。 只是C/C++理解(使用inline关键字)这不是一个重新定义,而MQL5不理解,尽管它可以通过编译模块的名称和#import中指定的模块进行区分。我不知道MQL4如何理解它。 简而言之,你不能在.mqh中定义一个函数的实现并在任何.ex5中毫无问题地使用它。 Vladimir Gomonov 2013.07.21 17:43 #10160 A100: 完全正确--只是C/C++理解这不是一个重新定义,而MQL5不理解。C/C++只有在编译静态 库的时候才能理解这一点,因为源文件的名称信息被保存在对象文件中(正是为了识别重新编译)。对于动态链接的库,这不会起作用,如果它起作用,也不是因为重新实现的检测,而是因为当前源码和DLL的命名一致性的 "优先规则"。 一些语言有这样的规则(特别是Delphi,可能一些C/C++编译器也有)。 1...100910101011101210131014101510161017101810191020102110221023...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
是的,谢谢,我在简化源代码时犯了一个错误--现在我已经以不同的方式重写了这个错误
为了避免混淆,我删除了之前的那篇。太可怕了,真的太可怕了,活在世上是多么可怕的事...
--
听着,这对你有什么好处? 如果没有秘密的话。
你用Lisp写你的顾问? 我向你致敬,但我建议你改用Haskell。
;-)
听着,你需要它做什么? 如果这不是什么秘密。
MQL5没有内联函数(在表格中),我使用参数化的宏来代替。
是的,我也使用它们,只是没有那么令人毛骨悚然的筑巢。))))
供你参考,mql5将所有的小函数翻译成内联替换,换句话说,我们可以假设每个用户定义的函数中都默认有关键字 "内联"。
替换宏或编译成函数的决定最终是由编译器做出的(顺便说一下,就像C++一样)。所以,试图用这种方式来加速是没有意义的,反正所有的简单函数都是内联的。
// 顺便说一句--有了类型控制!:)
作为参考,mql5将所有的小函数翻译成内联替换,换句话说--你可以假设每个用户函数中默认都有关键词 "内联"。
https://www.mql5.com/ru/forum/1111/page1013#comment_520221
1.mqh 中的B()应该是内联的--但所有这些--不能正常编译--只能单独编译。ServiceDesk提到电话的模糊性,没有深入到问题的本质,并建议以不同的方式组织项目。如何能以不同的方式进行?只有当我把B()的实现从.mqh删除到.ex5时,一切才会正常。那么什么是内联形式呢?
顺便说一下,在MQL4中,这个例子是有效的--没有错误,尽管B()事实上不是内联的,而是形式上的--内联。
而且我不是为了速度,而是为了方便。实质上,它们可能是内联的,但不是形式的(!)。
那么形式呢。
" 谁是Studebaker的人?这是你的Studebaker亲戚吗?你爸爸是Studebaker公司的?"
如果你在.mqh中定义inline,然后在几个.ex5中使用它,就会出现困难。
如果你不犯逻辑上的错误,并正确理解编译器的工作原理,就不会有任何困难。
我现在试着找一下链接
https://www.mql5.com/ru/forum/1111/page1013#comment_520221
这里的B()函数本质上是内联的
我还没有设法摆脱 "以相同的参数模糊地调用重载函数 "这样的错误--除非你把它放到一个单独的.ex5中,否则它们不会出现。
你在源代码层面上的递归基本上是不可识别的。 编译器很仁慈地对你皱起了眉头,就在优点上。你试图连接到inluder a libu,它定义了你正在编译的同一个inluder。那么你想要什么?如果你是一个编译器,你会怎么做?
这对你来说可能是个新闻,但是一个写在DLL中的内联函数绝对不能作为这个DLL之外的 宏来使用,//在运行时,源代码不再存在了。
我想给你的第二个消息是:mql(4, 5)中的所有lib都是动态链接的。这就是DLL的本质。
一句话:你实际上是想从一个lib指到它自己,指到它自己,指到它自己...... 等。
同意,如果都是无异议地编译,然后在运行时lib试图递归地加载自己,直到内存耗尽,那会更糟....。:))
?
这就是为什么在C/C++中会有内联关键字的原因
这根本不是原因。 我敢肯定,链接中的例子在C++中是无法编译的。
// 我懒得检查,这根本说不通。 如果我不明白如何构建递归组织的源代码,编译器也不会明白。
顺便说一下,这个例子在MQL4中是可行的--没有错误,尽管B()不是内联的,而是在形式上--内联的。
我不知道。虽然......由于那里没有函数重载,也许编译器并不试图暗示那里有错误的重载--它只是愚蠢地忽略了重复定义。
如果你在B()之前写内联,它可以在MQL4中编译(!),也可以在C/C++中编译。
那里根本就没有递归,事实上有
int A( int ) 和 #define B( ) A( 0 )
那里非常简单--如果你不太懒的话--用你的新脑袋看看--只是把函数的声明和实现分开 :)
1.mqh 中的B()应该是内联的--但所有这些都不能正常编译--只能单独编译。ServiceDesk提到了电话的模糊性,但没有深入到问题的核心,并建议以另一种方式组织项目。那还能怎样?
只有当你从.ex5中的.mqh中删除B()的实现时,它才能发挥作用。那么什么是内联形式呢?
你刚刚回答了你自己的问题。
这里的内联是正常的。 问题根本不在于B()的ineity,而在于它的重新定义。
只是C/C++理解(使用inline关键字)这不是一个重新定义,而MQL5不理解,尽管它可以通过编译模块的名称和#import中指定的模块进行区分。我不知道MQL4如何理解它。
简而言之,你不能在.mqh中定义一个函数的实现并在任何.ex5中毫无问题地使用它。
完全正确--只是C/C++理解这不是一个重新定义,而MQL5不理解。
C/C++只有在编译静态 库的时候才能理解这一点,因为源文件的名称信息被保存在对象文件中(正是为了识别重新编译)。
对于动态链接的库,这不会起作用,如果它起作用,也不是因为重新实现的检测,而是因为当前源码和DLL的命名一致性的 "优先规则"。 一些语言有这样的规则(特别是Delphi,可能一些C/C++编译器也有)。