错误、漏洞、问题 - 页 2579

 
Roman:

它怎么会是一个空字符串?当字符串来自插座时,在其他变体中,虽然它是歪的,但它不是空的。
我不是说你的变体是错的,但在你的变体中,你使用了一个字符串数组。
在我的例子中,它是一个指针。

socket函数返回一个指向const wchar_t *
的指针。这就是为什么我把这个错误归咎于mql,因为我试了那么多的C函数,硬生生把+1或+2给解决了。
它只是不会工作。

memcpy() 之后写几行并行到文件中,如果mql是有罪的(在有复制参数的调用之上有一些包装器),那么文件就不会是空的,可能。

HH:嗯,以防万一--µl中的库函数是用链接声明的,对吗?void fn(string& s)?
 
Vict:

在memcpy()之后并行写几行到文件中,如果是μl的原因(在有复制参数的调用上面有一些包装器),文件不会是空的,我想。

HH:好吧,以防万一--在μl库中函数是用引用来声明的?void fn(string& s)?

所有的字符串我都显示在图表的注释中,或者在打印终端中,当字符串到达时,它是立即可见的,在注释中你可以看到它是否是歪的。
当有大的时间差距时,这根弦很少出现在图表上,而且在打印时也有漏洞。
没有字符串从套接字中进入的疑问已经消失了,勾选数据以毫秒级的速度进入。
从socket getData()中取出一个指针变量,从指针变量中我直接复制到mql,没有包装。
是由风水学宣布的))

#import "ExampleDll.dll"
   void Func(string task, string & out);
#import
一般来说,mql字符串有一个问题。尝试并测试了许多变种。
来自套接字的字符串带有终端空号,最可靠的检查功能是
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
显示了mql上的问题。

一般来说,我将暂时使用sizeof(wichar_t*),然后看看行为。
但可能为了避免MQ的变化,我真的会在数组上写字符串。
 
但我想为了避免MQ的变化,我可能真的会把字符串写在数组上。

金句。当然,我想使用字符串,但由于没有标准来描述它的实现和/或将其传入dll时的行为,这纯粹是ub。因此,string in short[],你可以安全地传递数组;唯一的是创建和复制数组 的开销。

PS。不过,我认为问题不在mql,而是在你的代码中。所有的测试都正常通过,字符串在逻辑上没有任何问题,字符串是wchar_t *上的一个微不足道的包装,或者说是wstring上的包装,可能会把它搞砸。

 
Vladimir Simakov:

好话说尽。当然,我们想使用字符串,但由于没有标准来描述它在dll中的实现和/或传输行为,这纯粹是ub。因此,string in short[],你可以安全地传递数组;唯一的是创建和复制数组的开销。

PS。不过,我认为问题不在mql,而是在你的代码中。所有测试都正常通过,字符串在逻辑上没有任何问题,字符串是wchar_t *上的一个微不足道的包装,或者说是wstring上的包装,可能会把它搞砸。

我对解放军也有疑虑,我不排除任何可能的原因。
但我把从插座上收到的字符串转换成了ASCII码,你可以看到这个字符串是正确的。
接下来是一个简单的副本。
mql不能正确接受字符串指针。

附加的文件:
1.PNG  32 kb
 
Roman:

所有的线条我都显示在图表的注释中,或者在打印终端中,当线条出现时,在注释中可以立即看到它是否是歪的。
当有大的时间滞后时,线很少出现在图表上,而在打印时有漏洞。
怀疑来自插座的字符串没有进来,嘀嗒的数据是以毫秒级的速度进来的。
从socket getData()取到指针变量,从指针变量我立即复制到mql,没有包装。
是由风水学宣布的))

总之,任何关于mql字符串的问题。尝试并测试了许多变种。
来自套接字的字符串带有终端空号,最可靠的检查功能是
显示了mql上的问题。

一般来说,我现在会使用sizeof(wichar_t*),看看行为。
但可能为了避免MQ的变化,我真的会在数组上写字符串。

写入文件--我的意思是在dll方面,如果文件被写入,但没有进入μl,这已经是一个有分量的说法,有bug的说法,也许会被纠正。

而且还有一个没有你希望的包装,MQ从外界隐藏代码/地址,一切都不直接进行。

 
Vict:

写入文件--我的意思是在dll方面,如果它写入文件,但没有进入mql,那么它已经是一个有bug主张的有力论据,也许会被纠正。

而且有一个包装,没有你的愿望,MQ隐藏了外界的代码/地址,一切都不直接进行。

将收到的字符串写到一个文件中。
由于socket函数返回了一个指向字符串的指针,一个指向字符串的指针被写入文件,然后这个指针被复制到mql。
使用函数

wcscpy(out,  data);

结果字符串的长度为164,mql被分配为200。

StringInit(out, 200, 32);

在mql中收到的复制的字符串是等长的,但是,在复制时有一些空隙。
在mql脚本中,while循环是用Sleep(1)循环的。

附加的文件:
458.PNG  71 kb
 
而如果你使用函数
wcsncpy(out, data, wcslen(data));
然后就没有空隙了,但复制的线条不直,行尾有多余的字符。
添加wcslen(data)+1 也没有

底线,我在这里写的所有页面中。
mql字符串不能正确接受来自dll的,复制到字符串的指针const wchar_t*。
附加的文件:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman:

正确,我为字符串输出分配了一个缓冲区,并用空格初始化它。
然后我把这个字符串(指针)传给dll。

在dll中wchar_t*数据被复制到out,即也是一个指针。从逻辑上讲,应该没有什么问题。
根据我对帮助的理解,StringInit函数应该设置字符串的长度。
但我对StringInit函数 本身仍有一些问题;我指定了字符串的长度,当我指出指针的大小时,得到了奇怪的结果。
我不明白你说的手动弦长转移是什么意思。

而如果你使用没有指针的sizeof(wchar_t),字符串就会开始漂浮着额外的字符,从而导致解析和泄漏的问题。
为了将字符串传入dll,我使用了Renat的例子,来自他关于如何编写dll的文章。
但不知道为什么,如果我不使用sizeof(wchar_t)指针传递,字符串就会浮动,而使用sizeof(wchar_t*)指针就没有问题。
对我来说,这似乎是合乎逻辑的,我是把字符串作为一个指针复制的,大小应该作为一个指针传递,而不是作为一个类型。

有时你做得很好--它不起作用。

做错了--似乎是有效的。

在这种情况下,你必须做得正确,并在其他地方寻找错误。

 
Roman:

将得到的字符串写进文件。
由于socket函数返回了一个指向字符串的指针,一个指向字符串的指针被写入文件,然后这个指针被复制到mql。
使用函数

结果字符串的长度为164,mql被分配为200。

在mql中收到的复制的字符串是等长的,但是,在复制时有一些空隙。
在mql脚本中,while循环是用Sleep(1)循环的。

1.在MQL中,复制的是一个字符串,而不是一个指针。

2.你在MQL中选择了一个200字符的字符串。然后你复制了164个字符到里面。之后,看一下MQL中的线的大小。它仍然是200。

 
Koldun Zloy:

有时你做得很好--它不起作用。

做错了--似乎是有效的。

在这种情况下,你必须做正确的事情,在其他地方寻找错误。

所以为了弄清楚,我放弃了memcpy,而使用wcscpy或wcsncpy。
结果,上面的帖子。