Errori, bug, domande - pagina 705

 
Yedelkin:
E lasciamo la domanda sui difetti di Print() senza risposta, va bene? :)
Come ti piace.
 
victorg:
Qualunque cosa.

OK. Allora mi prendo il coraggio. Così, la descrizione della funzione Print() dice che "i dati di tipo doppio sono stampati con la precisione di 16 cifre decimali dopo il punto". In effetti, si scopre che la funzione Print() produce dei dati un po' arrotondati:

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. Allora mi prendo il coraggio. Così, la descrizione della funzione Print() dice che "i dati di tipo doppio sono stampati con la precisione di 16 cifre decimali dopo il punto". In realtà si è scoperto che la funzione Print() produce dati leggermente arrotondati:

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

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

123.4567890123456(7>5, quindi arrotondato per eccesso)

Sembra essere come descritto. Qual è l'errore, gli zeri non vengono stampati?
 
MetaDriver:
Tutto sembra corrispondere alla descrizione. Qual è il problema, gli zeri non vengono stampati?
Il bug è che la funzione Print() non stampa"Data of the double type accurate to 16 decimal digits after the dot".
 
Yedelkin:
Il bug è che la funzione Print() non emette"Data of type double with an accuracy of 16 decimal digits after the dot".

controllare

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

controllare

Non mi sono preso la briga di controllare.

//+------------------------------------------------------------------+
//|                                                      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));
  }
//+------------------------------------------------------------------+

Prima di tutto, il compilatore genera "conversione implicita da 'numero' a 'stringa' victorg2.mq5 12 22".

Secondo,

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

 

Usate la funzione PrintFormat appropriata per un controllo completo del 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
La stampa si basa sulla modalità di arrotondamento normale del doppio a 4 cifre. Correggeremo la documentazione.
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - Документация по MQL5
 

Per favore, datemi dei puntatori (handle) a strutture (preferibilmente anche ad array, compresi quelli statici).

L'avvolgimento in classi è spesso una cattiva soluzione:

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:

Si prega di dare puntatori (handle) a strutture (preferibilmente anche ad array, compresi quelli statici).

Cosa intende e perché?

 
Renat:

1. in che senso e

2. perché?

1.

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

Per creare array di puntatori a strutture (array). con successiva inizializzazione for(i){ S[i] = GetPointer(StaticStruct[i]); }

2. per conservare array solidi (impacchettati) di dati significativi.

Importante quando si ha a che fare con l'output di dati in buffer OpenCL grezzi (o l'invio a DLL, la scrittura su file, ecc.)

Allo stesso tempo, è possibile riordinare gli accessi ai dati (per esempio, quando si ordinano i puntatori) senza riscrivere i dati.