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

 
Alexey Navoykov:

Псевдокод они когда-то давали в этой ветке, поищите.  Насколько помню, capacity там увеличивается только при выходе размера массива за пределы этого capacity.  Хотя конечно что-то могло и поменяться.

А функция по получению значения сapacity действительно очень нужна.

Спасибо за информацию, пока что нашел как fxsaber то же искал ))

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

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

fxsaber, 2018.04.13 10:04

Помогите найти пост разработчика, где был выложен исходник ArrayResize. Поиск через гугл "site:mql5.com/ru/forum ArrayResize+reserve" не помогает.

Помню, что был исходник. В нем сразу видно, какая логика реализации reserve-параметра.

Искал в гуле, искал на форуме, искал в профилях основных разработчиков...
Кроме возможности использовать reserve_size со значением -1 в ArrayResize для очистки ранее выделенной памяти ни чего не нашел.
 
Sergey Dzyublik:

Спасибо за информацию, пока что нашел как fxsaber то же искал ))

И я не нашел )

Вроде @Slava об этом писал.

 

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

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

Ilyas, 2016.08.24 11:08

В массиве ("внутри") хранится allocated - под сколько элементов массив распределён.

Логика работы с резервом(условный код):
ArrayResize(arr,int size,int reserve)
  {
   if(arr.allocated<size)
      if(!ArrayAllocateMemory(arr,size+reserve))  // -> arr.allocated=size+reserve;
         return(-1);
   //---
   CallConstructorsOrDestructors(arr,size);
   //---
   arr.size=size;
   return(size);
  }

 
Alexey Navoykov:

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

 
class A{
   uchar data;
};
 
template<typename T>
class B{
public:
   T data;
};

template<typename T>
class C {
public:
   uchar data;
};


void OnStart(){
   A a;
   B<A> b;
   C<A> c;
   
   a = (A)(a);
   b = (B<A>)(b);    //'(' - invalid cast operation
   c = (C<A>)(c);    //code generation error            
}
Выполнить type cast "самого в себя", оказывается, не все типы данных и могут... 
Шаблонные классы ломаются при компиляции, а со структурам все ОК.
 
Можно доставать резерв грязными хуками и проверить поведение ресайза ручками
 
TheXpert:
Можно доставать резерв грязными хуками и проверить поведение ресайза ручками

Предположительно, в памяти объекта массива переменная под reserved size лежит рядом с переменной под size.
Однако на текущий момент, есть десяток более приоритетных задач, чем дебаг или копание в памяти МТ с целью изучения влияния ArrayResize на поле reserved size объекта массива.

 
Sergey Dzyublik:
#import "msvcrt.dll"
  long memcpy(int &dst[], long &src, int cnt);
#import

struct ArrayStore
{
   long offset;
   double x[];
   
   int capacity() 
   {
      int ints[sizeof(ArrayStore) / sizeof(int)];
      memcpy(ints, this.offset, sizeof(ArrayStore));
      return ints[8];
   }
};

void OnStart()
{
   ArrayStore store;
   ArrayResize(store.x, 17, 8755);
   Print("all reserved size = ", store.capacity()); // 8772
}
 
Sergey Dzyublik:
Выполнить type cast "самого в себя", оказывается, не все типы данных и могут... 
Шаблонные классы ломаются при компиляции, а со структурам все ОК.

Спасибо за сообщение.

Это рудимент, исправим.

 
TheXpert:

Спасибо, не подумал про доступ к памяти процесса с помощью WinApi.

П.с.  личка закрыта, по этому пишу тут:
"В reverse engineering термин хук имеет конкретное значение - код для перехват вызова некой функции или события."