Yeni MQL4 sözdizimi - sayfa 4

 
Doğru, çok iyi bir sebep olmadıkça, kodumda sadece bool, int, double ve string var. İndekslerde -1 ile uğraşmazdım, aksi takdirde bu indekse yaklaşan her tamsayıyı kullanmam gerekiyordu.
 
RaptorUK :

uchar - İmzasız Karakter, bunu neden bir döngü için kullanasınız? bana mantıklı gelmiyor. . . bir int kullanın. Ulonglarla çalışacaksınız, yeni bir tarihsaati budur. . . ve gelecekte hiç düşünmeden daktilo yazdığınızda uyarılacaksınız. . . uyarıyla ilgilenin veya görmezden gelin. Yine de en iyisini ummayın, şimdi yaptığınız gibi yapın, öğrenin ve anlayın.

Stackoverflow'tan gönderdiğiniz şeyler bana mantıklı geliyor, bence bu iyi bir tavsiye.

uchar, sorum küçük değişken türlerinin kullanımıyla ilgili olduğu için sadece bir örnekti. uchar, 0 ila 255 arasında 8 bitlik bir pozitif değerdir, bu nedenle 0 ila 100'lük bir döngü için, isterseniz 32 bit tam sayı yerine 8 bitlik uchar kullanabilirsiniz.
 
SDC :
uchar, sorum küçük değişken türlerinin kullanımıyla ilgili olduğu için sadece bir örnekti. uchar, 0 ile 255 arasında 1 baytlık bir pozitif değerdir, bu nedenle 0 ila 100 arasındaki bir döngü için 1 baytlık uchar'ı kullanabilirsiniz.
Evet yapabilirdin . . . ama neden yapasın? işe yarayacaktır, ancak bir döngü sayacı için karakter değerlerine yönelik bir değişken türü kullanmak neden mantıklıdır?

Bir işlevden döndürülen bir değeri kaydetmeniz gerekiyorsa ve söz konusu işlev bir uchar döndürürse, döndürülen değeri kaydetmek için bir uchar değişkeni kullanın. . . orijinal mql4 ile bu bir sorun değildi, yeni mql4 ile daha çok bir sorun olacak.
 

Soruyu sorduğumda neden isteyeceğimi bilmiyordum, bu yüzden soruyu sordum lol ...

8 bitlik bir değişken türünün 32 bitten daha hızlı mı yoksa daha yavaş mı yoksa aynı mı olacağını bilmiyordum, 8 bitlik bir değerin daha az RAM mi yoksa daha az disk alanı mı kullanacağını bilmiyordum. Şimdi bu küçük değişken türlerine sahip olduğumuzu görünce, bunları sadece 32 bit tamsayılara bağlı kalmak yerine, kod bloğunun gereksinimlerine uyacakları zaman kullanmanın artılarını ve eksilerini bilmek istedim.

32 bitlik bir işletim sisteminin aynı anda dört 8 bitlik değeri işleyebileceğini düşündüm ama bilmiyordum. Görünüşe göre öyle değil. Bu, 64 bit işletim sisteminin neden daha fazla RAM'e erişebilmesi dışında 32 bitten çok daha hızlı olmadığını açıklar. Bunu çoğu zaman merak etmiştim.

 

Çözümünü bulamadığım bir sorum var.

void& nasıl kullanılır? Yani, bir DLL'ye herhangi bir işaretçi göndermem gerekirse. Yardım dosyasında bu void türünü kullanan işlevler var, ancak onu kaynakta herhangi bir yere yerleştirirsem derlenmez. Şablonu geçici bir çözüm olarak kullanmaya çalıştım, ancak #import deyiminde şablon yasaklandı.

Tek tipler için yapıyı yönettim, ancak açık türü belirtmedikçe DLL'ye geçiş void& dizi işaretçisini uygulayamıyorum.

 int   FileReadArray(
   int     file_handle,               // File handle
   void &  array[],                   // Array to record
   int     start= 0 ,                   // start array position to write
   int     count= WHOLE_ARRAY            // count to read
);
 
 

