错误、漏洞、问题 - 页 2566 1...255925602561256225632564256525662567256825692570257125722573...3184 新评论 [删除] 2019.09.18 16:57 #25651 Slava: 有了这种铸造,就不会有数据损失。要么是0,要么就不是0。 另一种情况是当double -> 任何整数类型(包括int32)时。 在我看来,你玩警告有点过了,你的判断缺乏一致性。 bool continuation()const {return this.last_level;} // uint last_level // expression not boolean lrp_last_9.mq5 260 42 A100 2019.09.18 19:18 #25652 Vict: 在我看来,你的警告有点过分了,判断上 缺乏一致性。 同意的 这里也没有 这种意义上的数据损失(要么是0,要么不是0)。 void OnStart() { int i = -1; while ( ++i ); //Warning: expression not boolean } 但有一个警告。预计会有一个统一的方法 Aliaksandr Hryshyn 2019.09.18 19:20 #25653 试图从同一个类的静态函数中访问一个类实例的属性的结果。 2019.09.18 20:07:41.043 Test_exec (EURUSD,M5) Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5' 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) crash --> 000001E9CCD2963C 837B1400 cmp dword [rbx+0x14], 0x0 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 000001E9CCD29640 0F8E8F020000 jle dword 0x1e9ccd298d5 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 000001E9CCD29646 90 nop 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 00: 0x000001E9CCD2963C 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 01: 0x000000B56CA2F120 2019.09.18 20:07:41.080 Test_exec (EURUSD,M5) 02: 0x000001E9CCD2A04D 在这之前,编译器是沉默的。 Roman 2019.09.18 21:22 #25654 不会用终端null来初始化一个空字符串。 void OnStart() { string str; StringInit(str, 100, 0); Print(StringLen(str)); } 结果 2019.09.18 22:16:54.380 TestScript (EURUSD,H1) 0 预期的 2019.09.18 22:16:54.380 TestScript (EURUSD,H1) 100 在StringInit函数 的帮助中注意到 Примечание Если character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки. 事实上,不存在分配。 即以这种方式分配,十个空间 string str = " "; 是不一样的。 string str; StringInit(str, 10, 0); 标记为红色的帮助文本与逻辑行为不一致。 Igor Makanu 2019.09.18 21:23 #25655 Vict: 在我看来,你的警告太多,判断不够一致。 警告对布尔运算不起作用,现在我无意中发现我的代码中有一个错字,所以我重现了它。 #define getAsk(dummy) SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define getBid(dummy) SymbolInfoDouble(_Symbol, SYMBOL_BID) //+------------------------------------------------------------------+ void OnStart() { double sl = 0.0,tp=0.0; if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print(""); } //+------------------------------------------------------------------+ double OrderStopLoss() { return(getAsk()); } double OrderTakeProfit() { return(getBid()); } Stanislav Korotky 2019.09.18 23:04 #25656 Roman: 不会用终端null来初始化一个空字符串。 结果 预期的 在StringInit函数 的帮助中注意到 事实上,没有分配。 即以这种方式分配,十个空间 是不一样的。 而且,这似乎与帮助文本中用红色强调的行为逻辑不一致。 你错过了StringBufferLen函数--它返回分配的缓冲区的大小。StringLen返回字符串的长度,即到终端字符为止,如果它在最开始--长度为0,则分别返回。 Buffer != string。 A100 2019.09.19 00:05 #25657 Stanislav Korotky: 你忽略了StringBufferLen函数 - 它返回分配的缓冲区的大小。StringLen返回字符串的长度,即到终端字符为止,分别是,如果它在最开始--长度为0。 Buffer != string。 否则它就不了解自己。 Roman 2019.09.19 00:59 #25658 Stanislav Korotky: 你忽略了StringBufferLen函数--它返回分配的缓冲区的大小。 StringLen返回字符串的长度,即到终端字符为止,分别是,如果它在最开始--长度为0。 Buffer != string。 这很清楚,我们正在谈论用终端零来初始化一个字符串。 为什么不在stringInit(str, 10, 0);中填入十个终端零呢?并返回实际的字符串长度。 如果你想初始化一个空字符串,而不填充它!例如,100个字符。 然后要么100个空格作为str = " 多次敲击键盘",要么初始化垃圾StringInit(str, 100, 65) 我不明白为什么我需要用垃圾初始化,已经有足够多的垃圾了 )) [删除] 2019.09.19 02:30 #25659 Roman: 这是可以理解的,我们说的是用终端零来初始化字符串。 为什么不在StringInit(str, 10, 0);中填入十个终端零呢?并返回实际的字符串长度。 如果你想初始化一个空字符串,而不填充它!例如,100个字符。 然后要么100个空格作为str = " 多次敲击键盘",要么初始化垃圾StringInit(str, 100, 65) 我不明白为什么我需要用垃圾初始化,已经有足够多的垃圾了 )) 你为什么认为它没有被填上呢?只是μl字符串中的长度没有被存储,它被终端零号识别。 StringInit(str, 100, ' '); 不是吗? 如果你需要零,在μl std的某个地方有一个String类。 Roman 2019.09.19 03:10 #25660 Vict: 你为什么认为它没有被填上呢?只是μl字符串中的长度没有被存储,它被终端零号识别。 不是吗? 如果你需要零,在μl std的某个地方有一个String类。 不......它也是以这种方式返回零。而第三个参数ushort,需要整数的字符编码。 如果我初始化为str = " "; 然后从dll中传递数据,一切正常。 但如果我把它初始化为StringInit(str, 10, 0),那么数据就不会到达。这是因为代码没有为所需大小的字符串分配内存。 如果我有空间的代码,可能会工作,但我没有在不同的表中找到这样的代码。 我们需要为未来的字符数分配内存,然后将其转到已经初始化的空字符串。 但是要初始化字符串,不是Kommelpho,是垃圾。 StringInit(str, 100, 0); 应该用终端空值填充,并返回长度100。 1...255925602561256225632564256525662567256825692570257125722573...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
有了这种铸造,就不会有数据损失。要么是0,要么就不是0。
另一种情况是当double -> 任何整数类型(包括int32)时。
在我看来,你玩警告有点过了,你的判断缺乏一致性。
在我看来,你的警告有点过分了,判断上 缺乏一致性。
同意的
这里也没有 这种意义上的数据损失(要么是0,要么不是0)。
但有一个警告。预计会有一个统一的方法
试图从同一个类的静态函数中访问一个类实例的属性的结果。
在这之前,编译器是沉默的。不会用终端null来初始化一个空字符串。
结果
预期的
在StringInit函数 的帮助中注意到
事实上,不存在分配。
即以这种方式分配,十个空间
是不一样的。
标记为红色的帮助文本与逻辑行为不一致。
在我看来,你的警告太多,判断不够一致。
警告对布尔运算不起作用,现在我无意中发现我的代码中有一个错字,所以我重现了它。
不会用终端null来初始化一个空字符串。
结果
预期的
在StringInit函数 的帮助中注意到
事实上,没有分配。
即以这种方式分配,十个空间
是不一样的。
而且,这似乎与帮助文本中用红色强调的行为逻辑不一致。
你错过了StringBufferLen函数--它返回分配的缓冲区的大小。StringLen返回字符串的长度,即到终端字符为止,如果它在最开始--长度为0,则分别返回。 Buffer != string。
你忽略了StringBufferLen函数 - 它返回分配的缓冲区的大小。StringLen返回字符串的长度,即到终端字符为止,分别是,如果它在最开始--长度为0。 Buffer != string。
否则它就不了解自己。
你忽略了StringBufferLen函数--它返回分配的缓冲区的大小。
StringLen返回字符串的长度,即到终端字符为止,分别是,如果它在最开始--长度为0。 Buffer != string。
这很清楚,我们正在谈论用终端零来初始化一个字符串。
为什么不在stringInit(str, 10, 0);中填入十个终端零呢?并返回实际的字符串长度。
如果你想初始化一个空字符串,而不填充它!例如,100个字符。
然后要么100个空格作为str = " 多次敲击键盘",要么初始化垃圾StringInit(str, 100, 65)
我不明白为什么我需要用垃圾初始化,已经有足够多的垃圾了 ))
这是可以理解的,我们说的是用终端零来初始化字符串。
为什么不在StringInit(str, 10, 0);中填入十个终端零呢?并返回实际的字符串长度。
如果你想初始化一个空字符串,而不填充它!例如,100个字符。
然后要么100个空格作为str = " 多次敲击键盘",要么初始化垃圾StringInit(str, 100, 65)
我不明白为什么我需要用垃圾初始化,已经有足够多的垃圾了 ))
你为什么认为它没有被填上呢?只是μl字符串中的长度没有被存储,它被终端零号识别。
不是吗?
如果你需要零,在μl std的某个地方有一个String类。
你为什么认为它没有被填上呢?只是μl字符串中的长度没有被存储,它被终端零号识别。
不是吗?
如果你需要零,在μl std的某个地方有一个String类。
不......它也是以这种方式返回零。而第三个参数ushort,需要整数的字符编码。
如果我初始化为str = " "; 然后从dll中传递数据,一切正常。
但如果我把它初始化为StringInit(str, 10, 0),那么数据就不会到达。这是因为代码没有为所需大小的字符串分配内存。
如果我有空间的代码,可能会工作,但我没有在不同的表中找到这样的代码。
我们需要为未来的字符数分配内存,然后将其转到已经初始化的空字符串。
但是要初始化字符串,不是Kommelpho,是垃圾。
StringInit(str, 100, 0); 应该用终端空值填充,并返回长度100。