Buil 1583 CopyRates перестала работать, если приёмный массив - статически выделенный

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
181641
Vladimir Karputov  
MetaTrader 5 x64 build 1583 started (MetaQuotes Software Corp.)
Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 4467 / 8077 Mb, HDD: 302742 / 475588 Mb, GMT+02:00
C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Windows 10 Creators:

Windows 10 Creators

Согласно справке CopyRates я могу использовать как динамический, так и статически выделенный массив

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

Если необходимо копировать заранее известное количество данных, то лучше это делать в статически выделенный буфер, чтобы избежать излишнего перевыделения памяти.

Поэтому делаю попытку копировать в статически выделенный массив:

void OnTick()
  {
//---
   string text1="";
   string text2="";
   string text3="";
   MqlRates rates[3];
   for(int i=0;i<ArraySize(timeframes);i++)
     {
      ResetLastError();

и сразу получаю ошибку: кол-во скопированных элементов "-1" и ошибка "4006":

ERR_INVALID_ARRAY

4006

Массив неподходящего типа, неподходящего размера или испорченный объект динамического массива



Как только приёмный массив объявить, как динамический:

void OnTick()
  {
//---
   string text1="";
   string text2="";
   string text3="";
   MqlRates rates[];
   for(int i=0;i<ArraySize(timeframes);i++)
     {
      ResetLastError();

всё сразу начинает работать.


Добавлено: в biuld 1580 CopyRates работала со статически выделенным массивом.

Файлы:
Piano.mq5 19 kb
Alexey Viktorov
25795
Alexey Viktorov  
А я-то подумал что у меня оного что-то сломалось.
fxsaber
16746
fxsaber  
ArrayCopy не работает, даже если один массив (любой из двух) статический.
Vladimir Karputov
Модератор
181641
Vladimir Karputov  
Оперативно отреагировали. Спасибо! (Исправление будет в ближайшей бете).
SeriousRacoon
1080
SeriousRacoon  
Мда. C нарастающим количеством ошибок в новых версиях критически необходима опция отката обновления.
Yuriy Zaytsev
18677
Yuriy Zaytsev  
SeriousRacoon:
Мда. C нарастающим количеством ошибок в новых версиях критически необходима опция отката обновления.

Можно держать специально версию , которая на "Ваш" взгляд стабильна, можно ведь не спешить ставить Update

Koldun Zloy
728
Koldun Zloy  

Напишу сюда, поскольку появилось в этом же билде. Раньше всё было нормально.

Создаём такие классы:

struct StructA
{
   ushort vt;
   
   StructA() : vt( 0 ){}
   StructA( const ushort varType ) : vt( varType ){}
};

struct StructB : public StructA
{
   uint uintVal;
   
   StructB(){}
   StructB( const uint val ) : StructA( 2 ), uintVal( val ){}
};

struct StructC : public StructA
{
   ulong ulongVal;

   StructC(){}
   StructC( const ulong val ) : StructA( 3 ), ulongVal( val ){}
};
   
class ClassV
{
   StructC mData;
   
public:
   ClassV(){}
   ClassV( const uint val );
};

ClassV::ClassV( const uint val )
{
   StructB newData( val );
   mData = newData;
}

Компилятор выдаёт предупреждение:  "implicit struct cast".

Делаем явное преобразование:

ClassV::ClassV( const uint val )
{
   StructB newData( val );
   mData = (StructC)newData;
}

Появляется сообщение об ошибке:  '(StructC)' - invalid cast operation.

Оно конечно и сейчас работает, если не обращать внимание на предупреждения.

Но я привык обращать.

fxsaber
16746
fxsaber  
Koldun Zloy:

Компилятор выдаёт предупреждение:  "implicit struct cast".

Делаем явное преобразование:

Появляется сообщение об ошибке:  '(StructC)' - invalid cast operation.

StructB и StructC имеют разный размер.
prostotrader
8044
prostotrader  
А какие изменения в Билде 1583 были сделаны?
prostotrader
8044
prostotrader  
Появился 1584
Vladimir Karputov
Модератор
181641
Vladimir Karputov  
Vladimir Karputov:



Terminal MetaTrader 5 x64 build 1584 started (MetaQuotes Software Corp.) - починили, теперь  CopyRates снова корректно работает со статически выделенным массивом.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий