Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 5 из 5
  1. #1
    Аватар для Unreal
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.09.2014
    Сообщений
    133
    Репутация:
    4 ±

    Как создать массив с динамической памятью в Pawn?

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

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

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Стандартными средствами массив переменного размера создать нельзя, можно через возню с #emit (или с появившимся в последних версиях операторе emit), либо с помощью каких-нибудь "продвинутых" библиотек типа YSI, где точно такие же трюки с #emit, только в красивой обёртке.

    Но настоящий вопрос здесь - а зачем вам вообще массив переменного размера? Можно просто сделать массив с таким размером, которого будет достаточно при любой ситуации, и не париться.
    PHP код:
    // У игрока не может быть машин больше, чем в константе MAX_ALLOWED_CARS
    new sellcar_string[(25+2+18+3+20+4)*MAX_ALLOWED_CARS]; 
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для Unreal
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.09.2014
    Сообщений
    133
    Репутация:
    4 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Стандартными средствами массив переменного размера создать нельзя, можно через возню с #emit (или с появившимся в последних версиях операторе emit), либо с помощью каких-нибудь "продвинутых" библиотек типа YSI, где точно такие же трюки с #emit, только в красивой обёртке.

    Но настоящий вопрос здесь - а зачем вам вообще массив переменного размера? Можно просто сделать массив с таким размером, которого будет достаточно при любой ситуации, и не париться.
    PHP код:
    // У игрока не может быть машин больше, чем в константе 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 сэкономлено)
    Pro-pawn.ru

  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Unreal Посмотреть сообщение
    Спасибо за совет, просто если MAX_ALLOWED_CARS будет, допустим 10 а игрока всего 2 машин, то [(92)*10] = 920 создано, а используется только 184. А если бы можно было так то в данном случае можно было сэкономить память (920-184 = 736 сэкономлено)
    Кого вы там сэкономить решили? Локальные переменные создаются в стеке, память под который выделена постоянно (16384 байта или 4096 ячеек по умолчанию). Другое дело, что чем больше массив, тем дольше он заполняется нулями (ибо в Pawn все переменные по умолчанию инициализируются нулевыми значениями) - но и это можно обойти.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Unreal Посмотреть сообщение
    Спасибо за совет, просто если MAX_ALLOWED_CARS будет, допустим 10 а игрока всего 2 машин, то [(92)*10] = 920 создано, а используется только 184. А если бы можно было так то в данном случае можно было сэкономить память (920-184 = 736 сэкономлено)
    У тебя amx весит несколько гигабайт что-ли? Зачем "экономить" эти 3 КиБ? Если пользоваться библиотеками или плагинами, то на выделение нужного количества памяти уйдёт сильно больше времени, то есть ты сэкономишь память, но потеряешь процессорное время, смысл?

  6. Пользователь сказал cпасибо:
    oukibt (20.07.2020)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •