¡En MQL5 siempre hay espacio para un exploit ! ;)

 

Sugiero publicar y analizar todo tipo de "imposibilidades" de mql5, como esta: Compilación condicional.

Es posible mostrar la posibilidad al principio(sin revelar la aplicación) para torturar a los curiosos y estimular la propia creatividad del lector.

Pero al final, es necesario (¡obligatorio!) revelar el secreto y proporcionar un ejemplo de aplicación.

Por supuesto, esta forma de "dos fases" está plagada de bromas, pero me fiaré de las declaraciones honestas de los hacedores de milagros, que están dispuestos a "echarse atrás". :)

--

Así pues, ........ ¡AQUÍ VAMOS!

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

Aquí vamos. Yo primero. :)

Aunque los lugares más "mágicos" son más bien lentos... ¿Quizá alguno de los asistentes de mql5 encuentre la forma de acelerarlo?

// Puedes comprobar por ti mismo lo lentos que son, la prueba se dedica a medir su velocidad.

Este código funciona según la sintaxis habitual del uso de arrays bidimensionales.

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] );  
         //        ^  ^    Как это сделано???  :))  Жду Вашу версию!
        }
     }
  }

Todavía no podrás compilar el código: el inlining vendrá después... - si no, no será tan interesante. :)

Entonces, ¿quién puede repetir la hazaña?

Archivos adjuntos:
 

Mientras Vladimir espera una respuesta nuestra, yo tengo una pregunta digna de una hazaña ;)


¿Cómo podemos hacer que un ex5 importe funciones de DLLs de 32 y 64?
Digamos que para hacer un ex5 para dos (32/64) terminales.


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

Mientras Vladimir espera una respuesta nuestra, yo tengo una pregunta digna de una hazaña ;)


¿Cómo podemos hacer que un ex5 importe funciones de DLLs de 32 y 64?
Por ejemplo, para hacer un ex5 para dos (32/64) terminales.

¿Estás pidiendo excepciones otra vez?
 
Urain:
¿Estás pidiendo excepciones otra vez?

No, nunca he pedido una excepción, probablemente no se trata de eso, sino de #ifdef

Esperaba que si Vladimir era capaz de sobrecargar las operaciones por código, su método podría funcionar para habilitar automáticamente la DLL requerida o_O

Un tipo de #importación dentro de #define

 
MetaDriver:

Aquí vamos. Yo primero. :)

Entonces, ¿quién puede repetir la hazaña?

Está tardando mucho en repetir su hazaña :) Aunque hay un ejemplo similar en la documentación.

//--- перебираем строки для сложения
   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:

Está tardando mucho en repetir su hazaña :) Aunque hay un ejemplo similar en la documentación.

Así que hazlo por esa analogía... ¡no es gran cosa!... :-))

Y voy a echar un vistazo. ;)

 
sergeev:

¿Cómo puedo importar funciones de DLLs de 32 y 64 en un ex5?
Digamos que para hacer un ex5 para dos (32/64) terminales.

Las funciones tienen diferentes nombres. Y en el código, poner llamadas condicionales, dependiendo de la tasa de bits del terminal, a diferentes funciones.

Me parece que el terminal carga la DLL en la primera llamada. Ninguna llamada, ningún intento de carga y ningún aborto crítico.

No veo otras formas. El bitness del terminal es devuelto por TerminalInfoInteger().

bool x64 = TerminalInfoInteger(TERMINAL_X64);

Todo esto se puede hacer directamente en la biblioteca MyLib.ex5.



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

Las funciones tienen diferentes nombres. Y en el código, poner llamadas condicionales, dependiendo de la tasa de bits del terminal, a diferentes funciones.

Me parece que el terminal carga la DLL en la primera llamada. Ninguna llamada, ningún intento de carga y ningún aborto crítico.

No veo otras formas. El bitness del terminal es devuelto por TerminalInfoInteger().

Todo esto se puede hacer directamente en la biblioteca MyLib.ex5.

Sí, la misma opinión, que el terminal crea el objeto dll-función sólo en la primera llamada.

Y sobre el bitness parece que hubo algunas menciones sobre la diferente representación de los números en el foro, si el campo de bits de la variable da un resultado pero será 32 si otro, será 64. Se puede determinar por la experiencia.

 
MetaDriver:

Las funciones tienen diferentes nombres. Y poner llamadas condicionales en el código, dependiendo del modo de bits del terminal, a diferentes funciones.

Me parece que el terminal carga la DLL en la primera llamada. No hay llamadas, no hay intento de carga y aborto crítico.

No, señores, no entienden el problema. Las posibilidades con TERMINAL_X64 o _Is64 son conocidas.

Pero, por desgracia, el terminal hace lo contrario.

- Cuando se precipita al gráfico, éste comprueba la lista de DLLs utilizadas y muestra la lista de funciones importadas en la ventana de Dependencias
En aquellas DLL's que no coinciden con el bitness escribe un aviso MQL5\Libraries\somedll64.dll' no es la versión de 32 bits

- Pero cuando pulsas OK y el Asesor Experto se pone en marcha, estás realmente en problemas.

El terminal genera el error 193 y descarga EX5

No se puede abrir 'MQL5\Libraries\somedll64.dll' (193)
Fallo en la carga de EX5

Y quiero llamar tu atención sobre el hecho de que este código contiene sólo la declaración de la DLL y no se importan funciones de ella

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

Y ahí está la pregunta número uno.

¿Cómo se importan funciones de dlls de 32 bits como user32.dll etc. a una aplicación de 64? ¿O hay copias para ellos en el sistema con ese nombre y se crea un espacio OOP?

Razón de la queja: