Data

Einführung

PureBasic erlaubt die Benutzung von Data, um vordefinierte Blöcke mit Informationen innerhalb Ihres Programms zu speichern. Dies ist sehr nützlich für Standard-Werte eines Programms (Sprachen-Strings zum Beispiel) oder, in einem Spiel, zum Definieren eines (vorberechneten) Sprite-Weges.

DataSection muss zuerst aufgerufen werden, um den nachfolgenden Datenabschnitt (englisch "Data section") anzukündigen. Dies bedeutet, dass alle Sprungmarken (Labels) und Datenbestandteile in der DataSection des Programms gespeichert werden, welche einen viel schnelleren Zugriff als der Code-Abschnitt hat. Data wird benutzt zum Eingeben der Daten. EndDataSection muss angegeben werden, wenn nach dem Datenabschnitt weiterer Programmcode folgt. Einer der Vorteile ist, dass Sie ohne Probleme verschiedene Datenabschnitte in ihrem Code definieren können. Die Restore und Read Befehle werden benutzt, um die Daten auszulesen.

Diese Funktionen sind nicht "thread-sicher", verwenden Sie sie daher nicht innerhalb eines Threads.

Befehle


Syntax

DataSection
Beschreibung
Beginnt einen Datenabschnitt (englisch "Data section").

Beispiel

  DataSection
    NumerischeDaten:
    Data.w 120, 250, 645 ; drei Zahlen der Größe 'Word'
  EndDataSection



Syntax

EndDataSection
Beschreibung
Beendet einen Datenabschnitt.

Beispiel

  DataSection
    NumerischeDaten:
    Data.w 0, 1, 2
  EndDataSection



Syntax

Data.TypName
Beschreibung
Definiert Daten. Der Typ kann nur ein einfacher Basic Typ (Integer, Long, Word, Byte, Ascii, Unicode, Float, Double, Quad, Character, String) sein. Eine beliebige Anzahl Daten kann sich auf einer Zeile befinden, jede abgegrenzt durch ein Komma ','.

Beispiel

  DataSection
    GemischteDaten:
    Data.l 100, 200, -250, -452, 145
    Data.s "Hello", "This", "is ", "What ?"
  EndDataSection
Für fortgeschrittene Programmierer: Es ist auch möglich, eine Prozedur-Adresse oder die Adresse einer Sprungmarke innerhalb eines Data-Blocks zu speichern, wenn dessen Typ auf Integer (.i) gesetzt wird. (Die Verwendung des Typs 'Integer' speichert die (verschiedenen) Adressen in 32-Bit bzw. 64-Bit Umgebungen korrekt.) Dies kann verwendet werden, um z.B. einfach virtuelle Funktionstabellen aufzubauen.

Beispiel

  Procedure Max(Number, Number2)
  EndProcedure
  
  Label:
    
  DataSection
    GemischteDaten:
    Data.i ?Label, @Max()
  EndDataSection

Beispiel

  Interface MyObject
    DoThis()
    DoThat()
  EndInterface

  Procedure This(*Self)
    MessageRequester("MyObject", "This")
  EndProcedure

  Procedure That(*Self)
    MessageRequester("MyObject", "That")
  EndProcedure

  m.MyObject = ?VTable

  m\DoThis()
  m\DoThat()


  DataSection
    VTable:
      Data.i ?Procedures
    Procedures:
      Data.i @This(), @That()
  EndDataSection



Syntax
  
Restore Label
Beschreibung
Dieses Schlüsselwort ist nützlich, um die Startposition für ein nachfolgendes Read auf eine angegebene Sprungmarke (Label) zu setzen. Alle für diesen Zweck verwendeten Sprungmarken sollten sich innerhalb einer DataSection (des Datenabschnitts) befinden, da die Daten beim Kompilieren als ein vom Programmcode separater Block behandelt werden und möglicherweise von einer Sprungmarke getrennt werden, wenn die Sprungmarke außerhalb der DataSection platziert wurde.

Beispiel

  Restore StringData
  Read.s MyFirstData$
  Read.s MySecondData$
  
  Restore NumericalData
  Read.l a
  Read.l b

  Debug MyFirstData$
  Debug a
  
  End  
  
  DataSection
    NumericalData:    
      Data.l 100, 200, -250, -452, 145
      
    StringData:
      Data.s "Hello", "This", "is ", "What ?"
  EndDataSection



Syntax

Read[.<Typ>] <Variable>
  
Beschreibung
Liest die nächsten verfügbaren Daten ein. Die nächsten verfügbaren Daten können mittels des Restore Befehls geändert werden. Standardmäßig sind die nächsten verfügbaren Daten die zuerst deklarierten Daten. Der Typ der zu lesenden Daten wird durch den 'Typ'-Suffix festgelegt. Der Standard-Typ wird verwendet, wenn dieser nicht angegeben wird.
Es ist jedoch ratsam, den Ad-hoc-Typ zu verwenden, um eine Fehlermeldung beim Lesen des Daten-Strings zu vermeiden, und um Verwirrung bzgl. des Integer-Typs zu vermeiden, der für 32-Bit-Compiler vom Typ 'Long' und für 64-Bit-Compiler vom Typ 'Quad' ist.

Beispiel

  Restore StringData
  Read.s MyFirstData$  
  
  Restore NumericalData
  Read a   ; Achtung, es wird eine Integer-Zahl gelesen (Long bei 32-Bit bzw. Quad bei 64-Bit-Compilern).
  Read.q b
  Read c   ; Achtung, es wird eine 'Quad'-Zahl bei 64-Bit-Compilern gelesen, auch wenn es sich bei den Daten um 'Long' handelt!
  Read.l d
  
  Debug MyFirstData$ ; Zeigt 'Hello' an
  Debug a  ; Display 100
  Debug b  ; Display 111111111111111111
  Debug c  ; Achtung, die Anzeige hängt von Ihrem Compiler ab! : 200 bei 32-Bit bzw. 1288490189000 bei 64-Bit
  Debug d  ; ...analog: 300 bei 32-Bit bzw. 400 bei 64-Bit
  
  End  
  
  DataSection
    NumericalData:    
      Data.i 100
      Data.q 111111111111111111
      Data.l 200, 300, 400

    StringData:
      Data.s "Hello", "This", "is ", "What ?"
  EndDataSection