Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Функция Храним несколько чисел в 1 переменной

Fleynaro

Дебютант
Здрасте. Написал макросы, позволяющие хранить несколько числовых значений в 1 переменной по слотам.

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; 
}
Но вот беда, в pawn нельзя создавать четырехмерные массивы и более! На помощь идут макросы SetVarSlot2 и GetVarSlot2.
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-х и 3-х мерным и все их можно сократить, тем самым сэкономив приличную память.

Примечания:
- Значение, устанавливаемое на слот переменной, не должно быть отрицательным.
- Значение должно быть в указанных вверху пределах.
- Порядок слотов идет от нуля. То есть, 2 слота: 0-1, 4 слота: 0-3, 8 слотов: 0-7, 32 слота: 0-31.
- Переменная должна быть только типа integer.

Автор: Fleynaro
 
Сверху Снизу