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

Artyom Trishkin #:

Ну Вы же пишете, а значит - нет бана.

Если видите в профиле бан, перезагрузите роутер - наверняка у него динамический IP, и просто текущий попал на забаненный адрес. После перезагрузки роутера, IP сменится, и бана не будет.

Да, роутер с динамик. айпи. Спасибо.




Такой тут ещё впрос. достал я советник, закинул в тестер мт5, он долго думал потом сказал инит файлед.. Но он рабочий. Перекинул на другой комп - работает всё ок. Перегррузил свой- тоже работает, они по ходу как то связаны с оперативной памятью или нет? Если её очистить под 0 то тоже ошибка исчезает.

Vladislav Boyko #:

Правильно ли я понимаю, что при вызове метода withPtr() указатель будет проверен количество раз, равное размеру массива m_a.x[], а при вызове метода withRef() указатель будет проверен только 1 раз?

Полный код прикрепил в виде скрипта. Скрипт сравнивает скорость выполнения методов  withPtr() и withRef().

Для десяти миллионов обращений withRef() показывает примерно пятикратное ускорение (режим компиляции: maximum optimization):

Вы использовали лайфхак преобразования указателя в объект.

class A {};

void f( A& ) {}
void g( A*& ) {}

void OnStart()
{
  A* a = NULL;
  
  f(a); // OK - ??
  g(a); // OK
}

Тем самым обнулив проверку указателя на каждой итерации цикла. Выглядит, как ошибка языка, приводящая к ускорению.

Alain Verleyen #:
Это произошло из-за изменения в файле данных, которое привело к чтению за конец файла.

Не понял, т.е. файл слишком большой и не хватило памяти ОЗУ? По факту файл не большой и уменьшается в процессе работы скрипта.

Вот функция чтения - раньше не замечал подобных сообщений - активно использую не менее года.

//+------------------------------------------------------------------+
//Загрузка выборки в формате bin
//+------------------------------------------------------------------+
void Load_Data(int v)
{
//---Загрузка выборки из bin файла
   int Strok_Total_Data_Load=0;
   int Stolb_Total_Data_Load=0;
   int Size_arr_LoadData=0;
   string Dir="";
   if(Use_Temp_Dir==true && Load!=Dir_Q)
   {
      switch(v)
      {
      case 0:
         Dir=Dir_Q+"_TMP\\Setup\\train.bin";
         break;
      case 1:
         Dir=Dir_Q+"_TMP\\Setup\\test.bin";
         break;
      case 2:
         Dir=Dir_Q+"_TMP\\Setup\\exam.bin";
         break;
      }
   }
   else
   {
      switch(v)
      {
      case 0:
         Dir=Load+"\\Setup\\train.bin";
         break;
      case 1:
         Dir=Load+"\\Setup\\test.bin";
         break;
      case 2:
         Dir=Load+"\\Setup\\exam.bin";
         break;
      }
   }

   int h=FileOpen(Dir,FILE_READ|FILE_BIN|FILE_SHARE_READ|FILE_COMMON);//Загрузим файл
   if(h==INVALID_HANDLE)
   {
      Print("Ошибка открытия файла - ",Dir);
   }

   Strok_Total_Data_Load=FileReadInteger(h,INT_VALUE); // считываем значение
   Stolb_Total_Data_Load=FileReadInteger(h,INT_VALUE); // считываем значение
   Size_arr_LoadData=FileReadInteger(h,INT_VALUE); // считываем значение

   ArrayResize(arr_Data,Size_arr_LoadData);
   ArrayResize(arr_Load_Time,Strok_Total_Data_Load);
   ArrayResize(arr_Load_Target_P,Strok_Total_Data_Load);
   ArrayResize(arr_Target,Strok_Total_Data_Load);
   ArrayResize(arr_Load_Target_100_Buy,Strok_Total_Data_Load);
   ArrayResize(arr_Load_Target_100_Sell,Strok_Total_Data_Load);

   FileReadArray(h,arr_Data,0,Size_arr_LoadData); // считаем  массив заданное количество элементов

   int Size_arr_Bin=0;//Размер массива для считывания

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Time,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Target_P,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Target,0,Size_arr_Bin); // считаем  массив arr_Load_Target_100 заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Target_100_Buy,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   Size_arr_Bin=FileReadInteger(h,INT_VALUE); // считываем значение
   FileReadArray(h,arr_Load_Target_100_Sell,0,Size_arr_Bin); // считаем  массив заданное количество элементов

   int Size_arr_Zagalovki=0;
   Size_arr_Zagalovki=FileReadInteger(h,INT_VALUE); // считываем значение
   Print("Size_arr_Zagalovki=",Size_arr_Zagalovki);
   ArrayResize(arr_Zagalovki,Size_arr_Zagalovki); // изменение размера массива
   int Size_str=0;//Длина строки
   for(int i=0; i<Size_arr_Zagalovki; i++) // по всем элементам массива
   {
      Size_str=FileReadInteger(h,INT_VALUE); // чтение размере строки
      arr_Zagalovki[i]=FileReadString(h,Size_str); // чтение строки
   }
   FileClose(h);

   Strok_Total_Data=Strok_Total_Data_Load;
   Stolb_Total_Data=Stolb_Total_Data_Load;
}
Aleksey Vyazmikin # :

