Características da linguagem mql5, subtilezas e técnicas - página 159

 
Yurixx:

Pode dizer-me, por favor, pls.

No indicador a ordem das séries, por exemplo fechar[], é definida pelo ArraySetAsSeries() uma vez ou de alguma outra forma ?

É feito em OnCalculate() ou em OnInit() ?

Encontrei uma situação confusa:

Encomendar no fim[], definido por AS_SERIES na entrada no primeiro tick, no tick seguinte muda espontaneamente para normal, ou seja !AS_SERIES.

Ainda não encontrei a razão para isto no código.

em qualquer função que obtenha scalar &arr[] não pode ter a certeza absoluta sobre a direcção da indexação da matriz:-(

Além disso, se mudar a "seriação" no interior, esta direcção permanecerá após o fim da sua função...será um efeito secundário, o que ninguém espera

é por isso que, infelizmente, quando obtiver uma matriz para entrada numa função, lembre-se da sua serialização, coloque-a a uma conveniente e devolva SEMPRE o original de volta quando sair da função

Este é um caso raro com a OnCalculate, mas na prática costumava ser chamado também a partir de outro código.

 
Maxim Kuznetsov:

Além disso, se mudar a "serialização" internamente, esta direcção permanecerá quando a sua função terminar...

Era com isso que eu estava a contar. É por isso que coloquei oArraySetAsSeries(close,true) no blocoOnCalculate(), que é executado apenas uma vez no primeiro login. E esta "serialização" foi de facto estabelecida. No entanto, para minha surpresa, no segundo tique, e mais além, a "seriação" já era o oposto.

Maxim Kuznetsov:

Com a OnCalculate é um caso raro, mas na prática também foi chamado a partir de outro código.

Não tenho tais exóticos e, além disso, não altero a "serialização" de séries temporais e matrizes tampão dentro do programa. Por conseguinte, bastar-me-ia fixá-lo uma vez, no início do indicador. Mas, se não pudermos ter a certeza de que a "seriação" destas matrizes está guardada, temos de a definir no início de cada laço OnCalculate(). Isto parece ser algo completamente antinatural.

 
input string inStr = NULL; // Входная строка не может быть NULL, но об этом нигде не сообщается.

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{
  string Str = NULL;
  
  PRINT(inStr == NULL); // false
  PRINT(Str == NULL);   // true


  PRINT(inStr == ""); // true
  PRINT(Str == "");   // false
}
É uma boa ideia gerar um aviso em tempo de compilação.
 
fxsaber:
É uma boa ideia gerar um aviso em tempo de compilação.

Se nada mudou desde os velhos tempos, NULL != "" Muitas pessoas já caíram nesta situação antes.

 
Alexey Viktorov:

Se nada mudou desde os velhos tempos, NULL != "" Muitas pessoas já caíram nesta situação antes.

Não é disso que estamos a falar.

 
fxsaber:

Estamos a falar de outra coisa.

Então explique porque não pode ser. Porquê

input string inStr = "";

pode ser, mas

input string inStr = NULL;

não pode ser.

 
Alexey Viktorov:

Então explique porque não pode ser.

O guião acima mostra isto.

 
fxsaber:

O guião acima mostra isto.

Se o fizesse, não haveria dúvidas. Pensa sempre que todos à sua volta devem ler a sua mente, ou estar melhor treinados do que você em programação.

 
Alexey Viktorov:

Se o fizesse, não haveria dúvidas. Pensa sempre que todos devem ler a sua mente, ou ser mais hábeis na programação do que você.

Não compreendo as razões para esta reacção. O código terse demonstra a característica a 100%.

 
fxsaber:

Não compreendo as razões para esta reacção. O código terse demonstra a característica a 100%.

Reacção normal. Não compreendo os vossos códigos, pedi uma explicação e a resposta é...

NULL é uma tal ambiguidade que é preciso lidar com ela com cuidado. Especialmente quando aplicado a variáveis de corda.

A partir da documentação

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if(some_string==NULL) some_string="empty";

Assim, neste exemplo, NULL não significa que o comprimento da cadeia é igual a zero, mas que a variável não é inicializada.

No seu exemplo

input string inStr = NULL;

a variável é inicializada. Não está claro para mim como é inicializado e não me apetece resolvê-lo.

Consequentemente,

PRINT(inStr == NULL); // false

Indica que a variável é inicializada. Mais uma vez, com o que é a grande questão. Porque pensa que é impossível inicializar uma variável por NULL?

Aparentemente, esta inicialização faz com que o comprimento da corda seja igual a zero, que é o que diz esta verificação

PRINT(inStr == ""); // true