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

 
baramantan:

Ben mega programcı değilim. Ama evrenselliğin nerede olduğunu anlamıyorum? uchar evrensel olamaz çünkü kullanıcıyı sınırlar, yani: uchar sadece pozitif değerler içindir. Minimum değer sıfır, maksimum değer 255'tir.

uchar değerinin ötesindeki herhangi bir veri, uchar'ın maksimum veya minimum değerine eşit olur.

Bu söylediklerimden yola çıkarak en baştan "int veya double nasıl geçilir" diye sormuştum. Anlayamadım şef.

Tamam, küçük bir tur atalım.

1. char ve uchar örneğini ele alalım. Her iki değişken de 1 byte boyutunda.

Bu, birbirlerine atama yaparak bayt kaybetmediğimiz ve dolayısıyla orijinal verinin değerini kaybetmediğimiz anlamına gelir.

şu ifadelere bakın

uchar u=200; char c=u; u=c; Print(u);
c=-100; u=c; c=u; Print(c);

Aynı durum long/ulong, int/uint için de geçerlidir.

Yani, bayt cinsinden aynı boyuttaki tamsayı tipindeki değişkenler, bayt cinsinden bilgi kaybı olmadan birbirlerine aktarılabilir.

Bu arada, bu, Uzman Danışman MAGIC sayılarını ulong türünde kabul etse de, bunları programlarınızda her zaman long, yani işaretli biçimde ayarlayabileceğiniz ve okuyabileceğiniz anlamına gelir


2. Şimdi <some_type> ve uchar'a bakın.
Örneğin int. Bu, bellekteki bu 4 baytın kolayca uchar[4] dizisi olarak gösterilebileceği anlamına gelir
eğer bir double varsa( 8 bayttır), uchar[8] dizisi olarak gösterilebilir
Bu aynı zamanda dizelerin baytları için de geçerlidir - MQL'de ushort dizisidir.
ve buna göre herhangi bir türde bir yapınız varsa, herhangi bir veriyi kolayca uchar dizisi olarak sağlayabilirsiniz.

MQL5 sürümünde kullanılan baytlarla ilgili bu temel kavramlardır - bellekteki sanal dosyalar CFastFile. Herhangi bir veriyi uchar dizisi belleğinde saklar.

Yani, harici programlarla veri alışverişi yapmanız gerekmiyorsa. Veya başka bir programdan veri akışı şeklinde veri alırsınız - örneğin, İnternet sayfalarını okumak ve bu verilerin tümünü diske kaydetmeniz gerekmez, o zaman Windows eşlemesi yerine CFastFile kullanmak daha iyidir.

ve son olarak, https://www.mql5.com/tr/articles/364 adresini tamamen birleştirmek için.

 
BoraBo:

MT5 642 Win7 64, anladığım kadarıyla çalışmıyor, sonra

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // bellek nesnesi oluştur

1400 hatası alıyorum,

ama Vista 32 çalışıyor.


bunun nedeni 32 ve 64 sistemlerdeki farklı işaretçi boyutlarıdır

Bu kütüphane dosyası 32-bit terminal için hazırlanmıştır.

Ancak 64 bitlik bir terminal kullanıyorsanız, bir işaretçinin ima edildiği tüm yerlere (örneğin PBYTE, LPVOID, vb. ve tüm memcpy türlerine) 8 bayt uzun tip koymalısınız.

 

ama nasıl bağlanabilirim

#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 

Bu dışarı verir

'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh  718     10
'GetLastError' - ambiguous call to overloaded function with the same parameters	SymbolInfo.mqh	725	57

ve bu iki girinti birbiri olmadan da çalışır.

 
olyakish:

ama nasıl bağlanabilirim

Bu dışarı verir

ve bu iki ekleme birbiri olmadan çalışır.

bağlam çözünürlüğünü kullanmaya çalışın ::
 
sergeev:
bağlam çözünürlüğünü kullanmayı deneyin ::

Teşekkürler

