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

 
A100:

требуется чистое копирование (без завершающих нулевых символов)

if (StringLen(text[i]))
  start += StringToCharArray(text[i], array, start, StringLen(text[i]));

Это очень бородатая конструкция.


ЗЫ

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

const string text[] = { "ABC", "", "ABC" }; 

void OnStart()
{
  ArrayPrint(_R(text).Bytes); // Побайтовое представление массива.
  
  string Str;  
  _W(Str) = text;
  
  ArrayPrint(_R(Str).Bytes); // Побайтовое представление объединенной строки.
}
 
fxsaber:

Немного подправить документацию и уже не баг.

Философия далека от практики.

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

void OnStart()
{
    string text = "ABC";
    const int start = 0, count = 0;
    uchar array1[]; int n1 = StringToCharArray(  text, array1, start, count );
    short array2[]; int n2 = StringToShortArray( text, array2, start, count );
    Print( n1, ":", n2 );
}

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

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

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

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

 
A100:

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

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

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

 
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, срабатывает.

Гениально!