错误、漏洞、问题 - 页 2576 1...256925702571257225732574257525762577257825792580258125822583...3184 新评论 Roman 2019.09.26 22:02 #25751 Vict: 你的例子很有趣,你删除了所有的东西,你留下了UB(字符串字面的修改),每个人都要心灵感应。如果你期望得到一些聪明的建议,请给出最小的工作代码(在两边),否则就是垃圾了。 这个例子显示了导致问题的地方,即问题出在将wchar_t*指针复制到mql字符串上。 其余的代码与问题无关,也没有用,因为它只是检查是否有数据,然后读取,等等。 为什么要把它写在例子里,而污染了问题的本质,因为即使有简化的代码,很多人也不会明白问题是什么。 了解,getData()是一个网络函数,它读取 FrameOpcode,并将收到的数据作为一个指向 const wchar_t *类型的字符串的指针返回。 大家都知道,一个简单的函数wcscpy(out, data)将const wchar_t *字符串复制到字符串wchar_t *中,并自动计算字符的长度,以终端null const wchar_t *。这里我们遇到了一个错误,mql字符串没有正确接受 复制的字符串wchar_t *,那么为什么 呢?如果函数自动检测到终端null。 在Renat的文章中,字符串通过memcpy复制,字节大小错误。也许终端代码本身也采用了同样的方法,形成了mql类型的字符串。 你看,memcpy 不仅不适合复制字符串,而且还存在传递字节大小的错误,导致数据不均匀。 还有其他一些特殊的C函数用于字符串的复制,如wcscpy、wcsncpy 等。 而Renat自己在其中一个线程中写道,很快就会完全重做与字符串有关的工作,显然这个问题是已知的,但由于某种原因,对我所指出的问题保持沉默。 下面是wchar_t* 指针和简单的wchar_t类型 的字节大小的比较 附加的文件: 1.PNG 83 kb [删除] 2019.09.27 02:46 #25752 Roman: 当然,用一些东西代替getData(),在响应中写出一大堆乱七八糟的东西,比正常的可重复性测试更容易。如果UB对UB和结论是错误的,你还能指望什么呢? memcpy(cp,to,wcslen(to)*sizeof(wchar_t)); //в этой строке должен быть указатель sizeof(wchar_t *) 一切就在那里。你对字符串的想法出了问题,因此出现了蔓延的情况。 Roman 2019.09.27 03:40 #25753 Vict:当然,用一些东西代替getData(),在响应中写出一大堆乱七八糟的东西,比正常的可重复性测试更容易。如果UB对UB和结论是错误的,你还能指望什么呢?一切就在那里。你对字符串的概念有问题,因此出现了错误。 没有办法提供可复制的代码,因为你自己也明白,这是一个使用第三方库的dll。 至于为什么我认为例子中存在错误。 memcpy(cp,to,wcslen(to)*sizeof(wchar_t));//这个字符串必须 包含指针sizeof(wchar_t *) 如果我们使用不带指针的函数。 memcpy(out, data, wcslen(data) * sizeof(wchar_t)); 它将导致字符串的末端被不必要的字符所淹没。请看图片中的字符串的末端。 而且合乎逻辑的是,如果我们把一个字符串wchar_t *复制成一个指针,我们应该传递指针的大小而不是类型的大小。 而如果我们使用一个指针。 memcpy(out, data, wcslen(data) * sizeof(wchar_t*)); 该字符串是清晰的,没有多余的字符。 这并不重要,但在这两种情况下,我在解析方面有进一步的问题,即字符串泄漏和跳过。 而如果我使用这个函数,则没有任何泄漏,所有的解析都很好,只有在断行的最后有一个额外的字符,然后它出现,然后消失。 wcsncpy(out, data, wcslen(data)); 所以我通过一堆选项,但使用memcpy而不使用指向sizeof的指针,结果可以在截图中看到。 我想检查收到的wchar_t *字符串的终端null,无论它是否存在。 如何才能做到这一点呢? 附加的文件: plr_tuq3w6hwi.PNG 4 kb x__rqpgmxfkce.PNG 4 kb [删除] 2019.09.27 04:03 #25754 使用一个没有指针的函数。 它在最后没有留下0号。 而如果我用一个指针。 在这里你就出界了 而如果我使用这个函数,则没有任何泄漏,一切都解析得很好,只是在字符串的末尾多了一个字符,它出现又消失了。 再出来的时候,没有0。见文档 wcsncpy, wcsncpy_s... 如果在整个字符串src被复制之前就达到了count,那么产生的宽字符数组就不是空尾的。 ... HH:也许根本就不用搞字符串?将数组保存在wchar_t中,然后运行它们,如果需要的话,在μl中转换为字符串https://www.mql5.com/ru/docs/convert/shortarraytostring Roman 2019.09.27 04:47 #25755 Vict: 将数组保存在wchar_t中并运行它们,如果需要的话,在μl中转换为字符串。 哦,谢谢你)),谢谢你的提示,wcsncpy修饰了零。 是的,数组是留到最后的,如果指针不起作用,我就用数组。 fxsaber 2019.09.27 10:42 #25756 论坛引擎不允许你用一张图片来发帖。要求你输入文字。 你必须放一个空格。 Vladimir Karputov 2019.09.27 10:47 #25757 fxsaber: 论坛引擎不允许你用一张图片来发帖。要求你输入文字。 我必须要加一个空格。 这似乎是有道理的:这是一个论坛,主要的是文字。一张图片附在一次多少钱上。这不是图像的坟场。 Igor Makanu 2019.09.27 10:54 #25758 我完成了代码,它在MT4/5中工作,但我面临一个小小的意外 我如何在MQL4中取代TesterStop()? ? fxsaber 2019.09.27 10:58 #25759 Igor Makanu:我怎样才能在MQL4中取代TesterStop()? ExpertRemove. Igor Makanu 2019.09.27 11:02 #25760 fxsaber:ExpertRemove. 我知道这个变体,但我看到报告说ExpertRemove(0)不能用于市场中的Expert Advisors。 一般来说,我在两种情况下使用TesterStop()。 - 而不是INIT_PARAMETERS_INCORRECT,以隐藏优化器的日志。 - 如果没有足够的资金 来打开一个订单,我不打开它,但我关闭测试,以便优化速度更快。 1...256925702571257225732574257525762577257825792580258125822583...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你的例子很有趣,你删除了所有的东西,你留下了UB(字符串字面的修改),每个人都要心灵感应。如果你期望得到一些聪明的建议,请给出最小的工作代码(在两边),否则就是垃圾了。
这个例子显示了导致问题的地方,即问题出在将wchar_t*指针复制到mql字符串上。
其余的代码与问题无关,也没有用,因为它只是检查是否有数据,然后读取,等等。
为什么要把它写在例子里,而污染了问题的本质,因为即使有简化的代码,很多人也不会明白问题是什么。
了解,getData()是一个网络函数,它读取 FrameOpcode,并将收到的数据作为一个指向 const wchar_t *类型的字符串的指针返回。
大家都知道,一个简单的函数wcscpy(out, data)将const wchar_t *字符串复制到字符串wchar_t *中,并自动计算字符的长度,以终端null const wchar_t *。
这里我们遇到了一个错误,mql字符串没有正确接受 复制的字符串wchar_t *,那么为什么 呢?如果函数自动检测到终端null。
在Renat的文章中,字符串通过memcpy复制,字节大小错误。也许终端代码本身也采用了同样的方法,形成了mql类型的字符串。
你看,memcpy 不仅不适合复制字符串,而且还存在传递字节大小的错误,导致数据不均匀。
还有其他一些特殊的C函数用于字符串的复制,如wcscpy、wcsncpy 等。
而Renat自己在其中一个线程中写道,很快就会完全重做与字符串有关的工作,显然这个问题是已知的,但由于某种原因,对我所指出的问题保持沉默。
下面是wchar_t* 指针和简单的wchar_t类型 的字节大小的比较
当然,用一些东西代替getData(),在响应中写出一大堆乱七八糟的东西,比正常的可重复性测试更容易。如果UB对UB和结论是错误的,你还能指望什么呢?
一切就在那里。你对字符串的想法出了问题,因此出现了蔓延的情况。
当然,用一些东西代替getData(),在响应中写出一大堆乱七八糟的东西,比正常的可重复性测试更容易。如果UB对UB和结论是错误的,你还能指望什么呢?
一切就在那里。你对字符串的概念有问题,因此出现了错误。
没有办法提供可复制的代码,因为你自己也明白,这是一个使用第三方库的dll。
至于为什么我认为例子中存在错误。
memcpy(cp,to,wcslen(to)*sizeof(wchar_t));//这个字符串必须 包含指针sizeof(wchar_t *)
如果我们使用不带指针的函数。
它将导致字符串的末端被不必要的字符所淹没。请看图片中的字符串的末端。
而且合乎逻辑的是,如果我们把一个字符串wchar_t *复制成一个指针,我们应该传递指针的大小而不是类型的大小。
而如果我们使用一个指针。
该字符串是清晰的,没有多余的字符。
这并不重要,但在这两种情况下,我在解析方面有进一步的问题,即字符串泄漏和跳过。
而如果我使用这个函数,则没有任何泄漏,所有的解析都很好,只有在断行的最后有一个额外的字符,然后它出现,然后消失。
所以我通过一堆选项,但使用memcpy而不使用指向sizeof的指针,结果可以在截图中看到。
我想检查收到的wchar_t *字符串的终端null,无论它是否存在。
如何才能做到这一点呢?
它在最后没有留下0号。
而如果我用一个指针。
在这里你就出界了
再出来的时候,没有0。见文档
wcsncpy, wcsncpy_s
...如果在整个字符串src被复制之前就达到了count,那么产生的宽字符数组就不是空尾的。
...
HH:也许根本就不用搞字符串?将数组保存在wchar_t中,然后运行它们,如果需要的话,在μl中转换为字符串https://www.mql5.com/ru/docs/convert/shortarraytostring
将数组保存在wchar_t中并运行它们,如果需要的话,在μl中转换为字符串。
哦,谢谢你)),谢谢你的提示,wcsncpy修饰了零。
是的,数组是留到最后的,如果指针不起作用,我就用数组。
论坛引擎不允许你用一张图片来发帖。要求你输入文字。
你必须放一个空格。
论坛引擎不允许你用一张图片来发帖。要求你输入文字。
我必须要加一个空格。
这似乎是有道理的:这是一个论坛,主要的是文字。一张图片附在一次多少钱上。这不是图像的坟场。
我完成了代码,它在MT4/5中工作,但我面临一个小小的意外
我如何在MQL4中取代TesterStop()?
?
我怎样才能在MQL4中取代TesterStop()?
ExpertRemove.
ExpertRemove.
我知道这个变体,但我看到报告说ExpertRemove(0)不能用于市场中的Expert Advisors。
一般来说,我在两种情况下使用TesterStop()。
- 而不是INIT_PARAMETERS_INCORRECT,以隐藏优化器的日志。
- 如果没有足够的资金 来打开一个订单,我不打开它,但我关闭测试,以便优化速度更快。