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

 

Ошибка при выполнении:

void OnStart()
{
    Print(typename(MB_ICONQUESTION)==typename(0x00000020));
}

Результат:   false

Ожидалось: truе

Константа

Значение

Описание

MB_ICONQUESTION

0x00000020

Изображение вопросительного знака

 
A100 #:

Ошибка при выполнении:

Результат:   false

Ожидалось: truе

Константа

Значение

Описание

MB_ICONQUESTION

0x00000020

Изображение вопросительного знака

Стандартные константы являются аналогом макроподстановок и имеют тип int.

0x00000020 uint.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Типы char, short, int и long - Целые типы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber #:

Не понял.

//+------------------------------------------------------------------+
template <typename T>
void Func( T  in ) { Print(__FUNCSIG__,typename(in),"=",in); }
            
void OnStart()
{ 
 int iI=23;
 double dI=23.3;
 string sI="23.33";

   Func (iI);

   Func(dI);

   Func(sI);
}

2023.11.28 14:33:46.495 Sig (GBPUSD,M1) void "void OnStart()"::Func<int>(int)int=23

2023.11.28 14:33:46.495 Sig (GBPUSD,M1) void "void OnStart()"::Func<double>(double)double=23.3

2023.11.28 14:33:46.495 Sig (GBPUSD,M1) void "void OnStart()"::Func<string>(string)string=23.33

Если в шаблоне известен тип, то  нет нужды его явно указывать.

Иначе:

template <typename T>
void Func( void ) { Print(__FUNCSIG__); }
template<typename T>
struct THelper{}; 
//----
class A
{
public:
  template <typename T>
  A(const THelper<T>&) { Print(typename(T)); }
};

void OnStart()
{
  Func<int>();
  Func<double>();
  Func<A>();
  Func<string>(); 
  Func();         //   #ошибка компиляции  - could not deduce template argument #0       

 
Всем привет. После попытки обновления или открытия индикатора с папки , у меня по верх основной программы(окна) , открывается еще одно. Как решить эту проблему?
 
Mikhail Dovbakh #:

0x00000020 uint.

А почему Вы решили, что 0x00000020 должно быть непременно uint? Где ссылка на Документацию?

 
OVER9000 I #:
Всем привет. После попытки обновления или открытия индикатора с папки , у меня по верх основной программы(окна) , открывается еще одно. Как решить эту проблему?

Хоть бы скрином показали что там у Вас происходит

 
A100 #:

А почему Вы решили, что 0x00000020 должно быть непременно uint? Где ссылка на Документацию?

Я по факту написал. По идее константа 0х20 меньше  0X8000 и должна  быть тоже int. Здесь Ваши ожидания оправданы.

Но для MQL   не ставили задачу по полному соответствию Си... 

"Каждой целой константе присваивается тип, определяющий преобразования, которые должны быть выполнены, если константа используется в выражениях. Тип константы определяется следующим образом:

— десятичные константы рассматриваются как величины со знаком, и им присваивается тип int (целая) или long (длинная целая) в соответствии со значением константы. Если константа меньше 32768, то ей присваивается тип int в противном случае long.

— восьмеричным и шестнадцатеричным константам присваивается тип int, unsigned int (беззнаковая целая), long или unsigned long в зависимости от значения константы согласно табл 5.

Таблица 

Диапазон шестнадцатеричных
констант
Диапазон восьмеричных
констант
Тип
0x0 — 0x7FFF 0 — 077777 int
0X8000 — 0XFFFF 0100000 — 0177777 unsigned int
0X10000 — 0X7FFFFFFF 0200000 — 017777777777 long
0X80000000 — 0XFFFFFFFF 020000000000 — 037777777777 unsigned long

Для того чтобы любую целую константу определить типом long, достаточно в конце константы поставить букву "l" или "L".

 
Mikhail Dovbakh #:

Я по факту написал. По идее константа 0х20 меньше  0X8000 и должна  быть тоже int. Здесь Ваши ожидания оправданы.

Но для MQL   не ставили задачу по полному соответствию Си... 

Это тот случай, когда требуется полное соответствие, иначе с С++ на MQL нельзя перенести без трудноуловимой ошибки даже простые казалось бы вычисления:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

A100, 2023.11.25 14:45

Ошибка при выполнении:
void OnStart()
{
    printf("%d", -4/(2 + 0x0));
}

Результат:  2147483646

Ожидалось: -2

 
Mikhail Dovbakh #:

Если в шаблоне известен тип, то  нет нужды его явно указывать.

Спасибо, но вопрос был о другом.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2023.11.26 23:26

Это ограничение MQL5 или просто нельзя делать перегрузку шаблонной функции?
template <typename T>
void Func( void ) { Print(__FUNCSIG__); }

void Func( void ) { Print(__FUNCSIG__); }

void OnStart()
{
  Func<int>();
  Func();
}
 
Ошибка при компиляции:
class A {} const *a, *b;
void f( const A*& ) {}
void OnStart()
{
    f( b ); //Error: cannot convert type 'A *' to reference of type 'const A *'
}
Причина обращения: