Compiler Funktionen


Syntax
Groesse = SizeOf(Typ)
Beschreibung
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
  

Syntax
Index = OffsetOf(Struktur\Feld)
Index = OffsetOf(Interface\Funktion())
Beschreibung
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

Syntax
Typ = TypeOf(Objekt)
Beschreibung
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

Syntax
Ergebnis = Subsystem(<Konstanter String Ausdruck>)
Beschreibung
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

Syntax
Ergebnis = Defined(Name, Typ)
Beschreibung
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

Syntax
InitializeStructure(*Zeiger, Struktur)
Beschreibung
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

Syntax
CopyStructure(*Quelle, *Ziel, Struktur)
Beschreibung
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")

Syntax
Ergebnis = ClearStructure(*Zeiger, Struktur)
Beschreibung
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

Syntax
ResetStructure(*Zeiger, Struktur)
Beschreibung
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")

Syntax
Bool(<Boolescher Ausdruck>)
Beschreibung
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