Erros, bugs, perguntas - página 1183
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Ao testar o Expert Advisor, ele gera um erro
lucro takeprofit inválido para a função OrderSend
Erro de encomendaEnviar 4107
Como posso corrigi-lo sem entrar no código?
A função ZeroMemory não pode ser utilizada para este objecto
Mas porque é que o compilador mostra este erro não num local onde aZeroMemory é utilizada, mas num local onde a classe é definida? É confuso. Por exemplo, ao copiar um objecto que contém itens que não podem ser copiados, o erro ocorre exactamente na linha com a cópia e não algures dentro da classe.
Chegados ao lado prático de tudo isto, já me deparei com um problema. O código estava a utilizar objectos estáticos. Depois decidi substituir algumas delas por outras dinâmicas. Como resultado, as operações de comparação e atribuição começaram a funcionar de forma bastante diferente. E este problema era difícil de detectar porque o programa continua a compilar e a funcionar normalmente, mas não da forma que deveria.
Não compreendi imediatamente o problema
A partir disto pode ver que (a != a) leva à comparação de apontadores enquanto (a >> a) leva ao operador de chamada >>( A* )Há uma contradição.
Não pode alterar o comportamento de (a >> a) como outros operadores sobrecarregados (excepto para == e !=) porque tornará impossível a seguinte construção, uma vez que não pode regressar (A) mas só pode regressar (A*).
Também será impossível utilizar plenamente operadores sobrecarregados porque não existe uma operação de conversão de ponteiro para objecto (*a)
A única coisa a fazer é alterar o (== e !=) comportamento
Para comparar apontadores (== e !=) entre si e com o número zero (porque outras operações de ponteiro não têm significado), deve-se introduzir uma função especial como (GetPointer) ou especificar explicitamente uma conversão de tipo para o compilador
Assim, a possibilidade de utilização plena de operadores sobrecarregados será preservada e a contradição acima mencionada será eliminada
A única excepção razoável à regra geral deve permanecer operador=() porque
eliminaria todas as contradições de uma só vez.
Correcção: na verdade, as contradições são eliminadas apenas parcialmente, porque tal notação (*a) não resolve o problema da utilização múltipla de operadores (que agora funciona com sucesso com todos os operadores, excepto == e !=) - por isso a melhor forma de comparar apontadores entre si sobre igualdade/inequalidade continua a utilizar uma função especial - ou conversão explícita para o tipo ulong
isto está bem, e isto
erro de compilaçãoContinuando o tema sobre apontadores, seria bom acrescentar ao operador padrão MQL um apontador'&', seria muito mais conveniente e compacto do que o pesado GetPointer.Assim, tendo * e & operadores no nosso arsenal, podemos definir explicitamente as operações necessárias:
E há mais sobre este ampersand. MQL carece de referência a variáveis, especialmente tendo em conta o uso limitado de apontadores (apenas para objectos de classe). A função requer frequentemente acesso a um elemento de estrutura profundamente aninhado ou a uma matriz multidimensional. Tenho de escrever o caminho completo para ele cada vez, o que torna o código muito pesado.Pode-se simplificar as coisas criando uma referência e por vezes basta "mudar" o nome de uma variável localmente por conveniência. No entanto, o que estou a explicar aqui? Toda a gente já sabe como é conveniente usar referências, mas agora é preciso usar #define em vez disso, o que certamente não é bom.
E também precisamos da capacidade de passar o resultado de uma função por referência, ou seja, double& Func() { } { }
O Facebook assistiu recentemente ao surgimento de retroligações de posts de blogs:
Mantendo o tema dos apontadores, seria bom acrescentar à MQL um operador padrão de tomar um apontador'&', seria muito mais conveniente e compacto do que o pesado GetPointer.Assim, tendo os * e & operadores, podemos definir sem ambiguidade as operações necessárias:
Adoptar apenas (*a) para se referir às funções dos membros não dá quaisquer vantagens claras, mas em vez disso torna impossível a utilização dos operadores de uma forma simples e clara.
Tente reescrevê-lo tendo em conta a sua sugestão
Não se pode usar o objecto em si em vez do ponteiro porque o operador <<(...) só pode devolver um ponteiro ao objecto.
Que operações com apontadores não têm sentido? - Apenas comparação entre si e com um número - por isso devemos negligenciá-los e colocá-los numa função especial (por exemplo, bool ComparePointer( a,b)) para preservar a possibilidade de utilização múltipla de operadores sem os quais o próprio operador se sobrecarrega perde o seu significado crucial.