PureBasic

Функции компилятора

Краткое описание функций:
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')