Скачать MetaTrader 5

ArrayCopy

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужно пополнить счет? Пополняй удобным тебе способом!
Дмитрий Александрович
1705
Так, что-то я перегрелся, насколько я понял с помощью ArrayCopy() нельзя копировать В многомерные массивы?

Или я что-то не так делаю?

double arr[10][5], arr2[5];
ArrayCopy(arr[0],arr2);
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
Vladimir Batrudinov
4926
Vladimir Batrudinov 2010.08.02 15:04  
mrProF:
Так, что-то я перегрелся, насколько я понял с помощью ArrayCopy() нельзя копировать в/из многомерных массивов?

Или я что-то не так делаю?

Нужно понимать, что функция копирует значеня отдного масива в другой...

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

double arr[10][5], arr2[5];
ArrayCopy(arr,arr2);
Rashid Umarov
Админ
11840
Rashid Umarov 2010.08.02 15:06  

В справке параметры указаны как одномерные массивы

ArrayCopy

Производит копирование одного массива в другой.

int  ArrayCopy(
   void  dst_array[],       // куда копируем
   void  src_array[],       // откуда копируем
   int   dst_start=0,       // с какого индекса пишем в приемник
   int   src_start=0,       // с какого индекса копируем из источника
   int   cnt=WHOLE_ARRAY    // сколько элементов
   );



Дмитрий Александрович
1705
Дмитрий Александрович 2010.08.02 15:13  
Rosh:

В справке параметры указаны как одномерные массивы


Например если так:

double arr[10][5], arr2[5];
ArrayCopy(arr2,arr[0]);

То компилируется нормально.

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

Я в курсе, мне нужно скопировать одномерный массив во второе измерение другого массива.
Я уже сделал по другому, но все же интересно как скопировать.


Vladimir Batrudinov
4926
Vladimir Batrudinov 2010.08.02 15:38  
mrProF:

Например если так:

То компилируется нормально.

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

Я в курсе, мне нужно скопировать одномерный массив во второе измерение другого массива.
Я уже сделал по другому, но все же интересно как скопировать.


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

По этому этот код работает нормально (при этом 0 можно в цикле легко заменить на f = 0...9)

double arr[10][5], arr2[5];
ArrayCopy(arr2,arr[0]);

Вот этот код тоже нормально отработает (но данные можно будет перенести только в arr[0][5])

double arr[10][5], arr2[5];

double d;
int f;
  
  for(f=0;f<5;f++)
  {
    if(f==0){arr2[f]=0;}else{arr2[f]=arr2[f-1]+1;}
  }

ArrayCopy(arr,arr2);

  for(f=0;f<5;f++)
  {
  d = arr[0][f];
  Print(d);
  }

PS

Если использовать два массива, один из которых многомерный нужно или использовать другую функцию или писать свою, копирующую данные в цикле.

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

Дмитрий Александрович
1705
Дмитрий Александрович 2010.08.02 15:47  
Interesting:

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

По этому этот код работает нормально (при этом 0 можно в цикле легко заменить на f = 0...9)

Вот этот код тоже нормально отработает (но данные можно будет перенести только в arr[0][5])

PS

Если использовать два массива, один из которых многомерный нужно или использовать другую функцию или писать свою, копирующую данные в цикле.

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

Да подручными средствами (свои функции, циклы) я скопировал.
Просто хотелось бы копировать функцией ArrayCopy() в многомерный массив.
Ждем ответ разработчиков, можно будет или нет?
А то приходится для простой операции всякие костыли изобретать.

Vladimir Batrudinov
4926
Vladimir Batrudinov 2010.08.02 15:56  
mrProF:

Да подручными средствами (свои функции, циклы) я скопировал.
Просто хотелось бы копировать функцией ArrayCopy() в многомерный массив.
Ждем ответ разработчиков, можно будет или нет?
А то приходится для простой операции всякие костыли изобретать.

Однозначно ответят что свое писать нужно (если уже готового нет, на что бы я не сильно надеялся)...
Nikolay Demko
12465
Nikolay Demko 2010.09.10 19:13  
Interesting:
Однозначно ответят что свое писать нужно (если уже готового нет, на что бы я не сильно надеялся)...

Может ещё подскажите как ?

Написал своё :

void copy(double &aa[][], int i,const double &bb[][],int s)
  {
   for(int j=0;j<10;j++)
      aa[i][j] = bb[s][j];
  }

Ругается на передачу массивов :   ']' - positive integer constant is expected 

Nikolay Demko
12465
Nikolay Demko 2010.09.10 19:24  
Urain:

Может ещё подскажите как ?

Написал своё :

Ругается на передачу массивов :   ']' - positive integer constant is expected 

Нашёл на что ругается, сразу не мог найти тк это не логично.

Оказывается многомерные массивы при передаче по ссылке нужно описывать так же как и при объявлении те с указанием длинны статичных измерений.

void copy(double &a[][10], int i,const double &b[][10],int s)
  {
   for(int j=0;j<cell;j++)
      a[j][i]=b[j][s];
  }

Не понятно зачем так сделано ведь компилятор по имени знает к какому массиву обращатся ? по моиму достаточно указать что массив многомерный и всё.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
Andrey Dik
11349
Andrey Dik 2010.09.11 08:42  

Да, есть такое неудобство. Нужно заранее в функции объявлять размер второго измерения. Не получится поэтуму писать универсальные функции (для обработки массивов любых размеров). Придется использовать ООП. (помнишь, я просил тебя помочь сделать класс, который позволял бы работать с массивами произвольного размера?)

На MQL4 было бы достаточно писать например так:

CsvTo2D_Array(string nameFile, string Separator, double &array[0][0], int &StrAmount, int &ColumnAmount, bool &truth) 

Зачем так сделано в MQL5 непонятно. Возможно в этом есть смысл, который мне не известен, может быть разработчики прояснят этот момент? 

Slawa
Модератор
6843
Slawa 2010.09.13 12:45  
joo:

Зачем так сделано в MQL5 непонятно. Возможно в этом есть смысл, который мне не известен, может быть разработчики прояснят этот момент? 

Проясним. Так сделано для того, чтобы компилятор мог заранее высчитывать смещение для доступа к многомерным массивам. Если это делать на этапе выполнения, то исполняемый код распухает из-за дополнительных проверок и замедляется скорость обработки многомерных массивов
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий