Referências de matriz - página 6

 

Para informação:

  1. Todas as matrizes em MQL5 são passadas apenas por referência (4 ou 8 bytes na pilha), por isso não tenha medo de passar matrizes dentro de funções - sem custos especiais.
  2. É muito perigoso armazenar referências de memória reais, especialmente referências a matrizes controladas pelo próprio terminal(amortecedores indicadores, amortecedores OHLC), porque são realmente alteradas/alocadas. Além disso, é impossível guardar referências não documentadas entre chamadas (saída e entrada do código de script) para a EA.
  3. Ao passar uma matriz para uma DLL, o endereço inicial do bloco de dados é especificado, e as dimensões têm de ser especificadas separadamente.
 
mql5:

A primeira coisa a entender é porquê? E qual é a sua utilidade?

Se não quiser fazer ligações, nós próprios o faremos.

E graças aos participantes, graças aos posts neste tópico descobri que a descrição na ajuda está desactualizada...

Sim, é hilariante ) . Mas na verdade, nem sequer pensei que pudesse ser publicado na ajuda.

Talvez então já me possa falar de todas as bandeiras?

Renat:

Para informação:

  1. Todas as matrizes em MQL5 são passadas apenas por referência (4 ou 8 bytes na pilha), por isso não tenha medo de passar matrizes dentro de funções - sem custos especiais.

Não tenho medo, estou bem ciente de que é barata. É apenas inconveniente.

  1. É muito perigoso armazenar referências de memória reais, especialmente referências a matrizes geridas pelo próprio terminal(buffers indicadores, buffers OHLC), porque elas são realmente alteradas/alocadas. Mais ainda, as referências não documentadas entre chamadas (saída e entrada em código de script) da EA não devem ser guardadas.

Por favor, esclareça este ponto - pode haver reafectação de memória durante a OnCalculate? Isto é uma treta.

Entre chamadas, é claro, é claro.

Não quero ter uma característica que ligue um indicador ou terminal em geral, por isso vou utilizar a variante mais segura disponível.

 
TheXpert:

Mais sobre este ponto, por favor - pode haver realocação de memória durante a OnCalculate? Isso é uma loucura.


Não "durante" - entre.
 
TheXpert:

Mais sobre este ponto, por favor - pode haver realocação de memória durante a OnCalculate? Isso é uma chatice.

Entre chamadas, é claro, é compreensível.

É claro que estamos a falar de uma possível redistribuição entre chamadas.

O problema é que alguém irá salvar referências entre chamadas por engano ou explicitamente, em 99% dos casos tudo irá funcionar até ao crash. Depois disso, haverá pensamentos bastante esperados "a culpa é dos Metakvotes".

Por exemplo, tivemos tais pensamentos transmitidos por um camarada e continuámos a fazê-lo durante vários anos, incapazes de aceitar o facto de que a história entre chamadas pode ser trocada/alterada.

 
Renat:

Naturalmente, estamos a falar de uma possível redistribuição entre chamadas.

O problema é que alguém está obrigado a salvar a ligação entre chamadas por engano ou explicitamente, em 99% dos casos tudo irá funcionar até ao acidente. Depois disso, haverá os esperados pensamentos "It's Metakwots fault".

"Temer a culpa é não andar para a frente" (c).

E mais uma coisa: é melhor lamentar o feito, do que o não feito.

Renat, digamos que concordo que as variáveis de referência são uma fonte potencial de problemas, mas isto pode ser dito sobre quase todas as ferramentas. Por vezes, as pessoas espetam outras pessoas com chaves de fendas. Não faz sentido proibir agora as chaves de parafusos, e é ainda mais insensato simplesmente retirá-las da produção, porque podem ser feitas em casa sem demasiados problemas.

"Referências" como uma entidade mql é altamente desejável, não mesmo sob a forma de variáveis, mas como uma possibilidade de devolver uma referência ( lvalue ) da função. Isto permitirá fazer pelo menos indexadores realmente rápidos à esquerda para contentores e dar muitas outras características adicionais, como por exemplo:

MyTree.Search(Key).GetElement() = NewVal;

E eu compreendo que as pessoas vão querer devolver uma referência a uma variável local de uma função!

Esquecer as referências, porque podem tornar a vida mais difícil para os tolos?)

--

Tais limitações de mql5 (como a falta de ligações) motivam por vezes fortemente a "fuga para DLL", transformando o MT5 apenas num "motor de mercado" que proporciona ligação com o corretor. Mas a ideia original era precisamente o oposto - eliminar a necessidade de utilizar ferramentas de programação externas, porque"tudo está bem aqui".

 

Não há volta a dar, uma vez que o nosso objectivo é a máxima segurança linguística.

Trabalhar com ligações em bruto é um passo sólido e seguro em direcção a um acidente. E não são permitidos programas de "crashing" com todo o sistema de virtualização retirado.

A nossa decisão é plenamente informada. A MQL5 é utilizada para escrever programas que serão executados num grande número de computadores, e sem envolvimento humano.

 

De qualquer modo, espero que o princípio seja claro para qualquer pessoa que precise dele. Vou guardá-lo por agora, só para o guardar para mim. Mas ela estará, e estará aberta.

Não preciso de explicar que as referências a tipos básicos, como int, são muito mais fáceis de fazer sem demasiados problemas.

A única questão que causa complexidade e problemas de implementação é o âmbito da variável subjacente. Há realmente uma vasta gama de possibilidades.

________

Bem, e por motivação vale a pena notar que as ligações abrem toda uma camada de possibilidades adicionais, como os invólucros, por exemplo.

 
Estão planeadas ligações de valor...
 
mql5:
Estão planeadas ligações de valor...
Meu, devias ter-me dito logo) Eu não teria lutado. Mas isto é óptimo.
 

Saudações a todos.


Será que alguma coisa mudou em oito anos?

Ou, ainda é possível obter um endereço de matriz da OnCalculate() usando apenas a função msvcrt.dll e memcpy?

Ou todos continuam a "arrastar" referências a matrizes através de toda a estrutura de classes (alternativamente, organizando as suas próprias matrizes e copiando sempre o conteúdo) ?