SA-MP Forums Archive
Как узнать, что значение есть в массиве? - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Как узнать, что значение есть в массиве? (/showthread.php?tid=449679)



Как узнать, что значение есть в массиве? - Tee7even - 09.07.2013

Нужно узнать есть ли нужное значение в массиве, предположим у меня есть массив Bikes
Code:
new Bikes[3] = { 30, 12, 34 };
и тут нужно проверить есть ли значение vehicleid в этом массиве
Code:
if(проверить)
{
SendClientMessage(playerid, 0xFFFFFFFF, "У этого транспортного средства нет багажника");
}
Лично вижу только один способ - пролистать весь массив циклом, сравнивая каждое значение. Ну а если массив у нас величиной в 500 и больше? Собственно есть более простой способ решения проблемы?


Re: Как узнать, что значение есть в массиве? - Alexander_Petrov - 09.07.2013

Да нет ничего плохого в цикле, который только сравнивает значения.


Re: Как узнать, что значение есть в массиве? - Tee7even - 09.07.2013

Quote:
Originally Posted by Alexander_Petrov
View Post
Да нет ничего плохого в цикле, который только сравнивает значения.
Спасибо, до этого я видимо думал что это сильно нагрузит сервер, если к примеру будет использоваться более-менее часто, иногда периодически туплю...


Re: Как узнать, что значение есть в массиве? - Mutha_X - 10.07.2013

А не проще ли сделать массив с описанием всех транспортных средств по их модели? Тогда вы вообще будете иметь ко всему прямой доступ.


Re: Как узнать, что значение есть в массиве? - Tee7even - 10.07.2013

Quote:
Originally Posted by Mutha_X
View Post
А не проще ли сделать массив с описанием всех транспортных средств по их модели? Тогда вы вообще будете иметь ко всему прямой доступ.
Ну транспортные средства - это такой пример, который я привел, чтобы не особо заморачиваться.


Re: Как узнать, что значение есть в массиве? - ZiGGi - 11.07.2013

Если массив отсортирован, то можно воспользоваться двоичным поиском.


Re: Как узнать, что значение есть в массиве? - Tee7even - 11.07.2013

Раз уж тема приподнялась то, чтобы не создавать новую тему, я пожалуй спрошу здесь.
Что здесь не правильно? Следующая функция выдает игроку в инвентарь предмет с расчитыванием того, сколько надо положить в каждый слот, чтобы не больше максимального значения.
Code:
public GivePlayerItem(playerid,itemid,amount,param)
{
	new stack;
	if(IsItemStackedMax(itemid)) stack = MAX_STACK;
	else if(IsItemStackedMedium(itemid)) stack = MEDIUM_STACK;
	else stack = MIN_STACK;
	new slot[256], amo[256], par[256];
	for(new i;i<INVENTORY_SLOTS;i++)
	{
		format(slot, sizeof(slot), "sl%i", i);
		format(amo, sizeof(amo), "sl%iam", i);
		if ((GetPVarInt(playerid,slot)==itemid||GetPVarInt(playerid,slot)==0)&&GetPVarInt(playerid,amo)<stack)
		{
			format(par, sizeof(par), "sl%iparam", i);
			new a = stack-GetPVarInt(playerid,amo);//a - свободное место в слоте
			if (amount>a)//если количество предмета больше свободного места в слоте
			{
				new b = amount-a;//b - остаток предмета
				new p;
				SetPVarInt(playerid, slot,itemid);
				SetPVarInt(playerid, par,param);
				SetPVarInt(playerid, amo,GetPVarInt(playerid,amo)+a);
				p = GivePlayerItem(playerid,itemid,b,param);
				return p;
			}
			else if (amount<=a)
			{
				SetPVarInt(playerid, slot,itemid);
				SetPVarInt(playerid, par,param);
				SetPVarInt(playerid, amo,GetPVarInt(playerid,amo)+amount);
				return 0;
			}
			break;
		}
	}
	return amount;
}
В данном случае слотов 5 (INVENTORY_SLOTS). А максимальное количество в слот для предмета - 16. Когда я выдаю себе кол-во, которое больше всего инвентаря (больше 80) сервер выдает следущее:
Quote:

SERVER: Unknown Command

И далее на все команды так реагирует...
EDIT:
Да, я эпичный долбо*б, величина стрингов это все дело и убила...