PDA

Просмотр полной версии : [Вопрос] Как создать массив с динамической памятью в Pawn?



Unreal
04.01.2018, 13:25
Как создать массив, размер который будет зависеть от чего либо. Например:



new players_cars = 0;
for(new i = 0; i < MAX_ALLOWED_CARS; i++)
{
if(playerData[playerid][pCarKey][i] == 0) continue;
players_cars ++; // подсчет сколько машин у игрока
}
if(players_cars == 0) return SendClientMessage(playerid, COLOR_WHITE, "У вас нет машины! Вы можете купить ее на рынке");
new sellcar_string[(25+2+18+3+20+4)*players_cars]; // и тут вся проблема


вот что происходит у меня
http://ihost.pro-pawn.ru/image.php?di=TCC1

Daniel_Cortez
04.01.2018, 13:46
Стандартными средствами массив переменного размера создать нельзя, можно через возню с #emit (или с появившимся в последних версиях операторе emit (http://pro-pawn.ru/showthread.php?15830)), либо с помощью каких-нибудь "продвинутых" библиотек типа YSI, где точно такие же трюки с #emit, только в красивой обёртке.

Но настоящий вопрос здесь - а зачем вам вообще массив переменного размера? Можно просто сделать массив с таким размером, которого будет достаточно при любой ситуации, и не париться.


// У игрока не может быть машин больше, чем в константе MAX_ALLOWED_CARS
new sellcar_string[(25+2+18+3+20+4)*MAX_ALLOWED_CARS];

Unreal
04.01.2018, 13:52
Стандартными средствами массив переменного размера создать нельзя, можно через возню с #emit (или с появившимся в последних версиях операторе emit (http://pro-pawn.ru/showthread.php?15830)), либо с помощью каких-нибудь "продвинутых" библиотек типа YSI, где точно такие же трюки с #emit, только в красивой обёртке.

Но настоящий вопрос здесь - а зачем вам вообще массив переменного размера? Можно просто сделать массив с таким размером, которого будет достаточно при любой ситуации, и не париться.


// У игрока не может быть машин больше, чем в константе MAX_ALLOWED_CARS
new sellcar_string[(25+2+18+3+20+4)*MAX_ALLOWED_CARS];


Спасибо за совет, просто если MAX_ALLOWED_CARS будет, допустим 10 а игрока всего 2 машин, то [(92)*10] = 920 создано, а используется только 184. А если бы можно было так то в данном случае можно было сэкономить память (920-184 = 736 сэкономлено)

Daniel_Cortez
04.01.2018, 14:04
Спасибо за совет, просто если MAX_ALLOWED_CARS будет, допустим 10 а игрока всего 2 машин, то [(92)*10] = 920 создано, а используется только 184. А если бы можно было так то в данном случае можно было сэкономить память (920-184 = 736 сэкономлено)
Кого вы там сэкономить решили? Локальные переменные создаются в стеке, память под который выделена постоянно (16384 байта или 4096 ячеек по умолчанию). Другое дело, что чем больше массив, тем дольше он заполняется нулями (ибо в Pawn все переменные по умолчанию инициализируются нулевыми значениями) - но и это можно обойти (http://pro-pawn.ru/showthread.php?5249&p=62879&viewfull=1#post62879).

ziggi
04.01.2018, 17:49
Спасибо за совет, просто если MAX_ALLOWED_CARS будет, допустим 10 а игрока всего 2 машин, то [(92)*10] = 920 создано, а используется только 184. А если бы можно было так то в данном случае можно было сэкономить память (920-184 = 736 сэкономлено)

У тебя amx весит несколько гигабайт что-ли? Зачем "экономить" эти 3 КиБ? Если пользоваться библиотеками или плагинами, то на выделение нужного количества памяти уйдёт сильно больше времени, то есть ты сэкономишь память, но потеряешь процессорное время, смысл?