Compiler Funktionen
BeschreibungGroesse = SizeOf(Typ)
SizeOf kann benutzt werden, um die Größe jeder komplexen Struktur (funktioniert nicht mit den einfachen eingebauten Typen wie Word und Fließkomma), Interface oder sogar Variablen zu ermitteln. Dies kann auf vielen Gebieten nützlich sein, um den Speicherverbrauch für Operationen, Verwendung von API-Befehlen, etc. zu ermitteln.
Hinweis: Im Unicode-Modus verwendet ein Zeichen 2 Bytes. Im Ascii-Modus verwendet ein Zeichen 1 Byte. Sizeof(Zeichen) ermöglicht die Rückgabe der Größe (in Bytes), welche von einem Zeichen in Abhängigkeit vom aktiven Modus belegt wird.
Beispiel
Structure Person
Name.s
Vorname.s
Alter.w
EndStructure
Debug "Die Größe meines Freundes ist "+Str(Sizeof(Person))+" Bytes" ; wird 10 (4+4+2) ergeben
John.Person\Name = "John"
Debug SizeOf(John) ; wird auch 10 ergeben
Hinweis: Wenn eine Variable und eine Struktur den gleichen Namen haben, dann hat die Struktur Vorrang gegenüber der Variable.
BeschreibungIndex = OffsetOf(Struktur\Feld) Index = OffsetOf(Interface\Funktion())
OffsetOf kann verwendet werden, um den Index eines Struktur-Feldes oder den Index einer Interface-Funktion herauszufinden. Bei der Verwendung mit einem Interface ist der Funktions-Index der Speicher-Offset, es gilt deshalb IndexOfTheFunction*4.
Beispiel
Structure Person
Name.s
Vorname.s
Alter.w
EndStructure
Debug OffsetOf(Person\Alter) ; wird 8 ergeben, da ein String(-Pointer) 4 Byte im Speicher belegt
Interface ITest
Create()
Destroy(Flags)
EndInterface
Debug OffsetOf(ITest\Destroy()) ; wird 4 ergeben
BeschreibungErgebnis = Subsystem(<Konstanter String Ausdruck>)
Subsystem kann verwendet werden, um herauszufinden, ob ein Subsystem für das zu kompilierende Programm verwendet wird. Der Name des Subsystems ist nicht "Case-Sensitive", d.h. Groß-/Kleinschreibung ist egal.
Beispiel
CompilerIf Subsystem("OpenGL")
Debug "Kompilierung mit dem OpenGL Subsystem"
CompilerEndIf
BeschreibungErgebnis = Defined(Name, Typ)
Defined überprüft, ob ein bestimmtes Objekt innerhalb des Quellcodes wie Struktur, Interface, Variable bereits definiert ist oder nicht.
Der Parameter 'Name' muss ohne jeden Zusatz (z.B. ohne '#' für eine Konstante, ohne '()' für ein Array, einer LinkedList oder einer Map) angegeben werden.
Der Parameter 'Typ' kann einer der folgenden Werte sein:#PB_Constant #PB_Variable #PB_Array #PB_LinkedList #PB_Map #PB_Structure #PB_Interface #PB_Procedure #PB_Function #PB_OSFunction
Beispiel
#PureConstant = 10
CompilerIf Defined(PureConstant, #PB_Constant)
Debug "Konstante 'PureConstant' ist bereits deklariert"
CompilerEndIf
Test = 25
CompilerIf Defined(Test, #PB_Variable)
Debug "Variable 'Test' ist bereits deklariert"
CompilerEndIf
BeschreibungInitializeStructure(*Zeiger, Struktur)
InitializeStructure initialisiert den angegebenen strukturierten Speicherbereich. Dies ist nützlich, wenn die Struktur dynamische Objekte wie Arrays, Listen oder Maps enthält, welche intern von PureBasic zugewiesen werden müssen. 'Struktur' ist der Name der Struktur, welche zum Durchführen der Initialisierung verwendet werden soll. Es gibt keine interne Überprüfung, um sicherzugehen, dass die Struktur zum Speicherbereich passt. Diese Funktion ist nur für fortgeschrittene Anwender und sollte mit Vorsicht verwendet werden.
Beispiel
Structure People
Name$
Age.l
List Friends.s()
EndStructure
*Student.People = AllocateMemory(SizeOf(People))
InitializeStructure(*Student, People)
; Jetzt ist die Liste fertig zur Benutzung
;
AddElement(*Student\Friends())
*Student\Friends() = "John"
AddElement(*Student\Friends())
*Student\Friends() = "Yann"
; Den Listen-Inhalt ausgeben
;
ForEach *Student\Friends()
Debug *Student\Friends()
Next
BeschreibungCopyStructure(*Quelle, *Ziel, Struktur)
CopyStructure kopiert den Speicher eines strukturierten Speicherbereichs in einen anderen.
Dies ist nützlich beim Umgang mit dynamischen Zuweisungen, mittels Zeiger. Jedes Feld wird dupliziert, auch Array, Liste und Map. Es gibt keine interne Überprüfung, dass die Struktur auch zu den beiden Speicherbereichen passt. Diese Funktion ist nur für fortgeschrittene Anwender und sollte mit Vorsicht verwendet werden.
Beispiel
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")
BeschreibungErgebnis = ClearStructure(*Zeiger, Struktur)
ClearStructure gibt den Speicher eines strukturierten Speicherbereichs frei. Dies ist nützlich, wenn die Struktur Strings beinhaltet, welche intern von PureBasic allokiert wurden. 'Struktur' ist der Name der Struktur, welche zum Ausführen des Löschens verwendet werden soll. Es gibt keine interne Überprüfung, um sicherzustellen, dass die Struktur zum Speicherbereich passt. Diese Funktion ist nur für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden.
Beispiel
Structure People
Name$
LastName$
Age.l
EndStructure
Student.People\Name$ = "Paul"
Student\LastName$ = "Morito"
Student\Age = 10
ClearStructure(@Student, People)
; Wird leere Strings ausgeben, da die gesamte Struktur gelöscht wurde. Alle anderen Felder wurden auf Null zurückgesetzt.
;
Debug Student\Name$
Debug Student\LastName$
Debug Student\Age