Bibliotheken: Abbildungsdateien ohne DLL - Seite 9

 

Vielen Dank an den Autor für die Bibliothek!

Ich habe Funktionen für die Übertragung beliebiger Daten erstellt. Das folgende Skript zeigt ihre Arbeit am Beispiel von Zecken

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

// Weist Speicher der angegebenen Länge für Daten zu 
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);
}

// Schreibt Daten in den Speicher
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);              // Aufzeichnung der Menge 
  _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Aufzeichnung der Daten

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

  FileMemory.Write(Bytes, ArraySize(Bytes)); // Alles in den Speicher entladen
  
  return;
}

// Liest Daten aus dem Speicher
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));  // Lesen der Datenmenge aus dem Speicher 
  FileMemory.Read(Bytes, _R(Bytes)[0]); // Ich habe die Daten selbst

  _ArrayCopy(Data, Bytes);              // Dumped die Daten in ein Array
  
  return(ArraySize(Data));
}

#define  AMOUNT 1000

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

// Beispiel für die Übertragung von Zecken
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;
}


Ergebnis

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

Aktualisierung der Version

1.02 - Kopieren von Strukturen nach Union geändert

Dateien:
MemMapLib.mqh  31 kb
 
o_o:

Aktualisierung der Version

1.02 - Kopieren von Strukturen in Union geändert

Ersetzt die Datei und veröffentlicht
 
o_o:
Vielleicht haben Sie nicht berücksichtigt, dass hier in der Klasse die ersten Bytes für den Header reserviert sind, in dem die Dateigröße gespeichert ist?

Können Sie mir bitte sagen, ob ich es richtig mache?

Ich möchte doppelt schreiben/lesen. Da mql4 nicht weiß, wie man Strukturen ineinander kopiert, habe ich es anders gemacht.

In deinem Skript gab es keine solchen Aufrufe mit solchen Parametertypen und ich habe sie hinzugefügt:

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

Und dieser Code funktionierte ohne Fehler:

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. Kann ich memcpy mit solchen Parametertypen verwenden? Wenn "es ist alles falsch, lass es uns nochmal machen" nein, wie kann man dann überhaupt double schreiben/lesen?

2. Funktioniert das auch bei 32 Bit?

 
Denis Lysenko:

Ich möchte doppelt schreiben/lesen. Da mql4 nicht weiß, wie man Strukturen ineinander kopiert, habe ich es anders gemacht.

Jetzt kann man Strukturen mit Hilfe von union kopieren


1. Kann ich memcpy mit solchen Arten von Parametern verwenden?

2. Funktioniert das auch bei 32 Bit?

ja

 
Customer:

Wenn letzter Handel Verlust sie erhöhen viel


2 Geschäfte pro Sitzung, aber offen und geschlossen Beispiel offen 8,00 GBP /usd und geschlossen 16,00 gbp /usd

 
o_o:

Strukturen können jetzt mit union kopiert werden


Aus irgendeinem Grund ist der vorherige Kommentar gelöscht worden.

   union dbl_u
     {
      double            value;
     };
   union uchar_u
     {
      uchar              value[8];
     };
     
   dbl_u dbl;
   uchar_u chr;
   
   dbl = chr;
Er gibt zurück: '=' - illegale Operation verwenden
 
Denis Lysenko:

Aus irgendeinem Grund ist der vorherige Kommentar gelöscht worden.

Es gibt: '=' - illegale Operation verwenden
Lesen Sie das Handbuch. Unions nicht verwenden diese Weise.
 

Bitte helfen Sie mir zu verstehen, warum der folgende Code nicht funktioniert:

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

Das Ergebnis des Codes:

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

Warum kann ich den Inhalt einer Datei nicht im Speicher lesen, nachdem ich sie erneut geöffnet habe?

Ich führe das Skript in MT4 Terminal.

 
Иван:

Warum kann ich den Inhalt einer Datei im Speicher nicht lesen, nachdem ich sie erneut geöffnet habe?

Zumindest versuchen Sie nicht, eine Datei im Speicher zu lesen, nachdem Sie den Computer neu gestartet haben...