Erros, bugs, perguntas - página 168

 
Manov:

Tem"possível utilização de variável não-inicializada 'local_low'".

O que é que diz se

Se a variável for inicializada com qualquer coisa, o aviso desaparece. Mas como pode ver por si próprio, a inicialização da variável 'local_low' neste fragmento de código é desnecessária. Assim, o aviso não interfere em nada com a vida.
 
Renat:

Releia as minhas respostas do ponto de vista de um gestor de uma empresa de software que trouxe muitos projectos de software para o mercado.

Caso contrário, permanecendo ao nível de "qualquer programador", não compreenderá qual é o erro.

:) Uma vez que nunca serei o chefe de uma empresa de software, permanecerei para sempre ao nível de "qualquer programador" (ou seja, um programador amador, no meu entender).

...E como o programador amador nunca obtém uma descrição lógica do erro, conclui que ou simplesmente não há erro no seu pedaço de código ou o erro é tão complicado que ninguém o pode descrever na linguagem da lógica. Neste momento, podemos considerar que ambos os lados se entendem, a questão está terminada.

 
Yedelkin:
Se a variável for inicializada com qualquer coisa, o aviso desaparece. Mas, como pode ver por si próprio, a inicialização da variável local_low é redundante neste pedaço de código. Assim, o aviso não interfere em nada com a vida.
Um código concreto é provavelmente sim. mas o compilador terá de ser tão"infalível" quanto possível.
 
Então, o monitor inflamou-se e disse ao programador: nunca esconda a inicialização atrás de uma condição, nunca use uma variável de laço após o corpo do laço, verifique a divisão por zero, não multiplique as entidades desnecessariamente, não escreva se (a===verdadeiro) ...
 
Manov:
... O compilador terá de ser tão"infalível" quanto possível.
Não estou a discutir com isso. É um aviso útil. Quanto mais destes avisos tiver, melhor compreenderá o seu próprio código.
 
Vigor:
... não escrever se (a===verdadeiro) ...

A propósito, na Primavera tive formação de Expert Advisors, na qual, tendo lido muita literatura, introduzi condições do tipo if(a). Mas os peritos só começaram a trabalhar depois de eu ter alterado estas condições para condições como se (a===verdadeiro). Agora mal consigo sair deste hábito.
 
Yedelkin:

Mas devido ao uso de interrupção bool-variável na linha 9 logo após a inicialização da variável local_low na linha 8, verifica-se que na linha 15 a variável local_low terá a garantia de ser inicializada. Assim, neste ponto, o aviso "possível utilização da variável não inicializada 'local_low'" não significa "garantida" mas apenas a possível presença de um ramo de passagem em que a variável não é inicializada.
No seu exemplo, se Ac-k=0 , o para operador não será de todo executado e o local_baixo será garantido não-inicializado. Ou será errado?
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 

Se enviarmos um pedido para modificar uma posição com as mesmas paragens, receberemos um erro. Mas se enviar um pedido para modificar uma ordem pendente com os mesmos parâmetros, o pedido será executado. É assim que o planeámos e não precisamos de verificar os parâmetros para alterações?

Porquê entupir o servidor com pedidos desnecessários, por exemplo, em caso de erro no Expert Advisor ou lógica incorrecta do seu funcionamento?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Valmars:
No seu exemplo, se Ac-k=0 , então a declaração para declaração não será executada de todo e o local_baixo é garantido não-inicializado. Ou será errado?

É exactamente isso. Se Ac-k<=1, o para operador não deve ser executado de todo e a variável local_baixa é garantida para permanecer não-inicializada. Mas como a interrupção bool-variável permanece falsa (linha 3), em virtude da condição na linha 13, a variável não-inicializada local_low nunca (nunca deve) ser utilizada nos cálculos. Em particular, uma expressão com a variável local_low da linha 15 não deve ser avaliada [a menos, claro, que a declaração if funcione exactamente como indicado na ajuda:) ].

Por outras palavras, se for garantido que a variável local_low não será inicializada, também é garantido que não será (não deverá) utilizada nos cálculos.

 

void Graf()
{
if(ObjectFind(0, "H")<0) ObjectCreate(0, "H",OBJ_HLINE
,0,0,h,0);
if(ObjectFind(0, "L")<0) ObjectCreate(0, "L",OBJ_HLINE,0,0,0,l,0)
; ObjectSetDouble(0, "H",OBJPROP_PRICE,h)
; ObjectSetDouble(0, "L",OBJPROP_PRICE,l)
;
string bal = DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)
;
string equ = DoubleToString (AccountInfoDouble(ACCOUNT_EQUITY),2)
; string spread = DoubleToString(((Ask-Bid)/_Point),0)
; string space = ""
; string info= bal+space+equ+space+spread
;
if (ObjectFind(0, "info")<0) ObjectCreate(0, "info",OBJ_LABEL,0,0,0)
; ObjectSetInteger(0, "info",OBJPROP_XDISTANCE,0)
;
ObjectSetInteger(0, "info",OBJPROP_YDISTANCE,15)
; ObjectSetString(0, "info",OBJPROP_TEXT,info)
;
ObjectSetInteger(0, "info",OBJPROP_FONTSIZE,36)
; ObjectSetInteger(0, "info",OBJPROP_COLOR,Maroon)
; return
; }

Aqui está um pedaço de código. A função imprime o equilíbrio, equidade e valores de spread em cada tic. Mas a informação é mostrada por alguma razão, não para o tick anterior. Por favor, ajude-me a compreender porquê? Em MT4 código semelhante muda valores a cada novo tick, e em MT5 com um novo tick a informação é mostrada para tick anterior.