Скачать MetaTrader 5

Подскажите про массивы - страница 3

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Viktorov
20923
Alexey Viktorov  
Vladimir Karputov:
Не нужно выкусывать фразу из контекста. Я давал четко ответ про функцию ArrayCopy: при использовании ArrayCopy нельзя копировать массив сам в себя, так как результат такого копированиях будет неопределённый.

Кривыми руками ничего делать нельзя.

Проверяйте прежде чем такое говорить.

void OnStart()
{
 double arr[] = {3.2, 2.5, 7.9, 8.2, 10.12};
 int copy = ArrayCopy(arr, arr, 0, 1);
 arr[4] = 100500.2;
}

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


Aliaksandr Hryshyn
1996
Aliaksandr Hryshyn  
ovak77:
Я только учусь и на массивах попал в засаду: пытаюсь написать скрипт в котором массив данных будет перезаписываться. Например, 10 индексов, 0-9, допустим даты с 1 по 10 января, как 11 числа удалить данные за 1 января и вписать данные за 11, т.е. перезаписать в массив данные со 2 по 11 января, затем с 3 по 12 и т.д.?
Усложним задачку). У нас не 10 индексов а очень много, например 1000000, что операция сдвига получилась очень медленная, а вызывать её надо часто. Как реализовать такой же функционал, не копируя все данные массива?
Решайте).
Alexey Viktorov
20923
Alexey Viktorov  
Aliaksandr Hryshyn:
Усложним задачку). У нас не 10 индексов а очень много, например 1000000, что операция сдвига получилась очень медленная, а вызывать её надо часто. Как реализовать такой же функционал, не копируя все данные массива?
Решайте).

Если массив не многомерный и не статический, вот ещё вариант сдвига.

bool asSeries = ArrayGetAsSeries(arr);
ArraySetAsSeries(arr, (asSeries, ? false : true));
ArrayResize(arr, ArraySize(arr)-1);
ArraySetAsSeries(arr, asSeries);
Таким образом, нулевой индекс массива станет последним, затем убавим размерность, в этот момент последний элемент массива будет удалён, вернём направление индексации в прежнее состояние. Теперь последний элемент массива(который совсем недавно был предпоследним, а до этого первым) станет нулевым.


НО!!! Прежде чем говорить о скорости выполнения ArrayCopy надо-бы проверить несколько раз.

Код написан "на коленке" так-что если есть ошибки, не обессудьте... не проверял.

Aliaksandr Hryshyn
1996
Aliaksandr Hryshyn  
Ещё не хватает изменения размера массива в исходный, нужно куда-то новый элемент добавить.
Не сработает, будет копирование.
По условию, есть последовательность значений времени, нужно удалить самое старое(время) и добавить новое, притом, чтобы был правильный индексированных доступ, например, самое старое под индексом 0.
Тут просто всё.....
Aliaksandr Hryshyn
1996
Aliaksandr Hryshyn  
ArrayCopy - по условию 1000000 значений, копировать будет долго...
Ещё вопрос новичкам).
Какой объём данных будет копироваться в мегабайтах(1000000 значений времени)?
Alexey Viktorov
20923
Alexey Viktorov  
Aliaksandr Hryshyn:
ArrayCopy - по условию 1000000 значений, копировать будет долго...
Ещё вопрос новичкам).
Какой объём данных будет копироваться в мегабайтах(1000000 значений времени)?

А вместо предположений проверить было трудно? Или мама не разрешила?

/********************Script program start function*******************/
void OnStart()
{
 srand(GetTickCount());
 ulong st = GetMicrosecondCount();
 int arr[1000000];
 for(int i = 0; i < 1e6; i++)
  arr[i] = rand();
  Print("Заполнение массива ", GetMicrosecondCount()-st, " микросекунд");
  ulong st1 = GetMicrosecondCount();
  ArrayCopy(arr, arr, 0, 1);
  Print("Копирование массива ", GetMicrosecondCount()-st1, " микросекунд");
  Print("Общее время ", GetMicrosecondCount()-st, " микросекунд");
}/*******************************************************************/

Результат

2017.12.07 11:13:53.385 Test_ArrayCopy (EURJPY,H1)      Заполнение массива 1917 микросекунд
2017.12.07 11:13:53.395 Test_ArrayCopy (EURJPY,H1)      Копирование массива 696 микросекунд
2017.12.07 11:13:53.395 Test_ArrayCopy (EURJPY,H1)      Общее время 2653 микросекунд

Тип datetime как и int занимают 4 байта памяти. Итого 4000000 байт или 4000000/1024=3906,25 килобайт или 3,8 мегабайт.

Aliaksandr Hryshyn:
Ещё не хватает изменения размера массива в исходный, нужно куда-то новый элемент добавить.
Не сработает, будет копирование.
По условию, есть последовательность значений времени, нужно удалить самое старое(время) и добавить новое, притом, чтобы был правильный индексированных доступ, например, самое старое под индексом 0.
Тут просто всё.....

Это экзамен? Я должен был выложить готовый полный код или просто дать направление мысли?

Если тут всё просто зачем задавать вопросы?

Ihor Herasko
16468
Ihor Herasko  
Alexey Viktorov:

Тип datetime как и int занимают 4 байта памяти. 

8 байт. int - 4 байта.

Alexey Viktorov
20923
Alexey Viktorov  
Ihor Herasko:

8 байт. int - 4 байта.

Мало, мало ошибка давал. Вместо "ура" "караул" кричал...

Aliaksandr Hryshyn
1996
Aliaksandr Hryshyn  
Alexey Viktorov:

А вместо предположений проверить было трудно? Или мама не разрешила?

Результат

Тип datetime как и int занимают 4 байта памяти. Итого 4000000 байт или 4000000/1024=3906,25 килобайт или 3,8 мегабайт.

Это экзамен? Я должен был выложить готовый полный код или просто дать направление мысли?

Если тут всё просто зачем задавать вопросы?

Да, экзамен, не обязательный.
Первая задача не решена. Копирование долгое, есть вариант значительно быстрее, потому что не надо всё копировать, думайте... Сложность задачки чуть выше новичка.
Со вторым вопросом уже разобрались.

Alexey Viktorov
20923
Alexey Viktorov  
Aliaksandr Hryshyn:
Да, экзамен, не обязательный.
Первая задача не решена. Копирование долгое, есть вариант значительно быстрее, потому что не надо всё копировать, думайте... Сложность задачки чуть выше новичка.
Со вторым вопросом уже разобрались.

Ну, раз экзамен, тогда напряжение измеряется напряжометром.

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