Minha abordagem. O núcleo é o motor. - página 99

 
Реter Konow:
Em resumo, toda vez que você muda um valor de parâmetro de usuário, este valor deve ser convertido em uma variável unificada e imediatamente salvo em uma matriz de bytes compartilhada, que você pode então converter para uint e escrever para o recurso.

Você deve ter um parâmetro de usuário dentro da estrutura do sindicato. Quando você muda o parâmetro, a estrutura mudará com uma mudança simultânea da matriz int

union c
{
  uint i[2];
  long width;
}cc;
 
cс.width = 200;

i[2] é um recurso do usuário que é lido por outro programa.

Com uma linha cc.width = 200, você mudará:

  1. O parâmetro responsável pela largura,
  2. A estrutura que contém este parâmetro,
  3. O conjunto do recurso que está sendo lido pelo outro programa.

E aqui não há conversão e cópia, apenas mapeamento.
 
Vasiliy Sokolov:


Posso alterar as funções do invólucro no arquivo de propriedades de conexão e converter cada valor utilizável para a variável correspondente da união, e fazer uma matriz de bytes em tempo real. Mas, valores de texto que também precisam ser passados, convertidos em matriz de bytes usandoStringToChar().

No entanto, isto elimina a questão do uso de um sindicato. Afinal de contas, se eu tenho que usarStringToChar() de qualquer maneira, por que não montar tudo em uma corda e depois traduzir toda a corda em bytes usandoStringToChar()?

 
Vasiliy Sokolov:

Você deve ter um parâmetro de usuário dentro da estrutura do sindicato. Quando você muda o parâmetro, a estrutura mudará com uma mudança simultânea da matriz int

i[2] é um recurso do usuário que é lido por outro programa.

Com uma linha cc.width = 200, você mudará:

  1. O parâmetro responsável pela largura,
  2. A estrutura que contém este parâmetro,
  3. O conjunto do recurso que é lido por um programa de terceiros.

E aqui não há conversão ou cópia, apenas mapeamento.

Vasily, você está esquecendo que estamos falando de comunicação nos dois sentidos. Em meu motor, posso vincular tudo aos sindicatos, mas não posso ser responsável pelo código do usuário. Só posso inventar invólucros e colocá-los nos plugins.

Onde está a garantia de que o usuário também utilizará os sindicatos? Assim, quando ele chama minhas funções de invólucro, eu mesmo tenho que tirar seu valor e lançar para uma das minhas variáveis a partir de minhas uniões dentro de seu arquivo de plugin.

 
Реter Konow:

Posso alterar as funções do invólucro no arquivo de propriedades de conexão e converter cada valor utilizável para a variável correspondente da união, e fazer uma matriz de bytes em tempo real. Mas, valores de texto que também precisam ser passados, convertidos em matriz de bytes usandoStringToChar().

No entanto, isto elimina a questão do uso de um sindicato. Afinal de contas, se eu tenho que usarStringToChar() de qualquer maneira, por que não montar tudo em uma corda e depois traduzir toda a corda em bytes usandoStringToChar()?

Porque você terá uma análise dupla. Você vai converter tudo em um fio, é muito lento. Em seguida, você divide o fio em uma matriz, o que é muito rápido. Depois você o monta de volta a uma corda - isso é muito rápido. Então você divide o cordel nos tipos certos - isso é muito lento.

 
Реter Konow:

OK, mas e os textos?

Eles têm que ser convertidos em bytes viaStringToChar(). Você não pode usar o sindicato, certo?

Sim, você tem que traduzi-los, mas é rápido, ao contrário do parsing.

 

Por exemplo:

Aqui está a função de invólucro no arquivo plug-in depropriedades de conexão:

string E_Last_10_bars_2_Close_price(string n = rare_value,  int Property = -1){return(GET_N_SET(11,n,Property));}

Esta função é chamada assim:

E_Last_10_bars_2_Close_price(Close[2]);

Ou seja, o usuário define o valor deClose[2] em uma célula de tabela.

Close[2] - это значение дабл.

Assim, dentro de sua função de embalagem em seu programa, eu posso representar o valor(Close[2]) como uma matriz de caracteres.

Mas, na mesma célula, o usuário pode enviar o valor "Olá! :)", e então o que fazer?

E_Last_10_bars_2_Close_price("Привет! :)");
 
 

Oh, Peter, você começou com a linguagem de programação errada. Você deveria ter aprendido algo que não fosse estritamente datilografado.

Em geral, eu o entendi, você inventou sua própria linguagem não dita com base no MQL. Você contorna sua digitação rigorosa usando cordas. Esta é uma manobra!

 
Vasiliy Sokolov:

Oh, Peter, você começou com a linguagem de programação errada. Você deveria ter aprendido algo que não fosse estritamente datilografado.

Em geral, eu o entendi, você inventou sua própria linguagem não dita com base no MQL. Você contorna sua digitação rigorosa usando cordas. Esta é uma manobra!

Sim,)) Um movimento com um cavaleiro!

 

Se você estiver usando uma tabela, você deve decidir se deseja que os dados da tabela sejam estritamente numéricos ou textuais. Se texto, você passa em cordas. Se for real, sua função deve se parecer com esta:

string E_Last_10_bars_2_Close_price(double n,  int Property = -1){return(GET_N_SET(11,n,Property));}