Erros, bugs, perguntas - página 1642

 
Ao tentar criar um objecto de uma classe abstracta, o registo mostra informação demasiado escassa sobre o erro: 'CClass - não pode instanciar classe abstracta. E eu gostaria de saber quais os métodos em falta, porque há tantos métodos abstractos, e demora muito tempo a encontrar o que falta. Por favor, certifique-se de que o primeiro método em falta é indicado no registo.
 
Alexey Valeev:

Após a actualização de hoje em 18.08.2016 a função OrderCalcMargin começou a regressar 0.

Versão terminal Demo 5.00 build 1383

Código de teste:

Saída em terminal:

2016.08.18 20:35:36.394 Teste (EURUSD,H1) OneLot=0.0 GetLastError=0

ps: também escreveu ao servicedesk, mas também há aqui um fio adequado, por isso talvez esta mensagem seja respondida mais rapidamente.

Fixou-o. Obrigado pela mensagem.
 

Sem verificação da implementação de métodos puramente virtuais

class A {
        virtual void f() = 0;
};
void A::f() {} //нормально
 
fxsaber:
Erro de depuração (construir 1383)
Pensei que tinha sido corrigido. Mas não, é 1395.
 

Talvez não seja um insecto sério, mas está sempre a incomodar-me.

a essência do objecto gráfico como OBJ_RECTANGLE_LABEL desaparece um casal ou um pixel, não parece nada, mas não é bom ...

desaparece no canto superior esquerdo quando o objecto está escuro em cor....

 
Erro de compilação
template<typename T>
void f( T t1, T t2 = 0 ) {} //error: '0' - illegal operation use
Caso contrário, está bem.
template<typename T>
class A {
void f( T t1, T t2 = 0 ) {} //нормально
};
 

Em MQL5\Include\environment.mqh existe uma comparação tão dupla

//+------------------------------------------------------------------+
//| Сравнивает два значения типа double.                             |
//| RESULT                                                           |
//|   Возвращает истину, если значения равны и                       |
//|   ложь в противном случе.                                        |
//+------------------------------------------------------------------+
bool CEnvironment::DoubleEquals(const double a,const double b)
  {
//---
   return(fabs(a-b)<=16*DBL_EPSILON*fmax(fabs(a),fabs(b)));
//---
  }

Em Help, existe uma variante de MQL4\Libraries\stdlib.mq4

//+------------------------------------------------------------------+
//| right comparison of 2 doubles                                    |
//+------------------------------------------------------------------+
bool CompareDoubles(double number1,double number2)
  {
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false);
  }
 
fxsaber:

Em MQL5\Include\environment.mqh existe uma comparação tão dupla

Em Help, existe uma variante de MQL4\Libraries\stdlib.mq4

duplo olhar. E lêmo-lo. E vemos duas formas de comparação:

  • A primeira maneira consiste em comparar a diferença entre dois números com algum valor pequeno, o que define a precisão da comparação.
    Exemplo:
    bool EqualDoubles(double d1,double d2,double epsilon) 
      { 
       if(epsilon<0) epsilon=-epsilon; 
    //--- 
       if(d1-d2>epsilon) return false; 
       if(d1-d2<-epsilon) return false; 
    //--- 
       return true; 
      } 
    void OnStart() 
      { 
       double d_val=0.7; 
       float  f_val=0.7; 
       if(EqualDoubles(d_val,f_val,0.000000000000001)) Print(d_val,"equals",f_val); 
       else Print("Different: d_val = ",DoubleToString(d_val,16), 
                  "  f_val = ",DoubleToString(f_val,16)); 
    // Результат: Different: d_val= 0.7000000000000000   f_val= 0.6999999880790710 
      }

  • O segundo método consiste em comparar a diferença normalizada entre dois números reais com um valor de zero. Comparar a diferença dos números normalizados com zero é inútil porque qualquer operação matemática com números normalizados resulta num resultado não normalizado.
    Exemplo:

    bool CompareDoubles(double number1,double number2) 
      { 
       if(NormalizeDouble(number1-number2,8)==0) return(true); 
       else return(false); 
      } 
    void OnStart() 
      { 
       double d_val=0.3; 
       float  f_val=0.3; 
       if(CompareDoubles(d_val,f_val)) Print(d_val,"equals",f_val); 
       else Print("Different: d_val = ",DoubleToString(d_val,16), 
                  "  f_val = ",DoubleToString(f_val,16)); 
    // Результат: Different: d_val= 0.3000000000000000   f_val= 0.3000000119209290 
      }

 
Karputov Vladimir:

A segunda via envolve a comparação da diferença normalizada de dois números reais com zero. É inútil comparar a diferença dos números normalizados com zero, porque qualquer operação matemática com números normalizados resulta num resultado não normalizado.

Isto não é verdade. A diferença de duas duplas normalizadas será sempre zero se os seus valores normalizados forem os mesmos. Não preciso de citar um exemplo ao comparar flutuar e dobrar. Este não é o caso de dois duplos.

Além disso, pode aceitar dois números cujos valores normalizados são iguais um ao outro. Mas a sua diferença normalizada não será igual a zero.

 

Erro de compilação: ') - nem todos os caminhos de controlo devolvem um valor

int f()
{
        while ( true ) //или for(;;)
        {
//много строк c return, continue, без break
                return 0;
//много строк c return, continue, без break
                return 1;
        }
}