Errori, bug, domande - pagina 710

 

Necessario per determinare la dimensione di un array variabile, ma viene fuori l'errore:

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

Funziona direttamente con le costanti (#define) e con un valore numerico, ma non così. Perché?

 
tol64:

Necessario per determinare la dimensione di un array variabile, ma viene fuori l'errore:

//---

//---

Funziona direttamente con le costanti (#define) e con un valore numerico, ma non così. Perché?

Con le costanti, è un array statico, e con una variabile, è dinamico. E la dimensione di una dinamica è determinata da ArrayResize
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

Perché?

La seconda dimensione e quelle successive hanno una dimensione fissa. Può essere impostato solo da una costante.
 
tol64:

Con le costanti (#define) e con un valore numerico, funziona direttamente, ma non così. Perché?

Perché quando si definisce con #define, il compilatore sostituisce semplicemente la macro incontrata con la voce corretta prima della compilazione. Perciò vede

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

che non contraddice il linguaggio 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 effetti, si scopre che la funzione Print() produce dei dati un po' arrotondati:

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.999999999999999716

Il punto è che un numero reale è memorizzato con non più di 17 cifre significative.

Provate questo esempio per sentire la differenza:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
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));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
La descrizione nella guida sarà corretta.
 
notused:
Con le costanti, è un array statico, e con una variabile, è dinamico. E la dimensione di una dinamica è determinata usando ArrayResize.
TheXpert:
La seconda dimensione e quelle successive hanno una dimensione fissa. Può essere impostato solo da una costante.
Rosh:

Perché quando è definito con #define, il compilatore sostituisce semplicemente la macro incontrata con la voce corretta prima della compilazione. Perciò vede

che non contraddice il linguaggio MQL5.

Grazie. Potete dirmi cosa si può fare se la dimensione di un array nella prima e nella seconda dimensione è definita nei calcoli e non può essere una costante? Con ArrayResize(), potete ridimensionare solo la prima dimensione, dopo tutto. E perché posso ridimensionare un array applicando un valore variabile, mentre non può essere impostato inizialmente?
 
tol64:
Grazie. Potete dirmi cosa si può fare se la dimensione di un array sia nella prima che nella seconda dimensione è determinata da calcoli e non può essere una costante? Con ArrayResize(), potete cambiare solo la dimensione della prima dimensione. E perché si può ridimensionare un array usando una variabile, mentre non può essere impostato inizialmente?
si prega di utilizzare le classi.
 
tol64:
Grazie. Potete dirmi cosa si può fare se la dimensione di un array sia nella prima che nella seconda dimensione è determinata da calcoli e non può essere una costante? Con ArrayResize(), potete cambiare solo la dimensione della prima dimensione. E perché posso ridimensionare un array applicando un valore variabile, mentre non può essere impostato inizialmente?
Date un'occhiata alla sezione sulle operazioni di sovraccarico per un esempio per la classe CMatrix, forse questo funzionerà per voi.
 
Salve.

Non riesco a trovare come fare in modo che 2 classi si scambino messaggi.

Voglio che la classe A abbia un collegamento con B e la classe B con A.
Ho avuto un errore di compilazione, forse MQL5 non lo permette. Ma senza di essa la programmazione a oggetti viene utilizzata al 30%.

La soluzione potrebbe essere quella di scrivere una grande classe GOD che sa e conosce tutto. Ma questo non mi sembra molto elegante.
Chi può aiutare con la soluzione?

Grazie in anticipo!