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

 
Ошибка при выполнении:
void f( int           ) { Print(1); }
void f( const string& ) { Print(2); }
void OnStart()
{
    f( "ABCDEF" );
}

Результат:   1

Ожидалось: 2

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

Результат:   1

Ожидалось: 2

Нет ошибки.

 
Aleksey Vyazmikin #:

Я правильно понимаю, что сейчас есть ограничение на размер одного буфера для кода на OpenCL в районе 2 гигабайт?

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

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

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

Ожидалось: 4294967292

 
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

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

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