PDA

Просмотр полной версии : [Вопрос] Переменное количество аргументов



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

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

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


native Function(...);

main()
{
Function(25);
}


Code 1

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


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

Code 2

cell AMX_NATIVE_CALL Test(AMX* amx, cell* params)
{
cell* addr;
amx_GetAddr(amx, params[1], &addr);

printf("Value: %d\n", *addr);
return 1;
}


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


native Function(value, ...);

main()
{
Function(25);
}


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

Daniel_Cortez
25.06.2021, 12:55
Вариативные аргументы передаются по ссылке, т.к. предусмотрена возможность их изменения нативной функцией. Если аргументом является переменная или массив, то передаётся их адрес. Если же в качестве аргумента передана константное значение или возвращаемый другой функцией результат, то такое значение временно размещается в куче, а в функцию передаётся адрес того временного хранилища в куче (после возврата из нативной функции место в куче высвобождается). Именно для этого и нужно использовать amx_GetAddr(). Собственно, упомянутый выше вывод числа "12" - это адрес временного хранилища, в котором и размещено само значение "25".