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

 

Burada, bunun gibi her türlü "imkansızlık" mql5'i yayınlamayı ve analiz etmeyi öneriyorum: Koşullu derleme .

Meraklı insanlara eziyet etmek ve okuyucunun kendi yaratıcılığını teşvik etmek için önce özelliği ( uygulamayı açıklamadan ) gösterebilirsiniz.

Ama nihayetinde , sırrı ortaya çıkarmak ve örnek bir uygulama sağlamak (zorunlu!) gereklidir.

Tabii ki, böyle bir "iki aşamalı" form aldatmacalarla doludur, ancak "pazara cevap vermeye" hazır sihirbazların dürüst ifadelerine güveneceğim. :)

--

Öyleyse........ BAŞLA!

 
Итак........ НАЧАЛИ !

İyi. İlk ben. :)

Doğru, en "büyülü" yerler oldukça yavaştır - ama... mql5 sihirbazlarından biri biraz sonra hızlandırmanın bir yolunu bulabilir mi?

// Ne kadar yavaşladıklarını kendiniz görebilirsiniz, test sadece işin hızını ölçmeye adanmıştır.

Bu kod, iki boyutlu dizileri kullanmak için olağan sözdizimine göre çalışır.

 void OnStart ()
  {
   float   FA[ 5 ][ 3 ];
   long st= GetTickCount ();
   for ( int t= 0 ;t< 1000000 ;t++)
     {
       for ( int i= 0 ;i< 5 ;i++)
        {
         for ( int j= 0 ;j< 3 ;j++)
           {
            FA[i][j] = (i+ 1.5 )*(j+ 1.3 );
           }
        }
     }
   Print ( "====" , GetTickCount ()-st, " ms ====" );
   
   st= GetTickCount ();
   C2DMagicArray  MA( 5 , 3 );   
   for ( int t= 0 ;t< 1000000 ;t++)
     {
       for ( int i= 0 ;i<MA.SizeL();i++)
        {
         for ( long j= 0 ;j<MA.MaxR();j++)
           {
             MA[i][j] = (i+ 1.5 )*(j+ 1.3 );  
             // ^  ^  Как это сделано ??? Можете повторить ? :))
           }
        }
     }
   Print ( "====" , GetTickCount ()-st, " ms ====" );
   st= GetTickCount ();
   for ( int t= 0 ;t< 1000000 ;t++)
     {
       for ( int i= 0 ;i<MA.SizeL();i++)
        {
         for ( long j= 0 ;j<MA.MaxR();j++)
           {
            MA.Set(i,j, float ((i+ 1.5 )*(j+ 1.3 )));
           }
        }
     }
   Print ( "====" , GetTickCount ()-st, " ms ====" );

   for ( int i= 0 ;i<MA.SizeL();i++)
     {
       for ( int j= 0 ;j<MA.MaxR();j++)
        {
         Print ( MA[i][j] );  
         //         ^  ^    Как это сделано???  :))  Жду Вашу версию !
        }
     }
  }

Henüz kodu derleyemeyeceksiniz: kapsayıcılar daha sonra olacak... - aksi halde o kadar ilginç olmayacak. :)

Peki, kim başarıyı tekrarlayabilir?

 

Vladimir bizden cevap beklerken benim de ustalığı hak eden bir sorum var ;)


Bir ex5'te 32 ve 64 DLL'den işlevleri nasıl içe aktarabilirim ?
Diyelim ki iki (32/64) terminal için bir ex5 yapalım.


Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 
sergeev :

Vladimir bizden cevap beklerken benim de ustalığı hak eden bir sorum var ;)


32 ve 64 DLL'lerin işlevlerinin bir ex5'e aktarıldığından nasıl emin olabilirim?
Diyelim ki iki (32/64) terminal için bir ex5 yapalım.

Yine bir istisna mı istiyorsun?
 
Urain :
Yine bir istisna mı istiyorsun?

Hayır, asla istisna istemedim. Ve muhtemelen onlarla ilgili değil. #ifdef'e daha yakın

Vladimir, aşırı işlem yükünü kodla sonlandırmayı başarırsa, belki de yönteminin gerekli DLL'leri otomatik olarak dahil etmek için uygun olacağını umuyordum o_O

#define içinde bir tür #import

 
MetaDriver :

İyi. İlk ben. :)

Peki, kim başarıyı tekrarlayabilir?

