错误、漏洞、问题 - 页 3021

 
fxsaber:

错误在于两个函数之间的差异,而不是结果,因为这只是一个文档问题,当count=0时,应该输出什么。

不,还有统一性原则这种东西。这个错误很明显。如果你不理解为什么它是一个错误,那是你的问题。

 
fxsaber:

这个错误是两个函数之间的不匹配,而不是它们的结果,因为这只是一个文档问题,当count=0时要输出什么

关于交易、自动交易系统和策略测试的论坛

错误, 漏洞, 问题

罗曼, 2021.05.07 22:07

整个诀窍就在函数描述中))。

[in]  Количество элементов массива для копирования. Определяет длину результатной строки. 
По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. 
Терминальный 0 также будет скопирован в массив-приемник, 
при этом размер динамического массива может быть увеличен при необходимости под размер строки. 
Если размер динамического массива больше длины строки, то размер массива уменьшен не будет. 

Automatic progress ))
什么让用户更困惑。

A100:

而实践者如何向理论家解释这样一个矛盾的结果?

结果:4:0

预期:0:0

或者还可以--纠正一下文件?好吧,毕竟不是为了修复bug!

我的解释很简单:这些标准函数中的一个有错误--我甚至知道是哪一个


 
Roman:

在那之后,开发商已经纠正了,所以你之前的解释是不好的。

函数 是相同的(只在类型上不同,事实上是模板),描述是相同的(甚至有交叉引用),但结果却不同。

 
A100:

开发人员已经修复了 它,所以你之前的解释并不适用

究竟修复了什么?
文件中一直都是这样的。

str1

str1


你检查过被修复的内容了吗? ))
修复了,按你的要求分割。
3个字符,比如说。

char ch[];
int str = StringToCharArray( "ABCDEF", ch, 0, 3 );
    
Print("StringToCharArray "+(string)str);
Print("ch[] ",CharToString(ch[0]), CharToString(ch[1]), CharToString(ch[2]));
Print("GetLastError ", GetLastError());         

2021.05.25 02:08:33.329 Test (AUDUSD,M1)   StringToCharArray 3
2021.05.25 02:08:33.329 Test (AUDUSD,M1)   ch[] ABC
2021.05.25 02:08:33.329 Test (AUDUSD,M1)   GetLastError 0

但如果你在count 中传递0,整个字符串的结尾0将被自动 复制。
即使字符串是空的,结尾0也会被复制。

char ch[];
int str = StringToCharArray( "", ch, 0, 0 );
    
Print("StringToCharArray "+(string)str);
2021.05.25 02:24:47.161 Test (AUDUSD,M1)   StringToCharArray 1
而StringLen()并没有返回一个终止的零))
 
Roman:

你到底修复了什么?

但如果你给count 传递0,整个字符串的结尾0将被自动 复制。
即使字符串是空的,结尾0也会被复制。

为什么在StringToShortArray 中不同?请简要地解释一下,不要不必要地狡辩和莫名其妙地引用你先前的精彩解释(最后失败了)--用简单的语言--为一个傻瓜解释。

没有;)和其他不适当的符号在这个主题中。

 
A100:

为什么在StringToShortArray 中不同?如果可能的话,请简要地解释一下,不要花言巧语,也不要不可理喻地引用你先前的精彩解释(最后失败了)--用简单的语言--为一个傻瓜解释。

没有;)和其他不相关的符号在这个主题中。

分割工程

ushort sh[];
int str = StringToShortArray( "ABCDEF", sh, 0, 3 );
    
Print("StringToShortArray "+(string)str);
Print("sh[] ",ShortToString(sh[0]), ShortToString(sh[1]), ShortToString(sh[2]));
Print("GetLastError ", GetLastError()); 
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   StringToShortArray 3
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   sh[] ABC
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   GetLastError 0

我不知道为什么计数0 不起作用。
也许这个智能自动计数0 在这里不起作用,根据帮助,它已经是一个不匹配。
而且这一定是个错误。

ushort sh[];
int str = StringToShortArray( "ABCDEF", sh, 0, 0 );
    
Print("StringToShortArray "+(string)str);
//Print("sh[] ",ShortToString(sh[0]), ShortToString(sh[1]), ShortToString(sh[2]));
Print("GetLastError ", GetLastError()); 
2021.05.25 03:12:00.176 Test (AUDUSD,M1)   StringToShortArray 0
2021.05.25 03:12:00.176 Test (AUDUSD,M1)   GetLastError 0

总之,要么这里有一个错误,计数0不工作,
,要么StringToCharArray中有一个错误,在
计数0工作。

为了使你理解解释的合理性,请学习C语言的基础知识,特别是处理字符串。
那么就不会有问题了。

 
Roman:

简而言之,要么这里有一个错误,即计数0 不起作用,
,要么在StringToCharArray中有一个错误,即计数0起作用。

聪明的!

 
A100:

聪明的!

当然,这是个天才。
但如果你转过头来,给数组传递一个0的大小,并给它分配0的内存,说起来很奇怪。
这就是为什么计数0 会触发自动调整大小到字符串的末端
按照逻辑,它也应该在StringToShortArray 中工作。
错误会被更好地返回,没有任何调整。
 
Roman:
当然,这是个天才。
但如果你转过头来,传递一个零的数组大小并为其分配零的内存,说起来很奇怪
这就是为什么计数0会触发自动调整大小到字符串的末端。按照逻辑,它也应该在
StringToShortArray 中工作。他们最好在没有任何调整的情况下返回一个错误。

而在

CharArrayToString

为什么不一路走到底?

void OnStart()
{
    const uchar array[] = { 'A', 'B', 'C' };
    const int start = 0, count = 0;
    Print(CharArrayToString( array, start, count ));
}

结果:""

 
A100:

而在

为什么不一路走到底?

结果:""

可能是因为CharArrayToString 中没有[out]动态数组。
而开发商决定这是不需要的。
虽然类似的功能中的不同逻辑会造成更多的混乱。