Na MQL5 há sempre espaço para uma exploração! ;)

 

Sugiro publicar e analisar todo o tipo de "impossibilidades" de mql5, como esta: Compilação Condicional.

É possível mostrar a possibilidade no início(sem revelar a implementação) a fim de torturar pessoas inquisitivas e estimular a criatividade do próprio leitor.

Mas no final, é necessário (obrigatório!) revelar o segredo e fornecer uma amostra de implementação.

Claro que uma tal forma de "duas fases" está repleta de embustes, mas vou confiar em declarações honestas de trabalhadores milagrosos, que estão prontos a "recuar". :)

--

So........ AQUI VAMOS !

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

Aqui vamos nós. Eu primeiro. :)

Embora os lugares mais "mágicos" abrandem muito - mas... Talvez um dos feiticeiros do mql5 encontre uma forma de o acelerar?

// Pode ver por si próprio como são lentos, o teste é dedicado a medir a sua velocidade.

Este código funciona de acordo com a sintaxe habitual da utilização de matrizes bidimensionais.

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

Ainda não poderá compilar o código : os injectores estarão disponíveis mais tarde... - caso contrário, não será tão interessante. :)

Então, quem pode repetir a proeza?

Arquivos anexados:
 

Enquanto Vladimir espera por uma resposta nossa, tenho uma pergunta digna de uma proeza ;)


Como podemos fazer uma ex5 funções de importação de 32 e 64 DLLs?
Digamos que fazer um ex5 para dois terminais (32/64).


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

Enquanto Vladimir espera por uma resposta nossa, tenho uma pergunta digna de uma proeza ;)


Como podemos fazer uma ex5 funções de importação de 32 e 64 DLLs?
Digamos, para fazer um ex5 para dois (32/64) terminais.

Está a pedir novamente excepções?
 
Urain:
Está a pedir novamente excepções?

Não, nunca tinha pedido uma excepção antes. Provavelmente não se trata disso, trata-se mais de #ifdef

Esperava que, se Vladimir fosse capaz de sobrecarregar operações usando o seu código, o seu método pudesse funcionar para activar automaticamente a DLL o_O

Uma espécie de #importância dentro de #define

 
MetaDriver:

Aqui vamos nós. Eu primeiro. :)

Então, quem pode repetir a proeza?

Está a demorar muito tempo a repetir a sua proeza :) Embora haja um exemplo semelhante na documentação.

//--- перебираем строки для сложения
   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á a demorar muito tempo a repetir a sua proeza :) Embora haja um exemplo semelhante na documentação.

Portanto, faça-o por essa analogia... nada de especial! :-))

E vou dar uma vista de olhos. ;)

 
sergeev:

Como posso importar funções de 32 e 64 DLLs para um ex5?
Digamos que fazer um ex5 para dois terminais (32/64).

As funções têm nomes diferentes. E no código, colocar chamadas condicionais, dependendo da taxa de bits do terminal, a funções diferentes.

Parece-me que o terminal carrega DLL à primeira chamada. Nenhuma chamada - nenhuma tentativa de carregar e nenhum aborto espontâneo crítico.

Não vejo outras formas. A bitness terminal é devolvida por TerminalInfoInteger().

bool x64 = TerminalInfoInteger(TERMINAL_X64);

Tudo isto pode ser feito directamente na biblioteca MyLib.ex5.



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

As funções têm nomes diferentes. E no código, colocar chamadas condicionais, dependendo da taxa de bits do terminal, a funções diferentes.

Parece-me que o terminal carrega DLL à primeira chamada. Nenhuma chamada - nenhuma tentativa de carregar e nenhum aborto espontâneo crítico.

Não vejo outras formas. A bitness terminal é devolvida por TerminalInfoInteger().

Tudo isto pode ser feito directamente na biblioteca MyLib.ex5.

Sim, a mesma opinião, esse terminal cria um objecto com a função dll apenas na primeira chamada.

E sobre o bitness parece ter havido algumas menções sobre a representação diferente dos números no fórum, se o campo de bit de variável dá um resultado mas será 32 se outro, será 64. Pode ser determinado pela experiência.

 
MetaDriver:

As funções têm nomes diferentes. E no código, colocar chamadas condicionais, dependendo da taxa de bits do terminal, a diferentes funções a que se referir.

Parece-me que o terminal carrega DLL à primeira chamada. Nenhuma chamada - nenhuma tentativa de carregar e aborto crítico.

Não, cavalheiros, não compreendem o problema. As possibilidades com TERMINAL_X64 ou _Is64 são conhecidas.

Mas infelizmente o terminal faz diferente.

- Quando se corre para o gráfico verifica a lista de DLLs utilizadas e mostra a lista de funções importadas na janela Dependências
Nas DLL's que não correspondem à bitness escreve um aviso MQL5\Libraries\somedll64.dll' não é uma versão de 32 bits

- Mas quando pressiona OK e o Expert Advisor começa, está realmente em apuros.

O terminal gera erro 193 e descarrega o EX5

Não é possível abrir 'MQL5\Libraries\somedll64.dll' (193)
O carregamento do EX5 falhou

E quero chamar a vossa atenção para o facto de que este código contém apenas a declaração DLL e nenhuma função é importada a partir dela

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

E por isso há a questão número um.

Como se importam funções de 32 bit dlls como user32.dll etc. para uma aplicação de 64? Ou existem cópias para eles no sistema com esse nome e é criado o espaço OOP ?