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

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

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Как работать с длинными числами? (Работа с длинными числами SourcePawn)
Как работать с длинными числами?
MERC Дата: Вторник, 03.02.2015, 12:55:28 | Сообщение # 1
Сообщений: 9
Репутация: 0 [ +/- ]
Столкнулся с такой проблемой, SourcePawn не может работать с длинными числами, например 4294967295.
Можно ли ка-то обойти это ограничение легким способом, или только писать свои функции калькуляции таких чисел (нужно умножение, сложение, сравнивание)?


Сообщение отредактировал MERC - Вторник, 03.02.2015, 12:55:49
 
Sallcom Дата: Вторник, 03.02.2015, 12:59:25 | Сообщение # 2
Сообщений: 206
Репутация: 31 [ +/- ]
А что именно не получается?
 
хвостег Дата: Вторник, 03.02.2015, 13:17:49 | Сообщение # 3
Сообщений: 161
Репутация: 53 [ +/- ]
4294967295 = 4 байта = 0xFFFFFFFF = -1 (в сурспавне т.к это предел).
если тебе нужны числа из диапазона int 64, можешь попробовать преобразовать их в строки. как складывать\вычитать\умножать строки, есть куча примеров, правда все они вряд ли подойдут. ну это если ты не используешь такие числа в БД или тебе не нужен SteamId64 для просмотра профиля....
 
MERC Дата: Вторник, 03.02.2015, 14:23:38 | Сообщение # 4
Сообщений: 9
Репутация: 0 [ +/- ]
Цитата хвостег ()
ну это если ты не используешь такие числа в БД
да, именно, эти числа в ДБ а если быть точнее - это это ИП адрес и с ними нужно работать, вообще это число получаеться после преобразования ИП адреса в число... Получается, что в SourcePawn нет аналога int64?
 
хвостег Дата: Вторник, 03.02.2015, 14:36:17 | Сообщение # 5
Сообщений: 161
Репутация: 53 [ +/- ]
я не думаю что ты используешь ipv6, поэтому тебе с головой хватит 32х битного числа для хранения ип адресов...
 
MERC Дата: Вторник, 03.02.2015, 14:49:35 | Сообщение # 6
Сообщений: 9
Репутация: 0 [ +/- ]
Цитата хвостег ()
хватит 32х битного числа

int32 же ограничен до 2147483647 ?
А у меня числа до 4294967295
 
serm Дата: Вторник, 03.02.2015, 17:18:23 | Сообщение # 7
Сообщений: 138
Репутация: 7 [ +/- ]
Цитата MERC ()
Столкнулся с такой проблемой, SourcePawn не может работать с длинными числами, например 4294967295.
Можно ли ка-то обойти это ограничение легким способом, или только писать свои функции калькуляции таких чисел (нужно умножение, сложение, сравнивание)?

Ничего сложного нету. Бери c++ vs и в бой.
Делай вместо плагинов на sm расширения. Там полный доступ к серверной части + нет никаких ограничений в работе с числами.
 
MERC Дата: Среда, 04.02.2015, 06:06:02 | Сообщение # 8
Сообщений: 9
Репутация: 0 [ +/- ]
Цитата serm ()
Ничего сложного нету. Бери c++ vs и в бой.
Делай вместо плагинов на sm расширения. Там полный доступ к серверной части + нет никаких ограничений в работе с числами.


Не хватает базовых знаний и документации, можешь посоветовать какие-либо примеры и документацию по API?
 
serm Дата: Среда, 04.02.2015, 12:19:26 | Сообщение # 9
Сообщений: 138
Репутация: 7 [ +/- ]
Цитата MERC ()
Не хватает базовых знаний и документации, можешь посоветовать какие-либо примеры и документацию по API?

api на оф.сайте sourcemod (Где-то в закладках была ссылка на api, но чет найти ее не могу)
Примеры можешь взять тут https://forums.alliedmods.net/forumdisplay.php?f=134 (Чаще всего исходники прикладываются)
 
хвостег Дата: Четверг, 05.02.2015, 00:38:14 | Сообщение # 10
Сообщений: 161
Репутация: 53 [ +/- ]
на кой черт ему писать расширение для см, если у него числа в 32х битном диапазоне ?!
Цитата MERC ()
int32 же ограничен до 2147483647 ?
А у меня числа до 4294967295

это называется слышу звон, да не знаю где он...

int (__int32)
4 - байт
от -2 147 483 648 до 2 147 483 647

unsigned int (unsigned __int32)
4 - байт
От 0 до 4 294 967 295

А теперь простой пример как собрать ip из байт в число и наоборот из числа в байты....

Код

public OnPluginStart()
{
   new Ip = SIp(255, 255, 255, 255);
     
   new IpB[4];
   GIp(Ip, IpB);
   PrintToServer("B1: %d B2: %d B3: %d B4: %d", IpB[0], IpB[1], IpB[2], IpB[3]);
}

stock SIp(Ar1, Ar2, Ar3, Ar4)
{
   return (Ar1 & 0xFF) << 24 | (Ar2 & 0xFF) << 16 | (Ar3 & 0xFF) << 8 | (Ar4 & 0xFF);
}

stock GIp(ip, out[4])
{
   out[0] = (ip >> 24) & 0xFF;
   out[1] = (ip >> 16) & 0xFF;
   out[2] = (ip >> 8)  & 0xFF;
   out[3] =  ip        & 0xFF;
}

Прикрепления: ip.sp(0Kb)


Сообщение отредактировал хвостег - Четверг, 05.02.2015, 01:01:10
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Как работать с длинными числами? (Работа с длинными числами SourcePawn)
Страница 1 из 11
Поиск: