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.
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).
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. 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.
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 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.
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