![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
Değişkenlere, fonksiyonlara, referansa göre adres alma - tüm bunlar MQL kısıtlamalarıdır.
Bu, sözdizimi tarafından sağlanmayan bir şey bile değil, bu bellekle çalışma yasağı.
Bir void* işaretçisi bile, olağan C anlamında bir işaretçi değildir.
Bu, kopyalanmalarını önlemek için sınıf nesneleriyle çalışmak için bir nesnedir.
Aynı referans & bir adres almıyor, ancak bir nesneyi yığına kopyalamadan iletmek için bir derleyici belirteci.
Xia'da yazmak istiyorsanız, Xia'da yazın ve dll'yi içe aktarın, lütfen.
Yumurtalar gerçekten kaşınıyorsa ve yabancı dll'lere izin verilmiyorsa, o zaman yerli dll'lerden ithalat yapmak büyük bir günah değildir ve MQL ürününüz bu nedenle değer kaybetmez.
Örneğin, terminal işleminde bellekle çalışmak için boşta konuşmamak için, 4 baytlık bir işaretçi kullanabilir ve memcpy'yi içe aktarabilirsiniz.
bir çeşit sarmalayıcı sınıfı:
Bu sayede hafızayı istediğiniz gibi kullanabilirsiniz... Alışılagelmiş C-işaretçileri değil ama yine de
Ne yararlı olabilir?
Örneğin, modüller arasında veri aktarmak için global değişkenleri kullanmamak için GlobalAlloc'un içe aktarılmasıyla bir özelliği karıştırabilirsiniz.
GlobalAlloc, bir baykuş veya hindi çalışması için bir kalça veya statik dahili sanal makine ile ilişkili olmayan bir işleme bellek ayırır.
İçine herhangi bir boyutta dizi yerleştirebilir ve indeksleme için memcpy kullanabilirsiniz.
İthalat örneği:
#define HANDLE int
#define LPVOID int
Kullanım örneği:
// baykuş N1, oran dizinizi hazırlayın
MqlRates oranları[123];
// burayı doldurun
HANDLE memid = GlobalAlloc(GMEM_MOVEABLE, 123*sizeof(MqlRates));
LPVOID ptr=GlobalLock(memid);
memcpy(ptr,rates[0].time, 123*sizeof(MqlRates)); // burada, derlemek için içe aktarmada int memcpy(int&,const datetime&,int) prototipini oluşturmanız gerekir
GlobalUnlock(memid);
// kask bellek tanımlayıcısı
EventChartCustom(CID, MY_SEND_DATA, memid, 0, "");
// baykuş N2
void OnChartEvent(const int id, const uzun &lparam, const double &dparam, const string &sparam)
{
if( id == CHARTEVENT_CUSTOM+MY_SEND_DATA )
{
LPVOID ptr = GlobalLock((HANDLE)lparam);
MqlRates oranları[123];
// alınan oranlar
memcpy(oranlar[0].time,ptr,123*sizeof(MqlRates)); // burada prototip int memcpy(datetime&,const int&,int)
GlobalUnlock(memid);
GlobalFree(memid);
}
}
Her şey .. boru yok, harici dosyalar, sol dll'lerin içe aktarılması
Büyük olasılıklara sahip küçük bir örneği çabucak verdim, ancak düşünce uçuşunun sınırı yok
Evet, GlobalAlloc ile ilgili olarak, belirli bir işlem için bir işaretçi almak için GMEM_MOVEABLE'ı bellek kilitleme ve kilit açma ile kullanmanızı tavsiye ediyorum, geri verin.
Sabit bir glob kullanıyorsanız. bellek, daha sonra N'inci açık tanımlayıcı sayısı ile parçalanma meydana gelebilir ...
OS çekirdeği, yüke bağlı olarak bu şekilde isteyecektir.
iyi şanslar hackerlar
Örneğin, terminal işleminde bellekle çalışmak için boşta konuşmamak için, 4 baytlık bir işaretçi kullanabilir ve memcpy'yi içe aktarabilirsiniz.
Eski Henry Warren'ın "Programcılar için Algoritmik Püf Noktaları" adlı böyle bir kitabı var, yani bu tür birçok numara var. Doğru, C++ işaretçilerinin olmaması nedeniyle örneklerin çoğu MQL'de çalışmayacaktır.
Eğlenceli bir şeyler bulmaya çalışacağım.
Artısını bilenler için küçük bir açıklama daha.
C'de:
int var = 0; // bir değişken tanımla
int*ptr = &var; // var değişkenine bir işaretçi getir
intvar2 = *ptr; // değeri işaretçi ile var2'ye kopyalayın
MQL'de:
#ithalat "msvcrt.dll"
uint memcpy(int& hedef, const int& kaynak, int cnt); // hedef değişkenin adresini almak için memcpy prototipi
uint memcpy(int& hedef, uint ptr, int cnt); // ptr adresinden kopyalanacak memcpy prototipi
// derleyici, ikinci argümanın tür farkına göre iki prototipten birini değiştirecektir.
// uint gibi bir işaretçi türü alın
#içe aktarmak
int var = 0;
uint ptr = memcpy(var,var,0); // ptr işaretçisini var'a getir (burada memcpy hiçbir şeyi kopyalamaz ama var'ın adresini döndürür)
intvar2;
memcpy(var2, ptr, 4); // 4 bayt veya sizeof(int) ptr işaretçisinden var2 değişkenine kopyalayın (ikinci memcpy prototipi çalışır)
Umarım alıcı sizin için yararlı olur)))
C'deki örneğime benzer bir şey bulamazsınız))) Birincisi, MQL, ikincisi, işaretçilerin C sözdizimini atlayarak.
Umarım alıcı sizin için yararlı olur)))
Millet, nasılsa bir şeyler yazmak için yazmayın.
Memcpy ile tüm bu seçenekler birkaç yıl önce çiğnendi ve bu konu için uygun değil.
Millet, nasılsa bir şeyler yazmak için yazmayın.
Memcpy ile tüm bu seçenekler birkaç yıl önce çiğnendi ve bu konu için uygun değil.
Onu kod tabanına sokmak istedim ama sonra fikrimi değiştirdim:
MQL5'i Kaggle, Rakam Tanıyıcı görevinde kullanma
Millet, nasılsa bir şeyler yazmak için yazmayın.
Memcpy ile tüm bu seçenekler birkaç yıl önce çiğnendi ve bu konu için uygun değil.
Neden "uygun değil"?
Nerede olduğunu unuttum ve bulamadım...
Bu arada, harici DLL'leri dahil etmeden bir işaretçiyi bir diziye kaydetmenin bir başarı olduğunu düşünürdüm. DLL'den işlevleri içe aktarmayı kabul ettiğime dair göstergeleri her başlattığımda onaylamak istemiyorum
Neden "uygun değil"?
Nerede olduğunu unuttum ve bulamadım...
Bu arada, harici DLL'leri dahil etmeden bir işaretçiyi bir diziye kaydetmenin bir başarı olduğunu düşünürdüm. DLL'den işlevleri içe aktarmayı kabul ettiğime dair göstergeleri her başlattığımda onaylamak istemiyorum
Bir diziyi bir sınıfa sarın, yeni aracılığıyla ona MQL sözde işaretçileri yapabilirsiniz.
Aleksey, OnCalculate() işlevi tarafından üretilen dizileri bir sınıfa nasıl saracağımı söyler misiniz - bu durumda işaretçileri kopyalamak vazgeçilmezdir.
Şimdi - Verileri dizi sınıfıma kopyalıyorum ve sonra zaten bu nesneye bir işaretçi çekiyorum. Ancak, gördüğüm gibi, sık keneler ve çok sayıda çizelgeyle, oldukça belirgin bir şekilde "ağırlık" ekleyen gereksiz kopyalama ortaya çıkıyor. Bu kopyadan kurtulmak istiyorum. Ancak, DLL aracılığıyla koltuk değneği dışında (en azından standart, en azından samopisnuyu) - siz hiçbir şey sunana kadar.
Servis Masasında - savaşırlar, "nesne silinebilir" derler. Bunlar kendi dizileri! Bir nesne oluşturup silebilirim dediğinizde pointer geçersiz olur diye cevap veriyorlar, "Bundan ben sorumlu olacağım" diyorlar. "Çifte ahlak" vardır.
Ve cehenneme, bu DLL ile - ancak başlangıçta, bu tür göstergeler sürekli onay gerektirir - bu çok rahatsız edici ...