Sadece standart kütüphaneyi değiştirmek zorunda kaldım.

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- MarketWatch'ta sembolün seçili olup olmadığını kontrol edin
   if(!Select())
     {
      if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
        {
         printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
         return(false);
        }
      if(!Select(true))
        {
         printf(__FUNCTION__+": Error adding symbol %d",::GetLastError());
         return(false);
        }
     }
//--- başarılı
   return(true);
  }
//+------------------------------------------------------------------+
Bunun iyi bir şey olduğunu sanmıyorum....
 
olyakish:

Teşekkür ederim.

Sadece standart kütüphaneyi değiştirmek zorunda kaldım.

Bunun iyi bir şey olduğunu sanmıyorum.

Anlamıyorsunuz.

Size kernel32::GetLastError'dan bahsettim. Benim kodumda nasıl uygulandığına bakın.

Bu seçenekten memnun değilseniz,örneğin int parametresi ile kernel32 GetLastError'dan import bildirin. çağırırken bir fark olmayacak, ancak çakışmayı önleyeceksiniz.

 
sergeev:

anlamıyorsun.

Size kernel32::GetLastError'dan bahsettim. benim kodumda nasıl uygulandığına bakın.

Bu seçenek size uymuyorsa,örneğin int parametre ile kernel32 GetLastError'dan importedin. çağırırken bir fark olmayacak, ancak çakışmayı önleyeceksiniz.

Belki de doğru ifade edemiyorum.

ama yapmak zorundayız

Çünkü burada standart kütüphane eklenmiş kodunuzun bir örneği var.

//+------------------------------------------------------------------+
//|MemMap |
//| Telif Hakkı © 2006-2013, FINEXWARE Technologies GmbH |
//| www.FINEXWARE.com |
//| programlama & geliştirme - Alexey Sergeev, Boris Gershanov |
//+------------------------------------------------------------------+
#property copyright "Telif Hakkı © 2006-2013, FINEXWARE Technologies GmbH"
#property link      "www.FINEXWARE.com"
#property version   "1.00"
#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 


//------------------------------------------------------------------ OnStart
void OnStart()
{
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);
        
        uchar data[];
        StringToCharArray("Hello from MQL5!",data);
        err=hmem.Write(data,ArraySize(data));
        
        ArrayInitialize(data,0);
        hmem.Seek(0,SEEK_SET);
        err=hmem.Read(data,ArraySize(data));
        Print(CharArrayToString(data));
        
        hmem.Close();
}

Derlerken aynı hataları veriyor.

 

olyakish, sana yazdıklarımı tekrar dikkatlice oku.

Eğer bağlamdan tatmin olmadıysanız, size tam olarak ne demek istediğimi söylüyorum.

  • "ya da kütüphaneniz için neyi değiştireceğinizi".
 
sergeev:

anlamıyorsun.

Size kernel32::GetLastError'dan bahsettim. benim kodumda nasıl uygulandığına bakın.

Eğer bu seçenek size uymuyorsa, kernel32 GetLastError'danörneğin int parametresi ile importedin. çağırırken bir fark olmayacak, ancak çakışmayı önleyeceksiniz.

Kernel32::GetLastError kod içinde bağlamı ile çağrıldığında, derleyici GetLastError'ı bağlamsız olarakçağıracaktır.

Programcıların standart WinAPI fonksiyonlarının MQL-analoglarını bağlam ile çağırmayı bir kural haline getirmeleri yeterlidir. Böylece sonraki değişikliklerde herhangi bir sorun yaşanmayacaktır.

Ve böylece standart incili düzeltirsiniz ve güncellenir, bu yüzden tekrar düzenlemeniz gerekir.

 
Urain:

Ve böylece standart İncil'i düzeltirsiniz ve güncellenir, tekrar düzenlemeniz gerekir.

Standart olan standart olandır, bu yüzden orada yapacak bir şey yoktur, hiçbir şekilde. Bir hata var -- geliştiricilere bildirin. Başka yolu yok.