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

 
fxsaber #:

Люди специально хитрят, когда хотят байты сохранить в виде строки, чтобы не потерять информацию. Все из-за сложности хранения в строке нуля.

Попался пример.

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2018.09.21 07:41

#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
  {
    const string Str = DATA_STRING::ToString(Tick);
    
    MqlTick Ticks[1];
    
    Ticks[0] = DATA_STRING::FromString<MqlTick>(Str);
    ArrayPrint(Ticks);
  }
}
 
fxsaber #:

Так есть, если не случайный результат.

Если бы он был, то был бы описан в Документации

 
fxsaber #:

Люди специально хитрят, когда хотят байты сохранить в виде строки, чтобы не потерять информацию. Все из-за сложности хранения в строке нуля.

Никаких принципиальных сложностей с хранением нуля в string нет, потому что существует длина строки

Это все равно что утверждать, что есть сложности с хранением нуля в MQL массиве

 
A100 #:

Никаких принципиальных сложностей с хранением нуля в string нет, потому что существует длина строки

Для доказательства этого утверждения хорошо бы показать аналоги.

DATA_STRING::ToString
DATA_STRING::FromString
 
fxsaber #:

Для доказательства этого утверждения хорошо бы показать аналоги.

Аксиома не требует доказательств. В данный момент есть ошибки в реализации. Вы путаете ошибки в реализации ShortArrayToString и StringToShortArray и сложности. Ошибки есть, а сложностей - нет: string - это буфер заранее известного размера и нет разницы, что хранить в ячейке этого буфера - ноль или другое значение

 
A100 #:

Аксиома не требует доказательств. В данный момент есть ошибки в реализации. Вы путаете ошибки в реализации ShortArrayToString и StringToShortArray и сложности. Ошибки есть, а сложностей - нет: string - это буфер заранее известного размера и нет разницы, что хранить в ячейке этого буфера - ноль или другое значение

FileReadString в помощь.

 
fxsaber #:

FileReadString в помощь.

FileReadString неправильно работает, а FileWriteString - правильно (в данном случае):

void OnStart()
{
    string text = "ABC" + "\0" + "DEF";
    int h = FileOpen( "tmp.txt", FILE_BIN | FILE_WRITE );
    Print(FileWriteString( h, text, StringLen( text )));
    FileClose( h );
}

Результат: 14 байт (7 * sizeof(ushort))

Файлы:
tmp.txt  1 kb
 
A100 #:

FileReadString неправильно работает

А как правильно?
 
fxsaber #:
А как правильно?

Правильно было бы, если бы записываемая и считываемая строки были бы равны:

void OnStart()
{
    string file = "tmp.txt";
    string text1 = "ABC" + "\0" + "DEF";
    int h1 = FileOpen( file, FILE_BIN | FILE_WRITE );
    int n = FileWriteString( h1, text1, StringLen( text1 ));
    FileClose( h1 );
    int h2 = FileOpen( file, FILE_BIN | FILE_READ  );
    string text2 = FileReadString( h2, n/sizeof(ushort));
    FileClose( h2 );
    Print(StringLen(text1)==StringLen(text2));
}

Результат:   false

Ожидалось: true

А они не равны, при том, что text1 совпадает с tmp.txt - значит в данном случае FileWriteString работает правильно, а FileReadString - неправильно

 
A100 #:

Правильно было бы, если бы записываемая и считываемая строки были бы равны:

Попробуйте тогда связку EventChartCustom+OnChartEvent  с передачей/приемом sparam.