Русское сообщество по скриптингу

Циклический сдвиг элементов массива

Все вопросы по работе и настройке SourceMod и его плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только вопросов по SourceMod и его плагинам.

Циклический сдвиг элементов массива

Сообщение tonline_kms65 » 18 сен 2016, 05:48

Всем привет.
Я столкнулся с такой проблемой Циклический сдвиг массива.
Если быть точнее - мне нужно сдвинуть элементы массива (вправо или влево).
Как это осуществить? Именно на SourcePawn.

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

Код: Выделить всё
int i = 0;
while ((< count) && (element[i][id] == caller)) i++; //находим элеметы массива с места нахождения которых нужно сдвигать (т.к. они будут = 0 или -1).

while (< count-1) // здесь сдвигаем
{
element[i][id] = element[i+1][id];
i++;
}

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

Объясню для чего это нужно.
При удалении какой либо ENT (Kill, KillHierarchy), ENT удаляется, но массив выделенный в памяти, остается.
Что бы не было пустого места (=0), я хочу сдвинуть на пустое место остальные элементы, что бы не было этого пустого места.
Я не знаю, возможно что Kill, KillHierarchy делают это внутри своей функции. Но непохоже.
Аватара пользователя
tonline_kms65
 
Сообщения: 9
Зарегистрирован: 15 июн 2013, 10:29
Откуда: Комсомольск на Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX) (с 2007 по 2009)
с++
SourcePawn

Re: Циклический сдвиг элементов массива

Сообщение артист666 » 18 сен 2016, 20:22

Код: Выделить всё
#include <amxmodx>

new g_mass[] = {'a''b''c''d''e''f''g''h''i''j'0}

public 
plugin_init()
{
    
register_clcmd("say r""functions1")
    
register_clcmd("say l""functions2")
}
public 
functions1(id)
{
    
client_print(idprint_chat"%s"g_mass)
    
    
left_shift(g_masssizeof(g_mass) - 1)
    
    
client_print(idprint_chat"%s"g_mass)
    
    return 
PLUGIN_HANDLED
}
public 
functions2(id)
{
    
client_print(idprint_chat"%s"g_mass)
    
    
left_shift(g_masssizeof(g_mass) - 1)
    
    
client_print(idprint_chat"%s"g_mass)
    
    return 
PLUGIN_HANDLED
}
stock right_shift(a[], n)

    new 
a[1]
    new 
n
    
while(--0a[i] = a[1]
    
a[0] = t
}
stock left_shift(a[], n)

    new 
a[0]
    new 
= -1
    
while(++< (1)) a[i] = a[1]
    
a[1] = t
Аватара пользователя
артист666
 
Сообщения: 1938
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 261 раз.
Поблагодарили: 414 раз.
Опыт программирования: Больше трех лет

Re: Циклический сдвиг элементов массива

Сообщение tonline_kms65 » 19 сен 2016, 02:53



Я более подробно попытаюсь объяснить.

Пишу плагин "Drone".
Суть плагина - любой игрок с любой команды может создавать Дронов, и так же может брать созданных кем-то Дронов (которые валяются безхозные). Можно удаленно вызвать Дрона, если он не занят кем -то.

Теперь к сути проблемы:
Задание переменных таким образом
#define MAX_ENT 128
enum eDrone
{
bool:DroneUsed=false, //0 (Этот элемент и так 0. ложь я ему задаю на всякий случай)
DroneID, // 1
DroneCamID, // 2
DroneGlowSpriteID, // 3
};

new FreeDron[MAX_ENT+1][eDrone]; // свободный Дрон
new ClientDron[MAXPLAYERS][eDrone]; // это Дрон занятый
new count; // общее кол-во Дронов на сервере


Проблема возникает после разрушения какого нибудь из Дронов.
При count = 3;
После разрушения 1 Дрона не видно 3 Дрон. Второй Дрон видно.
После разрушения 2 Дрона не видно 3 Дрон. Первый Дрон видно.
После разрушения 3 Дрона Первый и Второй Дроны видно.

Тоже самое и при count = 5 и т.д.
Во всех случаях, после разрушения, последний Дрон не виден(недоступен). Ну и естественно при разрушении последнего Дрона все оставшиеся Дроны отлично видно.
Т.е. получается что сам массив как бы сдвигается что ли, до нулевого (после последнего). Или наоборот, не сдвигается.

Дрон не определяется по его ID.
И соответственно попытка вызвать или взять Дрона не получается. В общем проблема такого плана.
Последний раз редактировалось tonline_kms65 19 сен 2016, 03:00, всего редактировалось 2 раз(а).
Аватара пользователя
tonline_kms65
 
Сообщения: 9
Зарегистрирован: 15 июн 2013, 10:29
Откуда: Комсомольск на Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX) (с 2007 по 2009)
с++
SourcePawn

Re: Циклический сдвиг элементов массива

Сообщение артист666 » 19 сен 2016, 02:59

MAX_ENT - это сколько? тыщ 5?
Аватара пользователя
артист666
 
Сообщения: 1938
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 261 раз.
Поблагодарили: 414 раз.
Опыт программирования: Больше трех лет

Re: Циклический сдвиг элементов массива

Сообщение tonline_kms65 » 19 сен 2016, 03:03

артист666 писал(а):MAX_ENT - это сколько? тыщ 5?


Пробовал менять значение - не меняется ничего. Проблема не в этом. Ну я так думаю.
Аватара пользователя
tonline_kms65
 
Сообщения: 9
Зарегистрирован: 15 июн 2013, 10:29
Откуда: Комсомольск на Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX) (с 2007 по 2009)
с++
SourcePawn

Re: Циклический сдвиг элементов массива

Сообщение артист666 » 19 сен 2016, 03:07

Не советую таким способом делать.
Всю информацию проще хранить в pev_ константах непосредственно на объекте.
Аватара пользователя
артист666
 
Сообщения: 1938
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 261 раз.
Поблагодарили: 414 раз.
Опыт программирования: Больше трех лет

Re: Циклический сдвиг элементов массива

Сообщение tonline_kms65 » 19 сен 2016, 03:11

артист666 писал(а):Не советую таким способом делать.


Почему? Причина.

Есть свободная ENT, есть занятая (клиентская). Это на примере оружия - на земле одно, в руках совсем другое. Как то так.
ID один, но способ использования другой.
ID так и так в самой ENT забит, создатель этой ENT, и т.д.
Аватара пользователя
tonline_kms65
 
Сообщения: 9
Зарегистрирован: 15 июн 2013, 10:29
Откуда: Комсомольск на Амуре
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX) (с 2007 по 2009)
с++
SourcePawn


Вернуться в Вопросы по SourceMod и его плагинам

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1