Bug de compilador com parâmetro de modelo = vazio* - página 4

 
Dmitry Fedoseev:

Você já tentou ler o link que nos deu? Slava lá explica popularmente por que é assim - porque a prioridade estava misturada na antiga MQL4. Por isso, agora é importante chamar a atenção. Nem sequer é bom que haja apenas um aviso, seria melhor se houvesse um erro.

Ou, uma bofetada na cara

 
Dmitry Fedoseev:

Você já tentou ler o link que nos deu? Slava lá explica popularmente por que é assim - porque a prioridade estava misturada na antiga MQL4. Por isso, agora é importante chamar a atenção. Nem sequer é bom que haja apenas um aviso, seria melhor se houvesse um erro.

Então? Aqui:

int i = 1 << 2 + 3;

Também na MQL4 a prioridade foi confundida? Trata-se de uma abordagem geral, não de um caso especial. No caso particular você pode dar um aviso/erro (como exceção), mas por que deve ser estendido a tudo o mais?

Além disso, na MQL4 (tanto quanto sei), digamos que o operador não tem preguiça. E apesar disso, o compilador MQL5 não gera um aviso em casos similares (não sugere a quebra || em várias operações atômicas)

Da qual se segue que a página correspondente da história é invertida

 

Eu gostaria de acrescentar ... que até mesmo a Documentação diz:

"Para alterar a ordem das operações, são utilizados parênteses, que têm a mais alta prioridade".

o que implica que o uso de parênteses para outros fins (não relacionados à mudança da ordem) ainda deve ser justificado

 
fxsaber:

Onde estará o limite para o número de programadores quando se deve hesitar? 5 não é suficiente. 1.000 não é suficiente. 10.000 - hesitar. E, finalmente, N - confiança. Entretanto, quando foi (N-1) - eu ainda não confiava nele.

O limiar não é definido em valor absoluto, mas como uma % do número de pessoas que pensam o contrário. A maioria pode estar errada, mas não 99% é um critério confiável

 
A100:
E em 1961x32 tudo funciona... yay!

Hmm, característica interessante. Vou especificar a taxa de bits da plataforma a partir de agora também

 
A100:

Então? Aqui:

int i = 1 << 2 + 3;

também na MQL4 a prioridade foi confundida?

Sim, a documentação diz que a prioridade era diferente na versão antiga.

Mas, na minha opinião, tudo isso há muito tempo se tornou irrelevante. E ainda mais se a diretriz rigorosa for especificada. E se alguém desenterrar um código antigo e tentar compilá-lo, ele terá que refazer muitas coisas de qualquer maneira. Portanto, estas advertências são uma relíquia do passado. É por isso que eu concordo que não se deve jogar avisos no vácuo.

 
Desculpe, se você sabe, há alguma maneira de obter int do vazio*ptr em mql diferente de (int)StringFormat("%i",ptr)?
 
A100:

Portanto, em seus parênteses de código não significa nada, a declaração ... parece ilógico e, no caso de parênteses, precisamos entender se as prioridades/ordem mudaram de fato, enquanto em meus parênteses de código por si só significa mudar prioridades/ordem (a presença/ausência de parênteses deixa tudo claro)

parênteses
fxsaber
A100

incompreensível
as prioridades das operações são revertidas
não
as prioridades de operação não foram alteradas
as prioridades das operações não foram alteradas

Os parênteses fazem uma expressão completamente inequívoca.

As próprias advertências (não apenas sobre parênteses) não nos informam sobre um erro, mas sobre a possibilidade de um erro. Mas você se propõe a se livrar completamente de todos os avisos, porque as prioridades (não apenas com parênteses) são claramente especificadas no compilador.

A100:

O limiar não é definido em valor absoluto, mas como uma relação percentual do número de pessoas que pensam o contrário. A maioria pode estar errada, mas não 99% é um critério confiável

A mesma pergunta sobre o número não em absoluto, mas em relativo. 98% é um critério confiável? А 97%? Onde está esse limite quando você tem que começar a duvidar da confiabilidade? Mesmo que 100% das pessoas ao seu redor afirmem que você é um maníaco homicida. Esse é um critério confiável?

 
Ilya Malev:
Desculpe por estar fora do tópico, você pode me dizer se alguém sabe: há alguma maneira em mql de obter int do vazio*ptr diferente de (int)StringFormat("%i",ptr)?

somente via strings, eu costumava obter endereço de ponteiro viaStringConcatenate(), assim:

Cinteger *x = new Cinteger();
   string s;
   int zz=StringConcatenate(s,"*x = ",x);
   Print("OK ",s);
 
Alexey Navoykov:

O exemplo mais trivial é a classe da matriz. Neste caso, ela é usada para armazenar quaisquer indicações:

Tal conjunto é de uso duvidoso, francamente falando. O que você pode fazer com ele? Você sabe que não vai chamar automaticamente os membros da matriz para exclusão, certo?

Razão: