Переместил тему в раздел по C/C++/C#.
Сообщение от
KrutoyKrosch
Как передавать в плагин динамическое кол-во аргументов?
Точно так же, как и в обычную нативную функцию.
PHP код:
static cell AMX_NATIVE_CALL n_MemSort(AMX *amx, const cell *params)
В массиве params передаются все аргументы нативной функции. При этом 1-й аргумент находится в params[1], 2-й в params[2] и т.д., а params[0] содержит суммарный размер всех аргументов (в байтах). Разделите этот размер на размер одной ячейки (sizeof(cell)) - и получите количество аргументов для вашей функции.
Также в функциях с переменным числом аргументов все вариативные аргументы передаются по ссылке, т.е. передаётся не значение, а виртуальный адрес ячейки, в которой это значение находится. Из этого виртуального адреса с помощью функции amx_GetAddr() можно узнать физический адрес и по нему уже прочитать передаваемое значение.
Делается это примерно так:
PHP код:
cell amx_addr;
cell *phys_addr;
cell value;
amx_addr = params[3];
if (amx_GetAddr(amx, amx_addr, &phys_addr) != AMX_ERR_NONE)
{
// Неверный виртуальный адрес, здесь можно показать какое-нибудь сообщение об ошибке.
return 0;
}
value = *phys_addr;
Сообщение от
KrutoyKrosch
И как еще "возвращать массив"? Ну например как в sscanf.
Массивы всегда передаются по ссылке, поэтому точно так же с помощью amx_GetAddr() узнаёте физический адрес и записываете по нему свои значения.
Сообщение от
KrutoyKrosch
И чтобы потом эти все "динамические аргументы" можно было передать например в функцию printf уже в плагине.
Найдите нативную функцию и вызывайте её вручную. Поиск уже реализован здесь: https://github.com/maddinat0r/samp-p...lugin2.cpp#L40