Ошибки, баги, вопросы - страница 3011

 
A100:

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

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

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

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

 
Roman:

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

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

То есть, так?

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 настолько не в состоянии извлечь длину строки из типа string (тем более, что вычислять ее в MQL не нужно) что требуется внешняя помощь в виде дополнительного параметра? И почему тогда в других MQL функциях нет такой якобы строгой "сишной проверки" проверки?

 
A100:

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

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

 
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 также будет скопирован в массив-приемник, при этом размер динамического массива может быть увеличен при необходимости под размер строки. 
Если размер динамического массива больше длины строки, то размер массива уменьшен не будет. 

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

 
Roman:

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

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

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

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

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