MQL5'te her zaman kahramanlığa yer vardır! ;) - sayfa 8

 
havanda bir şey kalmutit suyu.
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.

#ithalat "msvcrt.dll"
int memcpy(short&,short&,int);
int memcpy(int&,int&,int);
int memcpy(double&,double&,int);
int memcpy(dizi&s,dizi&s,int);
#içe aktarmak

bir çeşit sarmalayıcı sınıfı:

yapı TPtr
{
int adres;
TPtr():addr(0){}
TPtr(const TPtr& r):addr(r.addr){}
şablon<typename _T> TPtr operatörü =(_T& r) {
addr = memcpy(r, r, 0);
bunu iade et;
}
};


peki, bir yusaja örneği:

string sval = "123";
kısa bval = 123;
int değer = 123;
çift dval = 123.123;

TPtrp = sval;
intptrs = p.addr;
p = bval;
int ptrb = p.addr;
p = ival;
int ptri = p.addr;
p = dval;
int ptrd = p.addr;

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

#import "kernel32.dll"
HANDLE GlobalAlloc(uint bayrakları, uint cnt);
LPVOID GlobalLock(HANDLE hmem);
int GlobalUnlock(HANDLE hmem);
KOLU GlobalFree(HANDLE hmem);
#import "ntdll.dll"
// GetLastError MT'de zaten var, bu nedenle WinAPI'den kullanın:
int RtlGetLastWin32Error();
#içe aktarmak


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
 
alexsis78 :

Ö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.
konuyu yanlış anlamışsın
 

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.

 
C'deki örneğime benzer bir şey bulamazsınız))) Birincisi, MQL, ikincisi, işaretçilerin C sözdizimini atlayarak.

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)))
 
alexsis78 :
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.

 
o_O :

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.

Katılıyorum ve işaretçi aritmetiği olmayan varyant tanımlandı, yani kusurlu. Evet ve gerçekten gerekli değiller, C# da değiller. Güvenli değil, ancak bu sadece kişisel kullanım içindir, ağ kurulumunun yasaklanması vb. Gibi bir dizi kısıtlama olacaktır.
 

Onu kod tabanına sokmak istedim ama sonra fikrimi değiştirdim:

MQL5'i Kaggle, Rakam Tanıyıcı görevinde kullanma

Digit Recognizer | Kaggle
  • www.kaggle.com
Kaggle is your home for data science. Learn new skills, build your career, collaborate with other data scientists, and compete in world-class machine learning challenges.
Dosyalar:
sampleMNIST.mq5  25 kb
 
o_O :

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

 
George Merts :

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.
 
Alexey Volchanskiy :
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 ...

Neden: