Errori, bug, domande - pagina 2867

 
A100:
#define  TMP VALUE      // TMP = 10 VALUE

Capito, interpretato in modo diverso qui.

Non è una costante, ma una macro, dopo tutto.

Grazie.
 
fxsaber:

Quindi identico in azione a MACRO e MACRO2.

Per l'utente finale, sì, si usa una macro con due parametri

 
Alla domanda sugli avvertimenti utili e dannosi:
#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

Cosa fa un compilatore Shell C++ intelligente? Giusto! Dove c'è un evidente errore di stampa e nella linea (1) - manca la "x

    A( int x, int y ) :

- genera l'avvertimento: 'A::x' è inizializzato con se stesso. E non mostra nulla in quei posti dove è OK!

E cosa fa il compilatore 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

È silenzioso quando ne ha bisogno e c'è un evidente errore di stampa, ma quando non ne ha bisogno e tutto è a posto, avverte: dichiarazione di 'y' nasconde membro

Perché è il contrario?
 

2632

Quando è in pausa nel test visivo, non è possibile sfogliare (riavvolgere/avanzare) il grafico usando il mouse o i tasti freccia.

 

Vedo che l'argomento delle macro è decollato, anch'io ho alcune domande

Perché int e uint sono usati per C e D?
Perché long e ulong dovrebbero essere sostituiti per la codifica
o forse il compilatore è così intelligente che percepisce la dimensione 280 e la ottimizza?

#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 seconda domanda.
Perché c'è un errore di compilazione per 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 terza domanda.

#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:

Vedo che l'argomento delle macro è decollato, anch'io ho alcune domande

Perché int e uint sono usati per C e D?
Dove dovrebbero essere sostituiti long e ulong
o forse il compilatore è così intelligente che percepisce la dimensione 280 e la ottimizza?


La seconda domanda.
Perché c'è un errore di compilazione per float?


La terza domanda.

1. L è lungo, ma c++. Prova LL
2. f
3 '\n' è un carattere
 
Vladimir Simakov:
1. L è lungo, ma c++. Prova LL.
2. f
3 '\n' è char.

Sì, funziona.
Ma il tipo di carattere '+' mostra ushort
Fits come una dimensione di stringa di 2 byte

#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:

Sì, ha funzionato.
Ma il tipo di carattere '+' mostra ushort
Lo imposta come una dimensione di stringa di 2 byte

Perché dovrebbe farlo?

Si tratta di un bug o di una cimice o di qualcosa del genere?

 
Vladimir Simakov:

Perché è così?

È un bug o una caratteristica?

Non lo so.
Forse è l'Unicode?

 
Roman:

Chi lo sa.
Forse è l'Unicode?

No, la logica degli sviluppatori è comprensibile, ma per me, preferisco specificare esplicitamente u'y' quando e se ne ho bisogno