Bibliotecas: Mapeado de Ficheros sin la DLL - página 9

 

¡Gracias al autor por la biblioteca!

Hice funciones para transferir cualquier dato. El script de abajo muestra su trabajo en el ejemplo de ticks

#include <MemMapLib.mqh>
#include <TypeToBytes.mqh>

// Asigna memoria de longitud especificada para los datos 
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);
}

// Escribe datos en la memoria
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);              // Registrada la cantidad 
  _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Grabación de los datos

  if (FromBegin)
    FileMemory.Seek(0, SEEK_SET);

  FileMemory.Write(Bytes, ArraySize(Bytes)); // Volcado de todo en la memoria
  
  return;
}

// Lee datos de la memoria
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));  // Leer la cantidad de datos de la memoria 
  FileMemory.Read(Bytes, _R(Bytes)[0]); // Obtener los datos propiamente dichos

  _ArrayCopy(Data, Bytes);              // Volcado de los datos en un array
  
  return(ArraySize(Data));
}

#define  AMOUNT 1000

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

// Ejemplo de transmisión de ticks
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;
}


Resultado

(_R(Ticks4Save)==Ticks4Load) = true ArraySize(Ticks4Save) = 1000 ArraySize(Ticks4Load) = 1000
 

Actualización de la versión

1.02 - cambiada la copia de estructuras a unión

Archivos adjuntos:
MemMapLib.mqh  31 kb
 
o_o:

Actualización de la versión

1.02 - cambiada la copia de estructuras a unión

Reemplazado el archivo y publicado
 
o_o:
¿Quizás no has tenido en cuenta que aquí en la clase se asignan los primeros bytes para la cabecera, donde se almacena el tamaño del fichero?

¿Puedes decirme si lo estoy haciendo bien?

Quiero escribir/leer doble. Como mql4 no sabe copiar estructuras entre sí, hice lo contrario.

En tu script no había tales llamadas con tales tipos de parámetros y los añadí:

	// 64
        long memcpy(double &Destination[], uchar &Source[], int Length);
        long memcpy(uchar &Destination[], double &Source[], int Length);

Y este código funcionó sin errores:

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. ¿Puedo usar memcpy con tales tipos de parámetros? Si "está todo mal, hagámoslo de nuevo" no, entonces ¿cómo escribir/leer doble en absoluto?

2. ¿Funcionará esto para 32 bits?

 
Denis Lysenko:

Quiero escribir/leer doble. Como mql4 no sabe copiar estructuras entre sí, hice lo contrario.

ahora puedes copiar estructuras con la ayuda de union


1. ¿Puedo usar memcpy con este tipo de parámetros?

2. ¿Funcionará para 32 bits?


 
Customer:

Si la última pérdida de comercio que aumentan mucho


2 operaciones por sesion pero abren y cierran ejemplo abren 8.00 GBP /usd y cierran 16 .00 gbp /usd

 
o_o:

ahora puedes copiar estructuras usando union


Por alguna razón se ha borrado el comentario anterior.

   union dbl_u
     {
      double            value;
     };
   union uchar_u
     {
      uchar              value[8];
     };
     
   dbl_u dbl;
   uchar_u chr;
   
   dbl = chr;
Devuelve: '=' - uso ilegal de la operación
 
Denis Lysenko:

Por alguna razón se ha borrado el comentario anterior.

Da: '=' - uso ilegal de la operación
Lee el manual. Los sindicatos no utilizan esta forma.
 

Por favor, ayúdenme a entender por qué el siguiente código no funciona:

#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();   
                
}

El resultado del código:

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

¿Por qué no puedo leer el contenido de un archivo en la memoria después de reabrirlo?

Ejecuto el script en el terminal MT4.

 
Иван:

¿Por qué no puedo leer el contenido de un archivo en memoria después de volver a abrirlo?

Al menos no intentas leer un archivo en memoria después de reiniciar el ordenador...