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

 
fxsaber #:

Нет ошибки.

Если нет - ниже подобные примеры попроще - попробуйте объяснить почему в одном случае результат 3, а в другом 4, при том, что они отличаются только строкой (*) и каких-либо ошибок или warning при компиляции нет:

void f( long       ) { Print(3); } //(*)
void f( const int& ) { Print(4); }
void OnStart()
{
    f(0);
}

Результат: 3

void f( const int& ) { Print(4); }
void OnStart()
{
    f(0);
}

Результат: 4

 
   int i = 0;
   long l = 0;
   f(0); // 3
   f(i); // 4
   f(l); // 3
 
trader6_1 #:

Для доказательства ошибки уже достаточно разного результата:

int i = 0;//Результат:
    f(0); // 3
    f(i); // 4

При том, что:

void OnStart()
{                                       //Результат:
    Print(typename(0)==typename(int )); //true
}

и это не считая того, что:

void OnStart()
{                                       //Результат:
    Print(typename(0)==typename(long)); //false
}
 
A100 #:

Пользуюсь OpenCL напрямую (с тех еще пор как в MQL ее запретили без поддержки double) - там нет ограничений. В MQL при определении размера (в частности буфера) нужно быть осторожным из-за неправильно определенного sizeof для x64 разрядной системы. Вот поясняющий пример:

void OnStart()
{
    int size = INT_MAX/2;
    Print(size*sizeof(int));
}

Результат:   -4

Ожидалось: 4294967292

не может тип int вместить в себя  4294967292
так прокатит:

void OnStart()
{
  uint size = INT_MAX/2;
  Print(size*sizeof(int));
}
 
A100 #:

Пользуюсь OpenCL напрямую (с тех еще пор как в MQL ее запретили без поддержки double) - там нет ограничений.

Вроде как ограничение  с double уже сняли.

Вы используете библиотеку, собранную на C++ для OpenCL?

 
Nikolai Semko #:

не может тип int вместить в себя  4294967292
так прокатит:

Совершенно верно, но принципиальная ошибка в данном случае именно в sizeof

sizeof должен быть такого типа, чтобы возвращать максимально возможный размер в системе. Для x64 разрядных систем он должен выглядеть так:

ulong sizeof(...)

Т.е. пользователь не должен думать, о корректности размера - произведение на sizeof всегда должно возвращать корректное значение.

Определим корректный sizeof:

#define sizeof(T)       ulong(sizeof(T)) //(*)
void OnStart()
{
    int size = INT_MAX/2;
    Print(size*sizeof(int));
}

Результат: 4294967292

как и ожидалось

А что изменилось по сравнению с первоначальным примером? - просто добавили строку (*)

 
Aleksey Vyazmikin #:

Вроде как ограничение  с double уже сняли.

Сняли далеко не сразу, а потом два раза на одни и те же грабли наступать - не располагаю такой возможностью

 
fxsaber #:

Это еще неисправленный баг.

Можно подумать, что его собираются исправить :)
 
fxsaber #
:

Это еще неисправленный баг.

Баг в MQL - это не любое сомнительное поведение, а только если:

1) В Документации указано по-другому

2) Есть пример, который вступает в неразрешимое противоречие с исходным

3) В C++ по-другому, а в Документации пробел

А в ином случае - это Ваше личное мнение - тем более никакого противоречивого примера я там о Вас не видел (пункт 2), при том, что указанное ниже поведение соответствует и логике и С++ (пункт 3)

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

Новая версия платформы MetaTrader 5 build 4040: Улучшения и исправления

A100, 2023.12.12 12:07

Вы не в теме просто - вот и чудятся везде баги, а их здесь нет (обобщил):

template<typename T>
void f( const T& t ) { Print( t ); }
void OnStart()
{
    int i = 1;
    f(  i );                  //нормально
    f(      1 );              //нормально
    string text = "ABCDEF";
    f(     text );            //нормально
    f(            "ABCDEF" ); //нормально
}

Это Вам любой грамотный пользователь подтвердит

Причина обращения: