错误、漏洞、问题 - 页 2576

 
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
[删除]  
Roman:

当然,用一些东西代替getData(),在响应中写出一大堆乱七八糟的东西,比正常的可重复性测试更容易。如果UB对UB和结论是错误的,你还能指望什么呢?

memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)

一切就在那里。你对字符串的想法出了问题,因此出现了蔓延的情况。

 
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,无论它是否存在。
如何才能做到这一点呢?

附加的文件:
[删除]  
使用一个没有指针的函数。

它在最后没有留下0号。

而如果我用一个指针。

在这里你就出界了

而如果我使用这个函数,则没有任何泄漏,一切都解析得很好,只是在字符串的末尾多了一个字符,它出现又消失了。

再出来的时候,没有0。见文档

wcsncpy, wcsncpy_s

...

如果在整个字符串src被复制之前就达到了count,那么产生的宽字符数组就不是空尾的。

...

HH:也许根本就不用搞字符串?将数组保存在wchar_t中,然后运行它们,如果需要的话,在μl中转换为字符串https://www.mql5.com/ru/docs/convert/shortarraytostring

 
Vict:

将数组保存在wchar_t中并运行它们,如果需要的话,在μl中转换为字符串。

哦,谢谢你)),谢谢你的提示,wcsncpy修饰了零。
是的,数组是留到最后的,如果指针不起作用,我就用数组。

 

论坛引擎不允许你用一张图片来发帖。要求你输入文字。

你必须放一个空格。

 
fxsaber:

论坛引擎不允许你用一张图片来发帖。要求你输入文字。

我必须要加一个空格。

这似乎是有道理的:这是一个论坛,主要的是文字。一张图片附在一次多少钱上。这不是图像的坟场。

 

我完成了代码,它在MT4/5中工作,但我面临一个小小的意外

我如何在MQL4中取代TesterStop()?

?

 
Igor Makanu:

我怎样才能在MQL4中取代TesterStop()?

ExpertRemove.

 
fxsaber:

ExpertRemove.

我知道这个变体,但我看到报告说ExpertRemove(0)不能用于市场中的Expert Advisors。

一般来说,我在两种情况下使用TesterStop()。

- 而不是INIT_PARAMETERS_INCORRECT,以隐藏优化器的日志。

- 如果没有足够的资金 来打开一个订单,我不打开它,但我关闭测试,以便优化速度更快。