Kütüphaneler: DLL olmadan Dosya Eşleme - sayfa 9 123456789101112 Yeni yorum fxsaber 2017.04.03 16:07 #81 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 --- 2017.05.01 13:02 #82 Sürüm güncellemesi1.02 - yapıların kopyalanması birlik olarak değiştirildi Dosyalar: MemMapLib.mqh 31 kb Rashid Umarov 2017.05.01 16:44 #83 o_o:Sürüm güncellemesi1.02 - yapıların kopyalanması birlik olarak değiştirildi Dosya değiştirildi ve yayınlandı Denis Lysenko 2017.09.13 23:20 #84 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ı? yürütme ilkesini döndürür. Çaydanlıktan gelen sorular Teoriden pratiğe --- 2017.09.14 09:28 #85 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ı kopyalayabilirsiniz1. Bu tür parametrelerle memcpy kullanabilir miyim? 2. Bu 32 bit için çalışacak mı?Evet Denis Lysenko 2017.09.14 19:02 #86 Customer: Son işlem zarar ederse lotu yükseltirlerOturum başına 2 işlem ancak açma ve kapama örneği açık 8.00 GBP / usd ve kapalı 16 .00 gbp / usd Denis Lysenko 2017.09.16 21:55 #87 o_o:yapıları artık union kullanılarak kopyalanabilirBazı 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ı --- 2017.09.17 23:35 #88 Denis Lysenko: Bazı nedenlerden dolayı önceki yorum silinmiştir.Şunu verir: '=' - yasadışı işlem kullanımı Kılavuzu okuyun. Sendikalar bu yolu kullanmazlar. Иван 2017.09.20 10:24 #89 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. --- 2017.09.20 11:00 #90 Иван: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... 123456789101112 Yeni yorum
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
Sonuç
Sürüm güncellemesi
1.02 - yapıların kopyalanması birlik olarak değiştirildi
Sürüm güncellemesi
1.02 - yapıların kopyalanması birlik olarak değiştirildi
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:
Ve bu kod hatasız çalıştı:
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ı?
Ç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
2. Bu 32 bit için çalışacak mı?
Evet
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
yapıları artık union kullanılarak kopyalanabilir
Bazı nedenlerden dolayı önceki yorum silinmiştir.
Bazı nedenlerden dolayı önceki yorum silinmiştir.
Lütfen aşağıdaki kodun neden çalışmadığını anlamama yardımcı olun:
Kodun sonucu:
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...