Библиотеки: File Mapping без DLL - страница 9

 

Спасибо автору за библиотеку!

Сварганил функции для передачи любых данных. Ниже скрипт показывает их работу на примере тиков

#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
 

Обновление версий

1.02 - изменено копирование структур на union

Файлы:
MemMapLib.mqh  31 kb
 
o_o:

Обновление версий

1.02 - изменено копирование структур на union

Заменил файл и опубликовал
 
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 бит?

 
Denis Lysenko:

Хочу писать/читать double. Т.к. mql4 не умеет копировать структуры друг в друга, сделал иначе.

копировать структуры сейчас можно с помощью union


1. Могу ли я использовать memcpy с такими типами параметров?

2. Сработает ли это для 32 бит?

да

 
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  

 
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
 
Denis Lysenko:

Почему-то предыдущий комментарий затерся.

Выдает: '=' - illegal operation use
Курите мануал. Юнионы так не используют.
 

ПОмогите, пожалуйста, разобраться почему не работает следующий код:

#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 терминале.

 
Иван:

Почему мне не удаётся считать содержимое файла в памяти после его переоткрытия?

Хорошо хоть не пробуете прочитать файл в памяти после перезапуска компьютера...

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