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

 
DrSky #:

Правильно. Вы пытаетесь обратиться к ch как к статическому элементу без объекта. Отсюда и ошибка. В вашем случае:

Но тогда ch будет общий на все объекты S.

А в С++ почему все работает!? Разберитесь в примере для начала

 
A100 #:

А в С++ почему все работает!? Разберитесь в примере для начала

По тому что это 2 разных языка. Кто-то из админов уже явно говорил, что нет цели компилировать C++.

Если вы хотите компилировать С++ код, используйте С++ компилятор.

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

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

Sergey Gridnev, 2023.12.12 15:49

Он тестированием компилятора занимается.

Другие Грааль годами ищут, они не занимаются ерундой?

Поэтому я и сказал, что он ерундой занимается. Он не тестирует компилятор. Он пихает С++ код в MQL компилятор и репортит сюда каждый warning.

Человек тупо не может смириться с тем, что для того, что бы использовать C++ наработки на MQL, нужно включать голову, а не бездумно компилировать.

 
Vladislav Boyko #:
Кто-то из админов уже явно говорил, что нет цели компилировать C++.

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

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

Ilyas, 2023.11.23 12:02

У нас нет цели копировать C++
Например, препроцессоры clang и MSVC различаются, т.е. можно написать код, который выдавать ошибки в одном компиляторе и успешно компилироваться в другом

Верно, пока не реализовано, работает над этим, но не специально, а врамках другого обновления языка.

 
Vladislav Boyko #:

По тому что это 2 разных языка. Кто-то из админов уже явно говорил, что нет цели компилировать C++.

Если вы хотите компилировать С++ код, используйте С++ компилятор.


Поэтому я и сказал, что он ерундой занимается. Он не тестирует компилятор. Он пихает С++ код в MQL компилятор и репортит сюда каждый warning.

Человек тупо не может смириться с тем, что для того, что бы использовать C++ наработки на MQL, нужно включать голову, а не бездумно компилировать.

1. Наработки на C++ я подключаю исключительно через .dll

2. Если вам ошибки не попадаются, то это означает лишь то, что вы не используете все возможности MQL - проще говоря: пишете в примитивном стиле

3. То, что пример работает в C++ означает, что оппоненту необходимо критически отнестись к своим аргументам - лишний раз прочесть документацию по MQL. Судя по всему вы тоже ее не читали

4. То что Разработчики не копируют С++ не означает, что уже скопированные конструкции должны работать как то по-другому

5. Модераторам рекомендую банить таких деятелей, которые пишут в этой теме не по сути вопроса, иначе из-за них растеряете всех вменяемых

 
Для вменяемых дополню свой пример:
struct S {
    int i;
    char ch[5];
};
void OnStart()
{
    Print(offsetof(S,ch)); //нормально
}

Если offsetof работает, значит и sizeof должен работать в этом же контексте.

Это помимо того что написано про sizeof в Документации

 

Уважаемые разработчики MT5!

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

Вот такой скрипт для теста

//--- COpenCL class
#include <OpenCL/OpenCL.mqh>
COpenCL           m_OpenCL;
//--- исходные коды кернелов
//#resource "Calc_Summ_Stolb_Matrix.cl" as string cl_tester
const string clSrc=
   "__kernel void CalcSumm_Stolb_2d(\r\n"
   "   __global uchar *arr_Data,\r\n"
   "   __global int *arr_Tabl_Rez,\r\n"
   "   int Stolb_Total_Data,\r\n"
   "   int Strok_Total_Data\r\n"
   ")\r\n"
   "{\r\n"
   "   int summ_sovpalo=0;\r\n"
   "   int index_i_L=0;\r\n"
   "   int index_i_G=0;\r\n"
   "   int index_L_G=0;\r\n"
   "   int index_G_L=0;\r\n"
   "   size_t L=get_global_id(0);\r\n"
   "   size_t G=get_global_id(1);\r\n"
   "}\r\n";

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---Кернелы OpenCL
   int index_kernel_CalcSumm_Stolb=0;

//---Инициализация файла с кернелами
   Print("Initialize=",m_OpenCL.Initialize(clSrc,true));
//--- установка количества кернелов
   Print("SetKernelsCount=",m_OpenCL.SetKernelsCount(1));
//--- создание кернелов
//   Print("0 KernelCreate=",m_OpenCL.KernelCreate(index_kernel_CalcSumm_Stolb,"CalcSumm_Stolb_2d"));
//--- создание буферов - указать количество буферов
   Print("SetBuffersCount=",m_OpenCL.SetBuffersCount(1));
//--- очистим все буферы
   m_OpenCL.BufferFree(0);
   int arr_Data[];
   int Size_arr_Data=268435456/4;
   bool Rez_Copy=false;
   for(int i=0; i<150; i++)
   {
      ArrayResize(arr_Data,Size_arr_Data*(i+1));
      Rez_Copy=m_OpenCL.BufferFromArray(0,arr_Data,0,Size_arr_Data*(i+1),CL_MEM_READ_WRITE);
      Print("Копируем в буфер на GPU, массив размером ",IntegerToString((i+1)*250,0,'0')," MB=",Rez_Copy);
      if(Rez_Copy==false)
      {
         PrintFormat("Error in BufferFromArray. Error code=%d",GetLastError());
         return;
      }
//--- очистим все буферы
      m_OpenCL.BufferFree(0);
   }
//--- remove OpenCL objects
   m_OpenCL.Shutdown();
}
//+------------------------------------------------------------------+

Такой результат:

2023.12.23 18:19:36.255 Test_GPU_mem (USDJPY,M1)        OpenCL: GPU device 'NVIDIA GeForce GTX 1660 SUPER' selected
2023.12.23 18:19:36.257 Test_GPU_mem (USDJPY,M1)        Initialize=true
2023.12.23 18:19:36.257 Test_GPU_mem (USDJPY,M1)        SetKernelsCount=true
2023.12.23 18:19:36.257 Test_GPU_mem (USDJPY,M1)        SetBuffersCount=true
2023.12.23 18:19:36.438 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 250 MB=true
2023.12.23 18:19:36.924 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 500 MB=true
2023.12.23 18:19:37.717 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 750 MB=true
2023.12.23 18:19:38.819 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 1000 MB=true
2023.12.23 18:19:40.226 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 1250 MB=true
2023.12.23 18:19:41.940 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 1500 MB=true
2023.12.23 18:19:44.043 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 1750 MB=true
2023.12.23 18:19:45.467 Test_GPU_mem (USDJPY,M1)        Копируем в буфер на GPU, массив размером 2000 MB=false
2023.12.23 18:19:45.467 Test_GPU_mem (USDJPY,M1)        Error in BufferFromArray. Error code=5112

Планируется ли снятие этого ограничения? Очень нужно мне для машинного обучения.

 
В тестере время течёт назад.
Файлы:
0h4ciy.png  5 kb
 
Ошибка при выполнении:
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

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