Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Циклический сдвиг массива
Циклический сдвиг массива
tonline_kms65 Дата: Суббота, 17.09.2016, 19:25:03 | Сообщение # 1
Сообщений: 182
Репутация: 2 [ +/- ]
Всем привет. Кто сталкивался с таким Циклический сдвиг массива (вправо или влево)?
Если быть точнее - как сдвинуть элементы массива (вправо или влево)?.
Как это осуществить? Именно на SourcePawn.

Вот для примера мой кусок кода:



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

Объясню для чего это нужно.
При удалении какой либо ENT (Kill, KillHierarchy), ENT удаляется, но массив выделенный в памяти, остается.
Что бы не было пустого места (=0), мне и необходимо сдвинуть на пустое место остальные элементы, что бы не было этого пустого места.
Я не знаю, возможно что Kill, KillHierarchy делают это внутри своей функции. Но непохоже.
Вот такой вопрос.


Сообщение отредактировал tonline_kms65 - Воскресенье, 18.09.2016, 03:12:46
 
SourceSamil Дата: Воскресенье, 18.09.2016, 07:18:23 | Сообщение # 2
Сообщений: 237
Репутация: [ +/- ]
Так можно сделать сдвиг в самое начало массива
new i, x;
while( ( i < count ) && ( element[ i ][ id ] == caller ) )
++i; //Находим с чего сдвигать
x = i; //Дублируем число i, т.к. оно нам нужно статическое, для вычисления кол-ва смещения
while( x < count && ( element[ x ][ id ] == caller ) ) { //Снова проходимся по массиву
element[ x - i ][ id ] = element[ x ][ id ]; //Смещаем, допустим начало у нас 8-ая позиция в цикле, то нужно сместить на 8 - i, в то время, как i = 8, т.е. 8-ая позиция примет первую, далее 9 - i = 1, т.е. 9-ая позиция примет вторую
++x;
}
 
хвостег Дата: Воскресенье, 18.09.2016, 11:52:27 | Сообщение # 3
Сообщений: 161
Репутация: 53 [ +/- ]
используй динамический массив и не нужно изобретать велосипед

Добавлено (18.09.2016, 11:52:27)
---------------------------------------------
всю информацию найдешь в adt_array.inc

 
tonline_kms65 Дата: Пятница, 23.09.2016, 05:29:32 | Сообщение # 4
Сообщений: 182
Репутация: 2 [ +/- ]
Цитата хвостег ()
всю информацию найдешь в adt_array.inc


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

Если как то заинтересует, посмотри здесь, я описал подробнее проблему. Что бы не повторяться.
http://amx-x.ru/viewtopic.php?f=50&t=36397

Не пойму а в чем мне поможет динамический массив? Он же не сжимается в SourcePawn по моему. Работает медленнее, хотя, в принципе, это по фигу.
Может быть есть пример кода?

Добавлено (23.09.2016, 05:29:32)
---------------------------------------------
Нашел косяк. Не нужно ничего двигать. Ошибка была у меня в цикле.

for(new i=0; i < count; ++i){ //count - общее кол-во Дронов на сервере. Здесь и был мой косяк.
if (FreeDron[i][DroneID] == .....){
После разрушения любого из Дронов, кроме последнего, последний Дрон, всегда, становился недоступен.
При разрушении последнего Дрона, все остальные были доступны.
Если Дроны не разрушались, то все они были доступны.

исправил на
int max_ent = GetEntityCount();
for(new i=0; i < max_ent; ++i){
// цикл сделал по всем ENT.
if (FreeDron[i][DroneID] == .....){

Тему можно закрыть.


Сообщение отредактировал tonline_kms65 - Пятница, 23.09.2016, 05:40:34
 
tolik1231 Дата: Среда, 28.09.2016, 15:36:33 | Сообщение # 5
Сообщений: 45
Репутация: 0 [ +/- ]
спс
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Циклический сдвиг массива
Страница 1 из 11
Поиск: