GetSVarString
Материал из Pro-Pawn Wiki
Описание:
Узнаёт значение серверной переменной строкового типа.
Параметры:
(varname[], string_return[], len) |
varname[] | Название переменной. |
string_return[] | Массив для сохранения строкового значения. |
len | Размер массива. |
Возвращаемое значение:
Длина строки, записанной в SVar, либо
0
, если переменной не существует. Строковое значение переменной возвращается косвенно в массиве string_return
.
Примечание |
SVar'ы создаются в момент установки их значения (SetSVarInt() , SetSVarFloat() , SetSVarString() ) и сохраняют своё значение при перезагрузке мода/фильтрскриптов, однако могут быть удалены вручную с помощью функции DeleteSVar() .
Максимальная длина названия SVar'а - 40 символов (41 с учётом символа конца строки '\0' ).
Названия SVar'ов не чувствительны к регистру. Например, названия "admin" , "ADMIN" , "Admin" и "AdMiN" будут обозначать один и тот же SVar.
Всего можно создать до 2000 SVar'ов. В одном SVar'е может быть только одно значение - нельзя хранить 2 или 3 значения разных типов. |
Баг SA-MP |
Содержимое массива varname не изменяется во время работы функции, однако сам массив объявлен без атрибута const :
native GetSVarString(varname[], string_return[], len); const -корректный) заголовок функции должен выглядеть так:
native GetSVarString(const varname[], string_return[], len); const , компилятор считает, что функция записывает в него данные, и потому не позволяет передавать в функцию неизменяемые массивы, выдавая ошибку несоответствия типов.
static const var_name[] = "status_string"; new string[128]; GetSVarString(var_name, string, sizeof(string)); // error 035: argument type mismatch (argument 1) Функция неправильно записывает символы, код которых больше 127 (например, символы кириллицы) (подробности: http://pro-pawn.ru/showthread.php?13007). Если в массиве string_value не хватает места под запись одного или нескольких символов строки, функция записывает символ конца строки ( '\0' ) за пределами массива - тем самым функция может обнулить переменную, объявленную перед или после массива, что может привести к неправильной работе кода, зависящего от значения в этой переменной.
Для хранения данных в структуре SVar'а есть 3 отдельных поля: одно для целых чисел, другое для вещественных, третье - для указателя на строковое значение. Эти поля занимают в сумме по 12 байт (каждое по 4 байта), но они никогда не используются одновременно и их можно было изначально объединить в union , чтобы они занимали всего 4 байта. Как результат, из-за расточительства сервером впустую тратится по 8 байт на каждый SVar, что составляет 8 * 800 = 6400 байт (6.25 килобайт) на игрока.
|
Пример использования:
// В коде гейммода.
new string[144 + 1];
GetSVarString("event_name", string, sizeof(string));
format(string, sizeof(string), "Приглашаем Вас на мероприятие \"%s\"! (введите \"/event\" для телепортации)");
SendClientMessage(playerid, -1, string);
// Где-то ещё (в одном из фильтрскриптов?)
static event_name[] = "Голодные игры";
SetSVarString("event_name", event_name);
new string[144 + 1];
GetSVarString("event_name", string, sizeof(string));
format(string, sizeof(string), "Приглашаем Вас на мероприятие \"%s\"! (введите \"/event\" для телепортации)");
SendClientMessage(playerid, -1, string);
// Где-то ещё (в одном из фильтрскриптов?)
static event_name[] = "Голодные игры";
SetSVarString("event_name", event_name);
См. также: