Compiler Funktionen


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

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

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

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

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

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

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