Roman
2367
Roman  
A100:

Потому что 4ый параметр

Мне нужно скопировать первые 3 символа. Если бы мне нужно было скопировать всю строку целиком (7 символов включая завершающий 0), то я бы указал -1. А если частично нельзя скопировать, то тогда зачем этот параметр вообще нужен

Этот параметр не для того, чтоб указывать сколько вы хотите скопировать символов, как субстрока
а для того чтоб указать какой размер символов передаётся в массив.
т.е. это сишная проверка строгой безопасности, на размер передаваемых данных.
По этому размеру автоматом будет выделена память динамического массива.

Если вам нужно скопировать три элемента из строки, то их сперва нужно получить из строки,
а затем уже передавать, при этом указываете размер сколько передаёте.

Vitaly Muzichenko
16865
Vitaly Muzichenko  
Roman:

Этот параметр не для того, чтоб указывать сколько вы хотите скопировать символов, как субстрока
а для того чтоб указать какой размер символов передаётся в массив.
т.е. это сишная проверка строгой безопасности, на размер передаваемых данных.
По этому размеру автоматом будет выделена память динамического массива.

Если вам нужно скопировать три элемента из строки, то их сперва нужно получить из строки,
а затем уже передавать, при этом указываете размер сколько передаёте.

То есть, так?

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

То есть, так?

Плюс единица, как размер завершающего нуля.
StringLen возращает размер без учёта нуля. 

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

Плюс единица, как размер завершающего нуля.
StringLen возращает размер без учёта нуля. 

Я дал пример от разработчиков и он рабочий

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: Библиотека хеш-функций и конвертаций в другие системы исчисления

Ilyas, 2021.03.04 15:12

Функция StringToArray захватывает терминирующий ноль, если не указывать длину строки (сложилось исторически)

Поэтому, в функции CryptDecodeA нужно использовать

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

вместо

StringToCharArray(InputText,scr);

Roman
2367
Roman  
Vitaly Muzichenko:

Я дал пример от разработчиков и он рабочий


Использование библиотек не предполагалось в данном вопросе ))
Это уже нюансы библиотек.

A100
2573
A100  
Roman:

Плюс единица, как размер завершающего нуля.
StringLen возращает размер без учёта нуля. 

А что StringToCharArray настолько не в состоянии извлечь длину строки из типа string (тем более, что вычислять ее в MQL не нужно) что требуется внешняя помощь в виде дополнительного параметра? И почему тогда в других MQL функциях нет такой якобы строгой "сишной проверки" проверки?

Roman
2367
Roman  
A100:

А что StringToCharArray настолько не в состоянии извлечь длину строки из типа string (тем более, что вычислять ее в MQL не нужно) что требуется внешняя помощь в виде дополнительного параметра? И почему тогда в других MQL функциях нет такой якобы строгой проверки?

Этот вопрос наверно уже не ко мне, а к разработчикам.
Но по этому параметру, выделяется размер памяти для динамического массива.
То есть для вас же удобство, чтоб самим не выделять память массива.
Плюс и проверка на корректность получается.
Дополнительный параметр размера, это стандартная практика строгой безопасности в сях.
В других функциях где не требуется размер, этого параметра и нет.
Обычно этот параметр применяется при работе с массивами, для выделения памяти.
Что в данном случае и происходит.

A100
2573
A100  
Roman:

Этот вопрос наверно уже не ко мне, а к разработчикам.
Но по этому параметру, выделяется размер памяти для динамического массива.
То есть для вас же удобство, чтоб самим не выделять память массива.
Плюс и проверка на корректность получается.

А в чем заключается проверка на корректность? - вот я допустим указал 0 - заведомо некорректное значение

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

И все скопировалось нормально, Результат: 7 - ошибок нет

Roman
2367
Roman  
A100:

А в чем заключается проверка на корректность? - вот я допустим указал 0 - заведомо некорректное значение

И все скопировалось нормально, Результат: 7 - ошибок нет

Тут вся хитрость в описании к функции ))

count=-1

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

автоматика прогресса ))
что больше запутывает пользователя.

Andrei Trukhanovich
27600
Andrei Trukhanovich  
Roman:

Этот параметр не для того, чтоб указывать сколько вы хотите скопировать символов, как субстрока
а для того чтоб указать какой размер символов передаётся в массив.

справка не согласна с такой трактовкой.

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

описание конечно атас - строка упоминается как массив, массив как строка, разброд и сумятица

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