Функции компилятора
SizeOf | OffsetOf | TypeOf |
Subsystem | Defined | InitializeStructure |
CopyStructure | ClearStructure | ResetStructure |
Bool |
Size = SizeOf(Type)
Описание
Команда SizeOf возвращает размер в байтах, который примет указанный Структурный тип (не сработает с простыми встроенными типами, такими как word и float), Интерфейс или даже Переменная. Поскольку SizeOf - функция времени компиляции, она не работает с динамическими объектами, такими как Массив, Связный список или Хеш-карта. Для этих целей, вместо неё используют команды: ArraySize(), ListSize() или MapSize().
Параметры
Type Тип объекта.
Возвращаемое значение
Размер объекта в памяти, в байтах
Комментарии
Это может быть полезно во многих ситуациях, таких как вычисление требований к памяти для операций, использование команд API, и т.д.
Примечание. Символьная переменная (CHARACTER) (.c) является unicode и занимает 2 байта, а переменная ASCII (.a) занимает только 1 байт.
Примечание. Если переменная и структура имеют одно и то же имя, структура будет иметь приоритет над переменной.
Пример: 1
char.c='!' Debug SizeOf(char); отобразит 2 ascii.a='!' Debug SizeOf(ascii); отобразит 1
Пример: 2
Structure Person Name.s ForName.s Age.w EndStructure Debug "Размер моего друга "+Str(SizeOf(Person))+" bytes" ; будет 10 (4+4+2) John.Person\Name = "John" Debug SizeOf(John) ; будет также 10
Примечание: если у переменной и структуры будет одинаковое имя, у структуры будет приоритет над переменной.
Index = OffsetOf(Structure\Field) Index = OffsetOf(Interface\Function())
Описание
OffsetOf может использоваться для определения смещения адреса поля Структуры или смещения адреса функции Интерфейса. При использовании с Интерфейсом индекс функции является смещением памяти, поэтому он будет IndexOfTheFunction * SizeOf (Integer).
Параметры
Structure\Field или Interface\Function() Поле структуры или функция интерфейса.
Возвращаемое значение
Возвращает индекс поля или функции, в противном случае 0.
Пример
Structure Person Name.s ForName.s Age.w EndStructure Debug OffsetOf(Person\Age) ; будет 8, поскольку строка составляет 4 байта в памяти ; (или 16 с 64-разрядным компилятором, поскольку там строка составляет 8 байтов), Interface ITest Create() Destroy(Flags) EndInterface Debug OffsetOf(ITest\Destroy()) ; будет 4
Type = TypeOf(Object)
Описание
TypeOf может использоваться, чтобы узнать тип переменной или структуры.
Параметры
Objet Используемый объект
Возвращаемое значение
Тип объекта. Тип может быть одним из следующих значений:#PB_Byte #PB_Word #PB_Long #PB_String #PB_Structure #PB_Float #PB_Character #PB_Double #PB_Quad #PB_List #PB_Array #PB_Integer #PB_Map #PB_Ascii #PB_Unicode #PB_Interface
Пример
Structure Person Name.s ForName.s Age.w EndStructure If TypeOf(Person\Age) = #PB_Word Debug "Age is a 'Word'" EndIf Surface.f If TypeOf(Surface) = #PB_Float Debug "Surface is a 'Float'" EndIf
Result = Subsystem(<constant string expression>)
Описание
Subsystem может использоваться, чтобы узнать, используется ли указанная Подсистема в компилируемой программе.
Параметры
constant string expression Имя подсистемы.
Может быть одним из следующих значений (чувствительно к регистру):OpenGL DirectX11
Возвращаемое значение
Возвращает ненулевое значение, если указанная подсистема используется, в противном случае 0.
Пример
CompilerIf Subsystem("OpenGL") Debug "Компиляция с подсистемой OpenGL" CompilerEndIf
Result = Defined(Name, Type)
Описание
Defined проверяет, является ли объект с указанным именем уже объявленным в исходном коде, например структура, интерфейс, переменная и т.д.
Параметры
Name Имя проверяемого объекта.
Имя должно быть указано без какой-либо дополнительной декорации (т.е. без символа '#' для константы, без'()' для Массива, Связного списка и Хеш-карты).Type Может принимать одно из следующих значений: #PB_Constant #PB_Variable #PB_Array #PB_List #PB_Map #PB_Structure #PB_Interface #PB_Procedure #PB_Function #PB_OSFunction #PB_Label #PB_Prototype #PB_Module #PB_Enumeration
Возвращаемое значение
Ненулевое значение в случае, если объект с данным именем объявлен, иначе 0.
Пример
#PureConstant = 10 CompilerIf Defined(PureConstant, #PB_Constant) Debug "Константа 'PureConstant' уже объявлена" CompilerEndIf Test = 25 CompilerIf Defined(Test, #PB_Variable) Debug "Переменная 'Test' уже объявлена" CompilerEndIf
Пример: объявление с условием
#PureConstant = 10 q=10 CompilerIf Defined(PureConstant, #PB_Constant) Debug "Константа 'PureConstant' уже объявлена" CompilerEndIf If q=0 ; несмотря на то что условие не выполнено, переменная 'Test' считается объявленной, TEST = 25 ; так как переменная объявляется ещё на этапе компиляции :) EndIf ; как и все именные объекты!!! CompilerIf Defined(TEST, #PB_Variable) Debug "Переменная 'Test' уже объявлена" CompilerEndIf
InitializeStructure(*Pointer, Structure)
Описание
InitializeStructure инициализирует указанный объект структурного типа (экземпляр структуры) в памяти. На самом деле она инициализирует содержащиеся в этом объекте динамические объекты, такие как Массив, Связный список или Хеш-карта, которые должны размещаться в памяти внутренними механизмами PureBasic. На другие типы не влияет (.s.l.i и т.д.).
Параметры
*Pointer Адрес памяти для использования. Structure Имя структуры, которая должна использоваться для инициализации.
Нет никаких внутренних проверок, гарантирующих, что область памяти соответствует структуре.
Возвращаемое значение
Ничего.
Комментарии
Предупреждение: многократные вызовы InitializeStructure создают утечку памяти, если предыдущие вызовы не закрыты. Для закрытия используйте команду ClearStructure, её нужно использовать, перед тем как вызвать InitializeStructure еще раз.
Эта функция предназначена для опытных пользователей и должна использоваться с осторожностью.
Чтобы динамически создать в памяти новый экземпляр структуры, который сразу будет проинициализирован и готов к использованию, используйте команду AllocateStructure().
Пример
Structure People Name$ Age.l List Friends.s() EndStructure *Student.People = AllocateMemory(SizeOf(People)) InitializeStructure(*Student, People) ; Теперь список готов к использованию ; AddElement(*Student\Friends()) *Student\Friends() = "John" AddElement(*Student\Friends()) *Student\Friends() = "Yann" ; Вывод содержимого списка ; ForEach *Student\Friends() Debug *Student\Friends() Next
CopyStructure(*Source, *Destination, Structure)
Описание
CopyStructure копирует область памяти занятую объектом со структурным типом (экземпляром структуры) в область памяти другого объекта с таким же типом.
Параметры
*Source Адрес памяти, содержащий объект-источник структурного типа. *Destination Адрес памяти, содержащий целевой объект того же структурного типа. Structure Имя структуры, заявленной в качестве типа для используемых при копировании объектов.
Возвращаемое значение
Ничего.
Комментарии
Это полезно при работе с динамическим размещением в памяти, через Указатели. Каждое поле структуры будет продублировано, даже Массивы, Связные списки и Хеш-карты. Целевой объект структурного типа будет автоматически очищен перед копированием, поэтому нет необходимости использовать команду ClearStructure перед командой CopyStructure.
Предупреждение: место назначения должно быть допустимой областью памяти объекта структурного типа или очищенной областью памяти. Если область памяти не очищена, это может вызвать отказ, поскольку случайные значения в памяти будут портить данные.
Нет никаких внутренних проверок, гарантирующих, что две зоны памяти относятся к объектам одного и того же структурного типа, поэтому необходимо тщательно проработать эту команду.
Эта функция предназначена для опытных пользователей и должна использоваться с осторожностью.
Пример
Structure People Name$ LastName$ Map Friends$() Age.l EndStructure Student.People\Name$ = "Paul" Student\LastName$ = "Morito" Student\Friends$("Tom") = "Jones" Student\Friends$("Jim") = "Doe" CopyStructure(@Student, @StudentCopy.People, People) Debug StudentCopy\Name$ Debug StudentCopy\LastName$ Debug StudentCopy\Friends$("Tom") Debug StudentCopy\Friends$("Jim")
ClearStructure(*Pointer, Structure)
Описание
ClearStructure очищает область памяти занятую объектом Структурного типа (экземпляром структуры) и устанавливает значение всех его полей на ноль.
Параметры
*Pointer Адрес памяти, содержащий объект структурного типа, подлежащий очистке. Structure Имя структуры, заявленной в качестве типа для объекта, которые требуется очистить.
Возвращаемое значение
Ничего.
Комментарии
Это полезно, когда структура содержит Строки, Массив, Связный список или Хеш-карту, которые были размещены в памяти внутренними механизмами PureBasic. Все поля указанного объекта структурного типа (экземпляра структуры) будут установлены в ноль, даже нативные типы, такие как long, integer и т.д.
Нет никаких внутренних проверок, гарантирующих, что используемая память относятся к объекту структурного типа, поэтому необходимо тщательно проработать эту команду. Эта функция предназначена для опытных пользователей и должна использоваться с осторожностью.
Пример
Structure People Name$ LastName$ Age.l EndStructure Student.People\Name$ = "Paul" Student\LastName$ = "Morito" Student\Age = 10 ClearStructure(@Student, People) ; Выведет пустые строки, поскольку объект структурного типа (экземпляр структуры) был очищен. Все поля были сброшены на ноль. ; Debug Student\Name$ Debug Student\LastName$ Debug Student\Age
ResetStructure(*Pointer, Structure)
Описание
ResetStructure очищает область памяти занятую объектом Структурного типа (экземпляром структуры) Структуры и инициализирует его для готовности к использованию. В отличии от ClearStructure, динамические объекты остаются доступными.
Параметры
*Pointer Адрес памяти, содержащий объект структурного типа, подлежащий очистке. Structure Имя структуры, заявленной в качестве типа для объекта, которые требуется очистить.
Возвращаемое значение
Ничего.
Комментарии
Это полезно, когда структура содержит Строки, Массив, Связный список или Хеш-карту, которые были размещены в памяти внутренними механизмами PureBasic. Все поля указанного объекта структурного типа (экземпляра структуры) будут установлены в ноль, даже нативные типы, такие как long, integer и т.д.
Нет никаких внутренних проверок, гарантирующих, что используемая память относятся к объекту структурного типа, поэтому необходимо тщательно проработать эту команду.
Эта функция предназначена для опытных пользователей и должна использоваться с осторожностью.
Пример
Structure Person Map Friends.s() EndStructure Henry.Person\Friends("1") = "Paul" ResetStructure(@Henry, Person) ; Выведет пустую строку, поскольку вся структура была сброшена. Хеш-карта еще пригодна для использования, но пуста. ; Debug Henry\Friends("1")
Bool(<boolean expression>)
Описание
Bool может использоваться, чтобы оценить булево выражение без обычного условного оператора, такого как If, While, Until и т.д.
Параметры
boolean expression Булево выражение для проверки.
Возвращаемое значение
Возвратит #True, если булево выражение будет верно, иначе #False.
Пример
Hello$ = "Hello" World$ = "World" Debug Bool(Hello$ = "Hello") ; распечатает 1 Debug Bool(Hello$ <> "Hello" Or World$ = "World") ; распечатает 1
Пример (Фран)
Procedure Chiffre(char.c) ProcedureReturn Bool(char >= '0' And char <= '9') EndProcedure Debug Chiffre('0') Debug Chiffre('1') Debug Chiffre('a') Debug Chiffre('z')