Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Алгоритм перезаписи трехмерного массива с i-того элемента

Страниц (1): [1]
 

1. Nikanr - 02 Октября, 2019 - 13:04:01 - перейти к сообщению
У нас есть трехмерный массив arr[71][25][25] (q,w,e соответственно) в котором хранятся числа. Нужно перезаписать элементы массива начиная с q индекса (т.е arr[q][w][e]=arr[q+1][w][e], а последний элемент массива обнулить(не обязательно).

Пробовал цикл в 3 for, работает но не так быстро как хотелось бы. Если начинать с 1 элемента долго думает, есть способ сделать это быстрее?

q = элементу массива с которого начинаем перезапись

Код цикла for который пробовал:
CODE:
for(int q=0; q<=70; q++)
{
for(int w=0;w<25;w++)
{
for(int e=0;e<25;e++)
{
arr[q][w][e]=arr[q+1][w][e];
}
}
}

(Добавление)
Числа могут быть вплоть до восьмизначных
(Добавление)
В принципе даже если одна строчка из массива будет равна нулю (т.е элементы arr[5][0-24][0-24]), то мб какая-нибудь подойдёт сортировка что бы эти нули переместить в конец массива
2. Zireael - 02 Октября, 2019 - 18:03:59 - перейти к сообщению
 Цитата:
есть способ сделать это быстрее?

CODE:
external(INT, "MoveMemory", "RtlMoveMemory", "Kernel32.dll");

int arr[10][5][5];

// для примера заполним массив числами
int z=0;
for(int q=0; q<sizearray(arr); q++)
{
for(int w=0;w<sizearray(arr[]);w++)
{
for(int e=0;e<sizearray(arr[][]);e++)
{
arr[q][w][e]=z;
z++;
}
}
}
//////////

messagebox("arr[0][0][0] = "+format(arr[0][0][0]));
int byte=(sizearray(arr)-1)*sizearray(arr[])*sizearray(arr[][])*4; // сколько байт копировать
MoveMemory(address(#arr[0][0][0]), address(#arr[1][0][0]), byte); // адрес куда копировать, откуда и количество байт для копирования

messagebox("arr[0][0][0] = "+format(arr[0][0][0]));
3. Nikanr - 04 Октября, 2019 - 04:00:58 - перейти к сообщению
А по какой логике рассчитывается количество байт для копирования? Допустим если я захочу копировать не с нулевого элемента, а с пятого или восьмого весь оставшийся массив
4. Zireael - 04 Октября, 2019 - 04:14:24 - перейти к сообщению
 Цитата:
не с нулевого элемента, а с пятого

 Цитата:
external(INT, "MoveMemory", "RtlMoveMemory", "Kernel32.dll" );

int arr[10][5][5];

// для примера заполним массив числами
int z=0;
for(int q=0; q<sizearray(arr); q++)
{
for(int w=0;w<sizearray(arr[]);w++)
{
for(int e=0;e<sizearray(arr[][]);e++)
{
arr[q][w][e]=z;
z++;
}
}
}
//////////

messagebox("arr[0][0][0] = "+format(arr[0][0][0]));
int byte=(sizearray(arr)-5)*sizearray(arr[])*sizearray(arr[][])*4; // сколько байт копировать
MoveMemory(address(#arr[0][0][0]), address(#arr[5][0][0]), byte); // адрес куда копировать, откуда и количество байт для копирования

messagebox("arr[0][0][0] = "+format(arr[0][0][0]));

Powered by ExBB FM 1.0 Final