Оглавление

Типы данных в AngelScript и C++

Примитивы

Примитивы в AngelScript аналогичны C++.

AngelScriptC++Size (bits)
void void 0
int8 signed char 8
int16 signed short 16
int signed long (*) 32
int64 signed long long 64
uint8 unsigned char 8
uint16unsigned short 16
uint unsigned long (*) 32
uint64unsigned long long64
float float 32
doubledouble 64
bool bool 8 (**)

*) На 32 битной платформе, тип long (С++) также 32 битный, но на 64 битной он обычно 64 битный, но в AngelScript он всегда 32 битный.

**) На 32 битных платформах PowerPC, тип bool обычно имеет размер 32 бит, поэтому на данной платформе AngelScript также использует 32 бита для bool.

Массивы

Массивы AngelScript не совпадают с массивами C++. Массивы находятся в специальном обьектк, доступном через интерфейс asIScriptArray. Поэтому вы не можете напрямую передавать в скрипт массив C++, возможно в скором будещем эта опция появится.

Также можно переопределить встроенный обьект массив своим обьектом, специализированным под определенные типы обьектов.

Хендлы

Хендлы используют механизм подсчета ссылок на обьект. Поэтому для работы хендла необходимо указывать обьекту функции, реализующие этот механизм, например пару функций AddRef/Release.

Когда AngelScript передает хендл по значению в функцию, увеличивается счетчик ссылок, таким образом функция отвечает за уменьшение счетчика когда она закончила работать с обьектом.

Однако, при регистрации функций\методов AngelScript может автоматически управлять счетчиком ссылок. Для этого следует добавить знак + к @. Теперь хендл может быть безопасно передан в функцию C++, которая работает с обычным указателем, но не освобождает его после работы.

Рекомендуется:
Хендлы

Список параметров

Посколько скриптовому движку необходимо гарантировать валидность указателей в любое время, он не всегда передает ссылки на действительные обьекты в параметры функции. Вместо этого он создает копию обьекта по ссылке и если ссылка должна возвращать значение, копирует оригинальный обьект в нее перед выходом из функции, если он еще существует.

Поэтому ссылки на параметры AngelScript в основном совместимы с сcылками C++, или указателями, исключая моменты когда адрес не может быть сохранен для дальнейшего использования, так как обьект может быть удален после отработки функции.

Если необходимо хранить адреса обьктов, используйте хендлы.

СсылкаОписание
&inВ функцию передается ссылка на копию значения. Для скриптовых функций это не важно, но поддерживается для совместимости с зарегистрированными функциями приложения.
const &inЕсли валидность значения гарантируется во время исполнения функции, ссылка на настоящий обьект передается в функцию, иначе создается копия.
&outВ функцию передается ссылка на неиницилизированное значение. Когда функция возвращает значение, оно копируется в настоящую ссылку. Аргумент выражения оценивается только после вызова функции. Данный вид лучше всего подходит для функций, возвращающих несколько значений.
const &outБесполезно, так как функция не сможет изменить значение.
&inoutНастоящая ссылка всегда передается в функцию. Если время жизни не может быть гарантировано, будет выдана ошибка во время компиляции и скриптер должен скопировать локальную переменную перед тем как передавать ссылку на нее в скрипт. Обьекты, которые поддерживают хендлы наилучше подходят в данной ситуации, так как они могут гарантировать время жизни ссылки.
const &inoutСсылка не может быть изменена функцией.

Если приложению требуются параметры ссылкой, как в C++, установить движку свойство asEP_ALLOW_UNSAFE_REFERENCES. При этом ссылки могут быть указаны без in, out, и inout. Параметр-ссылка без зарезервированных слов всегда будет передавать адрес оригинального значения. Параметр-ссылка с зарезервированными словами in и out будут работать как и раньше, а со словом inout ограничения будут убраны, так что вы сможете работать как с обычными C++ ссылками. В данном режиме программист приложения и скриптер должны помнить, что скрипт может обращаться к протухшим ссылками, что небезопасно.


Перевод - arroy.one@gmail.com. При копировании материалов указывайте ссылку на источник.