Ошибки, баги, вопросы - страница 2867

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

Понял, вот здесь интерпретировал иначе.

Подставляется не константа, а макрос, все-таки.

Благодарю.
 
fxsaber:

Так идентичный по действиям MACRO и MACRO2.

Для конечного пользователя - да, используется один макрос с двумя параметрами

 
К вопросу о полезных и вредных предупреждения:
#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

Что делает умный компилятор Shell C++ ? Правильно! Там где явная опечатка и в строке (1) - пропущен 'x' 

    A( int x, int y ) :

- он выдает предупреждение: 'A::x' is initialized with itself. А там где все нормально - ничего не выдает!!!

А что делает 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

Там, где нужно и явная опечатка - он молчит, но зато там где не нужно и все нормально - он предупреждает: declaration of 'y' hides member

Почему все наоборот?
 

2632

на паузе в визуальном тестировании не удаётся просматривать (перематывать назад/вперёд) чарт ни с помощью мышки перетаскиванием ни клавишами стрелок.

 

Вижу тема макросов попёрла, у меня тоже есть вопросы

Почему для C и D подставляется int и uint ?
Кода должен подставляться long и ulong
Или компилятор такой умный, что видит размерность 280 и оптимизирует?

#define A 280    // int
#define B 280U   // 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


Второй вопрос.
Почему ошибка компиляции для float

#define L 28.0F  // 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


Третий вопрос.

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

Вижу тема макросов попёрла, у меня тоже есть вопросы

Почему для C и D подставляется int и uint ?
Кода должен подставляться long и ulong
Или компилятор такой умный, что видит размерность 280 и оптимизирует?


Второй вопрос.
Почему ошибка компиляции для float


Третий вопрос.

1. L - это long, но с++. Попробуй LL
2. f
3 '\n' - это char
 
Vladimir Simakov:
1. L - это long, но с++. Попробуй LL
2. f
3 '\n' - это char

Да. сработало.
Но что то символьный тип '+' показывает ushort
Подставляет как строковый размер 2 байта

#define A 280          // int
#define B 280U         // unsigned int
#define C 280LL        // long
#define D 280LLU       // unsigned long
#define E 28.0         // double
#define F 28.0f        // 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:

Да. сработало.
Но что то символьный тип '+' показывает ushort
Подставляет как строковый размер 2 байта

А зачем так?

Это косяк или, типа, фича?

 
Vladimir Simakov:

А зачем так?

Это косяк или, типа, фича?

Да кто ж его знает.
Может из за юникода?

 
Roman:

Да кто ж его знает.
Может из за юникода?

Не, сама логика разработчиков вполне понятна, но, как по мне, то я лучше сам, явно укажу u'щ', когда и если мне это понадобится