Библиотеки: TypeToBytes - страница 3 1234567 Новый комментарий --- 2017.02.11 15:16 #21 да fxsaber 2017.02.13 19:43 #22 Три строчки одного и того жеColor = (color)ColorToARGB(Color, Alpha);Color = (color)((Color & 0xFFFFFF) + (Alpha << 24));_W(Color)[3] = Alpha; fxsaber 2017.03.07 13:57 #23 Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам fxsaber, 2017.03.07 13:55#include <TypeToBytes.mqh>template <typename T>void Swap( T &Value1, T &Value2 ){ const T Tmp = Value1; Value1 = Value2; Value2 = Tmp;}// Сортировка массива любого простого типаtemplate <typename T>bool MyArraySort( T &Array[] ){ if (!ArraySort(Array)) { const int Size = ArraySize(Array); for (int i = 0; i < Size - 1; i++) { const T Tmp = Array[i]; for (int j = i + 1; j < Size; j++) if (_R(Tmp) == Array[j]) // TypeToBytes.mqh { Swap(Array[i + 1], Array[j]); i++; } } } return(true);} Любые вопросы новичков по Новая версия платформы MetaTrader Ошибки, баги, вопросы fxsaber 2017.04.03 01:48 #24 Добавлена побайтовая работа и с массивами// Работа с массивами short Array[] = {1, 2, 3}; ArrayPrint(_R(Array).Bytes); // Распечатали побайтовое представление массива Array PRINT((_R(Array) == _R(Array).Bytes)) // Убедились, что побайтовое сравнение массивов работает. _W(Color) = Array; // Побайтово записали массив Array в Color PRINT(Color) // Убедились, что Color теперь C'1,0,2' ArrayPrint(_R(Color).Bytes); // Распечатали побайтовое представления Color uchar Array2[]; ArrayCopy(Array2, _R(Tick).Bytes); // Записали в Array2 байтовое представление Tick PRINT((_R(Tick) == Array2)) // Убедились, что Tick и Array2 побайтово совпадают MqlTick Tick2 = {0}; _W(Tick2) = Array2; // Записали в Tick2 массив Array2 PRINT((_R(Tick) == Tick2)) // Убедились, что Tick и Tick2 совпадают int Array3[] = {INT_MIN, INT_MAX}; ArrayPrint(_R(Array3).Bytes); // Распечатали побайтовое представление массива Array3 ArrayPrint(_R(Array).Bytes); // Распечатали побайтовое представление массива Array _ArrayCopy(Array3, Array); // Скопировали побайтово массив Array в массив Array3 ArrayPrint(_R(Array3).Bytes); // Убедились, что побайтовое представление массив Array3 соответствует fxsaber 2017.04.03 12:36 #25 Добавлена побайтовая работа и со строками// Работа со строками string Str = "abcd"; _W(i) = Str; // Записали в (int)i строку побайтово PRINT((_R(i) == Str)) // Сравнили побайтово int и sring ArrayPrint(_R(i).Bytes); // Посмотрели байты i ArrayPrint(_R(Str).Bytes); // Посмотрели байты Str PRINT(_R(Str)[(short)1]) // Взяли short-значение по смешению 1 в строке Str PRINT(Str) _W(Str)[2] = "98765"; // Побайтовая запись строки в строку со смещением 2 PRINT(Str) string StrArray[] = {"123", "45", "6789"}; _W(Str) = StrArray; // Записали в строку строковый массив PRINT(Str) _W(Str)[3] = (uchar)0; // В байт со смещением 3 записали ноль, тем самым отбрезав строку (длина - 3 ANSI-символа (4 байта)) PRINT(Str); fxsaber 2017.04.03 16:13 #26 Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий Библиотеки: File Mapping без DLL fxsaber, 2017.04.03 16:07 Спасибо автору за библиотеку!Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков#include <MemMapLib.mqh> #include <TypeToBytes.mqh> // Выделяет память заданной длины под данные template <typename T> bool GetFileMemory( CMemMapFile* &FileMemory, const int Amount, const string FileName = "Local\\test" ) { FileMemory = new CMemMapFile; return(FileMemory.Open(FileName, sizeof(T) * Amount + sizeof(int) + HEAD_MEM, modeCreate) == 0); } // Записывает данные в память template <typename T> void DataSave( CMemMapFile* FileMemory, const T &Data[], const bool FromBegin = true ) { const int Size = ArraySize(Data) * sizeof(T); uchar Bytes[]; _ArrayCopy(Bytes, _R(Size).Bytes); // Записали количество _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Записали данные if (FromBegin) FileMemory.Seek(0, SEEK_SET); FileMemory.Write(Bytes, ArraySize(Bytes)); // Сбросили все в память return; } // Считывает данные из памяти template <typename T> int DataLoad( CMemMapFile* FileMemory, T &Data[], const bool FromBegin = true ) { if (FromBegin) FileMemory.Seek(0, SEEK_SET); uchar Bytes[]; FileMemory.Read(Bytes, sizeof(int)); // Прочли из памяти количество данных FileMemory.Read(Bytes, _R(Bytes)[0]); // Получили сами данные _ArrayCopy(Data, Bytes); // Сбросили данные в массив return(ArraySize(Data)); } #define AMOUNT 1000 #define TOSTRING(A) #A + " = " + (string)(A) + " " // Пример передачи тиков void OnStart() { CMemMapFile* FileMemory; if (GetFileMemory<MqlTick>(FileMemory, AMOUNT)) { MqlTick Ticks4Save[]; CopyTicks(_Symbol, Ticks4Save, COPY_TICKS_INFO, 0, AMOUNT); DataSave(FileMemory, Ticks4Save); MqlTick Ticks4Load[]; if (DataLoad(FileMemory, Ticks4Load) > 0) Print(TOSTRING((_R(Ticks4Save) == Ticks4Load)) + TOSTRING(ArraySize(Ticks4Save)) + TOSTRING(ArraySize(Ticks4Load))); FileMemory.Close(); } delete FileMemory; }Результат(_R(Ticks4Save)==Ticks4Load) = true ArraySize(Ticks4Save) = 1000 ArraySize(Ticks4Load) = 1000Пример возможного практического применения нововведений. Библиотеки: File Mapping без общий доступ к файлам Передача данных. fxsaber 2017.04.05 00:32 #27 #include <TypeToBytes.mqh> // Объединение всех строк массива в одну строку string StringArrayConcatenate( const string &StrArray[] ) { string Str = ""; const int Size = ArraySize(StrArray); for (int i = 0; i < Size; i++) Str += StrArray[i]; return(Str); } void OnStart() { string StrArray[] = {"abcd", "123", "zxc", "890", "qwert"}; string Str1, Str2; // Объединение всех строк массива в одну строку Str1 = StringArrayConcatenate(StrArray); _W(Str2) = StrArray; Print(Str1); Print(Str2); }Выделенное - один и тот же результат сильно разными способамиabcd123zxc890qwert abcd123zxc890qwert fxsaber 2017.04.12 23:04 #28 После обновления станет доступна// Задали кастомную структуру struct STRUCT { int i; // Задали оператор присваивания void operator =( const STRUCT& ) {} }; // Демонстрация результата обхода кастомного оператора присваивания структуры _R-функционалом библиотеки STRUCT Struct; // Создали объект с кастомным оператором присваивания Struct.i = 1; ArrayPrint(_R(Struct).Bytes); // Убедились, что оператор присваивания PRINT(_R(Struct) == Struct) // не влияет на _R-функционал библиотеки // Проверка "корректности" оператора присваивания типа PRINT(_WRONG_ASSIGN_OPERATOR(int)) // Корректен PRINT(_WRONG_ASSIGN_OPERATOR(MqlTick)) // Корректен PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) // Не корректен fxsaber 2017.04.13 13:34 #29 Определение корректности оператора присваивания структур.Пример того, как данная возможность может быть полезна для выявления потенциальных ошибок.Пишем и запускаем скрипт.#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT() : i(0) {} template <typename T> void operator =( T& ) {} }; #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) }Результат._WRONG_ASSIGN_OPERATOR(STRUCT) = trueЭто говорит о том, что оператор присваивания не будет копировать структуру в структуру этого же типа.Если в структуру добавить еще, void operator =( STRUCT &Value ) { this.i = 0; }то результат будет тот же.Казалось бы, исправив этот оператор на void operator =( STRUCT &Value ) { this.i = Value.i; }должно все стать корректным, но библиотека говорит об обратном.Пожалуй, здесь самый тонкий момент данного примера.Исправляем на#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT() : i(0) {} template <typename T> void operator =( T& ) {} void operator =( const STRUCT &Value ) { this.i = Value.i; } }; #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) }и получаем результат_WRONG_ASSIGN_OPERATOR(STRUCT) = falseВот теперь оператор копирования написан корректно!Подобным образом можно проверять корректность операторов присваивания/копирования любых простых структур. Ошибки, баги, вопросы Баг компилятора: 'operator=' - Вопросы по ООП в fxsaber 2017.04.19 17:17 #30 Чем отличается NULL-строка от пустой?#include <TypeToBytes.mqh> #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { const string StrNull = NULL; PRINT(ArraySize(_R(StrNull).Bytes)) PRINT(ArraySize(_R("").Bytes)) }РезультатArraySize(_R(StrNull).Bytes) = 0 ArraySize(_R().Bytes) = 1NULL-строка имеет нулевую длину в байтах. Пустая - длина 1 байт (там ноль - конец строки). 1234567 Новый комментарий
Color = (color)((Color & 0xFFFFFF) + (Alpha << 24));
_W(Color)[3] = Alpha;
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
fxsaber, 2017.03.07 13:55
template <typename T>
void Swap( T &Value1, T &Value2 )
{
const T Tmp = Value1;
Value1 = Value2;
Value2 = Tmp;
}
// Сортировка массива любого простого типа
template <typename T>
bool MyArraySort( T &Array[] )
{
if (!ArraySort(Array))
{
const int Size = ArraySize(Array);
for (int i = 0; i < Size - 1; i++)
{
const T Tmp = Array[i];
for (int j = i + 1; j < Size; j++)
if (_R(Tmp) == Array[j]) // TypeToBytes.mqh
{
Swap(Array[i + 1], Array[j]);
i++;
}
}
}
return(true);
}
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: File Mapping без DLL
fxsaber, 2017.04.03 16:07
Спасибо автору за библиотеку!
Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков
Результат
Пример возможного практического применения нововведений.
Выделенное - один и тот же результат сильно разными способами
Пример того, как данная возможность может быть полезна для выявления потенциальных ошибок.
Пишем и запускаем скрипт.
Результат.
_WRONG_ASSIGN_OPERATOR(STRUCT) = trueЭто говорит о том, что оператор присваивания не будет копировать структуру в структуру этого же типа.
Если в структуру добавить еще,
то результат будет тот же.
Казалось бы, исправив этот оператор на
должно все стать корректным, но библиотека говорит об обратном.
Пожалуй, здесь самый тонкий момент данного примера.
Исправляем на
и получаем результат
_WRONG_ASSIGN_OPERATOR(STRUCT) = falseВот теперь оператор копирования написан корректно!
Подобным образом можно проверять корректность операторов присваивания/копирования любых простых структур.
Результат
NULL-строка имеет нулевую длину в байтах. Пустая - длина 1 байт (там ноль - конец строки).