错误、漏洞、问题 - 页 2461

 
fxsaber:

你能详细说明一下这一点吗?

以下是我的主观意见,如果我哪里错了,我很愿意帮助。


StringLen过去一直工作在O(n),直到字符串中的第一个NULL字符(0x0000),现在它工作在O(1)。
字符串的长度 总是可以通过StringSetCharacter(str, pos, 0x00)来截断,但他们由于某种原因引入了StringSetLength。

最有可能的是,分析器在处理字符串时解决了代码加速的任务。
加快代码速度的任务已经解决了,没有人在意现在一半的函数处理字符串中的NULL字符,而另一半不处理。

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
   string str = "123456789";
   PRINT(str);
   PRINT(StringLen(str));
   
   PRINT(StringSetCharacter(str, 7, 0x00));
   PRINT(StringLen(str));
   
   str += "\x00" + str;
   PRINT(StringLen(str));
   
   str += str;
   PRINT(str);
   PRINT(StringLen(str));
   
   ushort array[];
   PRINT(StringToShortArray(str, array));
   ArrayPrint(array);
   
   PRINT(StringLen(str));
   PRINT(StringLen(ShortArrayToString(array)));
   PRINT(StringLen(ShortArrayToString(array, 0, StringLen(str))));
} 

其结果是。

2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringSetCharacter(str,7,0x00):true
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):15
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:1234567
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringToShortArray(str,array):31
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      49 50 51 52 53 54 55  0 49 50 51 52 53 54 55 49 50 51 52 53 54 55  0 49 50 51 52 53 54 55  0
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array)):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array,0,StringLen(str))):7
 
Sergey Dzyublik:

以下是我的主观意见,如果我哪里错了,我很愿意帮助。


StringLen过去一直工作在O(n),直到字符串中的第一个NULL字符(0x0000),但现在它工作在O(1)。
字符串的长度 总是可以通过StringSetCharacter(str, pos, 0x00)来截断,但他们由于某种原因引入了StringSetLength。

最有可能的是,在处理字符串时,代码加速的任务得到了解决。
加快代码速度的任务已经解决了,没有人在意现在一半的函数处理字符串中的NULL字符,而另一半不处理。


其结果是。

请克制你的情绪。
下次你再使用粗话,就要被禁言了--我们这里不是酒吧。而且在酒吧里说脏话已经不再是一种时尚。
 
Sergey Dzyublik:

StringLen曾经工作在O(n),直到字符串中的第一个NULL字符(0x0000),现在它工作在O(1)。

只是部分修复了bug...为什么不呢?在我的记忆中,StringLen总是正确地工作(至少在x32中)。
 
Sergey Dzyublik:
对开发商而言。
请增加为默认赋值运算符(复制构造器)指定强制代码生成的功能。

这有点复杂。使用默认构造函数类比更容易。

1) 任何赋值运算符 都会覆盖默认的赋值运算符

2) 任何复制操作者都会覆盖默认的复制操作者。

 
A100:
只是部分地纠正了错误......为什么不呢?

因为MQL在处理带有NULL字符的字符串时没有一致的想法,这就是问题所在。
例如,StringToShortArray支持字符串中的NULL字符,而反向函数ShortArrayToString则不支持。

因此,更多的时间被花在捕捉错误和寻找解决方法上,而不是用于解决特定任务。

 
A100:

这有点复杂。使用默认构造函数类比更容易。

1) 任何赋值运算符 都会覆盖默认的赋值运算符

2) 任何复制操作都会取消默认的复制操作

我不需要撤消,我需要的是相反的强制生成。
MQL没有复杂类型深度复制的功能,在赋值运算符和复制构造器中,它们被默认实现。

 
Sergey Dzyublik:

由于在MQL中处理带有NULL字符的字符串时没有一致的想法,这就是问题所在。
例如,StringToShortArray支持字符串中的NULL字符,而它的反向函数ShortArrayToString则不支持。

一方面是的,另一方面在文件 中明确指出:"或直到满足终端0"。

 
Sergey Dzyublik:
好吧,有点不清楚为什么一开始就拖动了来自正数的零线。
 
A100:

一方面是的,另一方面在文件 中明确指出(它没有)。

StringToShortArray 说的一样。

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

然而,这并不妨碍它充分处理字符串中的NULL字符。

 
你好。MT5移动版 无法连接到我的Alpari经纪商。问题是什么?这是否会在某个时候被修复?