Erros, bugs, perguntas - página 312

 
Academic:

Este aviso não deve ser dado, porque a função ObjectGetDouble passa uma referência e a declaração se verifica a verdade retornada por ambas as chamadas, e portanto só se ambas as funções retornarem verdade, então estas variáveis são tratadas, o que significa que ambas as variáveis não podem ser definidas para o valor correcto.


O compilador não expande tanto a sua mente para garantir que estas variáveis serão necessariamente inicializadas como resultado de uma chamada para ObjectGetDouble. Tente escrever a sua própria variável, onde o valor para o parâmetro de entrada passado por referência será definido explicitamente. O que dirá o compilador?
 
Rosh:
O compilador não expande a sua mente o suficiente para garantir que estas variáveis serão necessariamente inicializadas como resultado de uma chamada ObjectGetDouble. Tente escrever o seu próprio, onde o valor para o parâmetro de entrada passado por referência será definido explicitamente. O que dirá o compilador?


Rashid, não é realmente "consciência" de todo, é matemática.

 
Academic:


Rashid, não é realmente "consciência" de todo, é matemática.

1. Existe algo como "avaliação abreviada de expressões lógicas".

2. O compilador não pode saber ao certo se a variável passada por referência será preenchida.

3. Um aviso é apenas isso, um aviso para chamar a sua atenção para a possibilidade de surgir um problema.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
Academic:


Rashid, não é realmente "consciência" de todo, é matemática.

Ok, vamos definir uma tal fusão

bool AlwaysGood( double & param)
  {
   return true;
  }
Existe aqui uma garantia de que a variável param será inicializada?
 
Rosh:

Ok, vamos definir uma tal ffrunctura

Existe alguma garantia de que a variável param será inicializada?

Esta é uma função em que o resultado "param" NÃO é alterado. Portanto, aqui o aviso deve ser dado a 1000% :)

A solução padrão aqui é esta: se houver um ramo de execução de código onde o valor não possa ser alterado, considera-se que esta função não altera o valor. E irá gerar um aviso.

Rashid, queres que eu pegue em qualquer um dos compiladores C++ e C modernos e compile tal código e estou certo de que nenhum deles dará um aviso à esquerda.

Além disso, se tiver tais "problemas" na detecção de tais coisas, de repente começa a ter uma dúvida muito forte de que não existe qualquer optimização enquanto tal. Ou será que existe?

 
Academic:

Rashid, queres que eu pegue em qualquer um dos compiladores C++ e C modernos e compile códigos semelhantes e tenho a certeza de que nenhum deles dará um aviso de esquerda.

De que é que estamos a discutir? w0 não ponha

PS Haverá definitivamente uma mensagem (talvez algumas linhas abaixo)

 
Academic:

Isto não é claramente uma melhoria, especialmente se existem tais "problemas" com a detecção de tais coisas, então uma GRANDE dúvida arrepia-se na medida em que não há qualquer optimização como tal. Ou será que existe?

A função ObjectGetDouble está fora do controlo do compilador porque tem uma implementação independente (i.e. biblioteca)
Документация по MQL5: Графические объекты / ObjectGetDouble
Документация по MQL5: Графические объекты / ObjectGetDouble
  • www.mql5.com
Графические объекты / ObjectGetDouble - Документация по MQL5
 
Academic:


Se olhar para a ajuda para ObjectGetDouble:


Retorna verdadeiro ou falso, dependendo do sucesso da função. Se bem sucedido, o valor do bem é colocado na variável de destino, passado por referência pelo último parâmetro.


Assim, concluímos que o preenchimento da variável receptora não é garantido em caso de qualquer erro. É por isso que a mensagem do compilador é válida.

IMHO.

 

Algo está fora de sincronia na construção mais recente.

Fazendo uma pequena EA:

int OnInit()
  {
   Print("Все нормально!"); 
   return(0);
  }

A executar o testador,

2011.02.22 11:54:21 Core 1 2011.02.07 00:00:00 Tudo está OK!

Faço alterações à minha EA:

int OnInit()
  {
   Print("Тестер, Аууу, ты где?"); 
   return(0);
  }

Compilo-o, faço o teste, ele responde:

2011.02.22 11:57:55 Core 1 2011.02.07 00:00:00:00 Tudo normal!

Só ajuda a reiniciar o terminal.

 
Serj_Che:

Algo está fora de sincronia na construção mais recente.

Fazendo uma pequena EA:

A executar o testador,

2011.02.22 11:54:21 Core 1 2011.02.07 00:00:00 Tudo está OK!

Faço alterações à minha EA:

Compilo-o, faço o teste, ele responde:

2011.02.22 11:57:55 Core 1 2011.02.07 00:00:00:00 Tudo normal!

Só ajuda a reiniciar o terminal.

Desculpe. Uma nova construção será lançada hoje ou amanhã sem este infeliz erro.