Bir DLL'ye yapı dizisini geçirmek için herhangi bir sınırlama var mı?

MT4Structure'ın basit bir yapı olduğunu varsayalım .

kernel32.dll dosyasını içe aktardıktan sonra, tek bir yapı gayet iyi çalışıyor:

 bool ReadFile(
     /*_In_         HANDLE*/ int hFile,
     /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
     /*_In_         DWORD*/ uint nNumberOfBytesToRead,
     /*_Out_opt_    LPDWORD*/ uint & lpNumberOfBytesRead[],
     /*_Inout_opt_  LPOVERLAPPED*/ int lpOverlapped
);

ama yapı dizisini kabul ederek işe giremiyorum. Bu bildirime parametre olarak gönderilirse, derleyici MT4Structure&[] ile derlenmeyecektir:

 bool ReadFile( int , MT4Structure&[], uint , uint &[], int );
 
Ovo :

Bir DLL'ye yapı dizisini geçirmek için herhangi bir sınırlama var mı?

Böyle bir şeyle ilgili bir sorun göremiyorum:

 struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

Beklendiği gibi çalışır (MT4 ve DLL'de farklı varsayılan yapı hizalamasına izin vermeniz şartıyla).

(BTW, şu anda bir MQL4 bool'un dahili temsilinin ne olduğundan emin değilim, ancak Win32 işlevlerini int döndüren olarak bildirmeyi tercih ederim. Win32 işlevleri, bir C++ bool yerine bir BOOL döndürür. BOOL, bir Windows makrosudur. değeri 1/0 olan 4 baytlık bir tamsayı için, C++ bool tek bir bayttır.MT4'e, işlevler aslında dört bayt döndürürken işlevlerden tek bir baytlık dönüş değeri beklemesini söylerseniz, yapabilirsiniz - yine de bu pek olası değil - yığın bozulmasıyla sonuçlanır.)

 
Ovo :

void& nasıl kullanılır? Yani, bir DLL'ye herhangi bir işaretçi göndermem gerekirse.

Sorunuzun ne olduğundan tam olarak emin değilim. Örneğin, Win32 API'sinin belgeleri, "bu, herhangi bir şey için herhangi bir işaretçi türünü kabul eder; Win32 işlevi , bellek bloğunuzun ne olduğu ile ilgilenmez" anlamına gelen void* kullanır.

 
gchrmt4 :

Sorunuzun ne olduğundan tam olarak emin değilim. Örneğin, Win32 API'sinin belgeleri, "bu, herhangi bir şey için herhangi bir işaretçi türünü kabul eder; Win32 işlevi, bellek bloğunuzun ne olduğu ile ilgilenmez" anlamına gelen void* kullanır.


Aynen öyle. Ancak MQL4 ile pek mümkün değil gibi görünüyor ve #import bloğunda bir şablon kullanılmasına izin verilmiyor. Bu nedenle, winapi ile ek yapı kullanmak, her yeni tür gerektiğinde #import bildirimlerinin manuel olarak güncellenmesine dönüşür. Bu benim için oldukça rahatsız edici, çünkü amacım ithalatı tek bir yerden yönetmekti.
 
Ovo :

Aynen öyle. Ancak MQL4 ile pek mümkün değil gibi görünüyor ve #import bloğunda bir şablon kullanılmasına izin verilmiyor. Bu nedenle, winapi ile ek yapı kullanmak, her yeni tür gerektiğinde #import bildirimlerinin manuel olarak güncellenmesine dönüşür. Ki bu benim için oldukça rahatsız edici.
Hala anladığımdan emin değilim ama... MQL4 içe aktarımını geçersiz* olarak ilan edebileceğinizi sanmıyorum. İçe aktarmada belirli bir veri türü kullanmanız gerekir ve daha sonra yalnızca bu veri türüyle DLL içe aktarımını kullanabilirsiniz. Aynı DLL işlevini farklı veri türleri ile kullanmak istiyorsanız, https://www.mql5.com/en/forum/148934 gibi bir geçici çözüm olmadığı sürece bir sorununuz var demektir.