Kütüphaneler: DLL olmadan Dosya Eşleme - sayfa 9

 

Kütüphane için yazara teşekkürler!

Herhangi bir veriyi aktarmak için fonksiyonlar yaptım. Aşağıdaki kod, kene örneği üzerindeki çalışmalarını göstermektedir

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

// Veri için belirtilen uzunlukta bellek ayırır 
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);
}

// Verileri belleğe yazar
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);              // Miktar kaydedildi 
  _ArrayCopy(Bytes, _R(Data).Bytes, sizeof(int)); // Veriler kaydedildi

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

  FileMemory.Write(Bytes, ArraySize(Bytes)); // Her şeyi belleğe boşalttı
  
  return;
}

// Bellekten veri okur
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));  // Bellekten veri miktarını okuyun 
  FileMemory.Read(Bytes, _R(Bytes)[0]); // Verinin kendisini aldım

  _ArrayCopy(Data, Bytes);              // Verileri bir diziye döktü
  
  return(ArraySize(Data));
}

#define  AMOUNT 1000

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

// Kene iletimi örneği
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;
}


Sonuç

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

Sürüm güncellemesi

1.02 - yapıların kopyalanması birlik olarak değiştirildi

Dosyalar:
MemMapLib.mqh  31 kb
 
o_o:

Sürüm güncellemesi

1.02 - yapıların kopyalanması birlik olarak değiştirildi

Dosya değiştirildi ve yayınlandı
 
o_o:
Belki de sınıfta ilk baytların dosya boyutunun saklandığı başlık için ayrıldığını dikkate almadınız?

Lütfen bana doğru yapıp yapmadığımı söyleyebilir misiniz?

Çift yazmak/okumak istiyorum. mql4 yapıları birbirine nasıl kopyalayacağını bilmediği için başka türlü yaptım.

Kodunuzda bu tür parametrelerle böyle bir çağrı yoktu ve onları ekledim:

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

Ve bu kod hatasız çalıştı:

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. Bu tür parametre tipleri ile memcpy kullanabilir miyim? "Hepsi yanlış, tekrar yapalım" hayır ise, o zaman nasıl çift yazılır / okunur?

2. Bu 32 bit için çalışacak mı?

 
Denis Lysenko:

Çift yazmak/okumak istiyorum. mql4 yapıları birbirine kopyalamayı bilmediği için ben başka türlü yaptım.

şimdi union yardımı ile yapıları kopyalayabilirsiniz


1. Bu tür parametrelerle memcpy kullanabilir miyim?

2. Bu 32 bit için çalışacak mı?

Evet

 
Customer:

Son işlem zarar ederse lotu yükseltirler


Oturum başına 2 işlem ancak açma ve kapama örneği açık 8.00 GBP / usd ve kapalı 16 .00 gbp / usd

 
o_o:

yapıları artık union kullanılarak kopyalanabilir


Bazı nedenlerden dolayı önceki yorum silinmiştir.

   union dbl_u
     {
      double            value;
     };
   union uchar_u
     {
      uchar              value[8];
     };
     
   dbl_u dbl;
   uchar_u chr;
   
   dbl = chr;
Şu sonucu döndürür: '=' - yasadışı işlem kullanımı
 
Denis Lysenko:

Bazı nedenlerden dolayı önceki yorum silinmiştir.

Şunu verir: '=' - yasadışı işlem kullanımı
Kılavuzu okuyun. Sendikalar bu yolu kullanmazlar.
 

Lütfen aşağıdaki kodun neden çalışmadığını anlamama yardımcı olun:

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

Kodun sonucu:

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

Bir dosyayı yeniden açtıktan sonra bellekteki içeriğini neden okuyamıyorum?

Komut dosyasını MT4 terminalinde çalıştırıyorum.

 
Иван:

Yeniden açtıktan sonra bellekteki bir dosyanın içeriğini neden okuyamıyorum?

En azından bilgisayarı yeniden başlattıktan sonra bellekteki bir dosyayı okumaya çalışmıyorsunuz...