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

 
fxsaber:

Багом является несоответствие этих двух функций, а не их результат, т.к. это только вопрос документации, что выдавать при count=0.

нет, есть еще такая штука как принцип единообразия. баг очевиден. если вы не понимаете почему это баг, это уже исключительно ваши проблемы.

 
fxsaber:

Багом является несоответствие этих двух функций, а не их результат, т.к. это только вопрос документации, что выдавать при count=0.

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

Ошибки, баги, вопросы

Roman, 2021.05.07 22:07

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

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

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

A100:

А как практик объяснит теоретикам такой противоречивый результат:

Результат:   4:0

Ожидалось: 0:0 

или тоже - чуть подправить документацию? Ну не исправлять же баги в конце концов!

У меня объяснение простое: в одной из этих штатных функций баг - и я даже знаю в какой


 
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, то автоматом скопируется вся строка с завершающим нулём. 
Даже если строка пустая, то скопируется завершающий ноль.

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, то автоматом скопируется вся строка с завершающим нулём. 
Даже если строка пустая, то скопируется завершающий ноль.

А в 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

А почему count 0 не срабатывает, этого не знаю.
Наверно эта хитрая автоматика на count 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

Короче, или тут ошибка, что на count 0 не срабатывает,
или ошибка в StringToCharArray, что на 
count 0, срабатывает.

Чтобы вы понимали, состоятельность объяснений, изучите основы Си языка, и особенно работу со строками.
И тогда не будет вопросов.

 
Roman:

Короче, или тут ошибка, что на count 0 не срабатывает,
или ошибка в StringToCharArray, что на count 0, срабатывает.

Гениально!

 
A100:

Гениально!

Конечно гениально. Справка не раскрывает явно, работу с count 0.
Но если бы вы включили голову, то передавать нулевой размер массива, и выделять ему нулевую память, мягко говоря странно.
По этому на count 0 срабатывает автоматический ресайз до конца строки.
По логике и в StringToShortArray должен срабатывать.
Лучше бы ошибку возвращали, без всяких ресайзов.
 
Roman:
Конечно гениально. Справка не раскрывает явно, работу с count 0.
Но если бы вы включили голову, то передавать нулевой размер массива, и выделять ему нулевую память, мягко говоря странно.
По этому на count 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] динамического массива.
И разработчик решил, что это излишне.
Хотя, разная логика в похожих функциях, вносит больше путаницы.

Причина обращения: