Erreurs, bugs, questions - page 2520

 

Erreur lors de la compilation

void f() {} //Error: 'f' - function must have a body
void f();
void OnStart()
{
        f();
}

Autrement :

void f() {}
void OnStart()
{
        f();
}

C'est bon. Quelle est la différence ?

En outre, le C++ se compile normalement en une seule passe :

#ifdef __cplusplus
void f( int ) {}   //была функция
//...
void f( int = 1 ); //уточнили параметры по умолчанию
void OnStart()
{
        f();       //вызвали
}
#endif
 
Et il n'y a pas d'erreur de compilation... Il ne reste plus qu'à deviner le résultat :
int f( int     ) { return 1; }
//...
int f( int = 2 );
int f( int     ) { return 3; }
void OnStart()
{
        Print( f( 0 ));
}
 

Avertissement peu clair sur la compilation

//lib.mqh //объявления
void f(); //Warning: no #import declaration
//lib.mq5 //реализация
void f() {}
//Test1.mq5 //собираем все вместе
#include "lib.mqh"
#include "lib.mq5"
void OnStart() { f(); }

Autrement :

//Test2.mq5
void f();
void f() {}
void OnStart() { f(); }

tout va bien - il n'y a pas d'avertissement. Quelle différence cela fait-il ?

 
A100:

Avertissement peu clair pendant la compilation

//lib.mqh //объявления
int f(); //Warning: no #import declaration

//lib.mq5 //реализация
void f() {}
Une erreur de frappe avec le type int, je présume ?
 
Alexey Navoykov:
C'est une erreur d'impression avec le type d'int, je suppose ?

Oui... Corrigé partout en void - pour plus de simplicité.

D'autre part, la signification, mais déjà les avertissements (*) ne sont pas clairs

//lib.h //объявления
int g();  //Warning: no #import declaration //(*)
void f(); //Warning: no #import declaration
lib.h est un fichier de déclaration générale, tandis que lib.mq5, lib2.mq5, lib3.mq5... avec des implémentations, qui sont incluses au moyen de #include si nécessaire. Ainsi, il se peut qu'il n'y ait pas du tout d'implémentation de int g() dans un build particulier, mais l'avertissement obscur est là. En fait, il y en a des centaines et ils vous empêchent de voir les avertissements vraiment importants
 
A100:

Oui... Corrigé partout en void - pour plus de simplicité.

D'autre part, la signification, mais déjà les avertissements (*) ne sont pas clairs

lib.h est un fichier commun avec des déclarations, tandis que lib.mq5, lib2.mq5, lib3.mq5... avec des implémentations, qui sont ajoutées via #include si nécessaire. Ainsi, il se peut qu'il n'y ait pas du tout d'implémentation de int g() dans un build particulier, mais l'avertissement obscur est là. En fait, il y en a des centaines, et ils empêchent de voir les avertissements vraiment importants.

Notez que même si vous spécifiez une implémentation dans le même livre d'inclusion, cet avertissement apparaîtra également.

 

L'erreur suivante mérite une attention particulière :

//lib1.mqh
void f(); //Error: 'f' - function must have a body
#include "lib.mq5"
//...
//lib2.mqh
void f();
#include "lib.mq5"
//...
//lib.mq5
void f() {}
#include "lib1.mqh"
#include "lib2.mqh"
void OnStart()
{
        f();
}

Essentiellement similaire à celui-ci, mais avec de nombreux fichiers, plutôt peu évidents et difficiles à comprendre

 
Pouvez-vous me dire comment le C++ fonctionne avec cela ?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a; 
  a = b; // OK
}
Je me demande si je dois utiliser cette fonctionnalité dans mon code ou non. Si ça marche en C++, je l'utiliserai. Non, je ne pense pas, car il pourrait être annulé dans les prochaines constructions.
 
Le fait qu'il n'y ait pas d'avertissement d'initialisation constitue-t-il une erreur ?
struct A
{
  int i;
};

struct B : public A
{
  string Str;
};

void OnStart()
{
  A a;
  B b;
  
//  b = a; // possible use of uninitialized variable 'a'
  a = b; // OK
}
 

fxsaber:
Подскажите, как в C++  с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.

b = a; 
a = b; // OK

La première affectation ne fonctionne que dans MQL. Et c'est dommage que ça marche. J'aimerais qu'ils abolissent enfin ce malentendu. Il n'y a aucun problème avec le second.