Автоматизация и боты

 Помощь      Поиск      Пользователи
Сайт Кибор     Программируемый кликер Кибор     Видео обучение     Заказать бот

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

> Без описания
Nikanr
Отправлено: 02 Октября, 2019 - 21:04:01
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 231
Дата рег-ции: Март 2019  
Репутация: 5




У нас есть трехмерный массив 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]), то мб какая-нибудь подойдёт сортировка что бы эти нули переместить в конец массива

(Отредактировано автором: 02 Октября, 2019 - 21:06:04)

 
 Top
Zireael
Отправлено: 03 Октября, 2019 - 02:03:59
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017  
Репутация: 585




 Цитата:
есть способ сделать это быстрее?

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]));
 
 Top
Nikanr
Отправлено: 04 Октября, 2019 - 12:00:58
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 231
Дата рег-ции: Март 2019  
Репутация: 5




А по какой логике рассчитывается количество байт для копирования? Допустим если я захочу копировать не с нулевого элемента, а с пятого или восьмого весь оставшийся массив
 
 Top
Zireael
Отправлено: 04 Октября, 2019 - 12:14:24
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017  
Репутация: 585




 Цитата:
не с нулевого элемента, а с пятого

 Цитата:
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]));
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 3 (гостей: 3, зарегистрированных: 0)
« Вопросы и решение проблем »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by