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

 
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;
}

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


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

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

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


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

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

 
Ещё не хватает изменения размера массива в исходный, нужно куда-то новый элемент добавить.
Не сработает, будет копирование.
По условию, есть последовательность значений времени, нужно удалить самое старое(время) и добавить новое, притом, чтобы был правильный индексированных доступ, например, самое старое под индексом 0.
Тут просто всё.....
 
ArrayCopy - по условию 1000000 значений, копировать будет долго...
Ещё вопрос новичкам).
Какой объём данных будет копироваться в мегабайтах(1000000 значений времени)?
 
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.
Тут просто всё.....

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

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

 
Alexey Viktorov:

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

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

 
Ihor Herasko:

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

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

 
Alexey Viktorov:

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

Результат

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

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

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

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

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

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