错误、漏洞、问题 - 页 2577 1...257025712572257325742575257625772578257925802581258225832584...3184 新评论 fxsaber 2019.09.27 11:07 #25761 Igor Makanu: 我知道这个选项。 然后除以零。 Igor Makanu 2019.09.27 11:12 #25762 fxsaber: 然后除以零。 吴......有希望,但像往常一样只有铁杆))))。 A100 2019.09.27 17:07 #25763 Vict: ZS: 也许根本就不用搞字符串?将数组保存在wchar_t中并进行竞赛,如果需要的话,在μl中转换为字符串https://www.mql5.com/ru/docs/convert/shortarraytostring 同意的 关于交易、自动交易系统和策略测试的论坛 WinAPI -> MQL5 x64 A100, 2018.05.29 14:11 所有的规则都已经说过了。如果你想让它一直工作--你需要使用ushort,如果你想了解为什么字符串突然停止工作(昨天的工作)--你可以使用字符串 Roman 2019.09.27 22:04 #25764 Vict: 在这里,你要越界了 你给了我一个想法,在StringInit(out, 165, 32)中检查初始化字符串的长度。 StringInit帮助中说第二个参数是字符串长度,在我的理解中,字符串长度是指字符串的字符数。 在我的例子中,传入的字符串有164个字符,所以我在第二个参数中放了165个,并尝试了超过*2,330。 使用带有指针的memcpy_s。 memcpy_s(out, wcslen(data) * sizeof(wchar_t*), data, wcslen(data) * sizeof(wchar_t*)); 结果是一样的,字符串的结尾总是被字符数漂移,而且解析时有泄漏。 没有指针,字符串也是浮动的。 但你给了我一个想法,在StringInit(out, 1400, 32)中,我设置了以字节为单位的指针大小,而不是字符串的长度。 然后奇迹出现了,字符串变得没有额外的输出字符,解析没有问题,而且没有任何泄漏。 我想注意的是,它是在sizeof中的指针,没有指针,字符串就会浮动。 这就给开发人员提出了一个问题,对StringInit的帮助是否正确? 在帮助中或在StringInit函数 本身中,是不是把字符串的长度与字符串的大小混为一谈? 一般来说,如果你使用memcpy,如果你传递了指针的大小,并且StringInit是用这个大小初始化的,而不是长度,那么它就能正确工作。 Roman 2019.09.27 22:35 #25765 A100: 同意的 是的,我也同意。但将字符串作为一个数组并不总是很方便,尤其是当这个字符串需要通过几个函数传递时。 在这种情况下,指针更方便,你不需要在每个转运函数中重新填充这个数组,另外为数组多输入一个参数,即它的大小。 Roman 2019.09.27 23:03 #25766 A100: 所以你只是分配了一个故意过大的缓冲区(把边界往后推),而错误根本没有显示出来--因为它在边界上。 我也是这么想的,弦的长度是164,设置165,设置330。 330显然不是字符串长度 的界限,如果你以字符计算字符串的话。 事实证明,这不是长度问题,而是字节的大小问题。 但帮助表明情况正好相反,应该是StringInit 中的长度。 一般来说,正如我所理解的那样,mql的字符串类型是一个指针,你应该像处理一个指针一样处理这个类型。 Roman 2019.09.28 00:47 #25767 还决定在dll中检查收到的字符串,看是否存在终端null。 零是存在的 for (int index = 0; index <= wcslen(data); ++index) wcout << static_cast<int>(data[index]) << " "; 123 34 101 34 58 34 97 103 103 84 114 97 100 101 34 44 34 69 34 58 49 53 54 57 54 50 52 50 50 57 50 51 54 44 34 115 34 58 34 66 84 67 85 83 68 84 34 44 34 97 34 58 49 54 54 50 49 57 49 55 53 44 34 112 34 58 34 56 50 48 50 46 49 48 48 48 48 48 48 48 34 44 34 113 34 58 34 48 46 48 51 51 50 51 48 48 48 34 44 34 102 34 58 49 56 51 57 54 49 54 55 50 44 34 108 34 58 49 56 51 57 54 49 54 55 50 44 34 84 34 58 49 53 54 57 54 50 52 50 50 57 50 51 49 44 34 109 34 58 116 114 117 101 44 34 77 34 58 116 114 117 101 125 0 [删除] 2019.09.28 06:20 #25768 Roman: 如果你坚持,就按你的方式来吧。 [删除] 2019.09.28 06:39 #25769 Roman: 我也这么想,弦的长度是164,我把它调到165,然后调到330。 如果你用字符来计算字符串,330显然不是一个字符串长度 的边界。 事实证明,这不是长度问题,而是字节的大小问题。 但帮助表明情况正好相反,应该是 StringInit 中的长度。 一般来说,正如我所理解的那样,mql的字符串类型是一个指针,你应该像处理一个指针一样处理这个类型。 mql类型的字符串是一个结构,包含一个指针,字符串的长度,可能还有其他东西。 当你向DLL传递一个字符串时,只传递指针。字符串的长度必须手动传入。 并始终确保不要使绳子的尺寸过大。 字符串大小的所有变化都只在MQL方面。 在DLL方面,你应该仔细阅读你所使用的功能的帮助。这是你的唯一问题。 sizeof( wchar_t* ) 返回指针的大小。这根本不是你需要的。 Roman 2019.09.28 07:20 #25770 Koldun Zloy: mql类型的字符串是一个结构,包含一个指针,字符串的长度,可能还有其他东西。 当你向DLL传递一个字符串时,只传递指针。字符串的长度必须手动传入。 并始终确保不要使绳子的尺寸过大。 字符串大小的所有变化都只在MQL方面。 在DLL方面,你应该仔细阅读你所使用的功能的帮助。这是你的唯一问题。 sizeof( wchar_t* ) 返回指针的大小。这根本不是你所需要的。 对了,我为字符串分配了一个缓冲区,并以空格初始化它。 然后我把这个字符串(指针)传给dll。 string out; StringInit(out, 1400, 32); Func(out); 在dll中,wchar_t*数据被复制到out,即也是一个指针。从逻辑上讲,应该没有什么问题。 根据我对帮助的理解,StringInit函数应该设置字符串的长度。 但我对StringInit函数 本身仍有一些问题;我指定了字符串的长度,当我指出指针的大小时,得到了奇怪的结果。 我不明白你说的手动弦长转移是什么意思。 而如果你使用没有指针的sizeof(wchar_t),字符串就会开始漂浮着额外的字符,从而导致解析和泄漏的问题。 为了将字符串传入dll,我使用了Renat的例子,来自他关于如何编写dll的文章。 但不知道为什么,如果我不使用sizeof(wchar_t)指针传递,字符串就会浮动,而使用sizeof(wchar_t*)指针就没有问题。 对我来说,这似乎是合乎逻辑的,我把一个字符串作为一个指针复制,大小应该传递给指针,而不是类型。 1...257025712572257325742575257625772578257925802581258225832584...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我知道这个选项。
然后除以零。
然后除以零。
吴......有希望,但像往常一样只有铁杆))))。
ZS: 也许根本就不用搞字符串?将数组保存在wchar_t中并进行竞赛,如果需要的话,在μl中转换为字符串https://www.mql5.com/ru/docs/convert/shortarraytostring
同意的
关于交易、自动交易系统和策略测试的论坛
WinAPI -> MQL5 x64
A100, 2018.05.29 14:11
所有的规则都已经说过了。如果你想让它一直工作--你需要使用ushort,如果你想了解为什么字符串突然停止工作(昨天的工作)--你可以使用字符串
在这里,你要越界了
你给了我一个想法,在StringInit(out, 165, 32)中检查初始化字符串的长度。
StringInit帮助中说第二个参数是字符串长度,在我的理解中,字符串长度是指字符串的字符数。
在我的例子中,传入的字符串有164个字符,所以我在第二个参数中放了165个,并尝试了超过*2,330。
使用带有指针的memcpy_s。
结果是一样的,字符串的结尾总是被字符数漂移,而且解析时有泄漏。
没有指针,字符串也是浮动的。
但你给了我一个想法,在StringInit(out, 1400, 32)中,我设置了以字节为单位的指针大小,而不是字符串的长度。
然后奇迹出现了,字符串变得没有额外的输出字符,解析没有问题,而且没有任何泄漏。
我想注意的是,它是在sizeof中的指针,没有指针,字符串就会浮动。
这就给开发人员提出了一个问题,对StringInit的帮助是否正确?
在帮助中或在StringInit函数 本身中,是不是把字符串的长度与字符串的大小混为一谈?
一般来说,如果你使用memcpy,如果你传递了指针的大小,并且StringInit是用这个大小初始化的,而不是长度,那么它就能正确工作。
同意的
是的,我也同意。但将字符串作为一个数组并不总是很方便,尤其是当这个字符串需要通过几个函数传递时。
在这种情况下,指针更方便,你不需要在每个转运函数中重新填充这个数组,另外为数组多输入一个参数,即它的大小。
所以你只是分配了一个故意过大的缓冲区(把边界往后推),而错误根本没有显示出来--因为它在边界上。
我也是这么想的,弦的长度是164,设置165,设置330。
330显然不是字符串长度 的界限,如果你以字符计算字符串的话。
事实证明,这不是长度问题,而是字节的大小问题。
但帮助表明情况正好相反,应该是StringInit 中的长度。
一般来说,正如我所理解的那样,mql的字符串类型是一个指针,你应该像处理一个指针一样处理这个类型。
零是存在的
如果你坚持,就按你的方式来吧。
我也这么想,弦的长度是164,我把它调到165,然后调到330。
如果你用字符来计算字符串,330显然不是一个字符串长度 的边界。
事实证明,这不是长度问题,而是字节的大小问题。
但帮助表明情况正好相反,应该是 StringInit 中的长度。
一般来说,正如我所理解的那样,mql的字符串类型是一个指针,你应该像处理一个指针一样处理这个类型。
mql类型的字符串是一个结构,包含一个指针,字符串的长度,可能还有其他东西。
当你向DLL传递一个字符串时,只传递指针。字符串的长度必须手动传入。
并始终确保不要使绳子的尺寸过大。
字符串大小的所有变化都只在MQL方面。
在DLL方面,你应该仔细阅读你所使用的功能的帮助。这是你的唯一问题。
sizeof( wchar_t* ) 返回指针的大小。这根本不是你需要的。
mql类型的字符串是一个结构,包含一个指针,字符串的长度,可能还有其他东西。
当你向DLL传递一个字符串时,只传递指针。字符串的长度必须手动传入。
并始终确保不要使绳子的尺寸过大。
字符串大小的所有变化都只在MQL方面。
在DLL方面,你应该仔细阅读你所使用的功能的帮助。这是你的唯一问题。
sizeof( wchar_t* ) 返回指针的大小。这根本不是你所需要的。
对了,我为字符串分配了一个缓冲区,并以空格初始化它。
然后我把这个字符串(指针)传给dll。
在dll中,wchar_t*数据被复制到out,即也是一个指针。从逻辑上讲,应该没有什么问题。
根据我对帮助的理解,StringInit函数应该设置字符串的长度。
但我对StringInit函数 本身仍有一些问题;我指定了字符串的长度,当我指出指针的大小时,得到了奇怪的结果。
我不明白你说的手动弦长转移是什么意思。
而如果你使用没有指针的sizeof(wchar_t),字符串就会开始漂浮着额外的字符,从而导致解析和泄漏的问题。
为了将字符串传入dll,我使用了Renat的例子,来自他关于如何编写dll的文章。
但不知道为什么,如果我不使用sizeof(wchar_t)指针传递,字符串就会浮动,而使用sizeof(wchar_t*)指针就没有问题。
对我来说,这似乎是合乎逻辑的,我把一个字符串作为一个指针复制,大小应该传递给指针,而不是类型。