错误、漏洞、问题 - 页 3011

 
A100:

因为第四个参数

我需要复制前3个字符。如果我想复制整个字符串(包括结尾的0在内的7个字符),我将指定-1。如果其中一些不能被复制,我需要这个参数做什么?

这个参数不是用来指定你要复制多少个字符的,就像
子串一样,而是用来指定传递给数组的字符数。
,也就是说,这是一个类似于C语言的对传递数据大小的严格安全检查。
这个大小将自动为动态阵列 分配内存。

如果你想从一个字符串中复制三个元素,你必须先从字符串中获取它们,
,然后再把它们传进去,传的时候要指定大小。

 
Roman:

这个参数不是用来指定你要复制多少个字符的,就像
子串一样,而是用来指定传递给数组多少个字符的。
,也就是说,它是对传递的数据大小进行C-size的严格安全检查。
这个大小将自动为动态阵列 分配内存。

如果你需要从一个字符串中复制三个元素,你必须先从字符串中获取它们,
,然后你必须把它们传进去,在传的过程中指定大小。

你是说像这样吗?

StringToCharArray(InputText,scr,0,StringLen(InputText));
 
Vitaly Muzichenko:

我是说,对吗?

加一作为终止的零的大小。
StringLen 返回不包括零的大小。

char ch[];
string InputText = "ABCDEF";
int    size      =  StringLen(InputText)+1;
    
StringToCharArray( InputText, ch, 0, size);
Print(GetLastError()); //0
 
Roman:

加一作为终止的零的大小。
StringLen 返回不考虑零的大小。

我举了一个开发者的例子,它是有效的

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

库:哈希函数和转换库

Ilyas, 2021.03.04 15:12

如果没有指定字符串的长度,StringToArray函数会捕获终止零点(历史上)。

因此, CryptDecodeA 函数应该使用

StringToCharArray(InputText,scr,0,StringLen(InputText));

而不是

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

我举了一个开发商的例子,它是有效的。


在这个问题上,并不打算使用图书馆))
这就是图书馆的细微差别。

 
Roman:

加一作为终止的零的大小。
StringLen 返回不考虑零的大小。

StringToCharArray是否无法从一个字符串中检索出字符串的长度(尤其是你不需要在MQL中计算它),以至于需要额外参数形式的外部帮助?为什么其他MQL函数没有这种所谓严格的"C-检查"

 
A100:

StringToCharArray是否无法从字符串类型中提取字符串长度(尤其是在MQL中不需要计算),以至于需要以额外参数的形式提供外部帮助?而为什么其他的MQL函数没有这种所谓的严格检查?

这可能不是针对我的问题,而是针对开发者的问题。
但这个参数是用来为动态数组 分配内存大小的。
换句话说,这是一个避免自己为数组分配内存的方便方法。
另外,我们可以检查正确性。
额外的尺寸参数是sys中严格安全的标准做法。
在其他不需要尺寸的函数中,没有这个参数。
通常这个参数是在处理数组时用来分配内存的。
这就是在这种情况下发生的事情。

 
Roman:

这可能不是针对我的问题,而是针对开发者的问题。
但这个参数是用来为动态数组 分配内存的。
这意味着你不需要自己分配数组的内存,这很方便。
另外,我们将得到一个正确性的检查。

什么是对正确性的检查?- 假设我,比如说,写了0--一个故意不正确的值。

void OnStart()
{
    uchar ch[];
    const string text = "ABCDEF";
    Print( StringToCharArray( text, ch, 0, 0 ));
}

一切都被正确地复制了,结果是:7 - 没有错误

 
A100:

对正确性的检查是什么?- 所以,假设我把它设置为0,这是一个已知的不正确的值。

而且一切都被正确地复制了。 结果:7 - 没有错误

诀窍就在函数描述中))

count=-1

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

automatic progress ))
,这让用户更加困惑。

 
Roman:

这个参数不是用来指定你要复制多少个字符作为子串
,而是用来指定多少个字符传递给数组。

帮助不同意这种解释。

要复制的数组元素的数量。定义了结果字符串的长度。默认为-1,这意味着它将复制到数组的末端,或者终端0。终端0也将被复制到目标数组中,如果需要,动态数组的大小可以增加,以匹配字符串的大小。如果动态数组的大小大于字符串的长度,那么数组的大小将不会被减少

当然,描述的是atas--字符串被称为数组,数组被称为字符串,混淆了

要复制的数组(字符串)元素的数量。指定结果字符串(数组)的长度。默认为-1,这意味着复制到数组(字符串)的末尾,或满足终端0。