Erros, bugs, perguntas - página 1182

 
Zeleniy:

A optimização não está a funcionar.

2014.08.05 19:34:42 Testador não seleccionado parâmetro optimizado, por favor verifique a(s) entrada(s) a ser(em) optimizada(s) e defina cuidadosamente os valores de início, passo e paragem

A tradução não deu nada.

O que quer dizer com "nada"? A tradução deveria ter-lhe dado algo do género: deve seleccionar pelo menos um parâmetro para optimização e certificar-se de que os valores de início, fim e passo estão correctos.
 
marketeer:
O que quer dizer com "nada"? A tradução deveria ter-me dado algo, como que eu deveria seleccionar pelo menos um parâmetro para optimização e garantir que o início, fim e passo do teste estão correctos.
É tão estranho, não percebo nada, talvez esteja apenas cansado, ainda estou a lutar com os erros para o segundo dia. Obrigado, vou confiar nas suas palavras.
 

Enfrentei este problema: preciso de comparar dois objectos da mesma classe um com o outro e decidi sobrecarregar o operador == por conveniência. Verificou-se que se os objectos são dinâmicos, o meu operador não é executado, e em vez dos próprios objectos são comparados os seus apontadores. Bem, faz sentido em princípio, a operação de saltar para o objecto pelo seu ponteiro é necessária: *a == *b. Mas no MQL esta possibilidade tinha sido esquecida. Temos de acrescentar.

class T {   int x;

public:

T (int value) { x=value; }   bool operator==(T& other) { Print("compare1");  return x==other.x; }   bool operator==(T* other) { Print("compare2");  return x==other.x; } }; //------------------ void OnStart() {   T* a= new T(10);   T* b= new T(10);      Alert(a==b);      delete a;   delete b; }

 

Embora eu tenha acabado de pensar, o facto de estarmos a comparar apontadores em vez de objectos é fundamentalmente errado, considerando as especificidades da linguagem. Afinal, o MQL é uma linguagem gerida, e o próprio conceito de "objecto" é aqui utilizado independentemente de como o objecto é armazenado e como é acedido. Os membros e os métodos são, em qualquer caso, acedidos por um ponto. De forma correspondente, o operador de comparação deve trabalhar da mesma forma tanto para objectos estaticamente seleccionados como para objectos dinâmicos. E se precisar de comparar apontadores, deve fazê-lousando GetPointer().

 
meat:

Embora estivesse apenas a pensar, o facto de haver uma comparação de apontadores em vez dos próprios objectos é fundamentalmente errado, dadas as especificidades da língua.

Não há necessidade de inventar regras de comparação em MQL que contradigam C++, desde que o possa fazer por outros meios. Se tiver indicações e precisar de comparar objectos - use uma função de comparação.
bool Compare(const T& t1, const T& t2 ) { return ( t1 == t2 ); }

Alert( Compare( a, b ));
Uma coisa é permitir um registo da forma (*a == *b) e outra coisa é dar um significado diferente ao registo (a == b)
 

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?

 
A100:
Não há necessidade de inventar regras de comparação em MQL que contradigam C++, desde que outros meios possam ser utilizados. Se tiver indicações e precisar de comparar objectos, use uma função de comparação É uma coisa que sugere permitir uma entrada do tipo (*a == *b), e outra coisa muito diferente para dar um significado diferente à entrada (a == b)

Bem, estou a explicar que as regras de MQL contradizem C++ como é. A referência a um objecto por um ponteiro aqui é feita com um ponto, enquanto que deve ser feita com ->, se seguirmos as regras de C++.

Isto é, "ponteiro" e "objecto" são duas noções absolutamente diferentes em C++, é por isso que a sintaxe é diferente. Tudo é rigoroso, mas aqui tudo é misturado. Parece que abordamos as propriedades e métodos de um ponteiro. Não estou a dizer que é mau, é mais conveniente ao OOP, é feito em C# por exemplo. Mas então tudo o resto deve ser implementado da mesma forma. Caso contrário, ocorrem contradições e confusão: em alguns casos usamos um ponteiro da mesma forma que o próprio objecto, e em outros casos o ponteiro ganha vida de repente.

Procedendo ao lado prático de tudo isto, já me deparei com um problema: o meu código estava a utilizar objectos estáticos. Depois decidi substituir alguns deles por dinâmicos. 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.

 

Tenho alguma classe no meu código que contém algum objecto:

CClass
{
  ...
  CObj  Object; 
  ...
};

A classe CObj é declarada antes dela.

Ao tentar compilar recebo um erro: 'Objecto' - não pode ser desajustado

O que significa este erro e qual é a sua causa? Não me lembro de ter encontrado este erro antes. A classe CObj tem um construtor e destruidor.

Tentei declarar Objecto simplesmente como uma variável - tudo está bem. Mas não o fará quando fizer parte de uma classe.

 
Então, alguém pode explicar o que é este erro ("- não pode ser desestabilizado")? Quando é que ele ocorre?
 
meat:
Então, alguém pode explicar o que é este erro ("- não pode ser desestabilizado")? Quando é que ele ocorre?
A função ZeroMemory não pode ser utilizada para este objecto
Razão: