Erreurs, bugs, questions - page 2867

 
fxsaber:

Donc identique en action à MACRO et MACRO2.

Pour l'utilisateur final, oui, une seule macro avec deux paramètres est utilisée

 
A la question sur les avertissements utiles et nuisibles :
#ifdef __cplusplus
class A {
    A( int  , int y ) :         //(1)
                        x( x ), //(2) warning: 'A::x' is initialized with itself
                        y( y )  //(3)
                    {}
    int x, y;
};
#endif

Que fait un compilateur Shell C++ intelligent ? C'est ça ! En cas de faute d'impression manifeste et à la ligne (1) - le "x" manquant.

    A( int x, int y ) :

- il génère l'avertissement suivant : 'A::x' est initialisé avec lui-même. Et il ne montre rien dans les endroits où il est correct !

Et que fait le compilateur MQL ?

#ifdef __MQL__
class A {
    A( int  , int y ) :         //(1) warning: declaration of 'y' hides member
                        x( x ), //(2) нормально
                        y( y )  //(3)
                    {}
    int x, y;
};
#endif

Il est silencieux lorsqu'il en a besoin et qu'il y a une erreur d'impression évidente, mais lorsqu'il n'en a pas besoin et que tout va bien, il avertit : la déclaration de 'y' cache un membre.

Pourquoi est-ce l'inverse ?
 

2632

Lorsqu'il est en pause dans le test visuel, il n'est pas possible de parcourir (rembobiner/avancer) le graphique en utilisant la souris ou les touches fléchées.

 

Je vois que le sujet des macros a pris de l'ampleur, j'ai aussi quelques questions.

Pourquoi int et uint sont utilisés pour C et D ?
Où faut-il substituer long et ulong
ou peut-être le compilateur est-il si intelligent qu'il détecte la taille 280 et l'optimise ?

#define  A 280    // int
#define  B 280 U   // unsigned int
#define  C 280L   // long
#define  D 280LU  // unsigned long
#define  K 28.0   // double

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Print(typename(A));
   Print(typename(B));
   Print(typename(C));
   Print(typename(D));   
   Print(typename(K));
}
2020.10.07 01:57:47.788 TestScript (EURUSD,M1)  int
2020.10.07 01:57:47.788 TestScript (EURUSD,M1)  uint
2020.10.07 01:57:47.788 TestScript (EURUSD,M1)  int
2020.10.07 01:57:47.788 TestScript (EURUSD,M1)  uint
2020.10.07 01:57:47.788 TestScript (EURUSD,M1)  double


La deuxième question.
Pourquoi y a-t-il une erreur de compilation pour float ?

#define  L 28.0 F  // float

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Print(typename(L));
}
'TestScript.mq5'                TestScript.mq5  1       1
'F' - undeclared identifier     TestScript.mq5  36      19
'F' - some operator expected    TestScript.mq5  36      19
2 errors, 0 warnings                            3       1


La troisième question.

#define  E '\n'         // char
#define F B'111111111' // int
#define  J ""           // string

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Print(typename(E));
   Print(typename(F));
   Print(typename(J));
}
2020.10.07 04:55:00.406 TestScript (EURUSD,M1)  ushort
2020.10.07 05:41:01.204	TestScript (EURUSD,M1)	uint
2020.10.07 04:55:00.406 TestScript (EURUSD,M1)  string
 
Roman:

Je vois que le sujet des macros a pris de l'ampleur, j'ai aussi quelques questions.

Pourquoi int et uint sont utilisés pour C et D ?
Où faut-il substituer long et ulong
ou peut-être le compilateur est-il si intelligent qu'il détecte la taille 280 et l'optimise ?


La deuxième question.
Pourquoi y a-t-il une erreur de compilation pour float ?


La troisième question.

1. L est long, mais c++. Essayez LL
2. f
3 "\n" est un caractère
 
Vladimir Simakov:
1. L est long, mais c++. Essayez LL.
2. f
3 "\n" est un caractère.

Oui. Ça marche.
Mais le type de caractère '+' nous indique que
Fits est une chaîne de caractères de 2 octets.

#define A 280          // int
#define B 280 U         // unsigned int
#define C 280 LL        // long
#define D 280 LLU       // unsigned long
#define E 28.0         // double
#define F 28.0 f        // float
#define J '+'          // char
#define K B'111111111' // int

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Print(typename(A));
   Print(typename(B));
   Print(typename(C));
   Print(typename(D));   
   Print(typename(E));
   Print(typename(F));
   Print(typename(J));
   Print(typename(K));
}
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  int
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  uint
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  long
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  ulong
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  double
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  float
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  ushort
2020.10.07 07:01:07.127 TestScript (EURUSD,M1)  uint
 
Roman:

Oui. Ça a marché.
Mais le type de caractère '+' est court
. Il est défini comme une taille de chaîne de 2 octets.

Pourquoi ferait-il ça ?

C'est un bug ou une anomalie ?

 
Vladimir Simakov:

Pourquoi est-ce que c'est comme ça ?

Est-ce un bug ou une fonctionnalité ?

Je ne sais pas.
C'est peut-être l'Unicode ?

 
Roman:

Qui sait ?
C'est peut-être l'Unicode ?

Non, la logique des développeurs est compréhensible, mais pour ma part, je préfère spécifier u'y' explicitement quand et si j'en ai besoin
 
Vladimir Simakov:
Non, la logique des développeurs est compréhensible, mais pour ma part, je préfère spécifier moi-même u'y' explicitement, quand et si j'en ai besoin

Il n'est pas clair comment le type de char est vaincu.

Raison: