Fleynaro
Дебютант
Здрасте. Написал макросы, позволяющие хранить несколько числовых значений в 1 переменной по слотам.
Как использовать:
Где нужно?
Во-первых, для экономии памяти. Можно поставить переменной несколько значений и не надо создавать другие лишние переменные.
Во-вторых, приведу пример.
Нам нужно создать массив к примеру такого вида и присвоить ему некие значения:
Но вот беда, в pawn нельзя создавать четырехмерные массивы и более! На помощь идут макросы SetVarSlot2 и GetVarSlot2.
Необязательно массив должен быть четырехмерным, он может быть и 2-х и 3-х мерным и все их можно сократить, тем самым сэкономив приличную память.
Примечания:
- Значение, устанавливаемое на слот переменной, не должно быть отрицательным.
- Значение должно быть в указанных вверху пределах.
- Порядок слотов идет от нуля. То есть, 2 слота: 0-1, 4 слота: 0-3, 8 слотов: 0-7, 32 слота: 0-31.
- Переменная должна быть только типа integer.
Автор: Fleynaro
PHP:
// На 2 слота. Значение должно быть в пределах 0 - 65535
#define GetVarSlot2(%0,%1) ((%0) >> (16 * (%1)) & 65535) // Узнаем значение в слоте %1 переменной %0
#define SetVarSlot2(%0,%1,%2) (%0) = ((%0) & (~0 ^ (65535 << (16 * (%1))))) | ((%2) << (16 * (%1))) // Устанавливаем значение %2 в слот %1 переменной %0
#define GiveVarSlot2(%0,%1,%2) SetVarSlot2(%0, %1, GetVarSlot2(%0, %1) + %2) // Даем или забираем %2 от значения в слоте %1 переменной %0
// На 4 слота. Значение должно быть в пределах 0 - 255
#define GetVarSlot4(%0,%1) ((%0) >> (8 * (%1)) & 255)
#define SetVarSlot4(%0,%1,%2) (%0) = ((%0) & (~0 ^ (255 << (8 * (%1))))) | ((%2) << (8 * (%1)))
#define GiveVarSlot4(%0,%1,%2) SetVarSlot4(%0, %1, GetVarSlot4(%0, %1) + %2)
// На 8 слотов. Значение должно быть в пределах 0 - 15
#define GetVarSlot8(%0,%1) ((%0) >> (4 * (%1)) & 15)
#define SetVarSlot8(%0,%1,%2) (%0) = ((%0) & (~0 ^ (15 << (4 * (%1))))) | ((%2) << (4 * (%1)))
#define GiveVarSlot8(%0,%1,%2) SetVarSlot8(%0, %1, GetVarSlot8(%0, %1) + %2)
// На 32 слота. Значение должно быть в пределах 0 - 1
#define GetVarSlot32(%0,%1) ((%0) >> (%1) & 1)
#define SetVarSlot32(%0,%1,%2) (%0) = ((%0) & (~0 ^ (1 << (%1)))) | ((%2) << (%1))
PHP:
new a, b, c, d;
SetVarSlot2(a, 0, 50000); // Установка значения 50000 на 0 слот переменной a
SetVarSlot2(a, 1, 66); // Установка значения 66 на 1 слот переменной a
GiveVarSlot2(a, 1, 4); // Прибавляем к уже установленному в данном слоте значению 66 +4. Теперь в слоте стоит значение 70.
GiveVarSlot2(a, 1, -10); // Отнимаем в этом слоте от 70 -10. В слоте теперь значение 60.
printf("a(0): %i, a(1): %i", GetVarSlot2(a, 0), GetVarSlot2(a, 1));
// a(0): 50000, a(1): 60
SetVarSlot4(b, 2, 250); // Аналогично как и на SetVarSlot2
SetVarSlot4(b, 3, 3);
printf("b(2): %i, b(3): %i", GetVarSlot4(b, 2), GetVarSlot4(b, 3));
// a(2): 250, a(3): 66
SetVarSlot8(c, 1, 13);
SetVarSlot8(c, 8, 0);
printf("b(1): %i, b(7): %i", GetVarSlot8(c, 1), GetVarSlot8(c, 7));
// a(1): 13, a(7): 0
SetVarSlot32(d, 15, 0);
SetVarSlot32(d, 29, 1);
printf("b(15): %i, b(29): %i", GetVarSlot32(d, 15), GetVarSlot32(d, 29));
// a(15): 0, a(29): 1
Во-первых, для экономии памяти. Можно поставить переменной несколько значений и не надо создавать другие лишние переменные.
Во-вторых, приведу пример.
Нам нужно создать массив к примеру такого вида и присвоить ему некие значения:
PHP:
enum hInfo {
hA,
hB
};
new Massiv[3][100][5][hInfo];
public OnGameModeInit()
{
Massiv[1][44][2][hA] = 5122, Massiv[1][44][2][hB] = 788;
printf("hA: %i, hB: %i", Massiv[1][44][2][hA], Massiv[1][44][2][hB]);
return 1;
}
PHP:
new Massiv[3][100][5];
public OnGameModeInit()
{
SetVarSlot2(Massiv[1][44][2], 0, 5000);
SetVarSlot2(Massiv[1][44][2], 1, 70);
printf("Slot 1: %i, Slot 2: %i", GetVarSlot2(Homes[1][44][2], 0), GetVarSlot2(Homes[1][44][2], 1));
return 1;
}
Примечания:
- Значение, устанавливаемое на слот переменной, не должно быть отрицательным.
- Значение должно быть в указанных вверху пределах.
- Порядок слотов идет от нуля. То есть, 2 слота: 0-1, 4 слота: 0-3, 8 слотов: 0-7, 32 слота: 0-31.
- Переменная должна быть только типа integer.
Автор: Fleynaro
