Erros, bugs, perguntas - página 705

 
Yedelkin:
E deixemos sem resposta a pergunta sobre os defeitos da Print(), vamos? :)
Como quiser.
 
victorg:
Tanto faz.

OK. Então, vou tomar a coragem. Assim, a descrição da função Print() diz que "os dados do tipo duplo são impressos com a precisão de 16 dígitos decimais após o ponto". De facto, verifica-se que a função Print() produz dados de certa forma arredondados:

void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
  }

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.9999999999999716
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5
 
Yedelkin:

OK. Então, vou tomar a coragem. Assim, a descrição da função Print() diz que "os dados do tipo duplo são impressos com a precisão de 16 dígitos decimais após o ponto". Na verdade, verificou-se que a função Print() produz dados ligeiramente arredondados:

ND 0 victorg2 (EURUSD,M1) 11:04:42 Imprimir(b)=200.0

MP 0 victorg2 (EURUSD,M1) 11:04:42 Impressão(DoubleToString(b,16))=199.99999999999999999716

123.4567890123456(7>5, portanto arredondado para cima)

Parece ser o descrito. Qual é a falha? Os zeros não são impressos?
 
MetaDriver:
Tudo parece encaixar na descrição. Qual é o problema? Os zeros não são impressos?
O erro é que a função Print() não imprime"Dados do tipo duplo com precisão de 16 dígitos decimais após o ponto".
 
Yedelkin:
O erro é que a função Print() não produz"Dados do tipo duplo com uma precisão de 16 dígitos decimais após o ponto".

cheque

 Print("Print(b)="+ b);
 
sergeev:

cheque

Não se deu ao trabalho de verificar.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;
   a=7.0/200.0;
   b=7.0/a;
   //Print("Print(b)=",b);
   Print("Print(b)="+b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));
  }
//+------------------------------------------------------------------+

Antes de mais, o compilador gera "conversão implícita de 'número' para 'string' victorg2.mq5 12 22".

Segundo,

IS 0 victorg2 (EURUSD,M1) 17:46:45 Print(b)=200
PJ 0 victorg2 (EURUSD,M1) 17:46:45 Print(DoubleToString(b,16))=199.9999999999999716

 

Utilizar a função PrintFormat apropriada para o controlo total do formato:

void OnStart()
  {
   double a,b;
   a=7.0/200.0;
   b=7.0/a;
   printf("Format: %.15lf",b);
   PrintFormat("Format: %.15lf",b);
  }

Format: 199.999999999999970
Format: 199.999999999999970
Os padrões de impressão são o modo normal de arredondamento de dois a quatro dígitos. Iremos corrigir a documentação.
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - Документация по MQL5
 

Por favor, dê indicações (pegas) às estruturas (de preferência também às arrays, incluindo as estáticas).

Envolver-se nas aulas é muitas vezes uma má solução:

struct SEmpty
  {
  };
  
class CEmpty
  {
  };
void OnStart()
  {
   Print("sizeof(SEmpty) = ",sizeof(SEmpty));   
   Print("sizeof(CEmpty) = ",sizeof(CEmpty));
  }
2012.04.07 20:49:38 SizeOf_Test (USDJPY,M30) sizeof(CEmpty) = 16
2012.04.07 20:49:38 SizeOf_Test (USDJPY,M30) sizeof(SEmpty) = 0
 
MetaDriver:

Por favor, dê indicações (pegas) às estruturas (de preferência também às arrays, incluindo as estáticas).

Em que sentido e porquê?

 
Renat:

1. em que sentido e

2. porquê?

1.

CEmpty  *C[];  // Это работает.
SEmpty  *S[];  // Error: 'SEmpty' - class type expected SizeOf_Test.mq5 19      1

Criar matrizes de ponteiros para estruturas (matrizes). com posterior inicialização para(i){ S[i] = GetPointer(StaticStruct[i]); }

2. manter conjuntos sólidos (embalados) de dados significativos.

Importante quando se trata de saída de dados para buffers OpenCL em bruto (ou envio para DLL, escrita para ficheiros, etc.)

Ao mesmo tempo, é possível reordenar os acessos aos dados (por exemplo, ao ordenar os apontadores) sem reescrever os dados.