Erreurs, bugs, questions - page 3018

 

dans la build 2940 ils ont réécrit Alglib, maintenant travailler avec des nombres complexes est une structure (il y avait une classe)

et fait des erreurs :

#include <Math\Alglib\complex.mqh>
void OnStart()
{
      al_complex a(1, 2);
      al_complex b(3, 4);
      a += b;
      printf("tst#1 : a.real = %f , a.imag = %f", a.re, a.im);

      al_complex c(1, 2);
      al_complex d(3, 4);
      c -= d;
      printf("tst#2 : c.real = %f , c.imag = %f", c.re, c.im);
 }

2021.05.23 21:49:35.210 tst (EURUSD,H1) tst#1 : a.real = 4.000000 , a.imag = 6.000000

2021.05.23 21:49:35.210 tst (EURUSD,H1) tst#2 : c.real = 4.000000 , c.imag = 6.000000


complexe source .mqh

//+------------------------------------------------------------------+
//| Overloading (+=)                                                 |
//+------------------------------------------------------------------+
void al_complex::operator+=(const al_complex &rhs)
  {
   re+=rhs.re;
   im+=rhs.im;
  }
//+------------------------------------------------------------------+
//| Overloading (-=)                                                 |
//+------------------------------------------------------------------+
void al_complex::operator-=(const al_complex &rhs)
  {
   re+=rhs.re;
   im+=rhs.im;
  }
 

Je ne me souviens pas qu'un nouveau type de données complexe ait été annoncé, mais sans les bibliothèques de plugins, tout fonctionne correctement :

void OnStart()
{
      complex a(1, 2);
      complex b(3, 4);
      a += b;
      printf("tst#1 : a.real = %f , a.imag = %f", a.real, a.imag);

      complex c(1, 2);
      complex d(3, 4);
      c -= d;
      printf("tst#2 : c.real = %f , c.imag = %f", c.real, c.imag);
 }

2021.05.23 21:54:13.976 tst (EURUSD,H1) tst#1 : a.real = 4.000000 , a.imag = 6.000000

2021.05.23 21:54:13.976 tst (EURUSD,H1) tst#2 : c.real = -2.000000 , c.imag = -2.000000




d'où vient le nouveau type de complexe ? .... il n'y a rien dans l'aide, et qu'est-ce qui a été ajouté ?

 
Igor Makanu:

Je ne me souviens pas qu'un nouveau type de données complexe ait été annoncé, mais sans les bibliothèques de plugins, tout fonctionne correctement :

2021.05.23 21:54:13.976 tst (EURUSD,H1) tst#1 : a.real = 4.000000 , a.imag = 6.000000

2021.05.23 21:54:13.976 tst (EURUSD,H1) tst#2 : c.real = -2.000000 , c.imag = -2.000000




d'où vient le nouveau type de complexe ? .... il n'y a rien dans l'aide, et qu'est-ce qui a été ajouté ?

Les développeurs ont confirmé que de nouveaux types ont été ajoutés. Récemment.

 
Igor Makanu:

Je ne me souviens pas qu'un nouveau type de données complexe ait été annoncé, mais sans les bibliothèques de plugins, tout fonctionne correctement :

2021.05.23 21:54:13.976 tst (EURUSD,H1) tst#1 : a.real = 4.000000 , a.imag = 6.000000

2021.05.23 21:54:13.976 tst (EURUSD,H1) tst#2 : c.real = -2.000000 , c.imag = -2.000000

d'où vient le nouveau type de complexe ? .... il n'y a rien dans l'aide, et qu'est-ce qui a été ajouté ?

Ici:

7. MQL5 : Ajout du support pour les opérations avec des nombres complexes.


Ajout d'un nouveau type intégré "complexe".
struct complex
  {
   double             real;   // вещественная часть
   double             imag;   // мнимая часть
  };
Le type "complexe" peut être transmis par valeur comme paramètre pour les fonctions MQL5 (par opposition aux structures habituelles, qui sont transmises uniquement par référence). Pour les fonctions qui sont importées de DLL, le type "complexe" doit être transmis par référence uniquement.

Pour décrire les constantes complexes, on utilise le suffixe "i" :
.
complex square(complex c)
  {
   return(c*c);
  }
  
void OnStart()
  {
   Print(square(1+2 i));  // в качестве параметра передается константа
  }

// будет выведено "(-3,4)" - это строковое представление комплексного числа
Pour les nombres complexes, seules des opérations simples sont disponibles : =, +, -, *, /, +=, -=, *=, /=, ==, !=.

D'autres fonctions mathématiques seront ajoutées à l'avenir : obtention de la valeur absolue, sinus, cosinus et bien d'autres encore.
Новая версия платформы MetaTrader 5 build 2940: Перенос витрин MQL5-сервисов в рабочую область и обновление дизайна
Новая версия платформы MetaTrader 5 build 2940: Перенос витрин MQL5-сервисов в рабочую область и обновление дизайна
  • 2021.05.14
  • www.mql5.com
В пятницу 21 мая 2021 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Artyom Trishkin:

Ici:

7. MQL5 : Ajout d'un support pour travailler avec des nombres complexes.


Ajout d'un nouveau type intégré "complexe".
Le type complexe peut être transmis par valeur comme paramètre pour les fonctions MQL5 (contrairement aux structures habituelles, qui sont transmises uniquement par référence). Pour les fonctions qui sont importées de DLL, le type "complexe" doit être transmis uniquement par référence.

Pour décrire les constantes complexes, on utilise le suffixe 'i' :
Pour les nombres complexes, seules des opérations simples sont actuellement disponibles : =, +, -, *, /, +=, -=, *=, /=, ==, !=.

D'autres fonctions mathématiques seront ajoutées à l'avenir : obtention de la valeur absolue, sinus, cosinus et bien d'autres encore.

OK, merci, c'est dommage que l'aide soit ajoutée tardivement.

 
Erreur d'exécution :
void OnStart()
{
    const string text[] = { "ABC", "", "ABC" };
    uchar array[];
    int start = 0;
    int n = 0;
    for ( int i = 0; i < ArraySize( text ); i++ )
    {
        const int count = StringLen( text[ i ] );
        n += StringToCharArray( text[ i ], array, start, count );
        start += count;
    }
    Print( ArraySize( array ), ":", n );
}

Résultat : 6:7

Attendu : 6:6

 
A100:
Erreur d'exécution :

Résultat : 6:7

Attendu : 6:6

count = 0 - seule la fin de la chaîne est copiée. Pourtant "" != NULL.

 
fxsaber:

count = 0 - seule la fin de la chaîne est copiée. Encore "" != NULL.

Et combien de

StringToCharArray

Doit-il être copié à compter = 0 ?

Indice : 3 caractères sont copiés quand count = 3

 
A100:

doit copier les caractères lorsque le compte = 0 ?

il semble que count=0 fonctionne de la même manière que count=-1 et dans le cas de "" il copie un terminal null, donc sans vérifications supplémentaires une chaîne vide ne peut pas être convertie normalement

 
Andrei Trukhanovich:

il semble que count=0 fonctionne de la même manière que count=-1 et dans le cas de "" il copie un zéro terminal.

C'est là que se trouve l'erreur, simplement montrée avec un exemple pratique où engénéral il peut y avoir à la fois des chaînes vides et count = 0 par lui-même (dans une boucle par exemple).