Bibliothèque: Mappage de fichiers sans DLL - page 9

 

Merci à l'auteur pour la bibliothèque !

J'ai créé des fonctions pour transférer n'importe quelle donnée. Le script ci-dessous montre leur travail sur l'exemple des ticks

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

// Alloue aux données une mémoire de la longueur spécifiée 
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);
}

// Écriture des données dans la mémoire
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);              // Enregistrement de la quantité 
  _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Enregistrement des données

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

  FileMemory.Write(Bytes, ArraySize(Bytes)); // Tout a été déversé dans la mémoire
  
  return;
}

// Lit les données dans la mémoire
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));  // Lire la quantité de données dans la mémoire 
  FileMemory.Read(Bytes, _R(Bytes)[0]); // Obtenir les données elles-mêmes

  _ArrayCopy(Data, Bytes);              // Dépose les données dans un tableau
  
  return(ArraySize(Data));
}

#define  AMOUNT 1000

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

// Exemple de transmission de tic-tac
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ésultat

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

Mise à jour de la version

1.02 - modification de la copie des structures en union

Dossiers :
MemMapLib.mqh  31 kb
 
o_o:

Mise à jour de la version

1.02 - modification de la copie des structures vers l'union

Remplacement du fichier et publication
 
o_o:
Peut-être n'avez-vous pas tenu compte du fait qu'ici, dans la classe, les premiers octets sont alloués à l'en-tête, où la taille du fichier est stockée ?

Pouvez-vous me dire si je procède correctement ?

Je veux écrire/lire en double. Comme mql4 ne sait pas copier des structures l'une dans l'autre, j'ai fait autrement.

Dans votre script, il n'y avait pas de tels appels avec de tels types de paramètres et je les ai ajoutés :

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

Et ce code a fonctionné sans erreur :

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. Puis-je utiliser memcpy avec de tels types de paramètres ? Si "c'est tout faux, recommençons" non, alors comment écrire/lire du double ?

2. Est-ce que cela fonctionnera pour les 32 bits ?

 
Denis Lysenko:

Je veux écrire/lire en double. Comme mql4 ne sait pas copier les structures les unes dans les autres, j'ai fait autrement.

Maintenant vous pouvez copier des structures à l'aide de l'union


1. Puis-je utiliser memcpy avec de tels types de paramètres ?

2. Est-ce que cela fonctionnera pour les 32 bits ?

oui

 
Customer:

Si la dernière transaction est déficitaire, ils augmentent le lot


2 transactions par session mais ouverture et fermeture exemple ouverture 8.00 GBP /usd et fermeture 16 .00 gbp /usd

 
o_o:

les structures peuvent désormais être copiées à l'aide de l'union


Pour une raison quelconque, le commentaire précédent a été effacé.

   union dbl_u
     {
      double            value;
     };
   union uchar_u
     {
      uchar              value[8];
     };
     
   dbl_u dbl;
   uchar_u chr;
   
   dbl = chr;
Il renvoie : '=' - utilisation d'une opération illégale
 
Denis Lysenko:

Pour une raison quelconque, le commentaire précédent a été effacé.

Il donne : '=' - utilisation d'une opération illégale
Lisez le manuel. Les syndicats n'utilisent pas cette méthode.
 

Veuillez m'aider à comprendre pourquoi le code suivant ne fonctionne pas :

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

Le résultat du code :

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

Pourquoi ne puis-je pas lire le contenu d'un fichier en mémoire après l'avoir rouvert ?

J'exécute le script dans le terminal MT4.

 
Иван:

Pourquoi ne puis-je pas lire le contenu d'un fichier en mémoire après l'avoir rouvert ?

Au moins, vous n'essayez pas de lire un fichier en mémoire après avoir redémarré l'ordinateur...