Erreurs, bugs, questions - page 710

 

Nécessaire pour déterminer la taille d'un tableau variable, mais l'erreur s'affiche :

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

//---

//---

Il fonctionne directement avec les constantes (#define) et avec une valeur numérique, mais pas comme ça. Pourquoi ?

 
tol64:

Nécessaire pour déterminer la taille d'un tableau variable, mais l'erreur s'affiche :

//---

//---

Il fonctionne directement avec les constantes (#define) et avec une valeur numérique, mais pas comme ça. Pourquoi ?

Avec les constantes, c'est un tableau statique, et avec une variable, c'est dynamique. Et la taille d'une dynamique est déterminée par ArrayResize
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

Pourquoi ?

La deuxième dimension et les suivantes ont une taille fixe. Elle ne peut être définie que par une constante.
 
tol64:

Avec des constantes (#define) et avec une valeur numérique, cela fonctionne directement, mais pas de cette manière. Pourquoi ?

Car lors de la définition avec #define, le compilateur remplace simplement la macro rencontrée par l'entrée correcte avant la compilation. Par conséquent, il voit

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

qui ne contredit pas le langage MQL5.

 
Yedelkin:

OK. Alors je vais prendre le courage à deux mains. Ainsi, la description de la fonction Print() indique que "les données de type double sont imprimées avec la précision de 16 chiffres décimaux après le point". En fait, il s'avère que la fonction Print() produit des données quelque peu arrondies:

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

Le fait est qu'un nombre réel est stocké en mémoire avec un maximum de 17 chiffres significatifs.

Essayez cet exemple pour sentir la différence :

//+------------------------------------------------------------------+
//| 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 description dans l'aide sera corrigée.
 
notused:
Avec les constantes, il s'agit d'un tableau statique, et avec une variable, il est dynamique. Et la taille d'une dynamique est déterminée à l'aide de ArrayResize.
LeXpert:
La deuxième dimension et les suivantes ont une taille fixe. Elle ne peut être définie que par une constante.
Rosh:

Car lorsqu'elle est définie avec #define, le compilateur remplace simplement la macro rencontrée par l'entrée correcte avant la compilation. Par conséquent, il voit

qui ne contredit pas le langage MQL5.

Merci. Pouvez-vous me dire ce que l'on peut faire, si la taille d'un tableau dans la première et la deuxième dimension est définie dans les calculs et ne peut pas être une constante ? Avec ArrayResize(), vous ne pouvez redimensionner que la première dimension, après tout. Et pourquoi puis-je redimensionner un tableau en appliquant une valeur variable, alors qu'elle ne peut pas être définie initialement ?
 
tol64:
Merci. Pouvez-vous me dire ce que l'on peut faire si la taille d'un tableau dans la première et la deuxième dimension est déterminée par des calculs et ne peut être une constante ? Avec ArrayResize(), vous ne pouvez modifier que la taille de la première dimension. Et pourquoi peut-on redimensionner un tableau à l'aide d'une variable, alors qu'il est impossible de la définir initialement ?
veuillez utiliser les classes.
 
tol64:
Merci. Pouvez-vous me dire ce que l'on peut faire si la taille d'un tableau dans la première et la deuxième dimension est déterminée par des calculs et ne peut être une constante ? Avec ArrayResize(), vous ne pouvez modifier que la taille de la première dimension. Et pourquoi puis-je redimensionner un tableau en appliquant une valeur variable, alors qu'elle ne peut pas être définie initialement ?
Jetez un coup d'œil à la section sur la surcharge des opérations pour un exemple pour la classe CMatrix, peut-être cela vous conviendra-t-il.
 
Bonjour.

Je ne trouve pas comment faire en sorte que 2 classes échangent des messages.

Je veux que la classe A ait un lien vers B et la classe B vers A.
J'ai eu une erreur de compilation, peut-être que MQL5 ne le permet pas. Mais sans elle, la programmation objet est utilisée à 30%.

La solution pourrait être d'écrire une seule grande classe de DIEU qui sait et connaît tout. Mais cela ne me semble pas très élégant.
Qui peut aider à trouver la solution ?

Merci d'avance !