Compiler Funktionen
BeschreibungGroesse = SizeOf(Typ)
SizeOf kann verwendet werden, um die Größe jeder komplexen Struktur, von eingebauten Typen (Word, Fließkomma, etc.), Interface oder sogar Variablen (Strukturen mit dem gleichen Namen wie eine Variable haben Vorrang) 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.
Als eine Compiler-Funktion wird SizeOf(x) einer Konstante zugewiesen und benötigt keine Zuweisung zu einer Variable, wenn es sich innerhalb einer Schleife oder oft aufgerufenen Prozedur befindet.
Als eine Funktion zum Zeitpunkt des Kompilierens arbeitet SizeOf 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.
Parameter
Typ Der Typ des Objekts.
Rückgabewert
Die Größe des Objekts im Speicher, in Bytes.
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) auf einem 32-Bit Compiler ergeben, da ein String-Pointer 4 Bytes im Speicher umfasst ; wird 18 (8+8+2) auf einem 64-Bit Compiler ergeben, da ein String-Pointer 8 Bytes im Speicher umfasst John.Person\Name = "John" Debug SizeOf(John) ; wird das Gleiche ergeben
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).
Parameter
Struktur\Feld oder Interface\Funktion() Das Feld der Struktur oder die Funktion des Interface.
Rückgabewert
Gibt den Index des Felds oder der Funktion zurück, andernfalls Null.
Beispiel
Structure Person Name.s Vorname.s Alter.w EndStructure Debug OffsetOf(Person\Alter) ; wird 8 auf einem 32-Bit Compiler ergeben, da ein String-Pointer 4 Byte im Speicher belegt ; wird 16 auf einem 64-Bit Compiler ergeben, da ein String-Pointer 8 Bytes im Speicher belegt Interface ITest Create() Destroy(Flags) EndInterface Debug OffsetOf(ITest\Destroy()) ; wird 4 auf einem 32-Bit Compiler ergeben, da ein Zeiger (Pointer) 4 Bytes im Speicher belegt ; wird 8 auf einem 64-Bit Compiler ergeben, da ein Zeiger (Pointer) 8 Bytes im Speicher belegt
BeschreibungTyp = TypeOf(Objekt)
TypeOf kann verwendet werden, um den Typ einer Variable oder eines Struktur-Feldes herauszufinden.
Parameter
Objekt Das zu verwendende Objekt.
Rückgabewert
Der Typ des Objekts.
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. Beim angegebenen Subsystem-Namen wird die Groß-/Kleinschreibung nicht beachtet.
Parameter
Konstanter String-Ausdruck Der Subsystem-Name.
Windows: DirectX9, DirectX11
Linux : Gtk2, Qt
MacOS X: Keiner
Rückgabewert
Gibt einen Wert ungleich Null zurück, wenn das Subsystem verwendet wird, andernfalls Null.
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.
Parameter
Name Der Name des Objekts. Der '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. Typ 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
Rückgabewert
Gibt einen Wert ungleich Null zurück, wenn das Objekt definiert ist, andernfalls Null.
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.).
Parameter
*Zeiger Die zu verwendende Speicheradresse. Struktur '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()().
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
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
BeschreibungErgebnis = CompareStructure(*Zeiger1, *Zeiger2, Struktur [, Flags])
CompareStructure vergleicht den Speicher zweier Strukturen auf Gleichheit. Der Vergleich wird rekursiv auch auf untergeordnete Elemente wie Arrays, Listen und Maps angewendet.
Parameter
*Zeiger1 Die Speicheradresse der ersten strukturierten Variable, die getestet werden soll. *Zeiger2 Die Speicheradresse der ersten strukturierten Variable, die getestet werden soll. Struktur Die verwendete Struktur. Flags (optional) Dieser kann einen der folgenden Werte haben: #PB_String_CaseSensitive : Beim String-Vergleich wird die Groß-/Kleinschreibung beachtet (a=a). (Standard) #PB_String_NoCase : Beim String-Vergleich wird die Groß-/Kleinschreibung nicht beachtet (a=A). #PB_Memory_FollowPointers: Wenn ein Strukturelement ein Zeiger ist, der nicht 0 ist, vergleichen Sie das Zeigerziel rekursiv. Standardmäßig wird nur der Zeigerwert selbst verglichen.
Anmerkungen
Achtung: Die Option #PB_Memory_FollowPointers ist für fortgeschrittene Benutzer gedacht und erfordert besondere Sorgfalt, um Abstürze zu vermeiden. Wenn diese Option verwendet wird, müssen alle Zeigerwerte auf einen gültigen und initialisierten Speicher zeigen oder den Wert 0 haben. Es ist auch nicht erlaubt, Schleifen in den pointierten Elementen (englisch "pointed elements" - eine Kette von Zeigern, die auf sich selbst verweist) zu haben.
Beispiel
Rückgabewert
Gibt einen Wert ungleich Null zurück, wenn die Strukturen gleich sind, oder Null wenn sie sich unterscheiden.Structure People Name$ LastName$ Map Friends$() Age.l EndStructure StudentA.People\Name$ = "Paul" StudentA\LastName$ = "Morito" StudentA\Friends$("Tom") = "Jones" StudentA\Friends$("Jim") = "Doe" StudentB.People\Name$ = "Paul" StudentB\LastName$ = "Morito" StudentB\Friends$("Tom") = "Jones" StudentB\Friends$("Jim") = "Doe" StudentC.People\Name$ = "Paul" StudentC\LastName$ = "Morito" StudentC\Friends$("Tom") = "Hanks" ; Nicht dasselbe wie in StudentA StudentC\Friends$("Jim") = "Doe" Debug CompareStructure(@StudentA, @StudentB, People) ; Gleich Debug CompareStructure(@StudentA, @StudentC, People) ; Nicht gleich
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 Arrays, Listen und Maps. Die Ziel-Struktur wird 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 geleerter Speicherbereich sein. Wenn der Speicherbereich nicht geleert ist, kann es zu einem Absturz kommen, da von der Löschroutine 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.
Parameter
*Quelle Die Speicheradresse, welche die zu kopierende Struktur enthält. *Ziel Die Speicheradresse der Kopie. Struktur Der Name der Struktur, die zum Ausführen des Kopiervorgangs verwendet werden soll.
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
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. Diese Funktion ist für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden.
Parameter
*Zeiger Die Speicheradresse, die die zu löschende Struktur enthält. Struktur 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.
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
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. Diese Funktion ist für fortgeschrittene Anwender und sollte mit Bedacht verwendet werden.
Parameter
*Zeiger Die Speicheradresse, die die neu zu initialisierende Struktur enthält. Struktur Der Name der Struktur, welche zum Durchführen des Löschens verwendet werden soll.
Rückgabewert
Diese Funktion gibt keinen Wert zurück.
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")
BeschreibungErgebnis = Bool(<Boolescher Ausdruck>)
Bool kann verwendet werden, um einen booleschen Ausdruck außerhalb der regulären bedingten Operatoren wie If, While, Until etc. auszuwerten.
Parameter
Boolescher Ausdruck Der zu testende Boolesche Ausdruck.
Rückgabewert
Gibt #True zurück, wenn der Boolesche Ausdruck wahr ist, andernfalls #False.
Beispiel
Hello$ = "Hello" World$ = "World" Debug Bool(Hello$ = "Hello") ; wird 1 ausgeben Debug Bool(Hello$ <> "Hello" Or World$ = "World") ; wird 1 ausgeben