Библиотеки: File Mapping без DLL - страница 9 123456789101112 Новый комментарий fxsaber 2017.04.03 16:07 #81 Спасибо автору за библиотеку!Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков#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 --- 2017.05.01 13:02 #82 Обновление версий1.02 - изменено копирование структур на union Файлы: MemMapLib.mqh 31 kb Rashid Umarov 2017.05.01 16:44 #83 o_o: Обновление версий1.02 - изменено копирование структур на unionЗаменил файл и опубликовал Denis Lysenko 2017.09.13 23:20 #84 o_o: может вы не учли, что тут в классе первые байты отведены под заголовок, где хранится размер файла?Подскажите пожалуйста, правильно ли я делаю?Хочу писать/читать double. Т.к. mql4 не умеет копировать структуры друг в друга, сделал иначе.В вашем скрипте не было таких вызовов с такими типами параметров и я их добавил: // 64 long memcpy(double &Destination[], uchar &Source[], int Length); long memcpy(uchar &Destination[], double &Source[], int Length);И такой код сработал без ошибок:void OnStart() { CMemMapFile hmem; long err=hmem.Open("Local\\test",111,modeCreate); double src[5]={1.2,3.4,5.6,7.8,9.0}; int cnt=sizeof(double)*ArraySize(src); uchar data[5*8]; memcpy(data,src,cnt); err=hmem.Write(data,ArraySize(data)); ArrayInitialize(data,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data,ArraySize(data)); ArrayInitialize(src,0); memcpy(src,data,cnt); hmem.Close(); }1. Могу ли я использовать memcpy с такими типами параметров? Если "все не то, давай по новой" нет, то как вообще писать/читать double?2. Сработает ли это для 32 бит? Любые вопросы новичков по могу ли я использовать 'Закрыть все'/'Открыть' инструменты --- 2017.09.14 09:28 #85 Denis Lysenko: Хочу писать/читать double. Т.к. mql4 не умеет копировать структуры друг в друга, сделал иначе.копировать структуры сейчас можно с помощью union1. Могу ли я использовать memcpy с такими типами параметров? 2. Сработает ли это для 32 бит?да Denis Lysenko 2017.09.14 19:02 #86 Customer: If last trade loss them raise lot 2 trade per sesion but open and close example open 8.00 GBP /usd and closed 16 .00 gbp /usd Denis Lysenko 2017.09.16 21:55 #87 o_o: копировать структуры сейчас можно с помощью unionПочему-то предыдущий комментарий затерся. union dbl_u { double value; }; union uchar_u { uchar value[8]; }; dbl_u dbl; uchar_u chr; dbl = chr;Выдает: '=' - illegal operation use --- 2017.09.17 23:35 #88 Denis Lysenko: Почему-то предыдущий комментарий затерся.Выдает: '=' - illegal operation useКурите мануал. Юнионы так не используют. Иван 2017.09.20 10:24 #89 ПОмогите, пожалуйста, разобраться почему не работает следующий код:#include <MemMapLib.mqh> //------------------------------------------------------------------ OnStart void OnStart() { CMemMapFile hmem; long err=hmem.Open("Local\\test",111,modeCreate); uchar data[],data2[]; StringToCharArray("0.12243;0.44565;1.32452",data); err=hmem.Write(data,ArraySize(data)); ArrayResize(data2,ArraySize(data)); ArrayInitialize(data2,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data2,ArraySize(data2)); Print("Read result=",CharArrayToString(data2)); hmem.Close(); Print("New cycle of open memory file"); err=hmem.Open("Local\\test",111,modeOpen); Print("err1=",err); ArrayInitialize(data2,0); hmem.Seek(0,SEEK_SET); err=hmem.Read(data2,ArraySize(data2)); Print("err2=",err); Print("after reading data2=",CharArrayToString(data2)); hmem.Close(); }Результат работы кода:2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: after reading data2= 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: err2=-1 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: err1=0 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: New cycle of open memory file 2017.09.20 11:13:54.981 memmap_MY_02_question EURUSD,H1: Read result=0.12243;0.44565;1.32452 Почему мне не удаётся считать содержимое файла в памяти после его переоткрытия?Запускаю скрипт в МТ4 терминале. --- 2017.09.20 11:00 #90 Иван:Почему мне не удаётся считать содержимое файла в памяти после его переоткрытия?Хорошо хоть не пробуете прочитать файл в памяти после перезапуска компьютера... 123456789101112 Новый комментарий
Спасибо автору за библиотеку!
Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков
Результат
Обновление версий
1.02 - изменено копирование структур на union
Обновление версий
1.02 - изменено копирование структур на union
может вы не учли, что тут в классе первые байты отведены под заголовок, где хранится размер файла?
Подскажите пожалуйста, правильно ли я делаю?
Хочу писать/читать double. Т.к. mql4 не умеет копировать структуры друг в друга, сделал иначе.
В вашем скрипте не было таких вызовов с такими типами параметров и я их добавил:
И такой код сработал без ошибок:
1. Могу ли я использовать memcpy с такими типами параметров? Если "все не то, давай по новой" нет, то как вообще писать/читать double?
2. Сработает ли это для 32 бит?
Хочу писать/читать double. Т.к. mql4 не умеет копировать структуры друг в друга, сделал иначе.
копировать структуры сейчас можно с помощью union
2. Сработает ли это для 32 бит?
да
If last trade loss them raise lot
2 trade per sesion but open and close example open 8.00 GBP /usd and closed 16 .00 gbp /usd
копировать структуры сейчас можно с помощью union
Почему-то предыдущий комментарий затерся.
Почему-то предыдущий комментарий затерся.
ПОмогите, пожалуйста, разобраться почему не работает следующий код:
Результат работы кода:
Почему мне не удаётся считать содержимое файла в памяти после его переоткрытия?
Запускаю скрипт в МТ4 терминале.
Почему мне не удаётся считать содержимое файла в памяти после его переоткрытия?
Хорошо хоть не пробуете прочитать файл в памяти после перезапуска компьютера...