Как работать с длинными числами?
|
|
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 |
|
Сообщений: 205
Репутация: 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 |
|
Сообщений: 137
Репутация: 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 |
|
Сообщений: 137
Репутация: 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; }
Гости не могут скачивать файлы
|
Сообщение отредактировал хвостег - Четверг, 05.02.2015, 01:01:10 |
|
| |