Belgelerde benzer bir örnek verilmiş olmasına rağmen, bir şey uzun süre başarınızı tekrarlamıyor :) .

 //--- перебираем строки для сложения
   for ( int i= 0 ;i<rows;i++)
     {
       //--- запишем результаты сложений строк матриц в массив
       for ( int k= 0 ;k<cols;k++)
        {
         arr[k]= this [i][k]+m[i][k];
        }
       //--- поместим массив в строку матрицы
      res[i]=arr;
     }
 
Yurich :

Belgelerde benzer bir örnek verilmiş olmasına rağmen, bir şey uzun süre başarınızı tekrarlamıyor :) .

Peki, bu benzetmeye göre yapın ... iş bir şey! ... :-))

Ve bir bakacağım. ;)

 
sergeev :

32 ve 64 DLL'lerin işlevlerinin bir ex5'e aktarıldığından nasıl emin olabilirim?
Diyelim ki iki (32/64) terminal için bir ex5 yapalım.

Fonksiyonlar farklı şekilde adlandırılır. Ve kodda, terminalin bitliğine bağlı olarak koşullu çağrılar yapın, farklı işlevlere erişin.

Bana öyle geliyor ki, terminal ilk çağrıda DLL'yi yüklüyor. Çağrı yok - indirme girişimi yok ve kritik bir düşük.

Henüz başka bir yol göremiyorum. Terminal bitliği, TerminalInfoInteger() değerini döndürür

 bool x64 = TerminalInfoInteger (TERMINAL_X64);

Bütün bunlar doğrudan MyLib.ex5 kitaplığında yapılabilir.



void MyLibMultibitFunc()   // библиотечная универсальная обёртка для DLL-функции
{
   if (x64) { MyDll64Func(); }
   else { MyDll32Func(); }
}
 
MetaDriver :

Fonksiyonlar farklı şekilde adlandırılır. Ve kodda, terminalin bitliğine bağlı olarak koşullu çağrılar yapın, farklı işlevlere erişin.

Bana öyle geliyor ki, terminal ilk çağrıda DLL'yi yüklüyor. Çağrı yok - indirme girişimi yok ve kritik bir düşük.

Henüz başka bir yol göremiyorum. Terminalin bitliği TerminalInfoInteger() tarafından döndürülür.

Bütün bunlar doğrudan MyLib.ex5 kitaplığında yapılabilir.

Evet, ayrıca terminalin yalnızca ilk çağrıda bir dll işlevi nesnesi oluşturduğu görüşünde.

ve bitlik ile ilgili olarak, forumda sayıların farklı temsilinden bahsedilmiş gibi görünüyor, eğer bit alanı bir değişiklikle sonuç verirse, ancak 32, diğeri 64 ise, o zaman 32 olacaktır. Ampirik olarak belirleyebilirsiniz.

 
MetaDriver :

Fonksiyonlar farklı şekilde adlandırılır. Ve kodda, terminalin bitliğine bağlı olarak koşullu çağrılar yapın, farklı işlevleri çağırın.

Bana öyle geliyor ki, terminal ilk çağrıda DLL'yi yüklüyor. Çağrı yok - indirme girişimi yok ve kritik bir düşük.

Hayır beyler, sorunu anlamıyorsunuz. TERMINAL_X64 veya _Is64 ile olasılıklar bilinmektedir.

Ancak ne yazık ki terminal farklı şekilde yapıyor.

- çizelgeye atıldığında, kullanılan DLL'lerin listesini kontrol eder ve Bağımlılıklar penceresinde içe aktarılan işlevlerin listesini görüntüler.
Bit ile eşleşmeyen DLL'lerde MQL5\Libraries\somedll64.dll' uyarısı 32-bit sürüm değil yazıyor.

- ve sonra Tamam'a bastığınızda ve Uzman Danışman başladığında, işte pusu sizi burada bekliyor.

terminal 193 hatası veriyor ve EX5'i kaldırıyor

'MQL5\Libraries\somedll64.dll' açılamıyor (193)
EX5 yüklenemedi

Ve kodda yalnızca bir DLL bildirimi olduğuna ve ondan hiçbir işlevin içe aktarılmadığına dikkat etmek istiyorum.

#import "somedll64.dll"
#içe aktarmak
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
Документация по MQL5: Основы языка / Препроцессор / Импорт функций (#import)
  • www.mql5.com
Основы языка / Препроцессор / Импорт функций (#import) - Документация по MQL5
 

Ve böylece bir numaralı soru var.

Bir 64 uygulama, user32.dll vb. gibi 32-bit dll'lerden nasıl içe aktarılır? Yoksa sistemde bu isimle kopyaları var mı ve OOP alanı mı oluşuyor?