Не понял, т.е. файл слишком большой и не хватило памяти ОЗУ? По факту файл не большой и уменьшается в процессе работы скрипта.

Вот функция чтения - раньше не замечал подобных сообщений - активно использую не менее года.

Это именно проблема. Извините, но я не буду проверять ваш код, у меня нет на это времени.

Разработчики MetaQuotes знают о сообщении «VirtualAlloc», и я полагаю, что они улучшат его в будущем. Но проблемы можно избежать.

Alain Verleyen #:
Но проблемы можно избежать.

Как избежать?

Mickey Moose #:


, они по ходу как то связаны 

Они связаны против хода.

fxsaber #:

Вы использовали лайфхак преобразования указателя в объект. Выглядит, как ошибка языка, приводящая к ускорению.

Это не лайфхак, а задокументированная возможность

https://www.mql5.com/ru/docs/basis/types/object_pointers

void OnStart()
  {
//--- объявим указатель на объект и создадим его с помощью оператора 'new'
   Foo *foo2=new Foo("foo2");
//--- вариант передачи указателя на объект по ссылке
   PrintObject(foo2); // указатель на объект автоматически преобразуется компилятором  
  }

void PrintObject(Foo &object)
  {
   Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
  }
Vladislav Boyko #:

Это не лайфхак, а задокументированная возможность

Ошибка в документации. С template такое не прокатит, например.

fxsaber #:
Тем самым обнулив проверку указателя на каждой итерации цикла. Выглядит, как ошибка языка, приводящая к ускорению.

По логике вещей, указатель все равно будет единократно проверен при преобразовании.

class A
  {
public:
   const int id;
             A(int a_id) : id(a_id) {}
  };

void OnStart()
  {
   f((A*)NULL); // invalid pointer access
  }

void f(A& a)
  {
   Print(a.id);
  }

Следующий тест показывает, что при попытке удалить объект внутри метода, он будет удален только после выхода из метода (утечки памяти нет по итогу):

class A
  {
public:
   const int id;
             A(int a_id) : id(a_id) {}
  };

void OnStart()
  {
   A* a = new A(123);
   f(a);
  }

void f(A& a)
  {
   Print("#1 ", a.id);
   A* ptr = GetPointer(a);
   delete ptr;
   Print("#2 ", a.id);
  }

fxsaber #:

Ошибка в документации. С template такое не прокатит, например.

Я не считаю, что это ошибка. Постом выше я показал, что сломать эту механику не получится даже при желании.

Шаблонами не пользуюсь, не могу ничего сказать.