Compiler Funktionen
BeschreibungGroesse = SizeOf(Typ)
SizeOf kann benutzt werden, um die Größe jeder Struktur (funktioniert nicht mit den einfachen eingebauten Typen wie Word, Fließkomma, etc.), Interface oder sogar Variablen zu ermitteln. Dies kann auf vielen Gebieten nützlich sein, wie z.B. für die Ermittlung des Speicherbedarfs für Operationen unter Verwendung von API-Befehlen. Da SizeOf eine Funktion zum Zeitpunkt des Kompilieren ist, arbeitet sie nicht mit Runtime Array, List oder Map. Stattdessen können hier ArraySize(), ListSize() bzw. MapSize() benutzt werden.
Hinweis: Eine Character (.c) Variable ist Unicode und verwendet 2 Bytes. Eine Ascii-Variable (.a) ist ASCII und verwendet 1 Byte.
Beispiel: 1
char.c='!' Debug SizeOf(char) ; wird 2 anzeigen ascii.a='!' Debug SizeOf(ascii) ; wird 1 anzeigen
Beispiel: 2
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 ergebenHinweis: 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 Adress-Offset eines Struktur-Feldes oder den Adress-Offset einer Interface-Funktion herauszufinden. Bei der Verwendung mit einem Interface ist der Funktions-Index der Speicher-Offset, es gilt deshalb IndexOfTheFunction*SizeOf(Integer).
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 ; (16 mit dem 64 Bit Compiler, da ein String dort 8 Bytes belegt) Interface ITest Create() Destroy(Flags) EndInterface Debug OffsetOf(ITest\Destroy()) ; wird 4 ergeben
BeschreibungTyp = TypeOf(Objekt)
TypeOf kann verwendet werden, um den Typ einer Variable oder eines Struktur-Feldes herauszufinden. Der Typ kann einer der folgenden Werte sein:#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
Beispiel
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
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 verknüpften Liste oder einer Map) angegeben werden.
Der Parameter 'Typ' kann einer der folgenden Werte sein:#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
Beispiel
#PureConstant = 10 CompilerIf Defined(PureConstant, #PB_Constant) Debug "Konstante 'PureConstant' ist deklariert" CompilerEndIf Test = 25 CompilerIf Defined(Test, #PB_Variable) Debug "Variable 'Test' ist deklariert" CompilerEndIf
BeschreibungInitializeStructure(*Zeiger, Struktur)
InitializeStructure initialisiert den angegebenen strukturierten Speicherbereich. Es initialisiert die Struktur-Objekte ("members") vom Typ Array, Liste oder Map, andere Objekte sind nicht betroffen (.s, .l, .i etc.). '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. Warnung: mehrfache Aufrufe von InitializeStructure verursachen einen Speicherverlust ("memory leak"), da die alten Struktur-Objekte nicht freigegeben werden (ClearStructure muss aufgerufen werden, bevor InitializeStructure ein weiteres Mal aufgerufen wird). Diese Funktion ist für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden. Um dynamische Strukturen zu allokieren, verwenden Sie AllocateStructure()().
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 Speicherinhalt eines strukturierten Speicherbereichs in einen anderen.
Dies ist nützlich beim Umgang mit dynamischen Zuweisungen, mittels Zeiger. Jedes der Felder wird dupliziert, auch Array, Liste und Map. Die Ziel-Struktur vor dem Kopieren automatisch gelöscht - es ist nicht nötig, ClearStructure vor CopyStructure aufzurufen.
Warnung: Das Ziel sollte ein gültiger Struktur-Speicherbereich oder ein gelöschter Speicherbereich sein. Wenn der Speicherbereich nicht geleert ist, kann es zu einem Absturz kommen, da von der Lösch-Routine zufällige Werte genutzt werden.
Es gibt keine interne Überprüfung, dass die Struktur auch zu den beiden Speicherbereichen passt. Diese Funktion ist für fortgeschrittene Anwender und sollte mit Bedacht 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 löscht einen strukturierten Speicherbereich. Dies ist nützlich, wenn die Struktur Strings, Arrays, Listen oder Maps beinhaltet, welche intern von PureBasic allokiert wurden. 'Struktur' ist der Name der Struktur, welche zum Ausführen des Löschens verwendet werden soll. Alle Felder werden auf Null gesetzt. Es gibt keine interne Überprüfung, um sicherzustellen, dass die Struktur zum Speicherbereich passt. Diese Funktion ist 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
BeschreibungResetStructure(*Zeiger, Struktur)
ResetStructure löscht einen strukturierten Speicherbereich und initialisiert diesen, damit dieser sofort einsatzbereit ist. Dies ist nützlich, wenn die Struktur Strings, Arrays, Listen oder Maps beinhaltet, welche intern von PureBasic allokiert wurden. 'Struktur' ist der Name der Struktur, welche zum Ausführen des Löschens verwendet werden soll. Alle Felder werden auf Null gesetzt. Diese Funktion ist für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden.
Beispiel
Structure Person Map Friends.s() EndStructure Henry.Person\Friends("1") = "Paul" ResetStructure(@Henry, Person) ; Wird einen leeren String ausgeben, da die gesamte Struktur zurückgesetzt wurde. Die Map ist weiterbin benutzbar, jedoch leer. ; Debug Henry\Friends("1")
BeschreibungBool(<Boolescher Ausdruck>)
Bool kann verwendet werden, um einen booleschen Ausdruck außerhalb der regulären bedingten Operatoren wie If, While, Until etc. auszuwerten. Wenn der boolesche Ausdruck wahr ist, wird #True zurückgegeben, andernfalls wird #False zurückgegeben.
Beispiel
Hello$ = "Hello" World$ = "World" Debug Bool(Hello$ = "Hello") ; wird 1 ausgeben Debug Bool(Hello$ <> "Hello" Or World$ = "World") ; wird 1 ausgeben