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

    Статус
    Оффлайн
    Регистрация
    27.02.2020
    Сообщений
    26
    Репутация:
    3 ±

    Переменное количество аргументов

    Приветствую. Собственно, начну сразу со своего вопроса.

    Почему нельзя напрямую получить значение переменной при переменном кол-ве параметров нативной функции?

    О чём именно речь?
    В павн можно передать в функцию нефиксированное кол-во параметров, с помощью ... , как аргумента. В плагине, в свою очередь, не выйдет просто так получить переданное значение.

    1. native Function(...);
    2.  
    3. main()
    4. {
    5. Function(25);
    6. }


    Code 1
    1. cell AMX_NATIVE_CALL Test(AMX* amx, cell* params)
    2. {
    3. printf("Value: %d\n", params[1]);
    4. return 1;
    5. }


    Результатом выполнения кода будет, скорее всего, во всех случаях, вывод числа 12 в консоль, которое отличается от переданного.
    Чтобы узнать нужное число, нужен вот такой код

    Code 2
    1. cell AMX_NATIVE_CALL Test(AMX* amx, cell* params)
    2. {
    3. cell* addr;
    4. amx_GetAddr(amx, params[1], &addr);
    5.  
    6. printf("Value: %d\n", *addr);
    7. return 1;
    8. }


    На этот раз действительно в консоль было выведено наше переданное, как аргумент, число 25.
    Но, в первом случае (Code 1), также можно получить нужное значение, если выставить фиксированный параметр.

    1. native Function(value, ...);
    2.  
    3. main()
    4. {
    5. Function(25);
    6. }


    Собственно, почему так происходит. Почему, если тип параметра предопределён, можно получить значение напрямую из params, а если нет, то нужно извлекать значение с помощью amx_GetAddr

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Вариативные аргументы передаются по ссылке, т.к. предусмотрена возможность их изменения нативной функцией. Если аргументом является переменная или массив, то передаётся их адрес. Если же в качестве аргумента передана константное значение или возвращаемый другой функцией результат, то такое значение временно размещается в куче, а в функцию передаётся адрес того временного хранилища в куче (после возврата из нативной функции место в куче высвобождается). Именно для этого и нужно использовать amx_GetAddr(). Собственно, упомянутый выше вывод числа "12" - это адрес временного хранилища, в котором и размещено само значение "25".
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

 

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

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

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

Метки этой темы

Ваши права

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