Befehlsreferenz

Dies ist die deutsche Übersetzung der freeBASIC Befehlsreferenz, stand 18.03.2007.

Statistik:
518 Schlüsselwörter
36 Einträge zu Hintergrund und Sprachstruktur
32 Seiten zur Navigation und Kapitelwahl
586 Einträge gesamt.

Folgende Themen sind verfügbar:
  • Alphabetische Referenz
  • Grundlagen der Sprachfamilie BASIC
  • Operatoren in freeBASIC
  • Prozeduren
  • Über die GfxLib
  • Verschiedene Themen

Der Übersetzer möchte sich an dieser Stelle für die tatkräftige Unterstützung bedanken, die er von der deutschsprachigen Community für
seine Arbeit erhalten hat.

Keep the fire burning!


Alphabetische Befehlsreferenz

Wählen Sie den Buchstaben, mit dem der Befehl beginnt, zu dem Sie eine Erklärung
lesen möchten.

A | B | C | D | E
F | G | H | I | K
L | M | N | O | P
R | S | T | U | V
W | X | Y | Z | Metabefehle


Liste der Schlüsselwörter beginnend mit A

ABS
ACCESS
ACOS
ADD
ALIAS
ALLOCATE
ALPHA
AND
AND (Methode)
AND (Operator)
ANY
APPEND
AS
ASC
ASIN
ASM
ASSERT
ASSERTWARN
ATAN2
ATN


ABS

Syntax: ABS ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

ABS gibt den Absolutbetrag (den positiven bzw. vorzeichenlosen Wert) der angegebenen
Zahl zurück.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist entweder ein INTEGER, wenn 'Zahl' ein ganzzahliger Wert
    ist (also vom Typ BYTE, UBYTE, SHORT, USHORT, INTEGER, ...), oder vom Typ
    DOUBLE, wenn 'Zahl' ein Fließkommawert ist (also vom Typ SINGLE oder DOUBLE).

    • Beispiel:
    PRINT ABS(-1), ABS(-3.1415), ABS(42)
    Ausgabe:
    1     3.1415     42

    Siehe auch:
    SGN
    mathematische Operatoren


ACCESS

Syntax: ACCESS { READ | WRITE | READ WRITE }
Typ: Klausel
Kategorie: Datei

ACCESS wird zusammen mit der OPEN-Anweisung verwendet.

Durch ACCESS werden die Zugriffsrechte auf die Datei festgelegt.
  • READ ermöglicht dabei Lesezugriff auf die Datei.

  • WRITE ermöglicht dabei Schreibzugriff auf die Datei.

  • READ WRITE ermöglicht dabei Lese- und Schreibzugriff auf die Datei.

    • Beispiel:
    OPEN "data.raw" FOR BINARY ACCES READ AS #1

    Siehe auch:
    OPEN


ACOS

Syntax: ACOS ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Inverskosinus einer Zahl zurück.
(ACOS bildet also die Gegenfunktion zu COS,)

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.
    Der Wert des Ausdrucks muss zwischen -1 und 1 liegen. Ist die Zahl größer als
    1, oder kleiner als -1, wird ein Fehler erzeugt.

  • Der Rückgabewert ist ein DOUBLE-Wert, der eine Gradangabe im Bogenmaß
    darstellt. Er liegt im Bereich zwischen -pi und +pi

    • DIM AS SINGLE Kosinuswert, Winkel

    Kosinuswert = 0.5
    Winkel = ACOS(Kosinuswert)

    PRINT Winkel
    'Ausgabe: 1.0472

    Siehe auch:
    SIN, ASIN,
    COS,
    TAN, ATN, ATAN2
    mathematische Operatoren
    Unterschiede: Neu in freeBASIC


ADD

Syntax: ... ADD [, Faktor]
Typ: Schlüsselwort
Kategorie: Gfx

ADD ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING eingesetzt
wird.

ADD bewirkt, dass die Farbnummer des gespeicherten Pixels wird mit 'Faktor' multipliziert und
zur Sättigung des zu überzeichnenden Pixels addiert wird.
'Faktor' ist dabei ein Wert zwischen 0 und 255.

Das Ergebnis der ADD-Methode sind ebenso wie bei ALPHA durchscheinende Bildschirmausschnitte.
Der Transparenzgrad des Ausschnitts ist jedoch nicht nur vom angegebenen Faktor abhängig,
sondern auch von der Helligkeit des darunter liegenden Pixels. Beim Überzeichnen schwarzer
Pixel verhält sich ADD wie ALPHA; mit zunehmender Helligkeit des zu überzeichnenden Pixels
allerdings verschiebt sich das Gleichgewicht der Farbmischung hin zur Transparenz des zu
Zeichnenden Pixels.

Wird 'Faktor' ausgelassen, nimmt freeBASIC automatisch Faktor = 255 an.

Ebenso wie TRANS und ALPHA werden Flächen in der Maskenfarbe nicht gezeichnet.
(Siehe dazu auch Interne Pixelformate.)

Unterschiede:
zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen:
  • existiert erst seit freeBASIC v0.17

    • Siehe auch:
    PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
    AND (Methode), OR (Methode), XOR (Methode),
    PSET (Methode), PRESET (Methode),
    ALPHA, TRANS, CUSTOM


ALIAS

Syntax: DECLARE SubName ALIAS "Aliasname" ...
Typ: Klausel
Kategorie: Speicherorganisation

ALIAS gibt einer Prozedur in einer Library einen neuen Namen mit dem man darauf
verweisen kann.

  • 'Aliasname' ist der Name, den die Prozedur in der Library trägt.

  • 'SubName ist der Name, den die Sub innerhalb des Programms trägt.

    • Beispiel:
    DECLARE SUB xClearScreen ALIAS "ClearVideoScreen" ()

    xClearScreen

    Siehe auch:
    DECLARE


ALLOCATE

Syntax: Pointer = ALLOCATE(Bytes)
Typ: Funktion
Kategorie: Speicherverwaltung

Reserviert ("Allokalisiert") eine beliebige Anzahl von Bytes im Speicher, und liefert
einen Pointer zum Anfang dieses Speicherbereichs.

  • Bytes ist ein INTEGER-Wert, der angibt, wie viele Bytes reserviert werden
    sollen.

  • Der Rückgabewert ist ein Pointer auf den Anfang des Speicherbereichs

  • Wenn beim Allokalisieren ein Fehler auftritt, ist der Rückgabewert 0.

    • Ein mit ALLOCATE reservierter Speicherbereich muss mit DEALLOCATE wieder
    freigegeben werden.

    ALLOCATE ist kein Teil der freeBASIC Runtime Library, sondern ein Alias von
    'malloc' der C-Lib. Es kann nicht garantiert werden, dass diese Funktion Multithreading
    auf allen Plattformen unterstützt.

    Beispiel:
    Mit ALLOCATE wird ein dynamisches Array erstellt, dessen Elemente mit einer
    Fibonacci-Sequenz befüllt werden. Beachten Sie den DEALLOCATE-Aufruf am
    Programmende!

    OPTION EXPLICIT

    CONST IntegerCount AS INTEGER = 15 ' Platz für 15 INTEGER-
    DIM AS INTEGER PTR buffer ' Speicherstellen
    buffer = ALLOCATE( IntegerCount * LEN( INTEGER ) ) ' reservieren

    IF( buffer = 0 ) THEN ' Reservierung schlug
    PRINT "Fehler: Speicher konnte nicht reserviert werden" ' fehl wenn PTR = 0
    END -1
    END IF

    buffer[ 0 ] = 0 ' Fibonacci-Sequenz
    buffer[ 1 ] = 1 ' einleiten ...

    DIM AS INTEGER i
    FOR i = 2 TO IntegerCount - 1
    buffer[ i ] = buffer[ i - 1 ] + buffer[ i - 2 ] ' ..., vervollständigen...
    NEXT

    FOR i = 0 TO IntegerCount - 1
    PRINT buffer[ i ] ; ' ... und ausgeben
    NEXT

    DEALLOCATE( buffer ) ' Speicher wieder freigeben
    END 0 ' Programm beenden
    Ausgabe:
    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

    Achtung: Wenn Sie einen Speicherbereich reservieren, MÜSSEN Sie diesen nach
    Gebrauch wieder freigeben, da er sonst auch nach Programmmende reserviert bleibt.
    Sehen Sie sich dieses Beispiel an:
    OPTION EXPLICIT

    FUNCTION AllocateExample2()
    DIM AS INTEGER PTR IntegerPtr = 0

    '' erste Reservierung
    IntegerPtr = ALLOCATE( LEN( INTEGER ) ) ' Pointer auf neuen
    ' Speicherbereich setzen

    '' zweite Reservierung
    integerPtr = ALLOCATE( LEN( INTEGER ) ) ' Pointer auf neuen Bereich
    ' verlegen
    DEALLOCATE( IntegerPtr )
    END FUNCTION

    AllocateExample2()
    SLEEP : END 0
    In diesem Beispiel geht bei jedem Funktionsaufruf Speicherplatz verloren, da der
    von der ersten Reservierung bereitgestellte Speicherbereich nicht mehr
    deallokiert wird.
    Daher sollten Sie, wenn Sie einen größeren Speicherbereich benötigen, die
    Funtkion REALLOCATE verwenden, oder zumindest den alten Speicherbereich IMMER
    mit DEALLOCATE freigeben.

    Siehe auch:
    CALLOCATE, REALLOCATE, DEALLOCATE,
    Pointer


ALPHA

Syntax: ... ALPHA [, alphawert]
Typ: Schlüsselwort
Kategorie: Gfx

ALPHA ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING eingesetzt wird.

Mit ALPHA lassen sich Transparenz-Effekte erzeugen.
Die ALPHA-Methode wird verwendet, um Bildschirmausschnitte 'durchscheinend' auszugeben; das Ergebnis der Bildschirmausgabe ist eine 'Mischfarbe'
aus dem Pixel, das überzeichnet wurde, und dem, das im Quellpuffer gespeichert war.

Das Aktionswort ALPHA ist nur in hi/truecolor-Modi verfügbar, also in Modi ab 15bpp.
'alphawert' stellt dabei den Transparenzgrad des zu zeichnenden Ausschnitts bzw. das Mischungsverhältnis der beiden Farben dar; 255 bedeutet
dabei volle Überdeckung, 0 keine Überdeckung. 127 ist der exakte Mittelwert zwischen den beiden Farben.
Ebenso wie bei TRANS und ALPHA werden Pixel in der Maskenfarbe nicht gezeichnet. (Siehe dazu auch Interne Pixelformate.)

In 32bpp-Modi ist es auch zulässig, den Parameter 'alphawert' auszulassen; in diesem Fall benutzt freeBASIC den Alphawert, der für jeden
Pixel einzeln angegeben wurde; dies ist nur in 32bpp-Modi möglich, da nur hier ein eingebetteter Alphawert für jeden Pixel möglich ist;
siehe dazu auch Interne Pixelformate

Wird 'alphawert' ausgelassen, jedoch ein Modi mit einer Farbtiefe unter 32bpp verwendet, so geht freeBASIC von alphawert = 255 aus; dies
entspricht völliger Überdeckung bzw. dem Aktionswort TRANS.

Unterschiede:
zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen:
  • existiert erst seit freeBASIC v0.14

    • Siehe auch:
    PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
    AND (Methode), OR (Methode), XOR (Methode),
    PSET (Methode), PRESET (Methode),
    ADD, TRANS, CUSTOM


AND (Methode)

Typ: Schlüsselwort
Kategorie: Gfx

AND ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING
eingesetzt wird.

Die Farbe des gezeichneten Pixels ist das Ergebnis eines logischen AND des zu
zeichnenden Pixels mit dem zu überschreibenden Pixel.

Beispiel:
An der Position (100, 100) befindet sich ein Pixel mit dem Farbattribut 172.
Dieses soll nach der AND-Methode mit einem Pixel des Farbattributs 47
überzeichnet werden. Das Ergebnis ist ein Pixel des Farbattributs 44.
Dies ergibt sich folgendermaßen:
Dezimal    Binär
 172       10101100
  47       00101111
-AND---------AND---
  44       00101100

Die AND-Methode kann mit allen Farbtiefen angewandt werden, also sowohl in
palettenindizierten Modi als auch in high/truecolor-Modi. Beachten Sie, dass in
palettenindizierten Modi das sichtbare Ergebnis nicht nur von den Farbattributen,
sondern auch von den zugeordneten Paletten-Einträgen abhängig ist.
Siehe dazu PALETTE und Standardpaletten.

Siehe auch:
AND (Operator),
PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
OR (Methode), XOR (Methode),
PSET (Methode), PRESET (Methode),
ALPHA, ADD, TRANS, CUSTOM


AND

AND kann als einfacher und kombinierter Operator eingesetzt werden:

logischer Operator (einfacher Operator)

Syntax: Ausdruck1 AND Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

AND vergleicht zwei Werte Bit für Bit, und setzt im Ergebnis nur dann ein Bit,
wenn die entsprechenden Bits in beiden Ausdrücken gesetzt waren.
AND wird in Bedingungen eingesetzt, wenn beide Aussagen erfüllt sein müssen.

Beispiel 1: AND in einer IF-THEN-Bedingung:
IF (a = 1) AND (b = 7) THEN PRINT "beides erfüllt" ELSE PRINT "Entweder a <> 1 oder b <> 7."

Beispiel 2: Komplement zweier Zahlen mit AND:
DIM AS INTEGER z1, z2

z1 = 6
z2 = 10

PRINT z1, BIN(z1, 4)
PRINT z2, BIN(z2, 4)
PRINT "---", "----"
PRINT z1 AND z2, BIN(z1 AND z2, 4)
GETKEY
Ausgabe:
  6           0110
 10           1010
---           ----
  2           0010

Siehe auch:
kombiniertes AND,
NOT, OR, XOR, IMP, EQV,
Logische Operatoren

kombinierter Operator

Syntax: Wert AND= Ausdruck
Typ: Operator
Kategorie: logische Operatoren

Das kombinierte AND ist eine Kurzform von
Wert = Wert AND Ausdruck
Ebenso wie der einfache Operator setzt das Kombinierte AND die Bits im Ergebnis
nur, wenn im Ausgangswert und im Ausdruck das entsprechende Bit gesetzt war.

Beispiel:
DIM AS INTEGER w, bnr

INPUT "Bitte geben Sie eine Zahl ein.", w
INPUT "Bitte geben Sie die Nummer des Bits ein, auf das geprueft werden soll.", bnr

w AND= (1 SHL bnr)

IF w THEN PRINT "Dieses Bit wurde gesetzt." ELSE PRINT "Dieses Bit wurde nicht gesetzt."
GETKEY
Ausgabebeispiel 1:
Bitte geben Sie eine Zahl ein. 5
Bitte geben Sie die Nummer des Bits ein, auf das geprueft werden soll. 2
Dieses Bit wurde gesetzt

Ausgabebeispiel 2:
Bitte geben Sie eine Zahl ein. 5
Bitte geben Sie die Nummer des Bits ein, auf das geprueft werden soll. 1
Dieses Bit wurde nicht gesetzt

Siehe auch:
einfaches AND,
NOT, OR (Operator), XOR (Operator), IMP, EQV,
Logische Operatoren


AND

AND kann als Operator, als kombinierter Operator und als Methode bei PUT (Grafik) und DRAW STRING eingesetzt
werden.

Siehe:
AND (Operator)
AND (Methode)


ANY

Typ: Datentyp/Klausel

Dieser Eintrag behandelt den Datentyp ANY. Für Informationen zu ANY als Klausel,
siehe INSTR, TRIM, LTRIM und RTRIM, DIM.

Wird ANY in einer DECLARE-Anweisung verwendet, bewirkt es, dass Parameter jeden
Typs an die Prozedur übergeben werden dürfen. Innerhalb der Prozedur werden sie
dann so behandelt, wie im Prozedurheader angegeben.

Beispiel 1:
DECLARE SUB PrintFirstByte (x AS ANY)

DIM i AS INTEGER, z AS ZSTRING * 12, s AS STRING
i = -1
s = "hello World!"
z = "hello World!"

PrintFirstByte i
PrintFirstByte s
PrintFirstByte z
GETKEY

SUB PrintFirstByte (x AS UBYTE)
? x
END SUB
Ausgabe:
255
160
104
Diese Werte kommen wie folgt zustande:
Der INTEGER 'i' hat den Wert -1, d.h. alle Bits sind gesetzt. (Siehe BIN). Da 'i'
BYREF übergeben wird, erhält die SUB nur die Adresse von 'i'. Im Prozedurheader
wurde festgelegt, dass der Parameter, dessen Adresse empfangen wurde, wie ein
UBYTE behandelt werden soll. Von den 32bit der Integervariable 'i' werden also
nur die ersten 8 ausgewertet. Diese sind alle gesetzt. In der Behandlung als
UBYTE ergibt dies 255.
Vom STRING 's' wird ebenfalls die Adresse übermittelt; wie bei STRING (Datentyp)
nachzulesen ist, steht an der Stelle, auf die verwiesen wird nur der Bezeichner
des Strings, nicht aber sein Inhalt. Das Ergebnis 160 ist also ein Teil der
Adresse des Stringinhalts. Daher kann das Ergebnis auch von Rechner zu Rechner
verschieden sein.
Da 'z' ein ZSTRING ist, hat diese Variable im Gegensatz zu 's' auch keinen
Bezeichner. An der Adresse von 'z', die an die Prozedur übergeben wird, ist
tatsächlich der Inhalt von 'z'. 104 ist der ASCII-Code von "h", dem ersten
Zeichen des Strings.

Die Verwendung von ANY ohne PTR ist nur in solchen DECLARE-Zeilen an BYREF-
Argumenten erlaubt, um dort die Typenprüfung bei der Parameterübergabe zu deaktivieren.

Zusammen mit PTR wird ANY oft verwendet, um einen Pointer auf einen
Speicherbereich zu setzen, dessen Inhalt kein spezielles Format hat; Siehe dazu
auch IMAGECREATE und ALLOCATE.

Der Typ ANY darf nicht mit VARIANT verwechselt werden, einem VB-Typ, der dazu in
der Lage ist, Informationen aller Datentypen zu speichern.

Siehe auch:
DECLARE, SUB, FUNCTION,
ALLOCATE, PTR, IMAGECREATE,
Datentypen
Prozeduren
INSTR, TRIM, LTRIM, RTRIM, DIM,


APPEND

Typ: Schlüsselwort
Kategorie: Datei

Das Schlüsselwort APPEND wird mit der OPEN-Anweisung
verwendet und öffnet die Datei im APPEND Modus. Das heißt, die Datei wird mit
sequentiellem Zugriff geöffnet und der Lese/Schreibzugriff erfolgt am Ende der Datei.

Siehe auch (externer Link):
http://www.petesqbsite.com/sections/express/issue4/index.html#filemanip

Siehe auch:
OPEN, RANDOM,


AS

Typ: Klausel

AS ist ein Sprachkonstrukt, mit vielen verschiedenen Bedeutungen, die je nach Kontext variieren:

  • DECLARE, SUB, FUNCTION
    Gibt hier den Variablentyp in der Parameterliste an.

  • DIM, REDIM, COMMON, STATIC (Anweisung), CONST
    Gibt hier den Datentyp der Variable an.

  • TYPE, UNION
    Gibt hier den Variablentyp innerhalb UDTs (user defined Type; siehe TYPE) an.

  • OPEN
    Gibt hier die Nummer des Dateipuffers an beim öffnen einer Datei an.

  • SELECT CASE
    Wird als 'AS CONST'-Klausel verwendet, um die Integer-Optimierung zu aktivieren

    • Unterschiede
    (Zu QB):
  • AS wird NICHT mehr mit dem Befehl NAME benutzt.

  • FIELD hat in freeBASIC eine andere Bedeutung; AS wurde dort früher für die
    Feldnamen bei RANDOM-Dateien verwendet. Verwenden Sie anstelle von RANDOM-Dateien
    lieber BINARY-Files.
  • Die Verwendung von AS mit SELECT CASE existierte unter QB nicht.

    • (zu früheren Versionen von freeBASIC)
  • Die Verwendung von AS mit SELECT CASE existiert erst seit freeBASIC v0.13.


ASC

Syntax A: ASC(Quelle AS STRING [,Stelle AS INTEGR]) AS INTEGER
Syntax B: ASC(Quelle AS ZSTRING PTR [,Stelle AS INTEGR]) AS INTEGER
Syntax C: ASC(Quelle AS WSTRING PTR [,Stelle AS INTEGR]) AS INTEGER
Typ: Funktion
Kategorie: Zählsysteme

Liefert den ASCII-Code des Zeichens in einem STRING zurück.

  • 'Quelle' ist ein String beliebiger Länge, der analysiert werden soll.

  • 'Stelle' ist ein nummerischer Ausdruck, der angibt, an welcher Stelle des
    Strings das zu analysierende Byte steht.
    Wenn 'Stelle' ausgelassen wird, nimmt freeBASIC automatisch 1 an.

    • ASC ist die Gegenfunktion zu CHR.

    ASC kann durch die Folgende Syntax ersetzt werden:
    AsciiCode = Quelle[Stelle - 1]

    Beispiel:

    PRINT "Der ASCII-Code von 'a' ist:"; ASC("a")
    PRINT "ABC in ASCII: "; ASC("ABC", 1); ASC("ABC", 2); ASC("ABC", 3)

    Siehe auch:
    CHR

    Unterschiede (zu QB)
  • Da unter QB Z- und WSTRINGs noch nicht existierten, konnte ASC auf solche
    natürlich nicht angewandt werden.

  • Der Parameter 'Stelle' ist neu; unter QB lieferte ASC immer den ASCII-Code
    des ersten Zeichens eines Strings zurück.


ASIN

Syntax: ASIN( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Inverssinus einer Zahl zurück.
(ASIN bildet also die Gegenfunktion zu SIN,)

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.
    Der Wert des Ausdrucks muss zwischen -1 und 1 liegen. Ist die Zahl größer als
    1, oder kleiner als -1, gibt ASIN '1.#QNAN' zurück, ein Fehlercode.

  • Der Rückgabewert ist ein DOUBLE-Wert, der eine Gradangabe im Bogenmaß
    darstellt. Er liegt im Bereich zwischen -pi und +pi

    • Beispiel:
    DIM h AS DOUBLE
    DIM o AS DOUBLE

    INPUT "Bitte geben Sie die Länge der Hypotenuse eines Dreiecks ein: ", h
    INPUT "Bitte geben Sie die Länge der Gegenseite eines Dreiecks ein: ", o
    PRINT
    PRINT "Der Winkel zwischen den Seiten ist"; ASIN ( o / h )
    GETKEY
    Ausgabe:
    Bitte geben Sie die Länge der Hypotenuse eines Dreiecks ein: ", 5
    Bitte geben Sie die Länge der Gegenseite eines Dreiecks ein: ", 3

    Der Winkel zwischen den Seiten ist 0.6435011087932844

    Siehe auch:
    SIN,
    ACOS, ACOS,
    TAN, ATN, ATAN2
    mathematische Operatoren


ASM

Typ: Befehl
Kategorie: Fremdsprachen

Bindet Maschinensprache-Code ins Programm ein.
Unterstützt wird der gesamte IA32-Befehlssatz.

Syntax A:
ASM ASSEMBLER-Code

Syntax B:
ASM
   'ASSEMBLER-Code
END ASM

Der Assembler-Code unterliegt der INTEL-Syntax.

Wenn Sie ASM-Code innerhalb einer FUNCTION einsetzen, können
Sie das Symbol 'FUNCTION' als Pointer einsetzen, der auf das Ergebnis der Function
zeigt.

Beispiel: Multiplikation zweier Integer mit Assembler
DECLARE FUNCTION mulintegers( BYVAL x AS INTEGER, BYVAL y AS INTEGER ) AS INTEGER

RANDOMIZE TIMER
a = RND * 100
b = RND * 100

PRINT a; " * "; b; " = "; mulintegers( a, b )

SLEEP

'------------------------------------------------------------------------------'

FUNCTION mulintegers( BYVAL x AS INTEGER, BYVAL y AS INTEGER ) AS INTEGER

ASM
mov eax, [x]
imul eax, [y]
mov [FUNCTION], eax
END ASM

END FUNCTION

Siehe auch:
Inline assembly


ASSERT

Syntax: ASSERT(Ausdruck)
Kategorie: Programmorganisation
Typ: Makro-Anweisung

Das ASSERT-Macro wurde zum debugging entwickelt, und funktioniert nur, wenn der
Compiler mit der Option "-g" aufgerufen wird.
Ist dies der Fall, wird das Programm beendet, sobald 'Ausdruck' gleich null ist.
Zusätzlich wird eine Zeile ausgegeben:
DATEINAME(ZEILENNNUMMER): assertion failed at PROZEDUR:AUSDRUCK
  • 'DATEINAME' ist dabei der Dateiname des gerade aktiven Codes inclusive Pfad.

  • 'ZEILENNUMMER' ist die Zeile, in der abgebrochen wurde.

  • 'PROZEDUR' ist die Prozedur, in der abgebrochen wurde. Wird das Programm auf
    Modulebene abgebrochen, wird (main) ausgegeben.

  • 'AUSDRUCK' ist der Ausdruck, der null geworden ist.

    • Wenn die Option "-g" nicht an fbc übergeben wird, erzeugt dieses Makro keinen
    Code; das Programm wird nicht beendet, wenn der Ausdruck gleich null wird.

    Beispiel:
    DECLARE SUB foo

    SUB foo
    a = 10

    FOR i = 1 TO 20
    a -= 1
    ASSERT (a <> 0)
    PRINT a
    NEXT
    END SUB

    SUB Quit DESTRUCTOR
    SLEEP
    END SUB
    Wenn -g an den Compiler übergeben wird, wird das Programm mit dieser Meldung
    beendet:
    test.bas(3): assertion failed at FOO: a <> 1
    Die DESTRUCTOR-Sub bewirkt, dass auf einen Tastendruck gewartet wird; so kann
    die Meldung gelesen werden, und verschwindet nicht sofort.

    Unterschiede (zu QB):
    Neu in freeBASIC.

    Siehe auch:
    ASSERTWARN, IF...THEN


ASSERTWARN

Syntax: ASSERTWARN(Ausdruck)
Kategorie: Programmorganisation
Typ: Makro-Anweisung

ASSERTWARN funktioniert genauso wie ASSERT, nur
dass das Programm nicht beendet wird, sobald der Ausdruck gleich null wird. Es
wird lediglich die Meldung ausgegeben.

Auch ASSERTWARN wird nur ausgeführt, wenn der Compiler mit der Option "-g"
ausgeführt wird.

Siehe auch:
ASSERT


ATAN2

Syntax: ATAN2(Zahl1 , Zahl2 )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Arcustangens (Anti-Tangens oder Inverstangens) des Quotienten zweier
Zahlen zurück.
Der Arcustangens ist der Winkel, dessen Tangens die angegebene Zahl ergeben
würde.

  • 'Zahl1' und 'Zahl2' sind beliebige nummerische Ausdrücke. Variablen, Konstanten,
    Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp
    außer STRING, ZSTRING oder WSTRING sein.
    Diese beiden Parameter stellen die Steigung einer Geraden dar. Dabei gilt
    m = Zahl1 / Zahl2
    'Zahl1' stellt also die vertikale Komponente, 'Zahl2' die horizontale
    Komponente der Steigung dar.

  • Der Rückgabewert ist ein DOUBLE-Wert, der den Cosinus-Wert zum Winkel enthält.
    Er liegt im Bereich zwischen -pi und +pi

    • ATAN2 liefert den Arcus-Tangens des Quotienten zweier arithmetischer Ausdrücke,
    ohne dabei den Quotienten explizit zu berechnen, so dass keine Division durch Null
    auftreten kann. Im Gegensatz zur ATN-Funktion kann bei der ATAN2-Funktion das Ergebnis
    zwischen minus Pi und plus Pi liegen, also in allen 4 Quadranten des Koordinatensystems.
    Dies ist möglich, weil es eine Unterscheidungsmöglichkeit gibt zwischen x > 0
    und y < 0 sowie x < 0 und y > 0, usw... Durch die Division zweier Zahlen
    geht die Information welcher der beiden Parameter < 0 ist verloren.
    ATN(x) ist eigentlich ATAN2(x,1) und nicht ATAN2(-x,-1).

    Beispiel:
    PRINT ATAN2(7, 24) ' ergibt das gleiche wie
    PRINT ATN (7 / 24) ' oder
    PRINT ATAN2(7 / 24.1)
    PRINT ATAN2(24, 0) ' ergibt einen Wert während ATN(24 / 0) nicht funktioniert

    Unterschiede
    zu QB und VB:
  • neu in freeBASIC

    • Siehe auch:
    SIN, ASIN,
    COS, ACOS,
    TAN, ATN
    mathematische Operatoren


ATN

Syntax: ATN( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Arcustangens (Anti-Tangens oder Inverstangens) einer Zahl zurück.
Der Arcustangens ist der Winkel, dessen Tangens die angegebene Zahl ergeben
würde.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist ein DOUBLE-Wert, der den Cosinus-Wert zum Winkel enthält.
    Er liegt im Bereich zwischen -pi und +pi

    • Die Gegenfunktion zu ATN lautet TAN.
    In vielen Fällen ist es praktisch, eine besondere Version des Arcustangens zu
    benutzen: Siehe ATAN2.

    Beispiel:
    PRINT "Pi ="; Atn ( 1.0 ) * 4
    PRINT ATN ( 4 / 5 )
    GETKEY
    Ausgabe:
    Pi = 3.141592653589793
    0.6747409422235527

    Siehe auch:
    SIN, ASIN,
    COS, ACOS,
    TAN, ATAN2
    mathematische Operatoren


Liste der Schlüsselwörter beginnend mit B

BASE
BEEP
BIN
BIT
BITSET
BITRESET
BINARY
BLOAD
BSAVE
BYREF
BYTE
BYVAL
BYVAL (Klausel)
BYVAL (Standard)


BASE

Syntax: OPTION BASE Startindex
Typ: Schlüsselwort
Kategorie: Programmorganisation

Setzt den standardmäßigen kleinsten Index für Arrays.

OPTION BASE kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist OPTION BASE nicht mehr zulässig! Geben Sie in diesem Fall bei der Dimensionierung eines Array immer explizit die untere
Arraygrenze an.

  • 'Startindex' ist ein INTEGER-Wert, der bei der Dimensionierung von Arrays
    verwendet wird, wenn eine Untergrenze nicht explizit angegeben wurde.

  • 'Startindex' muss eine Zahl sein, es darf kein Ausdruck sein. Auch einfache
    Ausdrücke, die nur aus Zahlen und mathematischen Operatoren bestehen sind
    unzulässig.

  • Aus diesem Grund können keine negativen Startindizes angegeben werden, da
    hierfür der Operator '-' zur Negation benötigt würde.
  • OPTION BASE ist ein Programmstandard, der mehrmals neu definiert werden darf.

    • Beispiel:
    DIM AS INTEGER a(5)

    OPTION BASE 4
    DIM AS INTEGER b(5)

    OPTION BASE 2
    DIM AS INTEGER c(5)

    DIM AS INTEGER d(0 TO 5)

    ? LBOUND(a)
    ? LBOUND(b)
    ? LBOUND(c)
    ? LBOUND(d)

    GETKEY
    Ausgabe:
    0
    4
    2
    0

    Siehe auch:
    DIM, OPTION

    Unterschiede
    zu QB:
  • 'Startindex' darf auch andere Werte als 0 und 1 annehmen.

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption
    -lang deprecated
    kompiliert wurde.


BEEP

Syntax: BEEP
Typ: Anweisung
Kategorie: Verschiedenes

BEEP weist das System an, ein Tonsignal auszugeben (unter Windows ist das das
Standard-Signal, dass auch beim Auftauchen eines Dialogfeldes ertönt.) Wenn
keine Soundkarte vorhanden ist, wird (sofern vorhanden) ein Signal über den
PC-Speaker ausgegeben.


BIN

Syntax: BIN[$] (Ausdruck [, Stellen])
Typ: Funktion
Kategorie: Zählsysteme

BIN gibt den binären Wert eines beliebigen Ausdrucks als STRING zurück.
Binärzahlen haben die Basis 2; sie bestehen aus den Zeichen 1 und 0.

  • 'Ausdruck' ist eine Ganzzahl (eine Zahl ohne Kommastellen), die ins
    Binärformat übersetzt werden soll

  • 'Stellen' ist die Anzahl der Stellen, die dafür aufgewandt werden soll. Ist
    'Stellen' größer als die benötigte Stellenzahl, wird der Rückgabewert mit
    führenden Nullen aufgefüllt.
    Ist 'Stellen' kleiner als die benötigte Stellenzahl, werden nur die hinteren
    Zeichen des Rückgabewerts ausgegeben.
    Wird 'Stellen' ausgelassen, besteht der Rückgabewert aus so vielen Zeichen,
    wie benötigt werden, um die Zahl korrekt darzustellen.

  • Der Rückgabwert ist ein String, der den Wert von 'Ausdruck' im Binärformat
    enthält.

    • Das Dollarzeichen ($) als Suffix ist optional.

    Beispiel:
    PRINT BIN(54321)
    PRINT BIN(3, 3)
    PRINT BIN(255, 4)
    Ausgabe:
    1101010000110001
    011
    1111

    Um eine Binärzahl in ihre dezimale Form zurückzuverwandeln, wird VAL verwendet:
    DIM binaer AS STRING

    binaer = "1001"
    'Kennung &b zeigt an, dass der folgende String eine Binärzahl ist.
    binaer = "&b" + binaer

    PRINT VAL(binaer)
    'Gibt 9 aus.

    Siehe auch:
    HEX, OCT, VAL,
    WBIN,
    BIT, BITSET, BITRESET

    Unterschiede: Neu in freeBASIC


BINARY

Typ: Schlüsselwort
Kategorie: Datei

Das BINARY Schlüsselwort wird mit der OPEN-Anweisung
verwendet, um eine Datei im BINARY Modus zu öffnen. Sowohl der Lese- als auch der
Schreibzugriff kann in einer BINARY-Datei an jeder beliebigen Position (an jedem
beliebigem Byte) erfolgen. Dazu werden GET # zum Lesen von Daten und PUT #
zum Schreiben von Daten verwendet.
Durch diese einfache Verwaltung ist der BINARY-Modus der Flexibelste.

Siehe auch:
OPEN,
PUT #, GET #,
RANDOM, APPEND,
OUTPUT, INPUT (Dateimodus)


BIT

Syntax: BIT(Ausdruck, BitNr)
Typ: Funktion
Kategorie: Bitmanipulation

BIT wird benutzt, um zu prüfen, ob das Bit an der Stelle 'BitNr' gesetzt
ist. Wenn ja, gibt BIT true (-1) aus, ansonsten false (0).

BIT erfüllt die selbe Funktion wie
(Ausdruck AND BitNr SHL BitNr) > 0

Beispiel:
foo = 1024
PRINT BIT( foo, 10 )
PRINT (foo AND 10 SHL 10) > 0
Ausgabe:
-1
-1

Siehe auch:
BITSET, BITRESET, BIN

Unterschiede: Neu in freeBASIC


BITRESET

Syntax: BITRESET(Ausdruck, BitNr)
Typ: Funktion
Kategorie: Bitmanipulation

BITRESET gibt den Wert von 'Ausdruck' zurück, bei dem das Bit an der Stelle
'BitNr' gelöscht wurde.

BITRESET erfüllt die selbe Funktion wie
Ausdruck AND NOT (1 SHL BitNr)

Beispiel:
foo = 192
PRINT BITRESET( foo, 6 )
PRINT foo AND NOT (1 SHL 6)
Ausgabe:
128
128

Siehe auch:
BIT, BITSET, BIN

Unterschiede: Neu in freeBASIC


BITSET

Syntax: BITSET(Ausdruck, BitNr)
Typ: Funktion
Kategorie: Bitmanipulation

BITSET gibt den Wert von 'Ausdruck' zurück, bei dem das Bit an der Stelle 'BitNr'
gesetzt wurde.

BITSET erfüllt die selbe Funktion wie
Ausdruck OR (1 SHL BitNr)

Beispiel:
foo = 128
PRINT BITSET( foo, 6 )
PRINT foo OR (1 SHL 6)
Ausgabe:
192
192

Siehe auch:
BIT, BITRESET, BIN

Unterschiede: Neu in freeBASIC


BLOAD

Syntax: BLOAD(Dateiname[, Adresse])
Typ: Funktion
Kategorie: Datei

Lädt einen Block binärer Daten aus einer Datei.

  • 'Dateiname' ist der Name der Datei, aus der geladen werden soll.

  • 'Adresse' ist die Adresse, auf die die Daten geladen werden sollen.
    Wenn Adresse ausgelassen wird, oder 0 (null) angegeben wird, schreibt BLOAD die
    Daten auf die aktuelle Bildschirmseite.

  • Der Rückgabewert ist eine der freeBASIC Fehlernummern
    Wie bei allen Funktionen kann der Rückgabewert verworfen werden; BLOAD wird
    dann wie eine Anweisung eingesetzt.

    • BLOAD kann dazu verwendet werden, einen Block binärer Daten zu laden. Ebenso
    ist es möglich, einen gespeicherten Bildschirmausschnitt direkt auf den
    Bildschirm zu laden: Wenn Sie keine Adresse angeben, oder als Adresse 0 angeben,
    werden die Daten als Pixel behandelt und auf die aktuelle Bildschirmseite
    geladen.

    Beispiel 1:
    BLOAD "image.bsv", 0

    Die selbe Funktion erfüllt:
    SCREENLOCK
    BLOAD "image.bsv", SCREENPTR
    SCREENUNLOCK

  • Seit Version 0.12b ist es auch möglich, mit BLOAD Bitmaps zu laden. Dies geschieht
    einfach dadurch, dass der Dateiname die Endung ".bmp" erhält.

  • Seit Version 0.14b werden Bitmaps aller Farbtiefen unterstützt; davor war
    es nur möglich, 256-Farben-BMPs zu laden.

    • Achten Sie darauf, dass die Daten im selben Format gespeichert werden, das auch
    der aktuelle Bildschirmmodus verwendet; siehe dazu
    Interne Pixelformate für Details.

    BLOAD wird einen Laufzeitfehler verursachen, wenn die Datei nicht gefunden
    werden kann, oder wenn das Format nicht unterstützt wird (dies ist der Fall,
    wenn versucht wird, eine nicht BMP, eine RLE-komprimierte BMP oder eine nicht-BSAVE-Datei
    zu laden.) Ebenso wird ein Fehler verursacht, wenn versucht wird, eine Truecolor-BMP
    in einem Palette-indiziertem Bildschirmmodus zu laden.

    Beispiel 2: Ein 48x48Pixel-Bild in einen Puffer laden, und auf dem Bildschirm ausgeben
    SCREEN 18, 32
    DIM garray(4 * (48 * 48) + 4) AS BYTE
    BLOAD "picture.bmp", @garray(0)
    PUT (10, 10), garray(0)

    Unterschiede
    Zu QB:
  • BLOAD unterstützt auch das Laden von Datenblöcken größer als 64KB sowie von Bitmaps.

  • BLOAD kann auch als Funktion eingesetzt werden

    • zu früheren Versionen:
  • Die Möglichkeit, 8bit-BMPs zu laden, existiert erst seit freeBASIC v0.12

  • Die Möglichkeit, BMPs höherer Farbtiefen als 8bit zu laden, existiert erst
    seit v0.14

    • Siehe auch:
    BSAVE, PUT (Grafik)


BSAVE

Syntax: BSAVE(Dateiname, [Adresse], [Größe])
Typ: Funktion
Kategorie: Datei

BSAVE speichert einen Block binärer Daten in eine Datei.

  • 'Dateiname ist der Name der Datei, in die die Daten geschrieben werden.

  • 'Adresse' ist die Adresse, von der die zu schreibenden Daten stammen. Wenn 0 (null) angegeben wird, kopiert BSAVE die Daten von der
    aktuellen Bildschirmseite. Üblicherweise ist dieser Parameter ein Pointer auf einen mit IMAGECREATE oder
    ALLOCATE erstellten Speicherbereich, oder ein Pointer auf ein Array.

  • 'Größe ist die Größe des Datenblocks in Bytes, der gespeichert werden soll.
    Wird dieser Parameter ausgelassen, speichert BSAVE das gesamte Array. Ist Adresse ein Pointer, so muss Größe angegeben werden, da sonst
    gar nichts gesepeichert wird.

  • Der Rückgabewert ist eine der freeBASIC Fehlernummern.
    Wie bei allen Funktionen kann der Rückgabewert verworfen werden; BLOAD wird dann wie eine Anweisung eingesetzt.

    • BSAVE speichert einen Block binärer Daten in eine Datei. Ebenfalls kann es benutzt werden, um Daten von der aktuellen Bildschirmseite in
    eine Datei zu speichern, wenn 0 als Adresse angegeben wird.

    Beispiel 1:
    BSAVE "image.bsv", 0, 64000

    Die selbe Funktion erfüllt:
    SCREENLOCK
    BSAVE "image.bsv", SCREENPTR, 64000
    SCREENUNLOCK

    Wenn Sie Daten vom Bildschirm speichern, werden diese im selben Format gespeichert, das auch der aktuelle Bildschirmmodus verwendet; siehe
    Interne Pixelformate für Details.
    Beachten Sie besonders, dass ein Pixel möglicherweise mehr als ein Byte benötigt. Dementsprechend müssen Sie den Parameter 'Größe' anpassen.

    Seit Version 0.14b gibt es die Möglichkeit, ein Bild auch als Bitmap zu speichern. Dazu geben Sie einfach nur einen Dateinamen an, der auf
    ".bmp" endet.

    BSAVE wird oft dazu verwendet, um Bildschirmausschnitte zu speichern, die zuvor mit GET (Grafik) eingelesen wurden. Diese
    können dann später mit PUT (Grafik) wieder ausgegeben werden.

    Seit Version 0.14b können mit BSAVE Pixeldaten auch im BMP-Format gespeichert werden; geben Sie dazu einfach einen Dateinamen mit Erweiterung
    '.bmp' an. In diesem Fall kann der Parameter 'Größe' ausgelassen werden, da die Größe direkt aus dem Bildpuffer entnommen wird.

    Beispiel 2:
    SCREENRES 320, 200, 32 ' Grafikmodus initialisieren

    ' Schwarzer Text auf weißem Grund
    COLOR RGB(0, 0, 0), RGB(255, 255, 255)
    CLS

    LOCATE 13, 15: PRINT "Hello world!"

    ' Gesamten Bildschirm als Bitmap speichern
    BSAVE "hello.bmp", 0

    Unterschiede
    Zu QB:
  • Daten, die mit der freeBASIC-Version von BSAVE gespeichert wurden, sind NICHT kompatibel zu den Daten, die mit QBs BSAVE gespeichert
    wurden.

  • Die binären Daten können auch im Bitmap-Format gespeichert werden.

  • BSAVE kann als Funktion eingesetzt werden

    • zu früheren Versionen:
  • Die Möglichkeit, im BMP-Format zu speichern existiert erst seit v0.14

    • Siehe auch:
    BLOAD, GET (Grafik),
    VARPTR


BYREF

Typ: Klausel
Kategorie: Programmorganisation

Übergibt die Adresse des nachfolgenden Parameters an eine Prozedur.
ByRef steht für 'By Reference'. Variablen die auf diese Weise übergeben wurden, sind dadurch direkt referenziert. Das bedeutet es wird
nicht ein Wert übergeben, sondern lediglich ein Zeiger auf die Position der Variablen im Speicher. Das hat zur Folge dass im Gegensatz
zu ByVal alle Änderungen dieser Variablen in der bearbeitenden Funktion oder Sub direkt auf die ursprüngliche Variable einwirken, da ja
von hier aus direkt darauf verwiesen wird.

Bis freeBASIC v0.16 wurden Variablen BYREF übergeben, wenn keine Klausel explizit verwendet wurde, und OPTION BYVAL
nicht aktiv war. In Versionen von freeBASIC ab v0.17 ist dies nur noch dann der Fall, wenn mit der Kommandozeilenoption
-lang deprecated
kompiliert wird. Bei Einsatz der Kommandozeilenoption
-lang fb
wird standardmäßig BYVAL übergeben.

Beispiel:
DECLARE SUB MySub (BYREF a, BYREF b)

DIM AS INTEGER a, b

a = 10
b = 10
PRINT "a = "; a
PRINT "b = "; b
PRINT

MySub

PRINT "Wieder auf Modulebene:"
PRINT "a = "; a
PRINT "b = "; b

SUB MySub (BYREF a, BYREF b)
a += 10
b += 10

PRINT "in MySub:"
PRINT "a = "; a
PRINT "b = "; b
PRINT
END SUB
Ausgabe:
a = 10
b = 10

in MySub:
a = 20
b = 20

Wieder auf Modulebene:
a = 20
b = 10

Siehe auch:
BYVAL, DECLARE, OPTION,
Parameterübergabe

Unterschiede:
zu QB
  • neu in freeBASIC

  • bis freeBASIC v0.16: keine Unterschiede bei der standard-Übergabemethode für Parameterlisten.

  • ab freeBASIC v0.17: Wenn das Programm mit der Kommandozeilenoption
    -lang deprecated
    übersetzt wird, so treten keine Unterschiede auf. Ansonsten werden Variablen standardmäßig BYVAL übergeben.

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.17 werden Variablen nur noch dann standardmäßig BYREF übergeben, wenn mit der Kommandozeilenoption
    -lang deprecated
    kompiliert wurde. Ansonsten muss explizit die BYREF-Klausel verwendet werden.


BYTE

Typ: Datentyp

Daten vom Typ BYTE sind vorzeichenbehaftete 8-bit-Ganzzahlen.
Der Wertebereich für Variablen vom Typ BYTE erstreckt sich von -128 bis 127.

Siehe auch:
DIM,
UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede: Neu in freeBASIC.


BYVAL (Klausel)

Syntax A: DECLARE { SUB | FUNCTION } Name (BYVAL parameter AS TYP, ...)
Syntax B: { SUB | FUNCTION } Name (BYVAL parameter AS TYP, ...)
Typ: Klausel
Kategorie: Programmorganisation

Legt in einer Parameterliste fest, dass ein Parameter BYVAL übergeben werden soll.

Beide Syntaxes symbolisieren die Parameterliste einer Prozedur; siehe dazu DECLARE, SUB, FUNCTION, Prozeduren, Parameterübergabe.

ByVal steht für 'By Value', was soviel bedeutet wie 'als Wert'. Dies erklärt auch gleich seine Funktion: Eine als mit ByVal übergebene
Variable wird als Wert übergeben, d.h. es wird eine Kopie erstellt und nur dieser an den Prozedurkopf einer Funktion oder Sub weitergegeben.
Wird in Folge, in der Funktion, der Wert geändert, hat das keine rückwirkenden Auswirkungen auf die ursprünglich übergebene Variable.
Der Zusammenhang wir vielleicht durch die Erläuterungen zum Schlüsselwort ByRef deutlicher.

Bitte beachten Sie:
Bis freeBASIC v0.16 wurden Variablen, wenn nichts anderes angegeben wurde, BYREF übergeben. In entsprechend höheren Versionen ist dies
nur dann noch der Fall, wenn mit der Kommandozeilenoption
-lang deprecated
kompiliert wird; ansonsten werden bei Versionen von freeBASIC ab v0.17 Variablen standardmäßig BYVAL übergeben.

Beispiel:
DECLARE SUB MySub (BYVAL a AS INTEGER, BYREF b AS INTEGER)

DIM AS INTEGER a = 1, b = 1

PRINT "Vor Subaufruf:"
PRINT "a = "; a
PRINT "b = "; b
PRINT

MySub a, b

PRINT "Nach Subaufruf:"
PRINT "a = "; a
PRINT "b = "; b

SUB MySub (BYVAL a AS INTEGER, BYREF b AS INTEGER)
a += 1
b += 1

PRINT "In der Sub:"
PRINT "a = "; a
PRINT "b = "; b
END SUB
Ausgabe:
Vor Subaufruf:
a = 1
b = 1

In der Sub:
a = 2
b = 2

Nach Subaufruf:
a = 1
b = 2

Unterschiede:
zu QB und VB:
  • Variablen werden standardmäßig BYVAL übergeben, nicht mehr BYREF, wie dies in QB und VB der Fall war.

    • zu älteren freeBASIC-Versionen
  • Seit freeBASIC v0.17 muss mit der Kommandozeilenoption
    -lang deprecated
    kompiliert werden, damit Variablen standardmäßig BYREF übergeben werden, wie das in den vorherigen Versionen der Fall war. Ansonsten
    ist der Standard BYVAL.

    • Siehe auch:
    BYREF


BYVAL (Standard)

Syntax: OPTION BYVAL
Typ: Klausel
Kategorie: Programmorganisation

Mit dieser Zeile wird festgelegt, dass die Parameter, die an SUBs und FUNCTIONs übergeben werden, standardmäßig BYVAL behandelt werden
sollen. Ist diese Option aktiviert, muss explizit die BYREF-Klausel angewandt werden, um Variablen per Referenz zu übergeben.
Wird OPTION BYVAL nicht bestimmt, geht freeBASIC davon aus, dass alle Parameter standardmäßig BYREF übergeben
werden sollen.

OPTION BYVAL kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist OPTION BYREF nicht mehr zulässig! In diesem Fall werden Variablen standardmäßig BYVAL übergeben; benutzen Sie
explizit die BYREF-Klausel, um dem entgegen zu wirken.

Unterschiede
zu QB:
  • neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption
    -lang deprecated
    kompiliert wurde.

    • Siehe auch:
    BYREF, OPTION,
    DECLARE, SUB, FUNCTION,
    Prozeduren


BYVAL

Typ: Klausel

BYVAL wird als Klausel in zwei Sprachkonstrukten verwendet: Bei der Deklaration von Prozeduren und bei der Festlegung von Programmstandards
mit OPTION.
BYVAL bei Deklarationen
BYVAL als Programmstandard mit OPTION


Liste der Schlüsselwörter beginnend mit C

CALL
CALLOCATE
CASE
CAST
CBYTE
CDBL
CDECL
CHAIN
CHDIR
CHR
CINT
CIRCLE
CLEAR
CLNG
CLNGINT
CLOSE
CLS
COLOR
COLOR (Anweisung)
COLOR (Funktion)
COM
COMMAND
COMMON
CONDBROADCAST
CONDCREATE
CONDDESTROY
CONDSIGNAL
CONDWAIT
CONS
CONST
CONSTRUCTOR
CONSTRUCTOR (Klassen)
CONSTRUCTOR (Module)
CONTINUE
COS
CPTR
CSHORT
CSIGN
CSNG
CSRLIN
CUBYTE
CUINT
CUNSG
CULNGINT
CURDIR
CUSHORT
CUSTOM
CVD
CVI
CVL
CVLONGINT
CVS
CVSHORT


CALL

Syntax (alt): CALL Subname ([Parameterliste])
Syntax (neu): Subname [Parameterliste]
Typ: Anweisung
Kategorie: Programmorganisation

Ruft eine Sub auf wie in diesem Codeausschnitt:
CALL foobar (35, 42)
Diese Form ist die Syntax der ältesten BASIC-Dialekte.
Es ist besser, diese Form zu benutzen:
foobar 35, 42
Dadurch spart man sich das Tippen von sieben Zeichen.

Allerdings wird CALL gerne verwendet, um anzuzeigen, dass der Rückgabewert einer
FUNCTION absichtlich ignoriert wurde.
Beispiel:
DECLARE FUNCTION PrintAndReturnLine (Text AS STRING) AS INTEGER

PRINT "Normales PRINT"
l = PrintAndReturnLine("Ein Teststring mit " + CHR(13) + CHR(10) + "Zeilenumbruch")
CALL PrintAndReturnLine "Zeile: " & l
PrintAndReturnLine "So geht das auch."

FUNCTION PrintAndReturnLine (Text AS STRING) AS INTEGER
PRINT Text
FUNCTION = CRSLIN
END FUNCTION

Unterschiede:
Zu QB:
SUBs und FUNCTIONs müssen bereits deklariert sein.

Siehe auch:
DECLARE, SUB, FUNCTION


CALLOCATE

Syntax: Pointer = CALLOCATE(Anzahl [, Größe])
Typ: Funktion
Kategorie: Speicherverwaltung

Reserviert einen Bereich im Speicher, setzt alle seine Bytes auf null, und gibt
einen Pointer auf den Anfang des reservierten Bereichs zurück.

  • 'Anhahl' ist die Anzahl der zu reservierenden Speicherstellen

  • 'Größe' ist die Größe in Bytes einer Speicherstelle.
    Wird 'Größe' ausgelassen, nimmt freeBASIC automatisch 1 an. CALLOCATE kann
    dann wie ALLOCATE verwendet werden, mit dem Unterschied, dass alle
    reservierten Bytes auf null gesetzt sind.

    • CALLOCATE ist kein Teil der freeBASIC Runtime Library, sondern ein Alias von
    'calloc' der C-Lib. Es kann nicht garantiert werden, dass diese Funktion Multithreading
    auf allen Plattformen unterstützt.

    Beispiel:
    ' einen INTEGER Pointer erstellen
    DIM p AS INTEGER PTR

    ' Speicherplatz für 10 INTEGER-Stellen reservieren
    p = CALLOCATE(10, LEN(INTEGER))

    ' Den Speicherbereich mit zehn Zahlen belegen
    FOR fill_p = 0 TO 9
    p[fill_p] = fill_p
    NEXT

    ' Die Zahlen ausgeben
    FOR show_p = 0 TO 9
    PRINT p[show_p]
    NEXT

    ' Auf Tastendruck warten
    GETKEY

    ' Programm beenden
    END

    Siehe auch:
    ALLOCATE, REALLOCATE, DEALLOCATE,
    Pointer

    Unterschiede: Neu in freeBASIC.


CALLS

Syntax: CALLS Subname ([Parameterliste])
Typ: Anweisung
Kategorie: Programmorganisation

Erfüllt die selbe Funktion wie CALL. In früheren
BASIC-Dialekten wurde er benutzt, um Programme aufzurufen, die nicht in BASIC.
Dieser redundante Befehl wurde aus Kompatibilitätsgründen beibehalten.

Unterschiede (Zu QB):
Die aufgerufene SUB/FUNCTION muss bereits deklariert sein.


CASE

Typ: Schlüsselwort
Kategorie: Bedingungen

Siehe SELECT CASE.


CAST

Syntax: CAST(Datentyp, Ausdruck)
Kategorie: Datentypen
Typ: Funktion

Konvertiert einen Ausdruck in einen Beliebigen anderen Typ. Er löst damit alle
C###-Befehle (CINT, CDBL, ...) ab.

  • 'Datentyp' ist ein Beliebiger Datentyp, inclusive POINTERn. Auch ZSTRING-
    und WSTRING-Poiner sind erlaubt.
    STRINGs variabler oder fester Länge, ZSTRINGs fester Länge oder WSTRINGs fester
    Länge als Datentyp jedoch führen zu ungültigen Ergebnissen.

  • 'Ausdruck' ist ein beliebiger Ausdruck. Jeder Datentyp, also auch STRINGs,
    ZSTRINGs oder WSTRINGs führen zu gültigen Ergebnissen, jedoch ist der
    Rückgabetyp bei diesen Typen immer null.

    • Beispiel:
    DIM i AS INTEGER, ip AS INTEGER PTR
    DIM b AS BYTE, bp AS BYTE PTR

    i = &H0080
    b = CAST(BYTE, i)

    ip = @i
    bp = CAST(BYTE PTR, ip)

    PRINT i, b
    PRINT *ip, *bp
    Ausgabe:
    128    -128
     128    -128

    Unterschiede (zu QB):
    Neu in freeBASIC

    Siehe auch:
    CPTR,
    CSIGN, CUNSG


CBYTE

Syntax: CBYTE(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck in ein BYTE.

Beispiel:
PRINT CBYTE(260)
(Gibt 4 aus.)

Siehe auch:
CAST,
CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG

Unterschiede: Neu in freeBASIC.


CDBL

Syntax: CDBL(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck in zu einer DOUBLE-Zahl.

(CDBL kann so erklärt werden: C-DBL, C(convert) DBL (DOUBLE).)

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG,
CSIGN, CUNSG


CDECL

Typ: Schlüsselwort
Kategorie: Fremdsprachen

Steht für C-DECLARE. In einer DECLARE-Anweisung angewandt bewirkt es, dass
die Variablen von rechts nach links übergeben werden (Wie bei C/C++ Prozeduren
üblich). freeBASIC übergibt die Variablen standardmäßig von links nach rechts.

Siehe auch:
DECLARE, PASCAL, STDCALL


CHAIN

Syntax: CHAIN(Programm)
Typ: Funktion
Kategorie: Programmorganisation

Übergibt die Kontrolle an ein anderes Programm und startet dieses.
Nachdem das aufgerufene Programm beendet wurde, erhält das Originalprogramm
die Kontrolle zurück.

  • 'Programm' ist der Dateiname (eventuell mit Pfadangabe) des Programms, das
    aufgerufen werden soll

  • Der Rückgabewert ist der vom aufgerufenen Programm erzeugte Errorlevel. (Siehe
    END)

    • Beispiel:
    Um dieses Beispiel zu starten, muss im aktuellen Arbeitsverzeichnis die Datei
    CHAIN2.EXE vorhanden sein. Wenn es nicht vorhanden ist, wird selbstverständlich
    nichts aufgerufen, und CHAIN gibt -1 zurück.
    #IFDEF FB__LINUX
    #DEFINE CHAIN2 "chain2"
    #ELSE
    #DEFINE CHAIN2 "chain2.exe"
    #ENDIF

    PRINT "vor dem CHAIN-Aufruf"
    CHAIN CHAIN2
    PRINT "Nach dem CHAIN-Aufruf"
    SLEEP

    Unterschiede (Zu QB):
  • Nachdem das aufgerufene Programm beendet wurde, läft das aufrufende
    Programm wieder weiter.

  • CHAIN ist eine Funktion

    • Siehe auch:
    RUN, EXEC, SHELL,
    END,COMMAND,
    CONSTRUCTOR, DESTRUCTOR


CHDIR

Syntax: CHDIR(Pfadangabe)
Typ: Funktion
Kategorie: Datei

Ändert das aktuelle Arbeitsverzeichnis oder -laufwerk.

  • 'Pfadangabe' ist ein String, der das Verzeichnis identifiziert, in das
    gewechselt werden soll.

  • Der Rückgabewert ist entweder 0, wenn der Wechsel erfolgreich war, oder -1,
    wenn ein Fehler aufgetreten ist.

    • 'Pfadangabe' kann dabei relativ zum aktuellen Arbeitsverzeichnis sein, oder absolut.
  • Relative Pfadangaben enthalten nur den Namen des oder der Unterordner, in den
    gewechselt werden soll, ohne Angabe der kompletten Laufwerk- und
    Verzeichnisstruktur.
    Ist das aktuelle Arbeitsverzeichnis etwa
    C:\BASIC
    so verweist die relative Angabe
    freeBASIC
    auf das Verzeichnis
    C:\BASIC\freeBASIC

  • Enthält eine relative Pfadangabe zwei Punkte, so bezieht sich die Angabe auf
    ein übergeordnetes Verzeichnis.
    Ist das aktuelle Arbeitsverzeichnis etwa
    C:\BASIC\freeBASIC
    so verweist die relative Angabe
    ..
    auf das Verzeichnis
    C:\BASIC

  • Relative Angaben können um mehr als eine Ebene abzeigen; die einzelnen
    Segmente werden durch einen Backslash getrennt.
    Ist das aktuelle Arbeitsverzeichnis etwa
    C:\WINDOWS
    so verweist die relative Angabe
    ..\BASIC\freBASIC
    auf das Verzeichnis
    C:\BASIC\freeBASIC

  • Absolute Pfadangaben enthalten das komplette Verzeichnis, in das gewechselt
    werden soll, inclusive des Laufwerks und aller Unterordner. Bei einer
    solchen Angabe wird das aktuelle Arbeitsverzeichnis komplett ignoriert.
    Ist das aktuelle Arbeitsverzeichnis etwa
    C:\BASIC\freeBASIC
    so verweist die absolute Angabe
    C:\WINDOWS
    auf das Verzeichnis
    C:\WINDOWS

  • Auch, wenn die absolute Angabe ein anderes Laufwerk enthält, als das
    Ausgangsverzeichnis, wird der Wechsel wie gewohnt durchgeführt. Ein
    expliziter Wechsel des Laufwerks ist NICHT nötig.

    • Beispiel:
    PRINT CURDIR

    CHDIR "\.."
    PRINT CURDIR

    CHDIR "C:\WINDOWS"
    PRINT CURDIR

    IF CHDIR("A:\") THEN
    PRINT "Laufwerk A: nicht bereit"
    ELSE
    PRINT CURDIR
    END IF
    Ausgabe:
    C:\BASIC\freeBASIC
    C:\BASIC
    C:\WINDOWS
    Laufwerk A: nicht bereit

    Siehe auch:
    RMDIR, MKDIR, CURDIR,
    SHELL

    Unterschiede (zu QB):
  • QB's CHDIR konnte nicht zwischen zwei Laufwerken wechseln

  • CHDIR ist nun eine Funktion


CHR

Syntax: CHR[$](ASCII_Wert AS INTEGER [ASCII_Wert_2 AS INTEGER [ ... ] ] )
Typ: Funktion
Kategorie: Zählsysteme

CHR verwandelt einen ASCII-Code in seinen Character.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
PRINT "ASCII-Character 127: "; CHR(127)
PRINT "Codes 65, 66 und 67: "; CHR(65, 66, 67)
CHR wird z.B. verwendet, um Zeichen darzustellen, die nicht auf der Tastatur sind.

Siehe auch:
WCHR,
ASC

Unterschiede (zu QB):
  • CHR kann nun mehr als ein Zeichen auf einmal zurückgeben


CINT

Syntax: CINT(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Verwandelt einen beliebigen numerischen Ausdruck in eine INTEGER-Zahl, indem es
die Nachkommastellen entfernt.

Unterschiede (zu QB):
INTEGER sind in FB 32bit-Ganzzahlen, keine 16bit-Ganzzahlen wie in QB.

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG


CIRCLE

Syntax: CIRCLE [Puffer,] [STEP] (x,y), Radius[, [Farbe][, [Anfangswinkel][, [Endwinkel][, [Aspekt][, F]]]]]
Typ: Anweisung
Kategorie: Gfx

CIRCLE zeichnet Kreise, Ellipsen oder Bögen

  • 'Puffer' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter Puffer oder ein Array. Beide können mit PUT angezeigt werden.

  • STEP gibt an, dass die Koordinaten relativ zur aktuellen Grafikcursorposition sind.
  • 'x' und 'y' sind die Koordinaten des Mittelpunkts des Kreises/Bogens/der Ellipse.

  • 'Radius' gibt den Radius des Kreises/Bogens an, bzw. den größten Raduis der Ellipse.

  • 'Farbe' ist die Farbnummer. Sie ist Modusspezifisch. Siehe dazu COLOR (Anweisung) und SCREEN (Anweisung).

  • 'Anfangswinkel' und 'Endwinkel' Sind Winkel im Bogenmaß. Sie liegen in einem Bereich zwischen -2 * Pi und 2 * Pi; Wenn Sie einen
    negativen Winkel angeben, wird er in einen Positiven umgewandelt, und CIRCLE zeichnet eine Linie vom Kreismittelpunkt bis zum
    Bogenende. (So können Sie z.B. Kuchendiagramme erstellen.)
    'Endwinkel kann kleiner sein als 'Anfangswinkel'.
    Wenn sie keinen Start- und Endwinkel angeben, wird ein(e) ganze(r) Kreis/Ellipse gezeichnet; Wenn Sie nur den Anfangswinkel angeben,
    wird für den Endwinkel 2 * Pi angenommen; wenn Sie nur den Endwinkel angeben, wird für den Anfangswinkel 0 angenommen.

  • 'Aspekt' ist das Verhältnis zwischen y-Radius und x-Radius.
    Der Standard-Aspekt ist der, der nötig ist, um einen perfekten Kreis auf dem Bildschirm zu zeichnen.
    Dieser Wert kann wie folgt berechnet werden:
    ratio = (y_radius / x_radius) * pixel_aspect_ratio
    pixel_aspect_ratio ist das Verhältnis der Breite des aktuellen Bildschirmmodus zu seiner Höhe. (Normalerweise 4:3).

  • 'F' ist das Ausfüllen-Flag. Wenn Sie dieses Flag setzen, wird der Kreis/ die Ellipse in der gewählten Farbe ausgefüllt.
    Das Ausfüllen-Flag kann nicht genutzt werden, wenn 'Anfangswinkel' und/oder 'Endwinkel' angegeben wurden; 'Kuchendiagramme' können
    nicht alleine mit CIRCLE dargestellt werden.

    • Benutzerdefinierte Koordinatensysteme, die mit WINDOW und/oder VIEW (Grafik) eingestellt wurden, wirken sich auf das Zeichnen des Kreises aus. (Das gilt auch
    für das Clipping; ein Kreis wird nur dann gezeichnet, wenn er sich innerhalb der logischen Bildschirmgrenzen befindet.)
    Nachdem CIRCLE den Zeichenvorgang abgeschlossen hat, wird die Position des Grafikcursors auf den Kreismittelpunkt gesetzt.

    Beispiel:
    SCREEN 18 ' Setze Bildschirmmodus 640 x 480 und zeichne einen Kreis in die Mitte.
    CIRCLE (320, 240), 200, 15 ' Zeichnet einen weißen Kreis
    CIRCLE (320, 240), 200, 2, , , 0.2, F ' Zeichnet eine ausgefüllte Ellipse
    CIRCLE (320, 240), 200, 4, 0.83, 1.67, 3 ' Zeichnet einen kleinen Bogen.

    Siehe auch:
    PSET (Grafik), PRESET (Grafik), LINE (Grafik), CIRCLE, PAINT,
    DRAW (Grafik), DRAW STRING,
    GET (Grafik), PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    POINT, VIEW (Grafik), WINDOW
    SCREEN (Anweisung)

    Unterschiede (Zu QB):
  • QB und freeBASIC benutzen verschiedene Algorithmen, um Kreise, Bögen und Ellipsen zu zeichnen. Daher sind die von freeBASIC
    erzeugten Bilder möglicherweise nicht pixelgenau identisch zu den von QB erzeugten.

  • Die Möglichkeit, ausgefüllte Kreise und Ellipsen zu erzeugen, ist neu in freeBASIC.

  • In freeBASIC ist es möglich, in einen Datenpuffer zu zeichnen


CLEAR

Syntax: CLEAR Bezeichner, [Wert], Bytes
Typ: Anweisung
Kategorie: Speicherverwaltung

Setzt alle Elemente eines Arrays auf einen bestimmten Wert.

  • 'Bezeichner' ist der Bezeichner eines Arrays oder das Ziel eines Pointers (*Pointer),
    dessen Werte reinitialisiert werden sollen.
    Dieser Parameter wird BYREF übergeben.

  • 'Wert' ist der Wert, auf den alle Bytes des Speicherbereichs gesetzt werden
    sollen. Wird 'Wert' ausgelassen, nimmt freeBASIC automatisch 0 an.

  • 'Bytes' ist die Anzahl der Bytes, die reinitialisiert werden sollen.
    Soll ein Array komplett reinitialisiert werden, errechnet sich 'Bytes' nach
    dieser Formel:
    Bytes = LEN(ArrayName(ersterIndex)) * UBOUND(ArrayName)

    • Beispiel:
    DIM array(1 TO 100) AS INTEGER
    DIM AllocArea AS BYTE PTR
    DIM IntVar AS INTEGER

    AllocArea = ALLOCATE(100)
    IntVar = 5

    CLEAR array(1), , LEN(array(1)) * UBOUND(array)
    CLEAR *AllocArea, 1, 100
    CLEAR IntVar, 255, LEN(INTEGER)

    PRINT array(1)
    PRINT AllocArea[0]
    PRINT IntVar
    Ausgabe:
    0
    1
    -1

    Wie sie sehen, werden alle vier Bytes der INTEGER-Stelle 'IntVar' einzeln mit
    dem Wert 255 befüllt; deshalb hat die Variable nach dem CLEAR-Aufruf den Wert -1.

    Siehe auch:
    DIM, ERASE

    Unterschiede (zu QB)
  • CLEAR wurde früher dazu verwendet, alle Variablen auf null zu setzen


CLNG

Syntax: CLNG(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem LONG INTEGER.
(Der Name CLNG setzt sich zusammen aus C (für convert) und LNG (für LONG.)

Unterschiede (zu QB):
Der Datentyp LONG entspricht dem Datentyp INTEGER; CLNG und CINT haben die selbe
Funktion. CLNG wurde nur aus Kompatibilitätsgründen beibehalten.

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG


CLNGINT

Syntax: CLNGINT(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem LONGINT.
(Der Name CLNGINT setzt sich zusammen aus C (für convert) und LongInt)

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG


CLOSE

Syntax: CLOSE [ [#]n [, [#]m [, [#]...]]]
Typ: Anweisung
Kategorie: Datei

Schließt eine, mehrere oder alle Dateien, die zuvor mit OPEN geöffnet
wurden.

  • #n, #m, #... sind die Dateinummern, die beim Öffnen mit OPEN zugewiesen
    wurden.

  • Um alle geöffneten Dateien zu schließen, geben Sie einfach keine Dateinummern an.

  • Die Rauten (#) sind optional, sollten aber benutzt werden, um Verwechslungen
    auszuschließen.

    • Beispiel:
    OPEN "file1" FOR INPUT AS #1
    OPEN "file2" FOR INPUT AS #2
    OPEN "file3" FOR INPUT AS #3
    OPEN "file4" FOR INPUT AS #4
    OPEN "file5" FOR INPUT AS #5

    'Eine Datei schließen
    CLOSE #2

    'Mehrere Dateien schließen
    CLOSE #4, #1

    'Alle geöffneten Dateien (#3 und #5) schließen
    CLOSE

    Siehe auch:


CLS

Syntax: CLS [Parameter]
Typ: Anweisung
Kategorie: Gfx

Löscht den Konsolen- bzw. Grafik-Bildschirm.

'Parameter' gibt an, welche Teile des Bildschirms gelöscht werden sollen. Er ist
einer von diesen Werten:
  • 0 löscht den gesamten Bildschirm.
  • 1 löscht den gesamten Grafikbildschirm, oder nichts im Konsolenmodus.
  • 2 löscht nur den aktuellen Textanzeigebereich (siehe VIEW PRINT),
    sowohl im Grafik- als auch im Konsolenmodus.

    Unterschiede (Zu QB):
    Die Bedeutung des optionalen Parameters hat sich geändert.

    Siehe auch:
    VIEW PRINT, SCREEN (Anweisung)


COLOR (Anweisung)

Syntax: COLOR [Vordergrund][,Hintergrund]
Typ: Anweisung
Kategorie: Gfx

Setzt die Vorder-/Hintergrundfarbe für Ausgaben auf der Konsole oder auf dem
Grafikfenster.

  • 'Vordergrund' und 'Hintergrund' sind die neuen Farbnummern, die verwendet
    werden sollen. Welche Farbe welche Nummer hat, hängt vom aktuellen
    Bildschirmmodus ab. Siehe SCREEN (Anweisung) und die Tabelle unten.

  • 'Vordergrund' wird von allen Grafikanweisungen außer PRESET (siehe Liste unten)
    als Standard-Linienfarbe verwendet. Bei den Text-Anweisungen wird sie als
    Text-Vordergrundfarbe verwendet.

  • 'Hintergrundfarbe' wird von PRESET als Standard-Linienfarbe verwendet. Bei
    den Text-Anweisungen wird sie als Hintergrundfarbe verwendet.

  • CLS füllt den Bildschirm in 'Hintergrundfarbe' aus.

  • Wird einer der beiden Parameter ausgelassen, behält freeBASIC den zuvor
    eingestellten Farbwert bei. COLOR ohne Parameter hat keine Auswirkung.

  • Im Textmodus ist standardmäßig 7 (weiß) als Vordergrundfarbe, und 0 (schwarz)
    als Hintergrundfarbe eingestellt.
    In Grafikmodi ist standardmäßig ein helles weiß als Vordergrundfarbe und
    schwarz als Hintergrundfarbe eingestellt.

    • Diese Anweisungen benutzen die zuletzt mit COLOR gesetzten Farben, wenn kein
    anderer Wert angegeben wird:
    Grafik-Anweisungen | Text-Anweisungen
PSET (Grafik) PRESET (Grafik) LINE (Grafik) CIRCLE DRAW (Grafik) PAINT CLS | PRINT (Anweisung) INPUT (Anweisung)

    Die Farbnummern und die zugehörige Farbe sind abhängig von der letzten SCREEN-Anweisung:
    (Gültig bis maximal 8bpp Farbtiefe)
    Modus | Vordergrundfarbe | Hintergrundfarbe
0 | Farbindex der aktuellen Palette zwischen 0 und 15 | Farbindex der aktuellen Palette zwischen 0 und 15
1 | Bildschirmhintergrundfarbe (zwischen 0 und 15) | Palette für Vordergrundfarben: (CGA-Emulierte Palette) 0: Grün, Rot und Braun 1: Zyan, Magenta und Weiß 2: wie 0, nur mit hellen Farben 3: wie 1, nur mit hellen Farben
2 und 11 | Farbindex der aktuellen Palette zwischen 0 und 1 | Farbindex der aktuellen Palette zwischen 0 und 1
7, 8, 9 und 12 | Farbindex der aktuellen Palette zwischen 0 und 15 | Farbindex der aktuellen Palette zwischen 0 und 15
13 und höher | Farbindex der aktuellen Palette zwischen 0 und 255 | Farbindex der aktuellen Palette zwischen 0 und 255

    Bei höheren Farbtiefen als 8bpp werden die Farben als Direct-RGB-Farbwerte
    behandelt. Direct-RGB-Farbwerte haben die Form &HRRGGBB, wobei RR, GG und BB
    die Rot-, Grün- und Blau-Werte sind. Sie liegen zwischen &h00 und &hFF (bzw 0 und
    255 in dezimaler Schreibweise).
    Sie können aber auch die RGB-Funktion benutzen.

    Beispiel:
    'Bildschirmmodus 800x600 bei 32bpp
    SCREEN 19, 32
    ' Vordergrundfarbe Orange und Hintergrundfarbe dunkelblau einstellen
    COLOR &hFF8000, &h000040
    ' Hello World! ausgeben
    CLS
    LOCATE 19, 44: PRINT "Hello World!"
    SLEEP

    Die Farben im Vollbildmodus können sich von denen der Fenstermodi unterscheiden!

    Siehe auch:
    COLOR (Funktion),
    SCREEN (Anweisung), PALETTE,
    PRINT (Anweisung), INPUT (Anweisung)

    Unterschiede (Zu QB):
  • Im Textmodus können sowohl Vordergrund- als auch und Hintergrundfarben zwischen
    0 und 15 liegen.

  • Es gibt kein Rahmen-Argument mehr.

  • Die freeBASIC-Version akzeptiert auch direkt-RGB-Farben in hi/truecolor-Modi.

  • Im SCREEN-Modus 1 lassen sich 4 verschiedene Farbpaletten anstelle von zweien
    benutzen.

  • COLOR lässt sich auch als Funktion einsetzen; siehe COLOR (Funktion).


COLOR (Funktion)

Syntax: COLOR
Typ: Funktion
Kategorie: Konsole

Die Funktion COLOR gibt Informationen über die verwendeten Textfarben zurück.

Der zurückgegebene Wert wird folgendermaßen berechnet:
(Vordergrund OR (Hintergrund SHL 16))
Das obere Word ist also die Hintergrundfarbe, während das untere Word die Vordergrundfarbe angibt.

Beispiel:
DIM AS INTEGER colr, fore, back

colr = COLOR
fore = LOWORD(colr)
back = HIWORD(colr)

PRINT "Used Colors:"
PRINT "foreground: "; fore
PRINT "background: "; back

PRINT

COLOR 10, 1

colr = COLOR
fore = LOWORD(colr)
back = HIWORD(colr)

PRINT "Used Colors:"
PRINT "foreground: "; fore
PRINT "background: "; back

SLEEP

Unterschiede (zu QB): COLOR kann auch als Funktion eingesetzt werden, nicht nur als Anweisung.

Siehe auch:
COLOR (Anweisung),
WIDTH (Funktion),
LOCATE (Funktion),
SCREEN (Funktion)


COLOR

Typ: Anweisung/Funktion

COLOR ist ein Schlüsselwort, das als Anweisung und als Funktion eingesetzt
werden kann.
Siehe:
COLOR (Anweisung)
COLOR (Funktion)


COM

COM wird zusammen mit OPEN COM eingesetzt.


COMMAND

Syntax: COMMAND[$] [(n)]
Typ: Funktion
Kategorie: Verschiedenes

Enthät die Kommandozeilenparameter an das Programm.

  • Der optionale Parameter 'n' gibt an, das nur der n-ten Kommandozeilenparameter
    zurückgegebem werdem soll.

  • Wird 'n' ausgelassen, so gibt freeBASIC alle Kommandozeilenparameter zurück.

  • ist n = 0, so gibt freeBASIC Pfad und Dateiname des aufrufenden Programms zurück

    • Das Dollarzeichen ($) als Suffix ist optional.

    'Prog1.bas
    SHELL "PROG2.EXE /parameter1 /parameter2"

    'Prog2.bas, liegt auch als compilerte Datei Prog2.EXE vor:
    PRINT COMMAND
    PRINT COMMAND(2)
    PRINT COMMAND(0)
    Ausgabe:
    /PARAMETER1 /PARAMETER2
    /PARAMETER2
    C:\BASIC\freeBASIC\Prog2.EXE

    Siehe auch:
    SHELL, EXEC, RUN


COMMON

Syntax A: COMMON [SHARED] Variable1[()] [AS Typ] [= Ausdruck] [, Variable2[()] [AS Typ] [= Ausdruck] [, ...] ]
Syntax B: COMMON [SHARED] AS Typ Variablenliste [= Ausdruck]
Typ: Anweisung
Kategorie: Programmorganisation

Macht Variablen mehreren Modulen zugänglich.

  • Das optionale Schlüsselwort SHARED macht die Variable zu einer globalen Variable, auf die auch aus Prozeduren (SUBs
    und FUNCTIONs) zugegriffen werden kann.

  • Variable1, Variable2 und Variablenliste stehen führ die Variablen, die allen Modulen zugänglich gemacht werden sollen.

  • Wenn ein Array allen Modulen zugänglich gemacht werden soll, dürfen keine Angaben zu den Dimensionen gemacht werden; die Syntax ist:
    COMMON [SHARED] Array1() [AS Typ] [, Array2() [AS Typ] [, ...] ]
    COMMON-Arrays sind immer dynamisch!

  • Wird AS Typ ausgelassen, wird automatisch der durch die letzte DEFxxx-Anweisung gesetzte Standard-Datentyp verwendet.
    Siehe dazu auch FB-Dialektformen.

  • Ebenso wie bei DIM ist es möglich, Variablen-Initiatoren zu verwenden.

  • In allen Modulen muss der selbe Bezeichner für die Variable verwendet werden; die Reihenfolge der COMMON-Anweisungen ist damit gleichgültig.

    • Beispiel:
    Kompilieren Sie dieses Beispiel mit der Kommandozeile
    <$fbc> Modul1.bas Modul2.bas - x modultest.exe
    (<$fbc> steht dabei für Pfad und Dateiname Ihres FB-Compilers.)
    ' Modul1.bas

    COMMON SHARED a
    COMMON SHARED b

    DECLARE SUB PublicSub ()

    a = 1
    b = 2

    PublicSub

    GETKEY

    '------------------------------------------------------------------------------'

    ' Modul2.bas
    COMMON SHARED b
    COMMON SHARED a

    DECLARE SUB PublicSub ()

    PUBLIC SUB PublicSub ()
    PRINT "PublicSub in Modul2.bas"
    PRINT "a = "; a, "b = "; b
    END SUB
    Ausgabe:
    PublicSub in Modul2.bas
    a = 1      b = 2

    Das komplette einbinden eines Codes mittels INCLUDE ist oft vorteilhafter.

    Siehe auch:
    DIM, SUB, FUNCTION,
    INCLUDE, SHARED,
    PUBLIC (Klausel)

    Unterschiede: (Zu QB)
  • Es ist nicht möglich, Variablen mehreren Prozessen zugänglich zu machen.

  • Arrays sind IMMER Dynamisch.

  • Die Reihenfolge der COMMON-Variablen spielt keine Rolle mehr, dafür aber
    ihre Bezeichner


CONDBROADCAST

Syntax: CONDCREATE(handle)
Typ: Anweisung
Kategorie: Programmorganisation

COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen
diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.

CONDBROADCAST sendet ein Signal an alle Threads, die auf 'handle' warten, dass
sie fortgesetzt werden dürfen. Dieses Signal wird quasi gleichzeitig an alle
wartenden Threads gesandt.

Beispiel: Siehe CONDCREATE

Siehe auch:
CONDCREATE, CONDDESTROY,CONDWAIT, CONDSIGNAL,
MUTEXCREATE, MUTEXDESTROY, MUTEXLOCK, MUTEXUNLOCK,
THREADCREATE, THREADWAIT


CONDCREATE

Syntax: handle = CONDCREATE()
Typ: Funktion
Kategorie: Programmorganisation

COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen
diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.

CONDCREATE gibt einen Handle zur COND zurück. Sobald die COND erstellt und die
Threads gestartet wurden, kann einer von ihnen angewiesen werden, auf ein COND
zu warten (CONDWAIT), bis ein anderer Thread signalisiert, dass er fortfahren
darf (CONDSIGNAL). Wenn alle wartenden Threads auf einmal fortgesetzt werden
sollen, kann dies mittels CONDBROADCAST geschehen.
Bevor das Programm beendet wird, müssen alle CONDs gelöscht werden, um den
Speicherplatz freizugeben (CONDDESTROY).

Der Unterschied zwischen MUTEXen und CONDs besteht darin, dass ein MUTEX immer
reagiert, sobald er entsperrt wird, während auf ein CONDSIGNAL nur reagiert wird,
wenn das entsprechende CONDWAIT gerade ausgeführt wird. Ist der Thread noch mit
anderen Anweisungen beschäftigt, geht das CONDSIGNAL verloren.
Wird ein MUTEX entsperrt, muss der wartende Thread noch nicht einmal beim
entsprechenden Zugriff auf den gerade entsperrten MUTEX angekommen sein, damit das
MUTEXUNLOCK seine Wirkung zeigt.
Das CONDSIGNAL zeigt seine Wirkung nur dann, wenn der wartende Thread auch wirklich
gerade an CONDWAIT ist.
Es empfielt sich daher, vor dem CONDSIGNAL oder CONDBROADCAST ein SLEEP 1
einzubauen, um sicherzustellen, dass die Threads bereit sind, das Signal aufzunehmen.

Beispiel:
DIM SHARED AS INTEGER hThread1, hThread2, hCond, q

DECLARE SUB Thread(BYVAL i AS INTEGER)

hCond = CondCreate()

hThread1 = THREADCREATE(@Thread, 1)
hThread2 = THREADCREATE(@Thread, 2)

PRINT "Beliebige Taste druecken, um Threads zu starten"
GETKEY
CONDBROADCAST(hCond)
SLEEP 1
PRINT

DO
SLEEP 1
CONDSIGNAL(hCond)
LOOP UNTIL q = 2

CONDDESTROY hCond
THREADWAIT(hThread1)
THREADWAIT(hThread2)

GETKEY

SUB Thread(BYVAL i AS INTEGER)
DIM AS INTEGER j

CONDWAIT(hCond)
? "Thread"; i; " wurde gestartet"

FOR j = 0 TO 9
CONDWAIT(hCond)
? "Thread"; i; " sendet:"; j
NEXT

q += 1
END SUB
Wie man sehen kann, werden die Threads zeitgleich durch das CONDBROADCAST
gestartet; das einzelne CONDSIGNAL wird immer abwechselnd an Thread 1 bzw.
Thread 2 gesandt.

Siehe auch:
CONDDESTROY, CONDWAIT, CONDSIGNAL, CONDBROADCAST,
MUTEXCREATE, MUTEXDESTROY, MUTEXLOCK, MUTEXUNLOCK,
THREADCREATE, THREADWAIT


CONDDESTROY

Syntax: CONDDESTROY(handle)
Typ: Funktion
Kategorie: Programmorganisation

COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen
diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.

CONDDESTROY löscht eine COND. 'handle' ist dabei der handle zur zu löschenden
COND.

Beispiel: Siehe CONDCREATE

Siehe auch:
CONDCREATE, CONDWAIT, CONDSIGNAL, CONDBROADCAST,
MUTEXCREATE, MUTEXDESTROY, MUTEXLOCK, MUTEXUNLOCK,
THREADCREATE, THREADWAIT


CONDSIGNAL

Syntax: CONDSIGNAL(handle)
Typ: Funktion
Kategorie: Programmorganisation

COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen
diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.

CONDSIGNAL sendet ein Signal an einen Thread, der auf 'handle' wartet,
dass er fortgesetzt werden darf.
Das Signal wird dabei in der Reihenfolge ausgegeben, wie die Threads gestartet
wurden.
Werden also die Threads in folgender Reihenfolge gestartet:
A, C, B
dann geht das erste CONDSIGNAL auch an A, das zweite an C und das dritte an B.

Beispiel: Siehe CONDCREATE

Siehe auch:
CONDCREATE, CONDDESTROY, CONDWAIT, CONDBROADCAST,
MUTEXCREATE, MUTEXDESTROY, MUTEXLOCK, MUTEXUNLOCK,
THREADCREATE, THREADWAIT


CONDWAIT

CONDCREATE

Syntax: CONDWAIT(handle)
Typ: Anweisung
Kategorie: Programmorganisation

COND steht für "conditional variable". Ebenso wie Mutexe (siehe MUTEXCREATE) stellen
diese eine Möglichkeit dar, Threads (siehe THREADCREATE) zu synchronisieren.

CONDWAIT wartet mit der Ausführung eines Threads, bis ein CONDSIGNAL oder ein
CONDBROADCAST ein Signal für diesen Handle aussendet, so dass der Thread
fortgesetzt wird.

Beispiel: Siehe CONDCREATE

Siehe auch:
CONDCREATE, CONDDESTROY, CONDSIGNAL, CONDBROADCAST,
MUTEXCREATE, MUTEXDESTROY, MUTEXLOCK, MUTEXUNLOCK,
THREADCREATE, THREADWAIT


CONS

CONS wird zusammen mit OPEN CONS eingesetzt.


CONST

Syntax: CONST Symbol [AS Typ]= Ausdruck [, Symbol [AS Typ] = Ausdruck [, ...]]
Typ: Anweisung/Klausel
Kategorie: Programmorganisation

Dieser Eintrag behandelt die Anweisung CONST. Für die Klausel CONST siehe SELECT CASE.

Erzeugt ein Symbol, das als Konstante behandelt wird. Dieses Symbol kann von jedem beliebigen Datentyp sein, abgesehen von
selbstdefinierten Datentypen. Konstanten sind in jeder Prozedur und in jedem Modul verfügbar und können NICHT verändert werden.

DEFxxx-Anweisungen haben keine Auswirkungen auf CONST-Symbole.

Seit freeBASIC v0.16s kann über die Klausel 'AS Typ' tatsächlich festgelegt werden, welchen Datentyp ein Symbol besitzen soll.

Beispiel: (gültig für freeBASIC ab v0.16)
CONST AS INTEGER a = 1
CONST AS DOUBLE b = 2
CONST AS BYTE c = 3

PRINT a, LEN(a)
PRINT b, LEN(b)
PRINT c, LEN(c)
Ausgabe:
1    4
2    8
3    1

Vor freeBASIC v0.16s wurde automatisch der Datentyp gewählt, der am besten dazu geeignet ist, um die Konstante zu speichern.
'AS TYP' hat bis zu dieser Version keine Auswirkungen auf den Datentyp des Symbols.
Der Datentyp des Symbols richtete sich ausschließlich nach dem Datentyp des Ausdrucks.
Um einen Datentyp sicher festzulegen, mussten Suffixe oder die Type-Casting-Funktionen (CINT, CDBL, ...) verwendet werden.
Bei 'AS STRING' wird geprüft, ob es sich bei dem folgenden Ausdruck tatsächlich um einen String handelt; WSTRINGs und ZSTRINGs sind als Konstanten nicht
zugelassen.

Beispiel: (gültig für freeBASIC bis v0.15)
DEFDBL A-Z
CONST AS INTEGER rot = CSHORT(4), blau = 1
CONST SingleValue = 1!
CONST DoubleValue1 AS DOUBLE = 3, DoubleValue2 AS SINGLE = 3.0
CONST msg = "Hello world!"

PRINT LEN(rot), LEN(blau)
PRINT LEN(SingleValue)
PRINT LEN(DoubleValue1), LEN(DoubleValue2)
PRINT msg
Ausgabe:
2     4
4
4     8
Hello world!
Obwohl 'rot' explizit als INTEGER definiert wurde, wird er doch wie ein SHORT
behandelt, da 'rot' durch 'CSHORT(4)' definiert wurde.
'blau' ist vom Typ INTEGER, obwohl der Standarddatentyp durch DEFDBL auf DOUBLE
gelegt wurde.
DoubleValue2 wird immer noch als INTEGER-Wert behandelt, da als Konstante ein INTEGER-Wert
angegeben wurde. Erst durch eine Suffix oder ein Komma wird sichergestellt, dass
der richtige Datentyp verwendet wird.
Fließkommazahlen ohne Suffix werden automatisch als DOUBLEs behandelt, daher ist
DoubleValue2 vom Typ DOULBE.

Unterschiede
zu QB:
  • Unter QB konnte der Datentyp von Variablen nicht festgelegt werden

    • zu früheren Versionen von freeBASIC
  • Erst seit freeBASIC v0.16 ist es möglich, den Datentyp einer Konstante explizit festzulegen.

    • Siehe auch:
    #DEFINE, SELECT CASE
    Datentypen


CONSTRUCTOR (Klassen)

Syntax A:
TYPE TypeName
    ' Feld-Deklarationen

    DECLARE CONSTRUCTOR ( )
    DECLARE CONSTRUCTOR ( [ Parameterliste ] )
End Type
Synax B:
CONSTRUCTOR Typename ( [ Parameterliste ] )
   ' Anweisungen
END CONSTRUCTOR

Typ: Prozedur
Kategorie: Programmorganisation

Ein Klassen-Konstruktor ist eine Prozedur, die aufgerufen wird, sobald eine UDT-Variable (user defindet Type - siehe TYPE (UDT)) erstellt wird.

Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

  • 'TypeName' ist der Name eines UDTs, wie er unter TYPE (UDT) erklärt wird.

  • 'Feld-Deklarationen' sind die Deklarationen, die den UDT oder die Klasse ausmachen. Siehe dazu TYPE (UDT), PROPERTY, OPERATOR.
  • 'Parameterliste' ist vom selben Format wie bei SUB. Auch optionale Argumente werden unterstützt.

  • 'Anweisungen' ist ein Programmcode, der den Regeln einer SUB folgt.

    • Konstruktoren bei Klassen werden immer dann ausgeführt, wenn eine Variable eines Typs erstellt wird, der einen Konstruktor besitzt. In
    einem Konstruktor können die Records des UDTs bereits mit Standardwerten ausgefüllt werden, sowie allgemeine Aufgaben erledigt werden,
    die bei der Erstellung der Variable fällig werden.

    Befindet sich der TYPE innerhalb eines NAMESPACEs, so wird die Zuordnung genau so durchgeführt, wie bei normalen Prozeduren innerhalb
    von NAMESPACEs; es ist möglich, den Bezeichner des TYPEs als Präfix vor den Bezeichner der Property zu hängen, oder mittels USING
    das Präfix für den gesamten Code überflüssig machen.

    Es ist möglich, einem Typen mehrere Konstruktoren zuzuordnen; diese müssen sich dann durch ihre Parameterliste unterscheiden. Siehe dazu
    auch OVERLOAD. Ein Konstruktor darf gar keinen, einen oder mehrere Parameter benutzen.
    Welcher Konstruktor aufgerufen wird, hängt von den Parametern ab, die bei der Erstellung des Typs angegeben werden.
    Die Parameter werden dabei ähnlich übergeben, wie dies bei bei Variablen-Initiatoren geschieht:
    Bei einem Parameter:
    DIM VariablenName AS DatenTyp = Wert
    Bei mehreren Parametern:
    DIM VariablenName AS DatenTyp = DatenTyp( Wert1, Wert2, ... )
    (Statt DIM können natürlich auch COMMON und STATIC verwendet werden.)

    Innerhalb der CONSTRUCTOR-Prozedur kann über das Schlüsselwort THIS auf die Records des UDTs zugegriffen
    werden.

    Enthält der Initiierte UDT selbst Felder, die Klassen mit eigenen Konstruktoren darstellen, so werden diese zuerst aufgerufen.

    Klassen-Konstruktoren MÜSSEN PUBLIC sein; siehe PUBLIC (UDT).

    Beispiel:
    Type sample

    Text As String

    Declare Constructor ()
    Declare Constructor ( a As Integer )
    Declare Constructor ( a As Single )
    Declare Constructor ( a As String, b As Byte )

    Declare Operator Cast () As String

    End Type

    Constructor sample ()
    Print "Konstruktor sample ()"
    Print
    This.Text = "Leer"
    End Constructor

    Constructor sample ( a As Integer )
    Print "Konstruktor sample ( a As Integer )"
    Print " a = "; a
    Print
    This.Text = Str(a)
    End Constructor

    Constructor sample ( a As Single )
    Print "Konstruktor sample ( a As Single )"
    Print " a = "; a
    Print
    This.Text = Str(a)
    End Constructor

    Constructor sample ( a As String, b As Byte )
    Print "Konstruktor sample ( a As String, b As Byte )"
    Print " a = "; a
    Print " b = "; b
    Print
    This.Text = Str(a) + "," + Str(b)
    End Constructor

    Operator sample.Cast () As String
    Return This.Text
    End Operator

    Print "Erstelle x1"
    Dim x1 As sample

    Print "Erstelle x2"
    Dim x2 As sample = 1

    Print "Erstelle x3"
    Dim x3 As sample = 99.9

    Print "Erstelle x4"
    Dim x4 As sample = sample( "aaa", 1 )

    Print "Werte:"
    Print " x1 = "; x1
    Print " x2 = "; x2
    Print " x3 = "; x3
    Print " x4 = "; x4
    Ausgabe:
    Erstelle x1
    Konstruktor sample ()

    Erstelle x2
    Konstruktor sample ( a As Integer )
      a =  1

    Erstelle x3
    Konstruktor sample ( a As Single )
      a =  99.9

    Erstelle x4
    Konstruktor sample ( a As String, b As Byte )
      a = aaa
      b =  1

    Werte:
      x1 = Leer
      x2 = 1
      x3 = 99.9
      x4 = aaa,1

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • CONSTRUCTOR für Klassen existiert seit freeBASIC v0.17

    • Siehe auch:
    CONSTRUCTOR, DESTRUCTOR (Klassen),
    TYPE (UDT), NAMESPACE


CONSTRUCTOR (Module)

Syntax: [ { PRIVATE | PUBLIC } ] SUB Name [ () ] CONSTRUCTOR [ Priorität ]
Typ: Klausel
Kategorie: Programmorganisation

Die CONSTRUCTOR-Klausel bewirkt, dass eine SUB sofort bei Programmstart aufgerufen wird; erst wenn diese SUB verlassen wird, beginnt die
Ausführung des eigentlichen Programmcodes. Der Code der CONSTRUCTOR-SUB wird dabei noch vor dem Code der Modulebene ausgeführt.

  • 'PRIVATE' und 'PUBLIC legen fest, ob die SUB PRIVATE oder PUBLIC sein soll; siehe dazu die entsprechenden Einträge der Referenz.

  • 'Name' ist der Bezeichner der SUB. Er folgt den üblichen Regeln.

  • Eine CONSTRUCTOR-SUB darf keine Parameterliste besitzen, da kein Weg existiert, festzulegen, welche Parameter übergeben werden.

  • Die 'CONSTRUCTOR'-Klausel markiert die SUB als Konstruktor.

  • 'Priorität' ist ein INTEGER-Wert zwischen 101 und 65535. Mit diesem Wert kann bei der Existenz mehrerer CONSTRUCTOR-SUBs im selben
    Modul die Reihenfolge festgelegt werden, in der die Konstruktoren abgearbeitet werden sollen.
    101 ist dabei die höchste Priorität; dieser Konstruktor wird zuerst ausgeführt.
    Die Zahlen an sich haben keine spezielle Bedeutung; lediglich die Verhältnisse zueinander (größer als, kleiner als) wirken sich
    tatsächlich im Programmverlauf aus.
    Alle Konstruktoren, die mit einer Priorität festgelegt wurden, werden vor denen ausgeführt, die ohne Priorität festgelegt wurden.
    Ein Konstruktor mit einem Prioritäts-Wert von 65535 ist wird so behandelt, als wäre ihm keine Priorität zugewiesen worden.

    • Eine solche SUB muss nur dann durch eine DECLARE-Anweisung deklariert werden, wenn sie im späteren Programmverlauf nochmals manuell
    aufgerufen werden soll. Wird sie mit einer normalen DECLARE-Zeile deklariert, so kann sie - wie eine ganz normale SUB - im Programm
    jederzeit aufgerufen werden, und folgt den Regeln einer normalen Prozedur.

    Wird versucht, eine SUB mit der CONSTRUCTOR-Klausel zu belegen, die einen oder mehrere Parameter besitzt, so wird ein Compiler-Fehler
    erzeugt.
    Innerhalb eines Sets von überladenen SUBs (siehe OVERLOAD) kann nur eine einzige CONSTRUCTOR-Sub bestimmt werden, da es nicht möglich
    ist, mehrere überladene SUBs mit leerer Parameterliste zu erstellen.

    Innerhalb eines Modules können mehrere Konstruktoren verwendet werden. Innerhalb mehrerer Module können ebenfalls zusätzliche
    Konstruktoren eingefügt werden, unter der Voraussetzung, dass keine zwei PUBLIC-Konstruktoren mit dem selben Bezeichner existieren.

    Werden in einem Modul mehrere Konstruktoren ohne Priorität verwendet, so werden diese im Code von unten nach oben abgearbeitet.

    Wenn mehrere Module kompiliert werden, die Konstruktoren besitzen, kann die Reihenfolge der Ausführung dieser nicht garantiert werden,
    solange keine Priorität angegeben wurde.
    Darauf muss besonders geachtet werden, wenn der Konstruktor eines Moduls eine Prozedur eines anderen Moduls aufruft, das ebenfalls einen
    Konstruktor besitzt.
    Es wird empfohlen, einen einzigen Konstruktor zu definieren, der die Prozeduren in den einzelnen Modulen manuell aufruft.

    Beispiel:
    Dieses Beispielprogramm enthält ein Set aus zwei Konstruktoren und Destruktoren. Es wird gezeigt, in welcher Reihenfolge diese
    abgearbeitet werden.
    Sub Constructor1() Constructor
    Print "Constructor1() aufgerufen"
    End Sub

    Sub Destructor1() Destructor
    Print "Destructor1() aufgerufen"
    End Sub

    Sub Constructor2() Constructor
    Print "Constructor2() aufgerufen"
    End Sub

    Sub Destructor2() Destructor
    Print "Destructor2() aufgerufen"
    GetKey
    End Sub

    '' ------------------------------------------------------------------------
    Print "Modul-Level Code"

    End 0
    '' ------------------------------------------------------------------------
    Ausgabe:
    Constructor1() aufgerufen
    Constructor2() aufgerufen
    Modul-Level Code
    Destructor1() aufgerufen
    Destructor2() aufgerufen

    Unterschiede
    zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • Die Möglichkeit, eine Priorität zuzuweisen existiert erst seit freeBASIC v0.17

  • existiert seit freeBASIC v0.14

    • Siehe auch:
    DESTRUCTOR (Module), SUB,
    CONSTRUCTOR


CONSTRUCTOR

CONSTRUCTOR ist ein Schlüsselwort, das in Zusammenhang mit mehreren Sprachkonstrukten eingesetzt werden kann.
Siehe...
  • CONSTRUCTOR (Module) zum Zusammenhang mit Prozeduren und modularer Programmierung

  • CONSTRUCTOR (Klassen) zum Zusammenhang mit Klassen und UDTs.


CONTINUE

Syntax: CONTINUE {DO | FOR | WHILE}
Typ: Anweisung
Kategorie: Schleifen

Führt einen verlassenen Code-Block wie DO...LOOP,
FOR...NEXT, oder WHILE...WEND wieder aus.

Beispiel:

DO
PRINT "Diese Zeile wird immer angezeigt."
If Inkey <> "" THEN EXIT DO
CONTINUE DO
PRINT "Diese Zeile wird NIE angezeigt."
LOOP

PRINT "Schleife verlassen"

Siehe auch:
DO...LOOP, FOR...NEXT, WHILE...WEND
EXIT

Unterschiede: Neu in freeBASIC.


COS

Syntax: COS ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Cosinus eines Winkels im Bogenmaß zurück.
Der Cosinus zu einem Winkel 'w' ist relative horizontale Entfernung innerhalb des
Normkreises zu seinem Mittelpunkt.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist ein DOUBLE-Wert, der den Cosinus-Wert zum Winkel enthält.

    • Die Gegenfunktion zu COS lautet ACOS.

    Beispiel:
    CONST pi AS DOUBLE = 3.1415926535897932
    DIM a AS DOUBLE
    DIM r AS DOUBLE

    INPUT "Bitte geben Sie einen Winkel in Grad (DEG) ein: ", a
    r = a * PI / 180 ' Grad in Bogenmaß umrechnen
    PRINT ""
    PRINT "Der Cosinus eines " ; a; " Grad-Winkels angle ist"; COS(r)
    GETKEY
    Ausgabe:
    Bitte geben Sie einen Winkel in Grad (DEG) ein: 60

    Der Sinus eines 60 Grad-Winkels ist 0.5

    Siehe auch:
    SIN, ASIN,
    ACOS,
    TAN, ATN, ATAN2
    mathematische Operatoren


CPTR

Syntax: CPTR(Datentyp POINTER, 32bit_Ausdruck)
Kategorie: Datentypen
Typ: Funktion

CPTR verwandelt einen beliebigen 32bit-Ausdruck in einen Pointer eines
beliebigen Typs.

  • 'Datentyp' ist ein beliebiger Datentyp, der jedoch ein Pointer sein muss.
    Erlaubt sind auch ZSTRING- und WSTRING-Pointer.

  • 32bit-Ausdruck ist entweder ein Pointer, eine INTEGER oder eine UINTEGER-
    Variable.

  • Der Rückgabewert ist ein Pointer auf eine Speicherstelle vom Typ 'Datentyp'.

    • Beispiel:
    DIM i AS INTEGER, ip AS INTEGER PTR, z AS ZSTRING PTR

    i = &h0080
    ip = @i
    PRINT *CPTR(BYTE PTR, ip), *ip

    i = 33
    ip = @i
    z = CPTR(ZSTRING PTR, ip)

    PRINT i, *z
    SLEEP
    Ausgabe:
    -128   128
    33   !
    '!' ist ASCII-Char 33.

    Unterschiede (zu QB):
    Neu in freeBASIC

    Siehe auch:
    CAST


CSHORT

Syntax: CSHORT(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebige numerischen Ausdruck in einen SHORT
INTEGER (16-bit).

DIM a AS LONG
DIM b AS SHORT

a = 10
b = CSHORT(a)

PRINT a; b
(Ausgabe: "10 10")

Siehe auch:
CAST,
CBYTE, CUBYTE,
CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG

Unterschiede: Neu in freeBASIC.


CSIGN

Syntax: CINT(vorzeichenlose_Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Verwandelt eine vorzeichenlose Zahl in eine vorzeichenbehaftete Zahl des selben
Datentyps.

CSIGN wird dazu benutzt, bei Multiplikationen und Divisionen das Verhalten
vorzeichenbehafteter Zahlen zu erzwingen.
(Im Zusammenspiel mit SHL und SHR).

DIM a AS USHORT
a = 65000
PRINT CSIGN(a)
Ausgabe:
-536

CSIGN ist die Gegenfunktion zu CUNSG.

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CUNSG

Unterschiede: Neu in freeBASIC.


CSNG

Syntax: CSNG(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck in eine SINGLE-Zahl.

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CDBL,
CSIGN, CUNSG


CSRLIN

Syntax: CSRLIN
Typ: Funktion
Kategorie: Konsole

Gibt die aktuelle Zeile des Cursors (row) zurück.

Der Name lässt sich in CSR-LIN zerlegen: CSR für Cursor, LIN für line.

Beispiel:
LOCATE 3, 10
PRINT CSRLIN
PRINT CSRLIN
Ausgabe:
3
4

Siehe auch:
POS, LOCATE (Anweisung)


CUBYTE

Syntax: CUBYTE(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem UBYTE.
(Der Name CUBYTE setzt sich zusammen aus C (für convert) und UBYTE.

Siehe auch:
CAST,
CBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG


CUINT

Syntax: CUINT(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem UINTEGER.
(Der Name CUINT setzt sich zusammen aus C (für convert) und UINT (für UINTEGER).

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG


CULNGINT

Syntax: CULNGINT(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem ULONGINT.
(Der Name CULNGINT setzt sich zusammen aus C (für convert) und ULongInt.

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT,
CINT, CUINT, CLNG,
CLNGINT,
CSNG, CDBL,
ULONGINT,
CSIGN, CUNSG


CUNSG

Syntax: CINT(vorzeichenbehaftete_Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert eine vorzeichenbehaftete Zahl in eine vorzeichenlose Zahl des selben
Datentyps.

Wird benutzt, um bei Multiplikationen und Divisionen das Verhalten vorzeichenloser Zahlen zu erzwingen.
(Im Zusammenspiel mit SHL und SHR).

Beispiel:
DIM a AS SHORT
a = -200
PRINT CUNSG(a)
Ausgabe:
65336

CUNSG ist die Gegenfunktion zu CSIGN.

Siehe auch:
CAST,
CBYTE, CUBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN

Unterschiede: Neu in freeBASIC.


CURDIR

Syntax: CURDIR[$]
Typ: Funktion
Kategorie: Datei

Gibt das aktuelle Arbeitsverzeichnis aus.

Das Dollerzeichen ($) als Suffix ist optional.

Beispiel:
PRINT CURDIR

Siehe auch:
EXEPATH,
CHDIR, MKDIR, RMDIR,
SHELL,
OPEN, DIR,

Unterschiede: Neu in freeBASIC.


CUSHORT

Syntax: CUSHORT(Zahl AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem USHORT.
(Der Name CUSHORT setzt sich zusammen aus C (für convert) und USHORT.

Siehe auch:
CAST,
CBYTE,
CSHORT, CUSHORT,
CINT, CUINT, CLNG,
CLNGINT, CULNGINT,
CSNG, CDBL,
CSIGN, CUNSG


CUSTOM

Syntax: ... CUSTOM blender [, parameter]
Typ: Schlüsselwort
Kategorie: Gfx

CUSTOM ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING
eingesetzt wird.

Durch CUSTOM wird vor Ausgabe jedes einzelnen Pixels die FUNCTION 'blender' aufgerufen,
um zu errechnen, in welcher Farbe der Pixel ausgegeben werden soll.
  • 'blender' ist ein Pointer auf eine Funktion der Form

    code>FUNCTION blender ( BYVAL src AS UINTEGER, BYVAL dst AS UINTEGER, BYVAL parameter AS ANY PTR) AS UINTEGER
    Achtung: 'parameter AS ANY PTR' existiert erst seit freeBASIC v0.17. In
    älteren Versionen konnte dieser Parameter nicht übergeben werden.

  • 'src' ist die Farbe des auszugebenden Pixels.

  • 'dst' ist die Farbe des Pixels, der überschrieben werden soll.

  • 'parameter' ist der Parameter, der als drittes Argument an die Funktion
    'blender' übergeben wird. Wird er ausgelassen, nimmt freeBASIC automatisch
    parameter = 0 an.

  • Das Ergebnis der FUNCTION ist die Farbe des neuen Pixels.

    • Diese Funktion wird für jedes neu zu zeichnende Pixel aufgerufen; die Farbe wird jedes
    mal neu berechnet.
    Achten Sie beim Einsatz dieses Aktionsworts darauf, dass die Ausführungsgeschwindigkeit
    unter aufwändigen Berechnungen leiden wird!

    Unterschiede:
    Zu QB:
  • Neu in freeBASIC

    • Zu früheren freeBASIC-Versionen
  • 'parameter AS ANY PTR' existiert erst seit freeBASIC v0.17. In älteren Versionen
    konnte dieser Parameter nicht übergeben werden.

  • existiert erst seit freeBASIC v0.14

    • Siehe auch:
    PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
    AND (Methode), OR (Methode), XOR (Methode),
    PSET (Methode), PRESET (Methode),
    ADD, ALPHA, TRANS


CVD

Syntax: CVD(8-Byte-String)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen 8-Byte-String (ein String aus 8 Zeichen) in eine DOUBLE-Zahl.

Siehe auch:
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


CVI

Syntax: CVI(4-Byte-String)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen 4-Byte-String (ein String aus 4 Zeichen) in eine INTEGER-Zahl.

Siehe auch:
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


CVL

Syntax: CVD(4-Byte-String)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen 4-Byte-String (ein String aus 4 Zeichen) in eine LONG-Zahl.

Siehe auch:
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


CVLONGINT

Syntax: CVLONGINT(8-Byte-String)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen 8-Byte-String (einen String aus 8 Zeichen) in eine LONGINT-Zahl.

Siehe auch:
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD

Unterschiede (zu QB):
Neu in freeBASIC


CVS

Syntax: CVD(4-Byte-String)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen 4-Byte-String (ein String aus 4 Zeichen) in eine SINGLE-Zahl.

Siehe auch:
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


CVSHORT

Syntax: CVSHORT(2-Byte-String)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen 2-Byte-String (einen String aus 2 Zeichen) in eine SHORT-Zahl.

Siehe auch:
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD

Unterschiede (zu QB):
Neu in freeBASIC


Liste der Schlüsselwörter beginnend mit D

DATA
DATE
DATEADD
DATEDIFF
DATEPART
DATESERIAL
DATEVALUE
DAY
DEALLOCATE
DECLARE
DEFBYTE
DEFDBL
DEFINED
DEFINT
DEFLNG
DEFLONGINT
DEFSHORT
DEFSNG
DEFSTR
DEFUBYTE
DEFUINT
DEFULONGINT
DEFUSHORT
DEFxxx
DESTRUCTOR
DESTRUCTOR (Klassen)
DESTRUCTOR (Module)
DIM
DIR
DO
DO...LOOP
DOUBLE
DRAW
DRAW (Grafik)
DRAW STRING
DYLIBLOAD
DYLIBFREE
DYLIBSYMBOL
DYNAMIC
DYNAMIC (Schlüsselwort)


DATA

Syntax: DATA Konstante [,Konstante [,...]]
Typ:Anweisung
Kategorie: Speicherverwaltung

DATA speichert Konstanten im Programm. Diese Konstanten dürfen keine Komplexen
Ausdrücke enthalten. D.h. die mit DATA gespeicherten Konstanten können NUR Zahlen
oder Strings sein.

Normalerweise werden die DATA-Befehle am Ende eines Programmcodes gesetzt.

Beispiel: 10 Zahlen mit DATA speichern:
DATA 105, 98, 85, 99, 110, 115, 109, 89, 104, 102

Der Zugriff auf die mit DATA gespeicherten Daten erfolgt über READ.

Beispiel: 10 gespeicherte Daten einlesen:
DIM height(1 to 10) AS INTEGER

FOR a = 1 TO 10
READ height(a)
NEXT

DATA 105, 98, 85, 99, 110, 115, 109, 89, 104, 102

Mit DATA gespeicherte Werte können nur einmal eingelesen werden; Durch
jede READ-Anweisung wird der jeweils nächste Wert in der Liste der DATAs
eingelesen. Sind mehr READ-Anweisungen als DATAs im Programm, wird ein Fehler
erzeugt.
Durch RESTORE können Daten mehrfach eingelesen
werden. Nach einem RESTORE-Aufruf liest die nächste READ-Anweisung wieder von
der ersten DATA-Konstante.

Seit freeBASIC v0.15b ist es auch möglich, innerhalb einer Prozedur DATA-Anweisungen
zu platzieren; in früheren Versionen war diese Anweisung nur auf Modulebene
erlaubt.
Die zugehörigen READ-Anweisungen beziehen sich dennoch weiterhin auf die
gespeicherten DATAs des gesamten Programms, nicht nur auf die der Prozedur:
DECLARE SUB foo

DATA 1, 2, 3

foo
SLEEP

SUB foo
DATA 4, 5, 6
FOR i = 1 TO 6
READ n
PRINT n
NEXT
END SUB
Ausgabe:
1
2
3
4
5
6

Unterschiede
Zu QB:
  • Strings MÜSSEN in "Anführungszeichen" stehen; sie werden sonst als
    Werte von Konstanten behandelt.

  • DATA darf auch in Prozeduren verwendet werden

    • zu früheren freeBASIC-Versionen
  • DATA darf erst seit freeBASIC v0.15 in Prozeduren verwendet werden

    • Siehe auch:
    READ, RESTORE


DATE

Syntax: DATE[$]
Typ: Schlüsselwort
Kategorie: Zeit

DATE gibt das aktuelle Datum im Format mm-dd-yyyy zurück.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel: Das aktuelle Datum ausgeben:
PRINT DATE
Ausgabebeispiel:
12-25-2005

Siehe auch:
TIMER, SETDATE,
TIME, SETTIME

Unterschiede (Zu QB):
Um ein neues Datum einzustellen, müssen Sie SETDATE


DATEADD

Syntax: Serial = DateAdd(Intervall, n, AusgangsSerial)
Kategorie: Zeit
Typ: Funktion

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren
Quellcode eingebunden werden, z.B. mit INCLUDE.

Gibt eine Serial Number aus, die eine Zeit Symbolisiert, die 'n' 'Intervalle' hinter
dem 'Ausgangsserial' liegt.

  • 'AusgangsSerial' ist eine Serial Number, die einen beliebigen Zeitpunkt angibt, zu dem ein bestimmter Zeitraum hinzugezählt werden soll.

  • 'Intervall' ist ein String, der angibt, wie groß die Intervalle sein sollen, die zum 'AusgangsSerial' hinzugezählt werden sollen. Er
    ist einer von diesen Werten:
    Wert | Bedeutung
    "yyyy" | Jahre
    "q" | Quartale (drei Monate)
    "m" | Monate
    "ww" | Wochen
    "d", "w" oder "y" | Tage
    "h" | Stunden
    "n" | Minuten
    "s" | Sekunden
  • 'n' ist die Anzahl der Intervalle, die zum 'Ausgangsserial' hinzugezählt werden sollen. 'n' ist vom Typ INTEGER, kann also nur ganzzahlige
    Elemente enthalten. Es ist also nicht möglich, zu einer Serial Number ein halbes Jahr hinzuzuzählen.
    Es ist allerdings durchaus möglich, eine negative Zahl anzugeben; in diesem Fall wird ein Serial ausgegeben, das vor 'AusgangsSerial'
    liegt.

    • Beispiel:
    #INCLUDE "vbcompat.bi"
    DIM AS DOUBLE SerialA, SerialB

    SerialA = NOW
    PRINT "Heute:"
    PRINT FORMAT(SerialA, "dd.mm.yyyy, hh:mm:ss")
    SerialB = DATEADD("ww", 3, serialA)
    PRINT "In drei Wochen:"
    PRINT FORMAT(SerialB, "dd.mm.yyyy, hh:mm:ss")
    SLEEP
    Ausgabebeispiel:
    Heute:
    13.12.2005, 15:10:41
    In drei Wochen:
    03.01.2006, 15:10:41

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBWIN.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART,
    FORMAT,
    ISDATE">,
     Serial Numbers


DATEDIFF

Syntax: Intervalle = DateDiff(Intervall, SerialA, SerialB [, erster_Tag_der_Woche [, erste_Woche_des_Jahres]])
Kategorie: Zeit
Typ: Funktion

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Gibt die Anzahl bestimmter Intervalle zwischen zwei Serial Numbers aus.

  • 'SerialA' und 'SerialB' sind die Zeitpunkte, deren Unterschied ermittelt werden soll. Wenn 'SerialA' größer ist als 'SerialB', dann ist das Ergebnis
    negativ.

  • 'Intervall' ist ein String, der angibt, wie groß die Intervalle sein sollen, die zum 'SerialA' (Dem Ausgangszeitpunkt) hinzugezählt
    werden sollen. Er ist einer von diesen Werten:
    Wert | Bedeutung
    "yyyy" | Jahre
    "q" | Quartale (drei Monate)
    "m" | Monate
    "w" | sieben-Tages-Einheiten (Wochen)
    "ww" | Kalenderwochen (beginnen u. enden bei einem bestimmten Wochentag)
    "d" oder "y" | Tage
    "h" | Stunden
    "n" | Minuten
    "s" | Sekunden

  • 'erster_Tag_der_Woche' wirkt sich auf das Ergebnis aus, wenn als Intervall "ww" angegeben wurde. Er ist einer von diesen Werten:
    Wert | alternatives Symbol | Tag
    ausgelassen
            Sonntag
    0 | fbUseSystem | lokal eingestelltes System
    1 | fbSunday | Sonntag
    2 | fbMonday | Montag
    3 | fbTuesday | Dienstag
    4 | fbWednesday | Mittwoch
    5 | fbThursday | Donnerstag
    6 | fbFriday | Freitag
    7 | fbSaturday | Samstag

  • 'erste_Woche_des_Jahres' wirkt sich auf das Ergebnis aus, wenn als Intervall "ww" angegeben wurde. Er ist einer von diesen Werten:
    Wert | alternatives Symbol | Bedeutung
    0 oder ausgelassen | fbUseSystem | lokal eingestelltes System
    1 | fbFirstJan1 | Beginne mit der Woche des ersten Januars als erste Kalenderwoche des Jahres
    2 | fbFirstFourDays | Beginne mit der ersten Woche, die vier Tage hat als erste Kalenderwoche des Jahres
    3 | fbFirstFullWeek | Beginne mit der ersten ganzen Woche des Jahres als erste Kalenderwoche des Jahres

    • Beispiel:
    #INCLUDE "vbcompat.bi"
    DIM AS DOUBLE SerialA, SerialB

    SerialA = NOW
    SerialB = DATESERIAL(YEAR(NOW), 12, 24) ' Weihnachten dieses Jahr
    PRINT "Heute ist der "; FORMAT(SerialA, "dd.mm.yyyy.")
    PRINT "Noch";
    PRINT DATEDIFF("d", SerialA, SerialB);
    PRINT " Tage bis Weihnachten!"
    SLEEP
    Ausgabebeispiel:
    Heute ist der 13.12.2005.
    Noch 11 Tage bis Weihnachten!

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEADD, DATEPART,
    FORMAT,
    ISDATE">,
     Serial Numbers


DATEPART

Syntax: Teil = DatePart(Intervall, Serial [, erster_Tag_der_Woche [, erste_Woche_des_Jahres]])
Kategorie: Zeit
Typ: Funktion

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Gibt einen bestimmten Teil einer Serial Number aus.

  • 'Intervall' ist ein String, der angibt, welcher Teil der Serial Number ausgegeben werden soll.
    Wert | Bedeutung
    "yyyy" | Jahr
    "q" | Quartal
    "m" | Monat
    "ww" | Kalenderwoche
    "w" | Wochentag
    "d" | Tag des Monats
    "Y" | Tag des Jahres
    "h" | Stunde
    "n" | Minute
    "s" | Sekunde

  • 'erster_Tag_der_Woche' wirkt sich auf das Ergebnis aus, wenn als Intervall "ww" angegeben wurde. Er ist einer von diesen Werten:
    Wert | alternatives Symbol | Tag
    ausgelassen
            Sonntag
    0 | fbUseSystem | lokal eingestelltes System
    1 | fbSunday | Sonntag
    2 | fbMonday | Montag
    3 | fbTuesday | Dienstag
    4 | fbWednesday | Mittwoch
    5 | fbThursday | Donnerstag
    6 | fbFriday | Freitag
    7 | fbSaturday | Samstag

  • 'erste_Woche_des_Jahres' wirkt sich auf das Ergebnis aus, wenn als Intervall "ww" angegeben wurde. Er ist einer von diesen Werten:
    Wert | alternatives Symbol | Bedeutung
    0 oder ausgelassen | fbUseSystem | lokal eingestelltes System
    1 | fbFirstJan1 | Beginne der Woche des ersten Januars als erste Kalenderwoche des Jahres
    2 | fbFirstFourDays | Beginne mit der ersten Woche, die vier Tage hat als erste Kalenderwoche des Jahres
    3 | fbFirstFullWeek | Beginne mit der ersten ganzen Woche des Jahres als erste Kalenderwoche des Jahres

    • Beispiel:
    #INCLUDE "vbcompat.bi"

    PRINT "Wir befinden uns im "; DATEPART("q", NOW); ". Quartal."
    PRINT "Es ist die "; DATEPART("ww", NOW, , fbFirstFullWeek); ". ganze Kalenderwoche."
    PRINT "Heute ist der "; DATEPART("w", NOW, fbMonday); ". Tag seit Montag."

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBWIN.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch:
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEADD, DATEDIFF,
    FORMAT,
    ISDATE">,
     Serial Numbers


DATESERIAL

Syntax: DATESERIAL(Jahr, Monat, Tag)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Diese Funktion wandelt ein angegebenes Datum in eine Serial Number um.
Der Rückgabetyp ist DOUBLE. Durch die interne Darstellung von DOUBLE-Werten kann es zu Ungenauigkeiten bei großen Werten kommen.
Diese Funktion wird vom Compiler solange ignoriert, bis die Datei vbcompat.bi in den Quellcode eingebunden wurde.

  • 'Jahr' ist eine vierstellige Jahreszahl

  • 'Monat' ist eine Zahl zwischen 1 und 12, die den Monat angibt.

  • 'Tag' ist der eine Zahl zwischen 1 und 31, die den Tag angibt.

  • Wenn Sie "unsinnige" Daten angeben, wie z.B. den 32.14.2004 wird der Fehler automatisch umgerechnet; das Ergebnis wäre hier der
    4.3.2005.

    • Beispiel:
    #INCLUDE "vbcompat.bi"
    a! = DATESERIAL(2005, 11, 6)
    PRINT FORMAT(a!, "dd/mm/yyyy hh:mm:ss")
    Ausgabebeispiel:
    06.11.2005 00:00:00

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    ISDATE">,
     FORMAT,
    Serial Numbers


DATEVALUE

Syntax: DATEVALUE(Datum$)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Verwandelt einen STRING mit einer Datumsangabe in eine Serial Number.

  • 'Datum$' ist der String, der in ein Dateserial verwandelt werden soll. Er muss in einem dieser Formate über geben werden:
    - dd.mm.yyyy
    - dd-mm-yyyy
    - dd/mm/yyyy
    - dd.mm.yy
    - dd-mm-yy
    - dd/mm/yy
    - d.m.yyyy
    - d-m-yyyy
    - d/m/yyyy
    - d.m.yy
    - d-m-yy
    - d/m/yy

  • Der Rückgabewert ist ein Integerwert, der das Dateserial enthält; Siehe Serial Numbers

    • Beispiel:
    Das heutige Datum mit DATE ermitteln und in eine Serial Number verwandeln:
    #INCLUDE "vbcompat.bi"
    DIM dv AS DOUBLE
    dv = DATEVALUE(DATE)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


DAY

Syntax: DAY(Serial)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

DAY extrahiert den Tag einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Serial Number behandelt wird.

  • Der Rückgabewert ist der Tag des Monats, der in der Serial Number gespeichert ist.

    • Beispiel:
    Den heutigen Tag des Monats aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM tag AS INTEGER
    tag = DAY(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


DEALLOCATE

Syntax: DEALLOCATE Pointer
Typ: Anweisung
Kategorie: Speicherverwaltung

Gibt einen mit ALLOCATE reservierten Speicher wieder frei.

  • 'Pointer' ist ein Pointer auf den Beginn des freizugebenden Speicherbereichs.

  • Der Bezeichner des Pointers muss nicht derselbe sein, wie der, mit dem der
    Speicherbereich allokalisiert wurde; lediglich die Adresse muss dieselbe
    sein.

    • Es wird empfohlen, den Pointer sofort null zu setzen, sobald der Speicherbereich
    freigegeben wurde, um zu verhindern, dass immer noch darauf zugegriffen wird.

    DEALLOCATE ist kein Teil der freeBASIC Runtime Library, sondern ein Alias von
    'free' der C-Lib. Es kann nicht garantiert werden, dass diese Funktion Multithreading
    auf allen Plattformen unterstützt.

    Beispiel:
    DIM AS INTEGER PTR p1, p2

    ' 4 Bytes reservieren
    p1 = ALLOCATE(4)

    ' p2 soll auf den selben Speicherbereich zeigen
    p2 = p1

    ' den Speicherbereich wieder freigeben; er wurde mit p1 erstellt, kann aber mit
    ' p2 freigegeben werden, da beide auf die selbe Adresse zeigen.
    DEALLOCATE p2

    ' p1 auf null setzen, um zu verhindern, dass auf den inzwischen freigegebenen
    ' Speicher zugegriffen wird
    p1 = 0

    Siehe auch:
    ALLOCATE, CALLOCATE, REALLOCATE,
    Pointer

    Unterschiede: Neu in freeBASIC.


DECLARE

Syntax A:
DECLARE SUB Name [OVERLOAD] [Aufrufkonvention] [[LIB "DLLName"] ALIAS "AliasName"] ( _
                 [ {BYVAL | BYREF } ] Parameter1 [AS Typ] [= Wert] ] [, _
                 [ {BYVAL | BYREF } ] Parameter2 [AS Typ] [= Wert] ] [, _
                 ...] ) _
                 [EXPORT]
Syntax B:
DECLARE FUNCTION Name [OVERLOAD] [Aufrufkonvention] [[LIB "DLLName"] ALIAS "AliasName"] ( _
                 [ {BYVAL | BYREF } ] [Parameter1] [AS Typ] [= Wert] ] [, _
                 [ {BYVAL | BYREF } ] [Parameter2] [AS Typ] [= Wert] ] [, _
                 ...] ) _
                 [AS Rückgabetyp] [EXPORT]

Anmerkung zur Syntax: Unterstriche (_) am Zeilenende werden von freeBASIC so
interpretiert, als wäre die Zeile nicht unterbrochen; dies dient nur der
besseren Übersichtlichkeit, und hat letztenendes keine Auswirkungen auf die
Programmausführung.

Typ: Anweisung
Kategorie: Programmorganisation

Deklariert eine neue SUB oder FUNCTION.

  • 'Name' ist der Bezeichner, unter dem die SUB/FUNCTION aufgerufen wird.

  • 'Aufrufkonvention' ist ein Schlüsselwort, das angibt, in welcher Reihenfolge
    die Parameter übergeben werden sollen. Möglich sind:
    CDECL, PASCAL und STDCALL.

  • 'Parameter1', 'Parameter2', '...' stehen für Parameter, die an die Prozedur
    übergeben werden sollen; siehe Parameterübergabe
    Ihre Namen sind eigentlich unbedeutend, und können ausgelassen werden. Eine
    Deklaration, in der die Parameter bezeichnet werden, ist jedoch einfacher
    nachzuvollziehen.
  • 'Typ' ist der Datentyp der übergebenen Parameter.; siehe Datentypen.

  • Durch die Klausel '= Wert' wird ein Parameter als optional deklariert; er kann
    beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird an die Sub
    für diesen Parameter 'Wert' übergeben.
    'Wert' darf ein einfacher Ausdruck sein, der Konstanten, Operatoren und
    Funktionen, jedoch KEINE Variablen enthält.

  • Wenn BYVAL bzw. BYREF nicht angegeben werden, wird standardmäßig BYREF
    verwendet; dies lässt sich mittels OPTION BYVAL ändern.

  • 'Rückgabetyp' hinter der Parameterliste ist der Typ des Rückgabewertes
    der FUNCTION.

  • 'DLLName' ist der Name der LIB/DLL, in der sich die Prozedur befindet.

  • 'AliasName' ist der Name, unter dem die Prozedur in der LIB/DLL aufgeführt
    ist. Da diese manchmal Zeichen enthalten, die unter BASIC nicht erlaubt sind,
    ist es möglich, ihnen "einen anderen Namen zu geben".

  • EXPORT und OVERLOAD werden in dieser Referenz an anderer Stelle erklärt.

    • Es hat sich als nützlich erwiesen, die DECLARE-Anweisungen in Include-Daten
    auszulagern, obwohl es ebenso möglich wäre, sie einfach zu Beginn
    eines BAS-Moduls zu platzieren.
    In jedem Fall ist es jedoch notwendig, die DECLARE-Anweisung vor der SUB/FUNCTION,
    die durch sie deklariert wird, zu setzen. (Ausnahmen bilden in DLLs ausgelagerte
    Prozeduren)

    Beispiel:
    DECLARE FUNCTION twice (AS INTEGER) AS INTEGER
    DECLARE SUB PrintTimes (AS ANY, BYVAL AS INTEGER = 1)

    FUNCTION twice (x AS INTEGER) AS INTEGER
    twice = x * 2
    END FUNCTION

    SUB PrintTimes (ToPrint AS ANY, BYVAL times AS INTEGER = 1)
    FOR i = 1 TO times
    PRINT ToPrint
    NEXT
    END SUB

    PRINT "Das Doppelte von 42 ist: "; twice(42)
    PrintTimes "Einmal"
    PrintTimes "Zehn mal", 10

    Seit freeBASIC v0.15b muss die ALIAS-Klausel verwendet werden, wenn eine
    Prozedur aus einer LIB/DLL eingebunden wird; in früheren Versionen konnte die
    ALIAS-Klausel ausgelassen werden; in diesem Fall wurde der Prozedurbezeichner (hier 'Name')
    als ALIAS-Name verwendet.

    Siehe auch:
    SUB, FUNCTION, DIM,
    BYVAL, BYREF, SHARED,
    LIB, ALIAS, OVERLOAD, EXPORT,
    Prozeduren,


DEFBYTE

Syntax: DEFBYTE Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFBYTE setzt den Standarddatentyp zu BYTE.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen
Buchstabenbereich liegt, werden als BYTE dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFBYTE b
DEFBYTE d-f
DIM bNumber
DIM eNumber

Dadurch werden 'bNumber' 'eNumber' zu einem BYTE, da ihre
Anfangsbuchstaben b sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC.


DEFDBL

Syntax: DEFDBL Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFDBL setzt den Standarddatentyp zu DOUBLE.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen
Buchstabenbereich liegt, werden als DOUBLE dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFDBL d
DEFDBL e-g
DIM bNumber
DIM fNumber

Dadurch werden 'dNumber' 'fNumber' zu einem DOUBLE, da ihre
Anfangsbuchstaben d sind, bzw. zwischen e und g liegen.

Siehe auch:
DEFxxx


#DEFINE

Syntax A: #DEFINE Symbol
Syntax B: #DEFINE Symbol Ausdruck
Syntax C: #DEFINE Symbol(Parameter) Makro
Typ: Metabefehl
Kategorie: Präprozessoren

Definiert ein Symbol mit benutzerdefinierter Bedeutung oder ein Makro.

Ein Symbol ist ein Bezeichner, der direkt vor der Kompilation durch seinen
Ausdruck ersetzt wird. Selbst wenn es keinen Wert besitzt (wie in Syntax A) kann
das Symbol bereits mit DEFINED verwendet werden.

Ein Makro ist im Grunde eine FUNCTION; direkt vor der Kompilation wird der Makro-
Bezeichner durch seinen Ausdruck ersetzt. Dabei können in diesem Ausdruck
Parameter verwendet werden, die zuvor unter 'Parameter' festgelegt wurden.
Makros werden meist für häufig auftretende mathematische Formeln verwendet.

Durch einfaches Definieren eines Symbols kann das Programm komplett anders laufen.
(Denken Sie an Kompatibilität oder Portabilität).

Diese Funktion ermöglichte freeBASIC, portabel zu LINUX und anderen System zu sein.

Einige Symbole und Makros sind bereits vordefiniert; siehe
Präprozessoren

Seit freeBASIC v0.16 können Makros auch als Parameter für andere Makros übergeben werden. In diesem Fall müssen auch dann Klammern für
die Parameterliste angegeben werden, wenn es sich um ein Parameterloses Makro handelt.

Beispiel:
Makros erstellen, die zwischen Neugrad und Bogenmaß umrechnen
#DEFINE pi 4# * ATN(1)
#DEFINE deg2rad(deg) ( (deg / 180#) * pi )
#DEFINE rad2deg(rad) ( (rad / pi) * 180# )

PRINT "PI ="; pi ' Ausgabe: 3.141592654
PRINT "180 im Bogenmaß"; deg2rad(180) ' Ausgabe: 3.141592654
PRINT "3.141592654 in Neugrad" ' Ausgabe: 180

Siehe auch:
DEFINED, #UNDEF
Präprozessoren

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.16 können Makros auch als Parameter für andere Makros übergeben werden. In diesem Fall müssen auch dann Klammern
    für die Parameterliste angegeben werden, wenn es sich um ein Parameterloses Makro handelt.


DEFINED

Syntax: DEFINED (Symbol)
Typ: Funktion
Kategorie: Präprozessoren

DEFINED gibt true (-1) zurück, wenn das angegebene Symbol bereits definiert
wurde, oder false (0), wenn es bislang noch unbekannt ist.

DEFINED wird meistens zusammen mit #IF verwendet.
Eine andere Verwendung ist nicht möglich.

Die selbe Funktion erfüllt #IFDEF, das aber flexibler
ist, da es mehr als eine Überprüfung zur gleichen Zeit zulässt.

Beispiel: unvollständiger Codeauszug:
#IF DEFINED(LogX)

Anmerkung: Dieser Präprozessor ist noch nicht vollständig implementiert; im
Gegensatz zu IFDEF und IFNDEF funktioniert dieser Präprozessor nur mit per
#DEFINE erstellten Symbolen; #IFDEF und #IFNDEF arbeiten auch mit CONST-Symbolen.

Siehe auch:
#DEFINE, #IFDEF, #IFNDEF,
Präprozessoren

Unterschiede: Neu in freeBASIC.


DEFINT

Syntax: DEFINT Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFINT setzt den Standarddatentyp zu INTEGER.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen
Buchstabenbereich liegt, werden als INTEGER dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFINT i
DEFINT a-f
DIM iNumber
DIM eNumber

Dadurch werden 'iNumber' 'eNumber' zu einem INTEGER, da ihre
Anfangsbuchstaben i sind, bzw. zwischen a und f liegen.

Siehe auch:
DEFxxx


DEFLNG

Syntax: DEFLNG Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFLNG setzt den Standarddatentyp zu LONG.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen
Buchstabenbereich liegt, werden als LONG dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFLNG l
DEFLNG d-f
DIM lNumber
DIM eNumber

Dadurch werden 'lNumber' 'eNumber' zu einem LONG, da ihre
Anfangsbuchstaben l sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx


DEFLONGINT

Syntax: DEFLONGINT Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFLONGINT setzt den Standarddatentyp zu LONGINT.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen Buchstabenbereich
liegt, werden als LONGINT dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFLONGINT l
DEFLONGINT d-f
DIM lNumber
DIM eNumber

Dadurch werden 'lNumber' 'eNumber' zu einem LONGINT, da ihre
Anfangsbuchstaben l sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC


DEFSHORT

Syntax: DEFSHORT Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFSHORT setzt den Standarddatentyp zu SHORT.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen Buchstabenbereich
liegt, werden als SHORT dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFSHORT s
DEFSHORT a-f
DIM sNumber
DIM eNumber

Dadurch werden 'sNumber' 'eNumber' zu einem SHORT, da ihre
Anfangsbuchstaben s sind, bzw. zwischen a und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC.


DEFSNG

Syntax: DEFSNG Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFSNG setzt den Standarddatentyp zu SINGLE.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen Buchstabenbereich
liegt, werden als SINGLE dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFSNG s
DEFSNG d-f
DIM sNumber
DIM eNumber

Dadurch werden 'sNumber' 'eNumber' zu einem SINGLE, da ihre
Anfangsbuchstaben s sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx


DEFSTR

Syntax: DEFSTR Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFSTR setzt den Standarddatentyp zu STRING.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen
Buchstabenbereich liegt, werden als STRING dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFSTR s
DIM sMessage

Dadurch wird 'sMessage' zu einem STRING, da sein
Anfangsbuchstabe ein i ist.

Siehe auch:
DEFxxx


DEFUBYTE

Syntax: DEFUBYTE Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFUBYTE setzt den Standarddatentyp zu UBYTE.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen Buchstabenbereich
liegt, werden als UBYTE dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFUBYTE u
DEFUBYTE a-f
DIM uNumber
DIM eNumber

Dadurch werden 'uNumber' 'eNumber' zu einem UBYTE, da ihre
Anfangsbuchstaben u sind, bzw. zwischen a und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC.


DEFUINT

Syntax: DEFUINT Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFUINT setzt den Standarddatentyp zu UINTEGER.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen
Buchstabenbereich liegt, werden als UINTEGER dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFUINT u
DEFUINT d-f
DIM uNumber
DIM eNumber

Dadurch werden 'uNumber' 'eNumber' zu einem UINTEGER, da ihre
Anfangsbuchstaben u sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC.


DEFULONGINT

Syntax: DEFULONGINT Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFULONGINT setzt den Standarddatentyp zu ULONGINT.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen Buchstabenbereich
liegt, werden als ULONGINT dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFULONGINT u
DEFULONGINT d-f
DIM uNumber
DIM eNumber

Dadurch werden 'uNumber' 'eNumber' zu einem ULONGINT, da ihre
Anfangsbuchstaben u sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC


DEFUSHORT

Syntax: DEFUSHORT Buchstabenbereich [,Buchstabenbereich [,...]]
Typ: Anweisung
Kategorie: Speicherorganisation

DEFUSHORT setzt den Standarddatentyp zu USHORT.
Variablen, die mit einem Buchstaben beginnen, der im angegebenen Buchstabenbereich
liegt, werden als USHORT dimensioniert.

Der Ausdruck Buchstabenbereich ist entweder der Form Buchstabe-Buchstabe, oder
einfach nur ein Buchstabe.

Beispiel:
DEFUSHORT u
DEFUSHORT a-f
DIM uNumber
DIM eNumber

Dadurch werden 'uNumber' 'eNumber' zu einem USHORT, da ihre
Anfangsbuchstaben b sind, bzw. zwischen d und f liegen.

Siehe auch:
DEFxxx

Unterschiede: Neu in freeBASIC.


DEFxxx

Unter DEFxxx werden alle DEF-Anweisungen zusammengefasst:
DEFBYTE, DEFUBYTE,
DEFSHORT, DEFUSHORT
DEFINT, DEFLNG, DEFUINT,
DEFLONGINT, DEFULONGINT,
DEFSNG, DEFDBL,
DEFSTR

Wenn Sie in ihrem gesamten Programm keine DEFxxx-Anweisung verwenden, wird
automatisch INTEGER als Standarddatentyp festgelegt.


DESTRUCTOR (Klassen)

Syntax:
TYPE TypeName
    ' Feld-Deklarationen

    DECLARE DESTRUCTOR [ () ]
End Type

Synax B:
DESTRUCTOR Typename [ () ]
   ' Anweisungen
END DESTRUCTOR

Typ: Prozedur
Kategorie: Programmorganisation

Ein Klassen-Destruktor ist eine Prozedur, die aufgerufen wird, sobald eine UDT-Variable (user defindet Type - siehe TYPE (UDT)) zerstört wird.

Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

  • 'TypeName' ist der Name eines UDTs, wie er unter TYPE (UDT) erklärt wird.

  • 'Feld-Deklarationen' sind die Deklarationen, die den UDT oder die Klasse ausmachen. Siehe dazu TYPE (UDT), PROPERTY, OPERATOR.
  • Die Parameterliste muss bei Destruktoren leer sein.

  • 'Anweisungen' ist ein Programmcode, der den Regeln einer SUB folgt.

    • Die Destruktor-Prozedur wird aufgerufen, sobald eine UDT-Variable zerstört wird. Dies ist dann der Fall, wenn das Programm beendet wird,
    oder der SCOPE-Block, innerhalb dessen sie erstellt wurde, an ihr Ende kommt.

    Innerhalb der CONSTRUCTOR-Prozedur kann über das Schlüsselwort THIS auf die Records des UDTs zugegriffen
    werden.

    Enthält der zu zerstörende UDT selbst Felder, die Klassen mit eigenen Destruktoren darstellen, so wird der Destruktor des UDTs vor denen
    der Records aufgerufen.

    Innerhalb eines Types kann nur ein einziger Destruktor erstellt werden.

    Klassen-Destruktoren MÜSSEN PUBLIC sein; siehe PUBLIC (UDT).

    Beispiel 1: Praxisnaher Einsatz zur automatischen Speicherfreigabe mit DeAllocate
    Type T
    intPtr As Integer Ptr

    Declare Constructor ( value As Integer )
    Declare Destructor ( )

    Declare Operator Cast () As String
    End Type

    Constructor T ( value As Integer )
    This.intPtr = Allocate(1)
    *This.intPtr = value
    End Constructor

    Destructor T ()
    DeAllocate This.intPtr
    End Destructor

    Operator T.Cast () As String
    Return Str(*This.intPtr)
    End Operator

    Dim x As T = 10

    Print x
    GetKey
    Ausgabe:
    10

    Beispiel 2: Zeitliche Abfolge des Erstellens und Zerstörens unter verschiedenen Bedingungen: Modulebene, Scope-Ebene, Prozedurebene.
    Type T
    value As ZString * 32
    Declare Constructor ( init_value As String )
    Declare Destructor ()
    End Type

    Constructor T ( init_value As String )
    value = init_value
    Print "Erstelle: "; value
    End Constructor

    Destructor T ()
    Print "Zerstoere: "; value
    End Destructor

    Sub MySub
    Dim x As T = ("MySub.x")
    End Sub

    Dim x As T = ("main.x")

    Scope
    Dim x As T = ("main.scope.x")
    End Scope

    MySub

    Sub Quit Destructor
    GetKey
    End Sub
    Ausgabe:
    Erstelle:  main.x
    Erstelle:  main.scope.x
    Zerstoere: main.scope.x
    Erstelle:  MySub.x
    Zerstoere: MySub.x

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • DESTRUCTOR für Klassen existiert seit freeBASIC v0.17

    • Siehe auch:
    DESTRUCTOR, CONSTRUCTOR (Klassen),
    TYPE (UDT), NAMESPACE


DESTRUCTOR (Module)

Syntax: [Public | Private] Sub identifier [Alias "external_identifier"] [()] Destructor [priority] [Static]
Typ: Klausel
Kategorie: Programmorganisation

Die DESTRUCTOR-Klausel bewirkt, dass eine SUB aufgerufen wird, bevor das Programm beendet wird. Dies geschieht sowohl dann, wenn eine END-,
SYSTEM-, oder STOP-Anweisung aufgerufen, als auch, wenn die letzte Anweisung des Hauptmoduls ausgeführt wird. Wurde per Kommandozeile
die Fehlerbehandlung aktiviert, so werden die Destruktoren auch aufgerufen, wenn ein nicht-planmäßiges Programmende auftritt.
(Siehe dazu die Kommandozeile.)

Siehe auch SUB für Details zu Prozeduren.

  • 'PRIVATE' und 'PUBLIC legen fest, ob die SUB PRIVATE oder PUBLIC sein soll; siehe dazu die entsprechenden Einträge der Referenz.

  • 'Name' ist der Bezeichner der SUB. Er folgt den üblichen Regeln.

  • Eine DESTRUCTOR-SUB darf keine Parameterliste besitzen, da kein Weg existiert, festzulegen, welche Parameter übergeben werden.

  • Die 'DESTRUCTOR'-Klausel markiert die SUB als Destruktor.

  • 'Priorität' ist ein INTEGER-Wert zwischen 101 und 65535. Mit diesem Wert kann bei der Existenz mehrerer DESTRUCTOR-SUBs im selben
    Modul die Reihenfolge festgelegt werden, in der die Destruktoren abgearbeitet werden sollen.
    101 ist dabei die höchste Priorität; dieser Destruktor wird zuerst ausgeführt.
    Die Zahlen an sich haben keine spezielle Bedeutung; lediglich die Verhältnisse zueinander (größer als, kleiner als) wirken sich
    tatsächlich im Programmverlauf aus.
    Alle Destruktoren, die mit einer Priorität festgelegt wurden, werden vor denen ausgeführt, die ohne Priorität festgelegt wurden.
    Ein Destruktor mit einem Prioritäts-Wert von 65535 ist wird so behandelt, als wäre ihm keine Priorität zugewiesen worden.

    • Eine solche SUB muss nur dann durch eine DECLARE-Anweisung deklariert werden, wenn sie im Programmverlauf nochmals manuell
    aufgerufen werden soll. Wird sie mit einer normalen DECLARE-Zeile deklariert, so kann sie - wie eine ganz normale SUB - im Programm
    jederzeit aufgerufen werden, und folgt den Regeln einer normalen Prozedur.

    Wird versucht, eine SUB mit der DESTRUCTOR-Klausel zu belegen, die einen oder mehrere Parameter besitzt, so wird ein Compiler-Fehler erzeugt.
    Innerhalb eines Sets von überladenen SUBs (siehe OVERLOAD) kann nur eine einzige DESTRUCTOR-Sub bestimmt werden, da es nicht möglich
    ist, mehrere überladene SUBs mit leerer Parameterliste zu erstellen.

    Innerhalb eines Modules können mehrere Destruktoren verwendet werden. Innerhalb mehrerer Module können ebenfalls zusätzliche
    Destruktoren eingefügt werden, unter der Voraussetzung, dass keine zwei PUBLIC-Destruktoren mit dem selben Bezeichner existieren.

    Werden in einem Modul mehrere Destruktoren ohne Priorität verwendet, so werden diese im Code oben nach unten abgearbeitet.

    Wenn mehrere Module kompiliert werden, die Destruktoren besitzen, kann die Reihenfolge der Ausführung dieser nicht garantiert werden,
    solange keine Priorität angegeben wurde.
    Darauf muss besonders geachtet werden, wenn der Destruktoren eines Moduls eine Prozedur eines anderen Moduls aufruft, das ebenfalls einen
    Destruktor besitzt.
    Es wird empfohlen, einen einzigen Destruktor zu definieren, der die Prozeduren in den einzelnen Modulen manuell aufruft.

    Beispiel:
    Dieses Beispielprogramm enthält ein Set aus zwei Konstruktoren und Destruktoren. Es wird gezeigt, in welcher Reihenfolge diese
    abgearbeitet werden.
    Sub Constructor1() Constructor
    Print "Constructor1() aufgerufen"
    End Sub

    Sub Destructor1() Destructor
    Print "Destructor1() aufgerufen"
    End Sub

    Sub Constructor2() Constructor
    Print "Constructor2() aufgerufen"
    End Sub

    Sub Destructor2() Destructor
    Print "Destructor2() aufgerufen"
    GetKey
    End Sub

    '' ------------------------------------------------------------------------
    Print "Modul-Level Code"

    End 0
    '' ------------------------------------------------------------------------

    Unterschiede
    zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • Die Möglichkeit, eine Priorität zuzuweisen existiert erst seit freeBASIC v0.17

  • existiert seit freeBASIC v0.14

    • Siehe auch:
    CONSTRUCTOR (Module), SUB,
    DESTRUCTOR


DESTRUCTOR

DESTRUCTOR ist ein Schlüsselwort, das in Zusammenhang mit mehreren Sprachkonstrukten eingesetzt werden kann.
Siehe...
  • DESTRUCTOR (Module) zum Zusammenhang mit Prozeduren und modularer Programmierung

  • DESTRUCTOR (Klassen) zum Zusammenhang mit Klassen und UDTs.


DIM

Syntax A:
DIM [SHARED] Variable1 [AS Typ] [= einfacherAusdruck] [, _
             Variable2 [AS Typ] [= einfacherAusdruck] [, _
             ...] ]
Syntax B:
DIM [SHARED] AS Typ Variable1 [= einfacherAusdruck] [, _
                    Variable2 [= einfacherAusdruck] [, _
                    ...] ]
Syntax C:
DIM [SHARED] Array( [ [Startindex TO] Endindex  [, _
                      [Startindex TO] Endindex] [, ...] ] )  [AS Typ] [ _
                   => {einfacherAusdruck [, einfacherAusdruck [, _ ... ] ] } ]

Anmerkung zur Syntax: Unterstriche (_) am Zeilenende werden von freeBASIC so
interpretiert, als wäre die Zeile nicht unterbrochen; dies dient nur der
besseren Übersichtlichkeit, und hat letztenendes keine Auswirkungen auf die
Programmausführung.

Typ: Anweisung
Kategorie: Speicherverwaltung

Dimensioniert Variablen und Arrays einer angegebenen Größe und eines angegebenen
Typs.
Ein Array ist eine Gruppe aus mehreren Variablen selben Typs, auf dessen einzelne
Elemente über einen Index zugegriffen wird.

  • 'Variable' und 'Array' sind die Namen von NEUEN, noch nicht verwendeten Variablen
    oder Arrays.

  • SHARED bewirkt, dass die Variable auch Unterprogrammen
    zugänglich ist.

  • AS Typ gibt an, von welchem Typ die Variable sein soll; wird AS Typ ausgelassen,
    erstellt DIM eine Variable/ein Array vom Standarddatentyp. Dieser ist wird durch
    die letzten DEFxxx-Anweisungen festgelegt.
    Bei Syntax B sind alle Variablen der Liste vom Typ 'Typ'.
    Achtung: Auch FUNCTION kann hier als Typ angegeben werden!
    Siehe dazu DYLIBLOAD.

  • 'einfacherAusdruck' ist ein Ausdruck, der aus Konstanten, Operatoren,
    Funktionen und Symbolen bestehen darf, jedoch nicht aus Variablen.
    Der Wert von 'einfacherAusdruck' wird der dimensionierten Variable
    zugewiesen.
    Um die Elemente eines Arrays zu befüllen, werden die einzelnen Werte in
    {geschweifte Klammern} gesetzt, und durch Kommata getrennt.
    Bei mehrdimensionalen Arrays müssen innerhalb der Klammern noch einmal
    geschweifte Klammern gesetzt werden.
    Siehe auch Variablen-Initiatoren.
    Außerdem ist es möglich, hier 'ANY' anzugeben, um festzulegen, dass die
    Variable nicht initialisiert werden soll; an der Speicherstelle verbleibt
    der 'Datenmüll', der im Speicher zurückgeblieben ist.

    • Einfache Variablen werden folgendermaßen dimensioniert:
    DIM i AS INTEGER, s AS SINGLE

    Nun stellen Sie sich vor, Sie wollten 100 Zahlen speichern, vielleicht sogar
    1000! Dim für 1000 Variablen zu benutzen ist eine riesige Arbeit, daher
    verwendet man Arrays. So dimensionieren Sie ein Array (oft auch Feld genannt)
    mit 1000 Elementen:
    (In diesem Beispiel wird es 'height' genannt.)
    DIM height(1 TO 1000) AS INTEGER
    Dadurch werden 1000 Speicherstellen für INTEGER-Zahlen reserviert, wobei
    der Index des ersten Elements 1 ist, und der des letzten Elements 1000.
    Eine andere Möglichkeit wäre diese:
    DIM height(999) AS INTEGER
    Hier werden ebenfalls 1000 Speicherstellen für INTEGER-Zahlen reserviert,
    jedoch reichen die Indixe in dieser Form von 0 bis 999.
    Wird bei der DIM-Anweisung der Startindex ausgelassen, so wird automatisch
    angenommen, dass der Startindex 0 ist. Durch OPTION BASE lässt
    sich dies ändern.
    Am besten stellen Sie sich den reservierten Speicherbereich als Liste vor, in
    die Alle Werte untereinander eingetragen werden.
    Wollen Sie nun eine Tabelle erstellen, sprich eine Liste mit 2
    Dimensionen, müssen sie auch in der DIM-Anweisung die Größe der zweiten Dimension
    angeben:
    DIM ZweiDimensional (1 TO 100, 50)
    Bis freeBASIC v0.16 wurden Felder mit bis zu vier Dimensionen unterstützt, seit
    v0.16 sind sogar achtdimensionale Felder zulässig.

    Um nun auf die Einträge im Feld zuzugreifen, verwenden Sie die Syntax:
    FeldName(Index [, Index [, ...] ])

    Beispiel:
    DIM feld (3) AS BYTE
    DIM tabelle (2, 4) AS INTEGER

    feld(0) = 10
    feld(1) = -3
    feld(2) = feld(0) + feld(1)

    tabelle(0, 0) = 10

    PRINT feld(1)

    Soll bei der Dimensionierung der Variable sofort ein Wert zugewiesen werden,
    kann dies über die sogenannten Variablen-Initiatoren
    geschehen:
    DIM a AS INTEGER = 5
    DIM AS STRING b = "hello world", c = "freeBASIC" + CHR(13) + "free 32bit Compiler"

    '$STATIC
    ' Nur STATIC-Felder können durch Variablen-Initiatoren befüllt werden.
    DIM Array(1 TO 3, 2) => { {1, 2, 3}, _
    {4, 5, 6}, _
    {7, 8, 9} }

    Es können auch Felder unbekannter Größe erzeugt werden, sofern diese Arrays DYNAMIC
    verwaltet werden. Solche Felder können z.B. an Prozeduren übergeben werden, wo
    sie redimensioniert und befüllt werden.
    Dabei durften solche Felder unbekannter Größe bis freeBASIC v0.16 nur auf
    Modulebene (d.h. nicht in SUBs und FUNCTIONs) verwendet werden; seit freeBASIC
    v0.16 können Felder unbekannter Größe an jedem Programmpunkt erstellt werden.

    Beispiel:
    DECLARE SUB FileList(Path AS STRING, Array() AS STRING)
    DIM AS STRING Files()

    FileList ENVIRON("TMP"), Files()

    SUB FileList(Path AS STRING, Array() AS STRING)
    DIM AS STRING filename
    DIM AS INTEGER i

    filename = DIR(Path + "\*.*")
    IF LEN(filename) THEN
    REDIM Array(0) AS STRING
    Array(0) = filename
    i = 1
    ELSE
    EXIT SUB
    END IF
    DO
    filename = DIR()
    IF LEN(filename) THEN
    REDIM PRESERVE Array(i) AS STRING
    Array(i) = filename
    i += 1
    ELSE
    EXIT DO
    END IF
    LOOP
    END SUB

    ? UBOUND(Files)
    FOR i = 0 TO UBOUND(Files)
    PRINT Files(i)
    NEXT

    GETKEY

    Unterschiede:
    Zu QB:
  • Wenn Sie Variablen als Indexzahl benutzen, müssen Sie das Feld mit REDIM
    dimensionieren, oder DYNAMIC (Metabefehl) benutzen.
    Dies wird sich in Zukunft vielleicht ändern.

  • freeBASIC unterstützt Variablen-Initiatoren.

    • zu früheren freeBASIC-Versionen:
  • seit freeBASIC v0.16 dürfen Felder unbekannter Größe an jedem Programmpunkt, auch in Prozeduren erstellt werden.

    • Siehe auch:
    REDIM, SHARED,
    SCOPE,
    STATIC (Anweisung), COMMON,
    DYNAMIC (Metabefehl), STATIC (Metabefehl),
    OPTION, DYNAMIC (Schlüsselwort), STATIC (Schlüsselwort)
    ERASE, CLEAR,
    Datentypen, Pointer


DIR

Syntax: DIR[$] ( [Dateiangabe] [, Attributnummer] [, RückgabeAttribut] )
Typ: Funktion
Kategorie: Datei

Gibt die Daten im aktuellen Arbeitsverzeichnis zurück.

Das Dollarzeichen ($) als Suffix ist optional.

  • 'Dateiangabe' ist ein String, der den Pattern zu den aufzulistenden Dateien enthält.
    Der String darf auch Pfadangaben und Wildcards enthalten.
    Ein Pattern ist ein Muster, mit dem ein Dateiname verglichen wird. Durch Wildcards, also Platzhalter, kann es auf mehrere Dateien passen.
    Wildcards sind Zeichen, die andere symbolisieren, als da wären:
    * - eine beliebige Zeichenfolge
    ? - ein beliebiges Zeichen, jedoch nur EINES.
    Beispiel:
    "a*.b??"
    Dieses Pattern symbolisiert alle Daten, die mit einem a beginnen, und deren Endung mit einem b beginnt, und 3 Zeichen lang ist.
    Mögliche Ergebnisse wären:
    allocate.bas
    a.bin
    Ist 'Dateiangabe' ein Nullstring (CHR(0) oder "", wird die nächste Datei zurückgegeben, die auf das zuletzt angegebene Pattern passt.
  • 'Attributnummer' ist eine Zahl, die angibt, welche Attribute die zurückzugebenden Dateien haben sollen. Sie ist eine Kombination aus folgenden Werten:
    &H00 | Normal | - keines -
    Wert | Bedeutung | Konstante in der DIR.BI
    &H01 | Schreibgeschützt | fbReadOnly
    &H02 | Versteckt | fbHidden
    &H04 | System | fbSystem
    &H10 | Verzeichnis | fbDirectory
    &H20 | Archiv | fbArchive
    &H21 | Archivierte, Schreibgeschützte Dateien | fbNormal
    &H80 | Normal | - keines -
    &H100 | Temporäre Dateien | - keines -
    &H800 | Komprimiert | - keines -
    (Um die angegebenen Konstanten zu nutzen, müssen Sie die Datei 'DIR.BI' einbinden - siehe INCLUDE. Die Datei 'DIR.BI' existiert erst seit freeBASIC v0.16)
    Kombination bedeutet, dass die oben genannten Eigenschaften durch Addition ihrer zugehörigen Werte verknüpfen lassen.
    Bei einer Kombination von Attributwerten gibt freeBASIC alle Dateien zurück, die in das Pattern passen, und mindestens ein Attributkriterium erfüllen.
    Will man also alle schreibgeschützten oder versteckten Dateien auflisten, muss Attributnummer 2 + 1 bzw. 3 sein. Wenn die Datei 'DIR.BI' eingebunden wurde, kann auch der Ausdruck
    fbReadOnly + fbHidden
    angegeben werden.
    Als Ergebnis werden hier schreibgeschützte Dateien, versteckte Dateien und schreibgeschützte, versteckte Dateien aufgelistet.

    Wird 'AttributNummer' ausgelassen, so nimmt freeBASIC automatisch &H21 an; dies entspricht einer Liste aller normalen Datein, inclusive schreibgeschützter und archivierter Dateien.
  • 'Rückgabeattribut' ist ein INTEGER PTR. Wird hier ein Wert angegeben, schreibt freeBASIC an die Speicherstelle, auf die 'Rückgabeattribut' verweist, welche Attribute auf die gefundene Datei oder Ordner tatsächlich zutreffen.
    Es ist eine Kombination aus den selben Werten, die schon bei 'AttributNummer' angesprochen wurden.
    Wird dieser Wert ausgelassen, oder null angegeben, so schreibt freeBASIC nichts in den Speicher.
    'Rückgabeattribut' wird verwendet, um die Ausgabe selektiver zu gestalten. Stellen Sie sich vor, Sie wollten eine Liste aller Dateien in einem Verzeichnis erstellen, die schreibgeschützt sind, und entweder archiviert sind oder als versteckt markiert wurden; die angabe von
    fbReadOnly + fbArchive + fbHidden
    Bewirkt auch eine Ausgabe von Dateien, bei denen nur ein Kriterium erfüllt ist. Mit 'Rückgabeattribut' kann vor Aufnahme in die Liste geprüft werden, ob die Datei tatsächlich mehrere Kriterien erfüllt; die entsprechende Zeile könnte so aussehen:
    IF (rAttr AND fbReadOnly) <> 0 AND ( (rAttr AND fbHidden) <> 0 OR (rAttr AND fbArchive) <> 0 ) THEN ...
    Eine weiterere Einsatzmöglichkeit ist die Auflistung der Unterordner in einem Verzeichnis; aus bislang unklarer Ursache werden archivierte Verzeichisse bei Angabe von 'fbDirectory' als Attributnummer nicht aufgelistet. Die Attributnummer 'fbDirectory + fbArchive' allerdings listet auch Dateien auf.
    Siehe dazu auch das Beispiel unten.
  • Der Rückgabewert ist ein String, der einen Dateinamen inclusive Erweiterung und ohne Pfadangabe enthält, der auf das letzte angegebene Pattern passt. Wurde keine Datei gefunden, auf die das Pattern passt, wird ein Nullstring ausgegeben.

Beispiel 1: Zwei Daten anzeigen, die mit "a" beginnen:
PRINT DIR("a*", 0)
PRINT DIR("")

Beispiel 2: Verwendung der Attributnummer:
#INCLUDE "DIR.BI"

DECLARE SUB listFiles (filespec AS STRING, attrib AS INTEGER)

SUB listFiles (filespec AS STRING, attrib AS INTEGER)
DIM filename AS STRING

filename = DIR(filespec, attrib)
DO
PRINT SPACE(4); filename
filename = DIR("", attrib)
LOOP WHILE LEN(filename)
END SUB

PRINT "Unterordner:"
listFiles "*", fbDirectory

PRINT "archive files:"
listFiles "*", fbArchive

PRINT "Versteckte und/oder Systemdateien, die mit 'a' beginnen:"
listFiles "a*", fbHidden + fbSystem

Beispiel 3: Alle Unterordner (auch archivierte) in einem Array speichern und ausgeben:
#INCLUDE "DIR.BI"

DECLARE SUB GetFolders( Array() AS STRING )

DIM myFolders() AS STRING, i AS INTEGER
GetFolders( myFolders() )

FOR i = 0 TO UBOUND(myFolders)
PRINT myFolders(i)
NEXT

SUB GetFolders( Array() AS STRING )
DIM AS STRING n
DIM AS INTEGER a, i

REDIM Array(0)

n = DIR("*", fbDirectory + fbArchive, @a)
IF LEN(n) = 0 THEN RETURN
DO
IF a AND fbDirectory THEN
REDIM PRESERVE Array(i)
Array(i) = n
i += 1
END IF
n = DIR()
LOOP WHILE LEN(n)

END SUB

Siehe auch:
OPEN, CURDIR, MKDIR,
RMDIR

Unterschiede:
zu früheren Versionen von freeBASIC:
  • Der optionale Parameter 'RückgabeAttribut' existiert erst seit v0.16.

    • Zu QB:
  • Unter QB war es nicht möglich, nach Dateien mit bestimmten Attributen zu scannen.

  • Unter QB war es nicht möglich, die Attribute der zurückgegebenen Dateien abzufragen.


DO...LOOP

Typ: Anweisung
Kategorie: Schleifen

Syntax A:
DO [{UNTIL | WHILE} Bedingung]
   ' Programmcode
LOOP

Syntax B:
DO
   ' Programmcode
LOOP [{UNTIL | WHILE} Bedingung]

Wiederholt einen Anweisungsblock während/bis eine Bedingung erfüllt ist. Wird keine Bedingung angegeben, so wird eine Endlos-Schleife
erzeugt. Der Programmierer muss über Anweisungen wie EXIT selbst dafür sorgen, dass die Schleife wieder verlassen wird.

Bedingung ist ein nummerischer Ausdruck, der entweder wahr/erfüllt (ungleich null) oder falsch/nicht erfüllt (gleich null) sein kann.
Wird Das Schlüsselwort UNTIL eingesetzt, so führt freeBASIC die Schleife aus, bis (until) die Bedingung erfüllt ist, d.h. bis der
Ausdruck einen Wert ungleich null annimmt.
Wird das Schlüsselwort WHILE eingesetzt, so führt freeBASIC die Schleife aus, solange (while) die Bedingung erfüllt ist, d.h. bis der
Ausdruck gleich null ist.

Als Block-Anweisung initialisiert DO...LOOP seit freeBASIC v0.16 einen SCOPE-Block, der mit der LOOP-Zeile
endet. Variablen, die innerhalb einer solchen Schleife deklariert werden, existieren außerhalb nicht mehr.

Taucht innerhalb des Schleifen-Codes die Anweisung CONTINUE DO auf, so ignoriert freeBASIC den Code bis zum nächsten NEXT, und springt
zurück zur LOOP-Zeile, prüft aber, ob die Bedingung bei LOOP (sofern angegeben) erfüllt wurde.

In Syntax A wird die Bedingung bereits geprüft, bevor die Schleife 'betreten' wird. Bewirkt der Wert der Bedingung dann ein Ende
der Schleife, so wird der Schleifencode übersprungen. Bei Syntax B wird der Wert der Bedingung erst geprüft, wenn der Schleifencode
schon einmal durchlaufen wurde.

DO...LOOP-Blöcke können bis zu beliebiger ebene ineinander verschachtelt werden.

Beispiel 1:
Dim As Integer n = 1
Dim As Integer gerade = 0

Do Until n > 10
If n Mod 2 Then Continue
gerade += 1
Loop
Print "Anzahl gerader Zahlen: "; gerade

Beispiel 2: Eine Endlosschleife, die über EXIT verlassen wird
Dim As Integer n = 1
Dim As Integer ungerade = 0

Do
If n > 10 Then Exit Do

If n Mod 2 Then ungerade += 1
n += 1
Loop

Print "Anzahl ungerader Zahlen: "; ungerade

Unterschiede:
zu QB und VB:
  • Innerhalb einer Schleife durften keine Variablen definiert werden

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.16b wirkt eine DO-LOOP-Schleife wie ein SCOPE-Block

    • Siehe auch:
    FOR...NEXT, WHILE...WEND,
    EXIT, CONTINUE,
    SCOPE,


DO

Typ: Anweisung

Siehe:
DO...LOOP


DOUBLE

Typ: Datentyp

DOUBLE bedeuten doppelte Genauigkeit. Variablen vom Typ DOUBLE sind
vorzeichenbehaftete 64-bit-Fließkommazahlen.
Damit lassen sich bis zu 15 Nachkommastellen darstellen, der Wertebereich
für DOUBLE-Zahlen liegt zwischen -10 ^ 308 und + 10 ^ 308.
Sie werden benutzt, umd sehr genaue Dezimalzahlen zu speichern.
Sie verhalten sich ähnlich zu SINGLE-Variablen, sind
aber genauer.

Wie genau sie auch sein mögen, sie sind immer noch bestimmten Grenzen
unterworfen, so dass große Genauigkeitsverluste auftreten können,
wenn sie nicht richtig verwendet werden.

Beispiel:
DIM a AS DOUBLE
a = 1.985766472453
PRINT a

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST


DRAW (Grafik)

Syntax: DRAW [Puffer,] StringBefehle$
Typ: Anweisung
Kategorie: Gfx

DRAW kann für mehrere verschiedene Zeichenbefehle verwendet werden. Um
kleinere Figuren zu zeichnen, ist es durchaus geeignet.

  • 'Puffer' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter Puffer
    oder ein Array. Beide können mit PUT angezeigt
    werden. Wird 'Puffer' ausgelassen, zeichnet freeBASIC direkt auf den Bildschirm.

  • Stringbefehle ist eine Reihe aus Zeichen. Jedes Zeichen stellt einen eigenen
    Befehl dar. Folgende Befehle sind verfügbar:

    • Grafikcursorbefehle
B | Vor einem eigentlichen Befehl angehängt bewirkt es, dass der Grafikcursor zwar bewegt wird, aber nichts gezeichnet wird.
N | Vor einem eigentlichen Befehl angehängt bewirkt es, dass zwar gezeichnet wird, der Grafikcursor aber nicht bewegt wird.
Mx,y | Zeichnet eine Linie vom ursprünglichen Grafikcursor zu den Koordinaten (x|y). Wenn dem x ein + oder - vorausgeht, sind die Koordinaten relativ zum ursprünglichen Grafikcursor.
U[n] | Zeichnet eine Linie n Pixel nach oben und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
D[n] | Zeichnet eine Linie n Pixel nach unten und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
L[n] | Zeichnet eine Linie n Pixel nach links und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
R[n] | Zeichnet eine Linie n Pixel nach rechts und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
E[n] | Zeichnet eine Linie n Pixel nach oben rechts und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
F[n] | Zeichnet eine Linie n Pixel nach unten rechts und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
G[n] | Zeichnet eine Linie n Pixel nach unten links und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
H[n] | Zeichnet eine Linie n Pixel nach oben links und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt freeBASIC 1 an.
Farb-Befehle:
Cn | Benutzt die Farbe mit der Nummer n als neue Vordergrundfarbe.
Pp,b | Füllt einen Bereich mit der Randfarbe p in der Farbe b aus.
Skalierung und Rotation:
Sn | Setzt die aktuelle Länge pro Einheit. Standardmäßig sind 4 Einheiten eingestellt.
An | Dreht um n * 90 Grad. (n muss zwischen 0 und 3 liegen.)
TAn | Dreht um n Grad. (n muss zwischen 0 und 359 liegen.)
Extrabefehle:
Xp | Führt Befehle von Adresse p aus. Sie können das so benutzen: down10$ = "D10" : DRAW "U10R5X" + VARPTR(down10$) + "L5"
    (Dieser Befehl wurde eventuell noch nicht vollständig implementiert)

    Beispiel:
    DIM Stern AS STRING, buffer As ANY PTR

    SCREEN 18

    Stern = "BF25 C14 NU20 NR20 ND20 NL20 C4 NE10 NF10 NG10 NH10"
    buffer = ImageCreate(200, 200, 1)

    DRAW buffer, Stern

    PUT (10, 10), buffer

    SLEEP

    Unterschiede (zu QB):
  • In freeBASIC ist es möglich, in einen Datenpuffer zu zeichnen

    • Siehe auch:
    DRAW STRING,
    PSET (Grafik), LINE (Grafik), CIRCLE, PAINT,
    GET (Grafik), PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    VIEW (Grafik), WINDOW,
    SCREEN (Anweisung), COLOR (Anweisung),


DRAW STRING

Syntax: DRAW STRING [Puffer, ] [STEP] (x, y), Text [, [Farbe] [, [Font] [, Methode] ]]
Typ: Anweisung
Kategorie: Gfx

DRAW STRING gibt einen Text im Grafikmodus an pixelgenauen Koordinaten aus.
Damit kann in Grafikmodi PRINT (Anweisung) abgelöst werden, das nur auf Zeilen und Spalten
genau ist; siehe LOCATE.
Ein weiterer Vorteil gegenüber PRINT ist, dass der Text transparent ausgegeben
werden kann; Informationen über den Hintergrund gehen nicht zwingend verloren.

DRAW STRING beeinflusst den Grafikcursor, jedoch nicht den Textcursor.

  • 'x' und 'y' sind INTEGER-Ausdrücke, die die linke obere Koordinate angeben,
    an der die Textausgabe beginnen soll.

  • 'STEP' gibt an, dass die Koordinaten relativ zur aktuellen Position des
    Grafikcursors sein sollen.

  • 'Text' ist ein beliebiger Stringausdruck, der die Zeichenkette festlegt, die
    ausgegeben werden soll.
    Auch WSTRINGs werden unterstützt, allerdings können nur die normalen ASCII-
    Zeichen korrekt dargestellt werden; Symbole, deren Zeichencode über 255
    liegt, werden als '?' Fragezeichen dargestellt.

  • 'Farbe' ist die Nummer der Farbe, in der der Text ausgegeben werden soll.
    Wird dieses Argument ausgelassen, verwendet freeBASIC automatisch die von
    COLOR eingestellte Standardfarbe.
  • 'Font' ist ein Pointer auf einen Grafikpuffer, der die zu verwendende
    Schriftart enthält. Mehr zum Format dieses Puffers unten

  • 'Methode' ist ein Aktionswort (evtl. mit Parameter), wie es bei PUT (Grafik)
    verwendet wird. Wird dieser Parameter ausgelassen, verwendet freeBASIC automatisch
    TRANS.
    Diese Aktionswörter können nur mit benutzerdefinierten Fonts verwendet werden,
    nicht aber mit dem Standard-Schriftsatz.

  • 'Puffer' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter Puffer
    oder ein Array. Beide können mit PUT angezeigt
    werden. Wird 'Puffer' ausgelassen, zeichnet freeBASIC direkt auf den Bildschirm.

    • Beispiel 1: DRAW STRING mit dem Standardzeichensatz
    DIM TextPuffer AS ANY PTR

    SCREEN 14, 32

    ' Ein Roter Hintergrund
    PAINT (0, 0), &HFF0000

    ' "Hello World" auf dem Bildschirm ausgeben
    DRAW STRING ( 0, 0), "Hello World"

    ' Zum Vergleich: Bei PRINT verschwindet der Hintergrund
    LOCATE 1, 15
    PRINT "Hello World"

    ' "Hello World" in gelb ausgeben
    DRAW STRING ( 0, 10), "Hello World", &HFFFF00

    ' Standardfarbe auf grün setzen, und "Hello World" in dieser Farbe ausgeben
    COLOR &H00FF00, &HFFFFFF ' Die Hintergrundfarbe hat keine Auswirkungen aus die Textausgabe
    DRAW STRING ( 0, 20), "Hello World"

    ' Zum Vergleich: Print lässt sich nicht genau auf y = 40 Positionieren, und die
    ' Hintergrundfarbe hat Auswirkungen:
    LOCATE 3, 15
    PRINT "Hello World"

    ' Umleitung der Ausgabe in einen Puffer ist Möglich:
    TextPuffer = IMAGECREATE(88, 8)
    DRAW STRING TextPuffer, (0, 0), "Hello World", &H00FFFF
    PUT (100, 100), TextPuffer, PSET

    ' Beim Standard-Schriftsatz bleibt bei jeder Ausgabemethode das Ergebnis das Selbe:
    DRAW STRING ( 0, 30), "Hello World", &HFFFF00, , AND

    ' Für Beispiele, bei denen der Parameter 'Methode' eine Bedeutung hat, siehe unten...

    GETKEY

    Benutzerdefinerte Schriftarten

    Die Font-Data müssen in einem Speicherberich liegen, der wie ein Bildpuffer für
    PUT (Grafik) verwaltet wird. Die Farbtiefe des Puffers muss dieselbe sein, wie
    die, die gerde verwendet wird. Andernfalls erzeugt DRAW STRING den Fehler
    "Unzulässiger Funktionsaufruf". (Siehe Fehler).
    In diesem Puffer stehen alle für die Schriftart verwendeten Zeichen nebeneinander.
    Der Puffer muss also so breit sein, wie alle Zeichen nebeneinander sind. Die
    Die erste Zeile des Puffers enthält den 'Header' der Schriftart. Darin ist
    angegeben, welche Zeichen in der Font dargestellt sind, und wie breit diese sind.
    Folglich ist die Höhe des Puffers gleich der Höhe der Zeichen plus eins.
    Daraus ergibt sich dieser Speicheraufbau:
    Länge in Bytes: (AnzahlDerZeichen + 1) * Breite * (Höhe + 1) + 4
    Bytenummer (Recordgröße) | Bedeutung
0 bis 1 (Word bzw. USHORT) | Breite des Puffers in Pixeln; (AnzahlDerZeichen + 1) * Breite
2 bis 3 (Word bzw. USHORT) | Höhe des Puffers in Pixeln + 1
4 (BYTE) | Version des Font-Headers (0)
5 (BYTE) | ASCII-Code des ersten Zeichens im Puffer
6 (BYTE) | ASCII-Code des letzten Zeichens im Puffer
7 bis 8 + AnzahlDerZeichen (BYTE) | Breite der Zeichen in Pixel
8 + AnzahlDerZeichen bis 7 + (AnzahlDerZeichen * 8) | ungenuzt
(AnzahlDerZeichen * 8) + 7 | Eigentliche Pixeldaten im selben Format wie bei IMAGECREATE
    Diese Tabelle wirkt auf den ersten Blick möglicherweise ein wenig verwirrend; sehen
    Sie sich also dieses Beispiel an:

    Beispiel 2: Erstellen einer Font für DRAW STRING und speichern dieser
    ' Die Schriftart soll die ASCII-Codes 32 bis 128 beinhalten:
    #DEFINE FIRST 32
    #DEFINE LAST 128

    ' Der Puffer für die Schriftart
    DIM AS UBYTE PTR myFont

    ' Ein 800x200x8bpp- Grafikfenster öffnen
    SCREENRES 800, 200, 32

    ' Den Puffer erstellen.
    ' Breite: 97 * 8 Pixel für 97 Zeichen, also 776 Pixel.
    ' Höhe: 9 Pixel, 8 für das Zeichen und eines, um zu speichern, wie breit das Zeichen ist.
    myFont = IMAGECREATE((LAST - FIRST + 1) * 8, 9)

    ' Der "Header" der Font:
    ' myFont[0] bis myFont[3] enthalten die Höhe und Breite des Puffers im IMAGECREATE-Format.
    myFont[4] = 0 ' Version des Font-Headers
    myFont[5] = FIRST ' ASCII-Code des ersten Zeichens in der Schriftart
    myFont[6] = LAST ' ASCII-Code des letzten Zeichens in der Schriftart

    ' Die eigentlichen Pixeldaten:
    FOR i = FIRST TO LAST
    ' Hier könnte für jedes Zeichen eine eigene Breite angegebn werden.
    ' Der Einfachheit halber wird darauf aber verzichtet.
    myFont[7 + i - FIRST] = 8

    ' Den Puffer mit dem Standard-Charset befüllen.
    ' Achtung: Die erste Pixel-Zeile bleibt frei, da hier die Breite der Zeichen
    ' gespeichert wurde.
    DRAW STRING myFont, ((i - FIRST) * 8, 1), CHR(i)
    NEXT i

    ' Ein Test:
    DRAW STRING (100, 100), "Hello world!",, myFont

    ' Der Gesamte Zeichensatz der Schriftart.
    ' Eventuell können Sie eine graue Linie über dem Zeichensatz erkennen, die durch
    ' die Breite-Bytes zustande kommen.
    PUT (0, 1), myFont, PSET

    ' Die Font speichern, um sie später nutzen zu können:
    BSAVE "C:\BASIC\StandardFont.fbf", myFont, (LAST - FIRST + 1) * 8 * 9 * 4 + 7
    ' Der letzte Parameter setzt sich so zusammen:
    ' Der Inhalt der Klammer stellt die Anzahl der Zeichen dar
    ' 8 Pixel ist jedes Zeichen breit
    ' jedes Pixel ist 8 Pixel hoch, zusätzlich wird eine Zeile für die Information
    ' Breite benutzt.
    ' Da ein 32bpp-Modus verwendet wird, sind zusätzlich pro Zeichen 4 Bytes nötig.
    ' 7 Bytes werden für den Header benötigt.

    GETKEY
  • Einmal erstellt, kann eine Schriftart wie im Beispiel mit BSAVE gespeichert und
    später mit BLOAD wieder geladen werden.

  • Die Verwendung des Farb-Parameters ist mit eigenen Schriftarten nicht möglich,
    da die Schriftart selbst schon die Farbe beinhalten kann.

    • Beispiel 3: Der Parameter 'Methode' mit selbstdefinierten Fonts:
    ' Konstanten aus Beispiel 2 übernehmen:
    #DEFINE FIRST 32
    #DEFINE LAST 128

    ' Die Deklaration der benutzerdefinierten Blender-Funktion
    DECLARE FUNCTION checkered_blend( BYVAL src AS UINTEGER, _
    BYVAL dest AS UINTEGER, _
    BYVAL param AS ANY PTR ) AS UINTEGER

    ' Bildschirmmodus 320x240 bei 32bpp
    SCREEN 14, 32

    ' Speicher reservieren für die zu ladende Font:
    DIM AS UBYTE PTR myFont
    myFont = IMAGECREATE((LAST - FIRST + 1) * 8, 9)

    ' Die Font aus Beispiel2 laden:
    BLOAD "D:\BASIC\freeBASIC\StandardFont.fbf", myFont

    ' Ein wenig Hintergrundgrafik
    CLS
    FOR i = 0 TO 190
    v = ABS(SIN(CSNG(i) / 8.0)) * 255.0
    LINE ( i, 0)-(i, 239), RGB(0, 0, v)
    NEXT i

    ' Die einzelnen Methoden vorführen:
    DIM AS INTEGER param = 1
    DRAW STRING (0, 0), "Hello World (PSET)" , , myFont, PSET
    DRAW STRING (0, 8), "Hello World (PRESET)" , , myFont, PRESET
    DRAW STRING (0, 16), "Hello World (AND)" , , myFont, AND
    DRAW STRING (0, 24), "Hello World (OR)" , , myFont, OR
    DRAW STRING (0, 32), "Hello World (XOR)" , , myFont, XOR
    DRAW STRING (0, 40), "Hello World (TRANS)" , , myFont, TRANS
    DRAW STRING (0, 48), "Hello World (ALPHA)" , , myFont, ALPHA, 127
    DRAW STRING (0, 56), "Hello World (ADD)" , , myFont, ADD, 127
    DRAW STRING (0, 64), "Hello World (CUSTOM)" , , myFont, CUSTOM, @checkered_blend, 0
    DRAW STRING (0, 72), "Hello World (CUSTOM)" , , myFont, CUSTOM, @checkered_blend, @param

    ' Speicher wieder freigeben
    IMAGEDESTROY myFont

    GETKEY

    ' Benutzerdefinierter Blender: Karierte Ausgabe des Sprites
    FUNCTION checkered_blend( BYVAL src AS UINTEGER, _
    BYVAL dest AS UINTEGER, _
    BYVAL param AS ANY PTR ) AS UINTEGER
    STATIC cnt
    DIM AS UINTEGER pixel

    pixel = IIF(((cnt AND 2)SHR 1) XOR ((cnt AND 16)SHR 4), src, dest)
    IF param THEN IF *CAST(INTEGER PTR, param) THEN pixel = IIF( (src = &HFF00FF) OR (pixel = dest), dest, src )

    cnt += 1
    RETURN pixel
    END FUNCTION
    Für die Verwendung des Aktionswortes CUSTOM siehe PUT (Grafik).

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen:
  • DRAW STRING ist erst seit freeBASIC v0.16s verfügbar.

    • Siehe auch:
    DRAW (Grafik),
    PRINT (Anweisung), LOCATE (Anweisung), COLOR (Anweisung),
    PSET (Grafik), LINE (Grafik), CIRCLE, PAINT,
    GET (Grafik), PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    VIEW (Grafik), WINDOW,
    SCREEN (Anweisung),


DRAW

Typ: Anweisung

DRAW wird verwendet mit:
DRAW (Grafik)
DRAW STRING


DYLIBFREE

Syntax: DYLIBFREE handle
Typ: Anweisung
Kategorie: Programmorganisation

Gibt den Speicher wieder frei, der durch eine geladene DLL belegt wurde.

handle ist die Nummer der DLL, die durch DYLIBLOAD zurückgegeben wurde.

Beispiel: Siehe DYLIBLOAD

Siehe auch:
DYLIBLOAD, DYLIBSYMBOL


DYLIBLOAD

Syntax: DYLIBLOAD(LibName AS STRING) AS INTEGER
Typ: Funktion
Kategorie: Speicherorganisation

Versucht, eine Dynamic Link Library (DLL) zu laden, und gibt in einer Integer-Variablen
einen Handle zu dieser DLL aus.

LibName ist der Name der DLL, eventuell mit Pfadangabe. Wird keine Erweiterung
angegeben, geht freeBASIC unter Win32 automatisch von ".dll" und unter Linux von
".so" aus. (Eventuell wird vom Compiler nicht geprüft, ob eine Erweiterung
angegeben wurde; Sie sollten keine Erweiterung angeben)
Der Rückgabewert ist ein Handle zur DLL (eine Zahl, über die die DLL
identifiziert und aufgerufen werden kann), wenn die DLL geladen werden konnte,
oder null, wenn der Ladeversuch fehlschlägt.

Durch DYLIBLOAD wird eine externe DLL zur Laufzeit in den Speicher geladen. Ihre
Funktionen sind ab diesem Zeitpunkt theoretisch verfügbar, müssen aber
erst durch DYLIBSYMBOL definiert werden, um
aufgerufen werden zu können.

Nach der Nutzung der Funktionen der DLL sollte der belegte Speicher durch DYLIBFREE
freigegeben werden.

Beispiel (Aus dem Verzeichnis examples/dll in Ihrem freeBASIC-Ordner):
(In diesem Beispiel wird angenommen, dass sich im freeBASIC-Verzeichnis die
Datei "mydll.dll" befindet, die die Funktion "AddNumbers" enthält.)
DIM library AS INTEGER
DIM addnumbers AS FUNCTION( BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) AS INTEGER

library = DYLIBLOAD( "mydll" )
IF( library = 0 ) THEN
PRINT "Cannot load the mydll dynamic library, aborting program..."
END 1
END IF

addnumbers = DYLIBSYMBOL( library, "AddNumbers" )
IF( addnumbers = 0 ) THEN
PRINT "Cannot get AddNumbers function address from mydll library, aborting program..."
END 1
END IF

RANDOMIZE TIMER

x = RND * 10
y = RND * 10

PRINT x; " +"; y; " ="; addnumbers( x, y )

DYLIBFREE library

Siehe auch:
DYLIBFREE, DYLIBSYMBOL


DYLIBSYMBOL

Syntax: DYLIBSYMBOL (Handle, FunktionsName AS STRING) AS INTEGER PTR
Typ: Funktion
Kategorie: Programmorganisation

DYLIBSYMBOL gibt Pointer auf Funktionen innerhalb einer DLL (Dynamic Link Library)
zurück, und macht diese so im Programm aufrufbar.

Handle ist die Nummer einer DLL, die durch DYLIBLOAD zurückgegeben wurde.
RoutinenName ist der Name, die die Funktion innerhalb der DLL trägt.

Beachten Sie, dass Sie die Funktion nicht mit DECLARE, sondern mit
DIM AS FUNCTION(Parameterliste) deklarieren müssen.

Beispiel: Siehe DYLIBLOAD

Siehe auch:
DYLIBLOAD, DYLIBFREE


DYNAMIC (Metabefehl)

Syntax: '$DYNAMIC
Typ: Metabefehl
Kategorie: Speicherverwaltung

'$DYNAMIC ist ein Metabefehl, der sich auf die Verwaltung von Arrays im Speicher auswirkt.

Durch ihn werden alle Arrays als dynamische Arrays definiert, so dass sie variabler Größe sein können, und zur Laufzeit redimensionert
werden können.

'$DYNAMIC kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist '$DYNAMIC nicht mehr zulässig! Um ein Array dynamischer Verwaltung zu erstellen, dimensionieren Sie es mit REDIM,
oder geben Sie bei der Erstellung keine Dimensionen an:
REDIM Dynamisch1 (200) AS INTEGER
DIM Dynamisch2 () AS INTEGER

Beispiel:
'$DYNAMIC
DIM a(100)
ERASE a
REDIM a(200)
(Selbe Verwendung wie in QuickBASIC)

Siehe auch:
'$STATIC (Metabefehl),
OPTION, DYNAMIC (Schlüsselwort),


DYNAMIC (Schlüsselwort)

DYNAMIC

Syntax: OPTION DYNAMIC
Typ: Schlüsselwort
Kategorie: Programmorganisation

Legt fest, dass Arrays standardmäßig DYNAMIC verwaltet werden sollen.
Der Metabefehl DYNAMIC hat die selbe Wirkung wie OPTION DYNAMIC.
Der Metabefehl STATIC und OPTION STATIC setzen diesen Standard außer Kraft.
Wird keiner von beiden Standards explizit gesetzt, freeBASIC von OPTION STATIC aus.

OPTION DYNAMIC kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist OPTION DYNAMIC nicht mehr zulässig! Um ein Array dynamischer Verwaltung zu erstellen, dimensionieren Sie es mit REDIM,
oder geben Sie bei der Erstellung keine Dimensionen an:
REDIM Dynamisch1 (200) AS INTEGER
DIM Dynamisch2 () AS INTEGER

Siehe auch:
DYNAMIC (Metabefehl), STATIC (Metabefehl), OPTION,
DIM, REDIM


DYNAMIC

DYNAMIC ist ein Schlüsselwort, das mit OPTION oder als Metabefehl eingesetzt wird.

Siehe:
DYNAMIC (Schlüsselwort)
DYNAMIC (Metabefehl)


Liste der Schlüsselwörter beginnend mit E

ELSE
ELSEIF
ENCODING
END
ENDIF
ENUM
ENVIRON
EOF
EQV
ERASE
ERFN
ERMN
ERR
ERR (Funktion)
ERR (Anweisung)
ERROR
ERROR (Anweisung)
ESCAPE
EXEC
EXEPATH
EXIT
EXP
EXPLICIT
EXPORT
EXTERN
EXTERN C++
EXTERN (Module)


#ELSE

Typ: Metabefehl
Kategorie: Präprozessoren

Verwendet in Zusammenhang mit: #IF, #IFDEF und #IFNDEF.

Unterschiede
zu QB und VB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC:
  • - keine -


ELSE

Typ: Schlüsselwort
Kategorie: Bedingungen

Siehe IF...THEN.


#ELSEIF

Typ: Metabefehl
Kategorie: Präprozessoren

Verwendet im Zusammenhang mit: #IF, #IFDEF und #IFNDEF.

Unterschiede
zu QB und VB:
  • Neu in freeBASIC.

    • zu früheren Versionen von freeBASIC
  • - keine -


ELSEIF

Typ: Schlüsselwort
Kategorie: Bedingungen

Siehe IF...THEN.


ENCODING

Typ: Schlüsselwort
Kategorie: Datei

ENCODING wird zusammen mit OPEN (Anweisung) verwendet, um festzulegen, in welchem Format die
Daten behandelt werden sollen. Möglich sind:

  • 'ENCODING "ASCII"' - Standard. Die Daten werden im ASCII-Format behandelt.

  • 'ENCODING "UTF-8"' - Gibt an, dass die Daten UTF-8-codiert sind.

  • 'ENCODING "UTF-16"' - Gibt an, dass die Daten UTF-16-codiert sind.

  • 'ENCODING "UTF-32"' - Gibt an, dass die Daten UTF-32-codiert sind.

    • Die ENCODING-Klausel kann nur in sequentiellen Modi verwendet werden (INPUT,
    OUTPUT, APPEND)

    Siehe auch:
    OPEN (Anweisung),
    PRINT (Datei), INPUT (Datei),
    WSTRING (Datentyp)


END

Syntax: END [ {SUB | FUNCTION | IF | SELECT | TYPE | ENUM | SCOPE | NAMESPACE | Rückgabewert AS INTEGER} ]
Typ: Anweisung
Kategorie: Programmorganisation

END beendet einen Kommandoblock oder ein Programm.

Wenn es mit dem Parameter SUB, FUNCTION, IF, SELECT, TYPE, ENUM, SCOPE oder NAMESPACE
benutzt wird, beendet es diesen Codeblock.

Wenn es ohne Parameter benutzt wird, beendet END das laufende Programm, und
kehrt zum Betriebssystem zurück.

Wenn es mit einem Rückgabewert benutzt wird, beendet END das laufende
Programm und sendet den angegebenen Wert an das Betriebssystem.
END ist mit dem C-feature 'return 0' zu vergleichen.
Der zurückgegebene Wert wird auch ERRORLEVEL genannt und spielt zum Beispiel
in BATCH-Programmen eine große Rolle.

Beispiel:
IF a = 2 THEN
' ...
ELSE
' ...
END IF

SELECT CASE ERR
CASE 0
END
CASE 1, 2, 7
END 1
CASE 5, 23, 70
END 2
CASE ELSE
END -1
END SELECT

Siehe auch:
SYSTEM,
IF, SELECT,
TYPE, ENUM, UNION,
SUB, FUNCTION,
SCOPE, NAMESPACE

Unterschiede:
  • Ermöglicht die Rückgabe eines Wertes (ERRORLEVEL) an das Betriebssystem.

  • Die Verwendung mit ENUM, UNION, SCOPE und NAMESPACE ist neu

  • Die Verwendung mit NAMESPACE ist erst seit freeBASIC v0.16s möglich.


#ENDIF

Typ: Metabefehl
Kategorie: Präprozessoren

Verwendet im Zusammenhang mit: #IF, #IFDEF und #IFNDEF.

Unterschiede
zu QB und VB:
  • Neu in freeBASIC.

    • zu früheren Versionen von freeBASIC:
  • - keine -


ENDIF

Typ: Schlüsselwort
Kategorihe: Bedingungen

Siehe IF...THEN.


#ENDMACRO

Syntax:
#MACRO Bezeichner [(Parameterliste)]
   ' Makro-Code
#ENDMACRO
Typ: Metabefehl
Kategorie: Präprozessor

Wird zusammen mit #MACRO benutzt.

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    #MACRO


ENUM

Typ: Anweisung
Kategorie: Programmorganisation
Syntax A:
ENUM [Listenname]
   Element1 [= INTEGER Wert]
   Element2 [= INTEGER Wert]
   Element3 [= INTEGER Wert]
   ...
END ENUM

Syntax B:
ENUM [Listenname]
   Element1 [= INTEGER Wert], Element2 [= INTEGER Wert], ...
END ENUM

ENUM (kurz für enumeration = Nummerierung) erzeugt eine Liste von Konstanten
vom Typ INTEGER, deren Werte ihrer Position im ENUM-Block entspricht. Begonnen wird
dabei mit dem Wert 0.

Soll ein Element einen anderen Wert erhalten, kann dieser per '= Wert' zugewiesen
werden.

Da sich die Elemente wie Konstanten verhalten, ist es nicht möglich, ihnen im Laufe
des Programms andere Werte zuzuweisen.

Beispiel:
ENUM
a
b
c = 4
d
END ENUM

PRINT a, b, c, d
(Ausgabe: 0 1 4 5)

Die Vergabe eines Listennamens ist im Zusammenhang mit DIM
sinnvoll.
Eine Variable, die als ENUM-Liste deklariert wird, kann nur einen Wert annehmen,
der in der Liste aufgeführt ist.

Unterschiede: Neu in freeBASIC.


ENVIRON

Syntax: ENVIRON[$](Systemumgebungsvariable) AS STRING
Typ: Funktion
Kategorie: Verschiedenes

Gibt den Wert einer Systemumgebungsvariable zurück.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
Den Wert der Systemvariable path ausgeben:
PRINT ENVIRON("path")

Siehe auch:
SETENVIRON

Unterschiede (Zu QB):
ENVIRON wird benutzt, um den Wert einer Variable zu ermitteln, nicht, um den Wert
einer solchen zu setzen; diese Funktion wurde von SETENVIRON übernommen.


EOF

Syntax: EOF(f)
Typ: Funktion
Kategorie: Datei

EOF steht für end-of-file (Ende der Datei), und gibt true (-1) zurück, wenn der
Dateicursor das Ende einer geöffneten Datei erreicht hat.

  • 'f' ist dabei die Nummer der Datei die geprüft werden soll. Diese Nummer
    wurde durch die OPEN-Anweisung festgelegt.

    • Beispiel:
    f = FREEFILE ' eine unbenutzte Dateinummer finden
    OPEN "file.ext" FOR INPUT AS #f ' Datei "file.ext" im INPUT-Modus öffnen

    DO UNTIL EOF(f) ' Daten so lange einlesen, bis das Ende erreicht wurde.
    INPUT #f, txt$ ' Zeile in 'txt$' einlesen.
    PRINT txt$ ' Daten auf dem Bildschirm ausgeben.
    LOOP ' Wiederholen

    CLOSE #F ' Datei schließen.

    Siehe auch:


EQV

EQV kann als einfacher und kombinierter Operator eingesetzt werden:

logischer Operator (einfacher Operator)

Syntax: Ausdruck1 EQV Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

EQV vergleicht zwei Werte Bit für Bit, und setzt im Ergebnis nur dann ein Bit,
wenn die entsprechenden Bits in beiden Ausdrücken gleichwertig waren.
EQV wird in Bedingungen eingesetzt, wenn beide Aussagen den selben Status haben
müssen, also entweder beide wahr oder falsch sein müssen.

Beispiel 1: AND in einer IF-THEN-Bedingung:
IF (a = 1) EQV (b = 7) THEN
PRINT "beides erfüllt oder beides nicht erfüllt."
ELSE
PRINT "Entweder a <> 1 aber b = 7 oder a = 1 aber b <> 7."
END IF

Beispiel 2: Komplement zweier Zahlen mit AND:
DIM AS INTEGER z1, z2

z1 = 6
z2 = 10

PRINT z1, BIN(z1, 4)
PRINT z2, BIN(z2, 4)
PRINT "---", "----"
PRINT (z1 EQV z2) AND 15, BIN( (z1 EQV z2) AND 15, 4)
GETKEY
Ausgabe:
  6           0110
 10           1010
---           ----
  3           0011

Anmerkung dazu: Die angewandten AND 15 bewirken, dass nur die letzten vier Bits
angezeigt werden. Der Grund dafür ist, dass INTEGER-Variablen aus 32bit bestehen.
Die übrigen 28bits werden selbstverständlich auch mit IMP verglichen. Würden
diese in dieses Beispiel miteinbezogen, würde dieses Beispiel einen Teil seiner
Anschaulichkeit verlieren.

Siehe auch:
NOT, AND (Operator), OR (Operator), XOR (Operator), IMP,
Logische Operatoren

kombinierter Operator

Syntax: Wert EQV= Ausdruck
Typ: Operator
Kategorie: logische Operatoren

Das kombinierte EQV ist eine Kurzform von
Wert = Wert EQV Ausdruck
Das kombinierte EQV also setzt die Bits im Ergebnis nach den Bedingungen, nach denen
auch das einfache EQV arbeitet.

Beispiel:
DIM AS UBYTE a

a = &B00110011
PRINT BIN(a, 8)
a EQV= &B01010101
PRINT "01010101"
PRINT "--------"

PRINT BIN(a, 8)
GETKEY
Ausgabe:_
00110011
01010101
--------
10011001

Siehe auch:
einfaches EQV,
NOT, AND (Operator), OR (Operator), XOR (Operator), IMP,
Logische Operatoren


ERASE

Syntax: ERASE Array [, Array [,...]]
Typ: Anweisung
Kategorie: Speicherverwaltung

Löscht dynamische Arrays aus dem Speicher, oder setzt alle Elemente eines
statischen Arrays auf 0

  • 'Array' ist dabei der Bezeichner eines Arrays.

  • Es dürfen beliebig viele Array-Bezeichner angegeben werden.

    • Unterschiede
    zu QB:
  • - keine -

    • zu früheren Versionen von freeBASIC:
  • Erst seit freeBASIC v0.11 werden die Elemente statischer Arrays auf null
    gesetzt; davor war der Einsatz von ERASE an diesen nicht zulässig.

    • Siehe auch:
    DIM, CLEAR


ERFN

Syntax: ERFN
Typ: Funktion
Kategorie: Fehler

ERFN gibt einen ZSTRING PTR auf den Namen der Prozedur zurück, in dem ein Fehler aufgetreten ist.
Ihr Projekt muss dabei mit der Kommandozeilenoption
-exx
kompiliert werden. Ist dies nicht der Fall, so kann ERFN nicht eingesetzt werden; der Rückgabewert ist in diese Fall immer null.

Beispiel:
kompilieren Sie dieses Beispiel mit der Kommandozeile
fbc -exx -lang deprecated ERMN_Test.bas
' ERFN_Test.bas

Declare Sub Generate_Error

Sub Generate_Error
On Error Goto Handler
Error 1000
Exit Sub

Handler:
Print "Error Function: "; *Erfn()
Print "Error Module : "; *Ermn()
Resume Next
End Sub

Generate_Error
Ausgabe:
Error Function: GENERATE_ERROR
Error Module  : ERFN_Test.bas

Unterschiede
zu QB und VB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • ERFN existiert erst seit freeBASIC v0.16

    • Siehe auch:
    ERMN, ERL,
    ERROR, ON...ERROR,
    Fehlernummern


ERMN

Syntax: ERMN
Typ: Funktion
Kategorie: Fehler

ERMN gibt einen ZSTRING PTR auf den Namen des Moduls zurück, in dem ein Fehler aufgetreten ist.
Ihr Projekt muss dabei mit der Kommandozeilenoption
-exx
kompiliert werden. Ist dies nicht der Fall, so kann ERMN nicht eingesetzt werden; der Rückgabewert ist in diese Fall immer null.

Beispiel:
kompilieren Sie dieses Beispiel mit der Kommandozeile
fbc -exx -lang deprecated ERMN_Test.bas
' ERMN_Test.bas

Declare Sub Generate_Error

Sub Generate_Error
On Error Goto Handler
Error 1000
Exit Sub

Handler:
Print "Error Function: "; *Erfn()
Print "Error Module : "; *Ermn()
Resume Next
End Sub

Generate_Error
Ausgabe:
Error Function: GENERATE_ERROR
Error Module  : ERMN_Test.bas

Unterschiede
zu QB und VB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • ERMN existiert erst seit freeBASIC v0.16

    • Siehe auch:
    ERFN, ERL,
    ERROR, ON...ERROR,
    Fehlernummern


ERR (Anweisung)

Syntax: ERR = Ausdruck
Typ: Anweisung
Kategorie: Fehlerbehandlung

ERR kann wie eine globale Variable verwendet werden; ein beliebiger INTEGER-Wert
kann dieser Variable zugewiesen werden.
Durch diese Anwendungsweise ist es möglich, benutzerdefinierte Fehler zu
erzeugen. Dies wäre zwar auch mit ERROR möglich,
allerdings wird durch ERROR das Programm beendet, wenn keine Umleitung auf eine
Fehlerbehandlungsroutine mittels ON ERROR durchgeführt wird.
ERR ermöglicht also die Verwendung benutzerdefinierter Fehler ohne die
Kommandozeilenoption -ex (siehe die Kommandozeile)

Es wird empfohlen, möglichst Hohe Zahlen als Fehlernummern für
benutzerdefinierte Fehler zu verwenden, da die unteren Werte bereits von
freeBASIC verwendet werden, und eventuell eine Überschneidung verursachen.
Siehe auch die freeBASIC-Fehlernummern

Siehe auch:
ERROR (Anweisung), ON ERROR,
ERR (Funktion), ERL,
Fehlernummern

Unterschiede (Zu QB):
Die Fehlernummern sind nicht die selben wie in QB.


ERR (Funktion)

Syntax: ERR
Typ: Funktion
Kategorie: Fehlerbehandlung

ERR gibt die Fehlernummer des zuletzt aufgetretenen Fehlers zurück.
Wenn kein Fehler aufgetreten ist, gibt ERR 0 zurück.

Beispiel:
Datei öffnen, die nicht existiert
ON ERROR GOTO FehlerHaendler

OPEN "ThisFileDoesSurelyNotExist.nofile" FOR INPUT AS #1
END

FehlerHaendler:
PRINT "Fehler aufgetreten!"
PRINT "Fehlernummer:";ERR

Siehe auch:
ERROR (Anweisung), ON ERROR, ERR (Anweisung),
ERL,
Fehlernummern

Unterschiede (Zu QB):
Die Fehlernummern sind nicht die selben wie in QB.


ERR

ERR ist ein Schlüsselwort, das als Anweisung, Funktion und Aktionswort
eingesetzt werden kann.

Siehe:
ERR (Anweisung)
ERR (Funktion)
OPEN ERR


ERROR

Syntax: ERROR Fehlernummer AS INTEGER
Typ: Anweisung
Kategorie: Fehlerbehandlung

Simuliert einen auftretenden Fehler.
Kann dazu benutzt werden, benutzerdefinierte Fehler zu erzeugen.

Wenn keine Fehlerbehandlung aktiv ist (siehe ON ERROR), wird das Programm
beendet.

Es wird empfohlen, möglichst hohe Fehlernummern für benutzerdefinierte Fehler zu
wählen, damit sich diese nicht mit den freeBASIC-Fehlernummern überschneiden;
beachten Sie bitte auch, dass in späteren Versionen von freeBASIC evtl. neue
Fehlernummern hinzukommen.

Beispiel:
Fehler 150 erzeugen (einer von vielen möglichen Fehlern...)
ERROR 150

Unterschiede (Zu QB):
Die Fehlernummern sind nicht die selben wie in QB.

Siehe auch:
#ERROR, ON ERROR,
ERL,
ERR (Funktion), ERR (Anweisung),
Fehlernummern


#ERROR

Syntax: #ERROR Nachricht
Typ: Metabefehl
Kategorie: Fehler

#ERROR unterbricht die Kompilierung, und gibt eine benutzerdefinierte Nachricht aus.

Nachricht ist eine beliebige Zeichenfolge, die als Fehlermeldung vom Compiler zurückgegeben werden soll.

Dieser Metabefehl ist zusammen mit #IF sinnvoll.

Beispiel:
#IFDEF __FB_WIN32__
#INCLIB: 'OpenAL32'
#ELSEIF DEFINED(__FB_LINUX__)
#INCLIB: 'openal'
#ELSE
#ERROR Platform not supported
#ENDIF
Dieser Code prüft, auf welchem System der Compiler arbeiten soll. Wenn Windows 32 oder Linux installiert ist, wird eine Version von OpenAL
geladen. Andernfalls gibt FBC.EXE die Meldung "Plattform not supported" aus.

Siehe auch:
ERROR (Anweisung)


ERROR

Typ: Anweisung/Metabefehl

ERROR ist ein Schlüsselwort, das als Anweisung und als Metabefehl eingesetzt
werden kann.
Siehe:
ERROR (Anweisung)
ERROR (Meta)


ESCAPE

Syntax: OPTION ESCAPE
Typ: Schlüsselwort
Kategorie: Verschiedenes

Aktiviert die Verwendung von Escape-Characters in Strings.

Diese Option kann nur bis freeBASIC v0.16 verwendet werden, oder in entsprechend höheren Versionen, die mit der Kommandozeile
-lang deprecated
kompiliert wurden. Für den Einsatz von ESCAPE-Sequenzen in Versionen ab v0.17 mit der Option '-lang fb' siehe unter 'ab freeBASIC v0.17'.

Durch diese Option werden in freeBASIC werden Backslashes ( "\", CHR(92) ) als Escape-Characters verwendet. Der Ausdruck hinter dem
Escape-Character wird nicht 1:1 ausgegeben, sondern zuerst interpretiert. Folgt dem Character eine Zahl, so funktioniert der Character
wie ein CHR; anstelle der Zahl wird das zugehörige ASCII-Zeichen ausgegeben. Die Zahl kann in jedem beliebigen Zählsystem angegeben
werden, wenn die Präfix &? verwendet wird (z.B. &H für Hexadezimal).

Außerdem behandelt freeBASIC diese Strings folgendermaßen:
  • \r wie ein CHR(13) (carriage-return)

  • \n und \l wie ein CHR(10) (line-feed). \r\n ergibt also ein CRLF, der EDV-Version eines Zeilenumbruchs.

  • \a wie ein CHR( 7) (Bell)

  • \b wie ein CHR( 8) (Backspace)

  • \t wie ein CHR( 9) (Tab)

  • \v wie ein CHR(11) (vtab)

  • \f wie ein CHR(12) (formfeed)

  • \a_double_quote wie ein CHR(34) (Doppeltes Anführungszeichen (")

  • \' wie ein CHR(39) (Einfaches Anführungszeichen (')

  • Alle anderen Zeichen hinter dem Escape-Char werden so interpretiert, wie Sie im
    Ausdruck stehen. \\ wird also zu \. Beachten Sie dies, wenn Sie OPTION ESCAPE
    in Zusammenhang mit Pfadangaben verwenden!

    • Seit freeBASIC v0.16s ist es möglich, einem String ein Dollarzeichen $ voranzustellen. In diesem Fall wird für diesen String die Interpretation
    der Escape-Zeichen deaktiviert. Dies ist natürlich nicht nötig, wenn OPTION ESCAPE nicht verwendet wird.

    Beispiel:
    OPTION ESCAPE

    #DEFINE CRLF "\r\n"

    DIM AS STRING message

    message = "\45 this is the \"first\" line\r\nthis is the \"second\" line \45"
    PRINT message

    PRINT CRLF + "^-- CRLF --V" + CRLF;

    PRINT "The Path is \34" $"C:\FREEBASIC\33a" "\34"
    GETKEY
    Ausgabe:
    - this is the "first" line
    this is the "second" line -

    ^-- CRLF --V
    The Path is "C:\FREEBASIC\33a

    ab freeBASIC v0.17

    Da mit freeBASIC v0.17 die Verwendung von OPTION-Standards nicht mehr zulässig ist, müssen Strings, die Escape-Sequenzen enthalten,
    jetzt explizit markiert werden. Dies geschieht dadurch, dass ihnen ein Ausrufezeichen vorangestellt wird:
    !"String, der Escape-Sequenzen enthält".
    Das oben gezeigte Beispiel muss also für freeBASIC ab v0.17 folgendermaßen lauten, wenn die Kommandozeilenoption '-lang fb' lautet:
    #DEFINE CRLF !"\r\n"

    DIM AS STRING message

    message = !"\45 this is the \"first\" line\r\nthis is the \"second\" line \45"
    PRINT message

    PRINT CRLF + !"^-- CRLF --V" + CRLF;

    PRINT !"The Path is \34" "C:\FREEBASIC\33a" !"\34"
    GETKEY
    Die Markierung von Strings, die nicht geparsed werden sollen, mit einem Dollarzeichen $ ist also nicth mehr nötig; aus Kompatibilitätsgründen
    ist sie aber immer noch erlaubt. Die letzte Zeile dieses Beispiels dürfte also ebenso lauten:
    PRINT !"The Path is \34" $"C:\FREEBASIC\33a" !"\34"

    Unterschiede:
    zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.17 muss mit der Kommandozeilenoption '-lang deprecated' kompiliert werden, um OPTION ESCAPE einsetzen zu können.
    Soll stattdessen nach '-lang fb' übersetzt werden, so werden Strings, die Escape-Sequenzen enthalten mit einem Ausrufezeichen
    markiert:
    !"String, der Escape-Sequenzen enthält".
  • Seit freeBASIC v0.16s ist es möglich, Strings ein Dollarzeichen $ voranzustellen, um die Interpretation der Escape-Chars zu unterdrücken.

  • Seit freeBASIC v0.14 werden Escape-Chars in INCLUDE- und INCLIB-Anweisungen nicht mehr interpretiert.

    • zu QB:
  • Neu in freeBASIC

    Siehe auch:
    OPTION


EXEC

Syntax: EXEC( Programm AS STRING, Parameter AS STRING ) AS INTEGER)
Typ: Funktion
Kategorie: Programmorganisation

Führt das angegebene Programm aus, und liefert seinen Errorlevel zurück.

  • Programm ist ein STRING, der das auszuführende Programm angibt. Eventuell muss
    der volle Pfad des Programms angegeben. Falls er ausgelassen wird, nimmt
    freeBASIC an, dass sich das Programm im aktuellen Arbeitsverzeichnis befindet.

  • Parameter gibt an, welche Parameter an das auszuführende Programm übergeben
    werden sollen. Wenn keine Parameter übergeben werden sollen, benutzen Sie einfach
    einen Nullstring (CHR(0) bzw. ""). Parameter darf NICHT ausgelassen werden!

  • Der Rückgabewert ist das vom Programm gesetzte ERRORLEVEL (siehe END), oder -1,
    wenn das Programm nicht aufgerufen werden konnte.

    • Während das angegebene Programm ausgeführt wird, unterbricht freeBASIC
    die Ausführung des eigentlich Programms.

    Unterschiede:
    zu QB:
  • Neu in freeBASIC.

    • Siehe auch:
    RUN, CHAIN, SHELL,
    END,COMMAND,
    CONSTRUKTOR, DESTRUCTOR


EXEPATH

Syntax: EXEPATH AS STRING
Typ: Funktion
Kategorie: Programmorganisation

Gibt den Arbeitspfad des gerade ausgeführten Programms zurück.
EXEPATH hat NICHT dieselbe Funktion wie CURDIR:

Beispiel:
CHDIR "C:"
PRINT "Das Programm befindet sich in: "; EXEPATH
PIRNT "Das aktuelle Arbeitsverzeichnis ist: "; CURDIR

Siehe auch:
CURDIR, CHDIR

Unterschiede: Neu in freeBASIC.


EXIT

Syntax: EXIT {SUB | FUNCTION | DO | FOR | WHILE | SELECT }
Typ: Anweisung
Kategorie: Schleifen

Verlässt einen Codeblock wie SUB, FUNCTION, oder Schleifen wie DO...LOOP, FOR...NEXT,
oder WHILE...WEND sowie eine SELECT-CASE-Abfrage.

Beispiel: Der PRINT-Befehl wird nie ausgeführt.
DO
EXIT DO
PRINT "Wird nie ausgeführt"
LOOP

Unterschiede
zu QB:
  • Unter QB waren nur EXIT { DEF | DO | FOR | FUNCTION | SUB } möglich.

  • EXIT DEF existiert unter freeBASIC nicht mehr.

    • zu früheren Versionen von freeBASIC:
  • EXIT SELECT ist erst seit freeBASIC v0.16 möglich.

    • Siehe auch:
    SUB, FUNCTION,
    DO...LOOP, WHILE...WEND, FOR...NEXT
    CONTINUE


EXP

Syntax: EXP( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt die Potenz einer angegebenen Zahl zur eulerschen e zurück.
e ist näherungsweise 2.718281828459045.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist eine DOUBLE-Zahl, die das Ergebnis des Ausdrucks
    e ^ 5
    darstellt.

    • EXP ist die Gegenfunktion zu LOG

    Beispiel:
    Berechnung des Kapitals mit Zinseszins
    DIM r AS DOUBLE
    DIM p AS DOUBLE
    DIM t AS DOUBLE
    DIM a AS DOUBLE

    INPUT "Bitte geben Sie das ursprünglich investierte Kapital ein: "; p
    INPUT "Bitte geben Sie die jährliche Verzinsung (als Dezimale) ein: "; r
    INPUT "Bitte geben Sie den Verzinsungszeitraum in Jahren ein: "; t

    a = p * Exp ( r * t )
    PRINT ""
    PRINT "Nach";t;" Jahren wird bei einer Verzinsung von"; r * 100; "% ihr Ausgangskapital von"; p; "$ "
    PRINT a; "$ wert sein."
    GETKEY
    Ausgabe:
    Bitte geben Sie das ursprünglich investierte Kapital ein: 100
    Bitte geben Sie die jährliche Verzinsung (als Dezimale) ein: .08
    Bitte geben Sie den Verzinsungszeitraum in Jahren ein: 20

    Nach 20 Jahren wird bei einer Verzinsung von 8% ihr Ausgangskapital von 100$
    495.3032424395115$ Wert sein.

    Siehe auch:
    LOG
    mathematische Operatoren


EXPLICIT

Syntax: OPTION EXPLICIT
Typ: Schlüsselwort
Kategorie: Programmorganisation

Durch OPTION EXPLICIT müssen alle Variablen durch DIM, COMMON, STATIC oder in einem Prozedur-Header definiert werden; dadurch kann
verhindert werden, dass versehentlich falsche Datentypen verwendet werden, oder dass unerwünschte Effekte durch Tippfehler auftreten.
Diese Funktion ist normalerweise deaktiviert.
OPTION EXPLICIT kann auch in der Mitte des Codes aktiviert werden. Im Codeteil vor dem OPTION-EXPLICIT-Aufruf ist dann eine 'implizite Deklaration',
also eine Verwendung von Variablen ohne vorherige Definition durch DIM, COMMON oder STATIC erlaubt.

OPTION EXPLICIT kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist OPTION EXPLICIT nicht mehr zulässig! Stattdessen müssen ab dieser Version alle Variablen IMMER explizit deklariert
werden; eine implizite Deklarierung ist verboten.

Unterschiede
zu QB:
  • neu in freeBASIC

    • zu VB:
  • keine

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.17 ist diese Option nicht mehr nötig, wenn die Compileroption -lang fb eingesetzt wird. Siehe freeBASIC-Dialektformen.

    Siehe auch:
    DIM, COMMON, STATIC, OPTION


EXPORT

Syntax: DECLARE FUNCTION foo CDECL ( Argumente ) AS output_type EXPORT
Typ: Klausel
Kategorie: Programmorganisation

Wenn eine FUNCTION in einer DLL mit der EXPORT-Klausel deklariert wurde, wird sie zur PUBLIC-EXPORT-Tabelle hinzugefügt, so dass sie von
externen Programmen aus mit DYLIBSYMBOL verlinkt werden kann.
Die FUNCTION muss mit der CDECL-Klausel deklariert sein.
Stellen Sie sicher, dass Sie den Compiler mit der Kommandozeilenoption '-export' aufrufen, da sonst die Klausel übergangen wird.
(Siehe: Kommandozeilenoptionen)

Beispiel:
'mydll.dll
DECLARE FUNCTION AddNumbers CDECL ALIAS "AddNumbers" ( BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) AS INTEGER EXPORT

FUNCTION AddNumbers CDECL ALIAS "AddNumbers" ( BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) AS INTEGER EXPORT
AddNumbers = operand1 + operand2
END FUNCTION

'------------------------------------------------------------------------------'

'Hauptprogramm
' Erstelle einen Funktionspointer
' Argumente sind die selben wie in der DLL
DIM AddNumbers AS FUNCTION ( BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) AS INTEGER

hndl = DYLIBLOAD("mydll.dll")
' Adresse des Programms finden (Groß/Kleinschreibung beachten!)
AddNumbers = dylibsymbol( hndl, "AddNumbers" )
' Aufrufen
PRINT "1 + 2 ="; AddNumbers( 1, 2 )
SLEEP

Wichtig:
  • Wenn Sie die ALIAS-Klausel nicht benutzen, verwendet freeBASIC den von Ihnen angegebenen Programmnamen in
    Großbuchstaben.

  • Wenn Sie Ihr Programm nicht CDECL deklarieren, müssen Sie auch @arg_count_in_bytes an GetProcAddress übergeben. (Dies bedeutet, es wird
    BYREF eine Adresse übergeben, an der die Anzahl der Bytes gespeichert ist)

    • Unterschiede
    zu QB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC:
  • EXPORT existiert seit freeBASIC v0.11.

    • Siehe auch:
    DECLARE, DYLIBLOAD, DYLIBSYMBOL


EXTERN

Syntax: EXTERN [IMPORT] Bezeichner [ALIAS "Aliasname"] [AS Typ]
Typ: Anweisung
Kategorie: Programmorganisation

EXTERN wird benutzt, um auf externe Variablen zuzugreifen, die in anderen Modulen
oder DLL's deklariert sind. Im Gegensatz zu COMMON wird kein Speicherplatz
reserviert.
Es wurde hinzugefügt, um die C-Bibliotheken wie Allegro und DirectX zu unterstützen.

  • 'IMPORT' muss verwendet werden, wenn auf Win32-DLLs zugegriffen wird, da
    hier Symbole auf eine andere Art verwaltet werden.

  • 'Bezeichner' ist der Name, unter dem eine Globale Variable der DLL oder des
    Moduls angesprochen werden soll.

  • 'Aliasname' ist der Name, den die Variable im externen Programm trägt.

  • 'Typ' ist ein beliebige Datentyp, wie z.B. INTEGER, oder ein UDT
    (user defined Type; siehe TYPE)

    • Beispiel:
    ' Modul1.bas
    EXTERN Foo ALIAS "foo" AS INTEGER

    SUB SetFoo
    foo = 1234
    END SUB

    '------------------------------------------------------------------------------'

    ' Modul2.bas
    DECLARE SUB SetFoo
    EXTERN Foo ALIAS "foo" AS INTEGER
    DIM foo AS INTEGER = 0

    SetFoo
    PRINT Foo

    Unterschiede:
    zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • existiert erst seit freeBASIC v0.11

    • Siehe auch:
    EXTERN C++
    COMMON


EXTERN

Syntax: EXTERN "C++"
Typ: Anweisung
Kategorie: Programmorganisation

'EXTERN "C++"' startet einen Block, innerhalb dessen alle Deklarationen
behandelt werden, als wären sie von GNU C++ erstellt worden. Nur Deklarationen
sind zulässig, sogenannte "ausführbare Anweisungen" sind unzulässig.
Im Detail sind die erlaubten Anweisungen innherhalb eines Namespaces:
  • DIM

  • STATIC

  • COMMON

  • DECLARE

  • TYPE

  • UNION

  • ENUM

  • CONST

    • Der Vorteil einer solchen Behandlung ist, dass der Linker einen leichter
    lesbaren Namen zurückgibt, wenn eine Referenz nicht gefunden werden konnte.
    Außerdem werden alle Prozedur-Deklarationen automatisch mit der CDECL-Aufruf-
    Konvention versehen.

    Beispiel:
    EXTERN "C++"
    ' Auch innerhalb des Namsepaces gilt die C++-Behandlung
    NAMESPACE Ns1
    DECLARE FUNCTION theFunction( BYVAL AS INTEGER ) AS UINTEGER
    END NAMESPACE
    END EXTERN

    ' Innerhalb dieses Namespaces gilt die freeBASIC-Behandlung
    NAMESPACE Ns2
    DECLARE FUNCTION theFunction( BYVAL AS INTEGER ) AS UINTEGER
    END NAMESPACE

    /' Beide Funktionen existieren nicht; für beide wird also eine Fehlermeldung
    ausgegeben.
    Hier wird allerdings demonstiert, wie GNU C++ und freeBASIC die Bezeichner
    intern handhaben; die Fehlermeldung EXTERN C++-Funktion ist westentlich
    einfacher zu lesen:
    '/

    Print Ns1.theFunction( 1 )
    Print Ns2.theFunction( 1 )

    /' Fehlermeldung für Ns1.theFunction:
    FBIDETEMP.o:fake:(.text+0x54): undefined reference to `Ns1::theFunction(int)'
    Fehlermeldung für Ns2.theFunction:
    FBIDETEMP.o:fake:(.text+0x68): undefined reference to `_ZN3NS211THEFUNCTIONEi@4
    '/

    Unterschiede:
    zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • Die Verwendung als EXTERN "C++" existiert erst seit freeBASIC v0.16s

    • Siehe auch:
    EXTERN (Module),
    NAMESPACE,
    DECLARE,
    CDECL


EXTERN

EXTERN ist ein Schlüsselwort, das für Modulare Programmierung sowie zur
Festlegung von Aufrufkonventionen benutzt werdne kann:

Siehe:
  • EXTERN (Module)
  • EXTERN C++


Liste der Schlüsselwörter beginnend mit F

freeBASIC Fehlernummern
FIELD
FILEATTR
FILECOPY
FILEDATETIME
FILEEXISTS
FILELEN,
FIX
FLIP
FOR
FOR...NEXT
FORMAT
FRE
FREEFILE
FUNCTION


freeBASIC-Fehlernummern

Bislang existieren in freeBASIC die folgenden Fehlernummern:

Fehlernummer | Bedeutung (deutsch) | Bedeutung (engl. Original)
0 | Kein Fehler |
1 | Unzulässiger Funktionsaufruf | illegal function call
2 | Datei nicht gefunden | file not found
3 | Datei Ein/Ausgabefehler | file I/O error
4 | Kein freier Speicher | out of memory
5 | Ungültiges Ergebnis | illegal resume
6 | Außerhalb der Dimensionsgrenzen | out of bounds array access
7 | Zugriff auf null-Pointer | null pointer access
8 | Keine Privilegien | no priviledges Anmerkung: der korrekte Plural von privilege wäre privileges...
9 | Abbruch-Signal | "interrupted" signal
10 | Unzulässiger Befehl | "illegal instruction" signal
11 | Floating-Point-Fehler (Kommazahlen?) | "floating point error" signal
12 | "segmentation violation"-Signal | "segmentation violation" signal
13 | Anfrage auf Programmbeendung | "termination request" signal
14 | unnormale Programmbeendung | "abnormal termination" signal
15 | Anfrage auf Beendigung | "quit request" signal

Siehe auch:
ERROR (Anweisung), ERR (Funktion),
ON ERROR,
OPEN (Funktion)


FIELD

Syntax: TYPE UDTName FIELD = { 1 | 2 | 4 }
Typ: Schlüsselwort
Kategorie: Speicherorganisation

FIELD wird zusammen mit TYPE verwendet, und legt dort das Padding-Verhalten fest.
Dieses bestimmt, dass UDTs auf eine bestimmte Länge "ausgedehnt" werden sollen.
Der Zweck liegt darin, dass auf solche ausgedehnten Felder z.T. schneller
zugegriffen werden kann.

Das Feld wird dabei so ausgedehnt, dass die Anzahl der Bytes, die das Feld im
Speicher benötigt, ein ganzzahliges Vielfaches von 1, 2 oder 4 ist.

Da freeBASIC ein 32bit-Compiler ist, wird standardmäßig die Feldbreite 4 verwendet,
da 32bit 4 Byte entsprechen.

Beispiel:
TYPE BytePacked FIELD = 1
i AS INTEGER
b AS BYTE
END TYPE

TYPE WordPacked FIELD = 2
i AS INTEGER
b AS BYTE
END TYPE

TYPE DWordPacked FIELD = 4
i AS INTEGER
b AS BYTE
END TYPE

PRINT LEN( BytePacked)
PRINT LEN( WordPacked)
PRIND LEN(DWordPacked)
Ausgabe:
5
6
8

Unterschiede
zu QB:
  • QB unterstützte noch kein Padding. Daher war die Feldbreite immer 1. Beachten
    Sie dies, wenn Sie Dateien, die von QB generiert wurden in FB einlesen.

  • Unter QBASIC wurde FIELD verwendet, um die Puffergröße bei RANDOM-Files
    festzulegen - siehe OPEN.
    Diese Verwendung ist unfer freeBASIC nicht mehr möglich.


FILEATTR

Syntax: FILEATTR ( Dateinummer, [Ausgabe] )
Typ: Funktion
Kategorie: Datei

Gibt Informationen über eine mit OPEN geöffnete Datei zurück.

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei file.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.
Alternativ können Sie auch die Datei vbcompat.bi einbinden, da diese die file.bi automatisch in Ihr Programm lädt.

  • 'Dateinummer' ist dabei die Nummer, die beim Öffnen mit OPEN zugewiesen wurde.

  • 'Ausgabe' ist eine beliebige Zahl, die angibt, welche Information über die Datei zurückgegeben werden soll. Siehe unten, welcher Wert
    welche Information zurückgibt.
    Wird dieser Parameter ausgelassen, nimmt freeBASIC automatisch 1 an.

  • Der Rückgabewert ist eine INTEGER-Zahl, die abhängig ist von 'Ausgabe' ist und die Eigenschaften einer Datei beschreibt.
    Kann eine Information nicht abgefragt werden, z.B. weil die angegebene Dateinummer nicht belegt ist, so ist der Rückgabwert immer 0.

    • Abhängig von 'Ausgabe' werden verschiedene Werte ausgegeben. Um den Code besser lesbar zu gestalten, sind in der Datei 'file.bi' Symbole
    definiert worden, die die Information hinter den Zahlenwerten in Worten wiedergeben. Folgende Werte können angegeben werden, bzw. werden
    ausgegeben:
    Wert für 'Ausgabe' | Symbol für 'Ausgabe' | Zurückgegebene Information | Rückgabewerte | Symbole für Rückgabewerte
1 | fbFileAttrMode | Dateimodus (z.B. BINARY), in dem 'Dateinummer' geöffnet wurde | 1 2 4 8 32 | fbFileModeInput fbFileModeOutput fbFileModeRandom fbFileModeAppend fbFileModeBinary
2 | fbFileAttrHandle | Der Handle, über den das System auf die Datei zugreift. Es ist der selbe Handle, den die C Runtime-Library verwendet. Nur unter Windows: Wenn an dieser Stelle der Handle der Handle eines geöffneten COM-Geräts abgefragt wird, gibt freeBASIC das Ergebnis der API CreateFile() zurück. Der Rückgabewert für den Handle eines geöffneten LPT-Geräts ist das Ergebnis der API OpenPrinter(). Diese Handle-Werte können an andere Windows-API-Funktionen übergeben werden. Nur unter Linux: Der Rückgabewert für ein geöffnetes COM-Gerät ist der Datenbezeichner, der von OPEN() zurückgegeben wird. | - entfällt - | - entfällt -
3 | fbFileAttrEncoding | Die Codierungsvariante (z.B. ASCII, UTF-8), mit der die Datei behandelt wird. Siehe auch ENCODING | 0 1 2 3 | fbFileEncodASCII fbFileEncodUTF8 fbFileEncodUTF16 fbFileEncodUTF32

    Beispiel 1:
    #INCLUDE "file.bi"

    DIM f AS INTEGER
    f = FREEFILE

    OPEN "C:\BASIC\freeBASIC\fbc.exe" FOR INPUT AS #f

    SELECT CASE FILEATTR(f, fbFileAttrMode)
    CASE fbFileModeInput
    PRINT "Die Datei wurde im INPUT-Modus geoeffnet"
    CASE fbFileModeOutput
    PRINT "Die Datei wurde im OUTPUT-Modus geoeffnet"
    CASE fbFileModeAppend
    PRINT "Die Datei wurde im APPEND-Modus geoeffnet"
    CASE fbFileModeRandom
    PRINT "Die Datei wurde im RANDOM-Modus geoeffnet"
    CASE fbFileModeBinary
    PRINT "Die Datei wurde im BINARY-Modus geoeffnet"
    END SELECT

    PRINT "Das System-Handle zur Datei ist"; FILEATTR(f, fbFileAttrHandle)

    SELECT CASE FILEATTR(f, fbFileAttrEncoding)
    CASE fbFileAttrEncodASCII
    PRINT "Die Datei ist als ASCII-Datei geoeffnet"
    CASE fbFileAttrEncodUTF8
    PRINT "Die Datei ist als UTF-8-Datei geoeffnet"
    CASE fbFileAttrEncodUTF16
    PRINT "Die Datei ist als UTF-16-Datei geoeffnet"
    CASE fbFileAttrEncodUTF32
    PRINT "Die Datei ist als UTF-32-Datei geoeffnet"
    END SELECT

    CLOSE #f

    GETKEY
    Ausgabe:
    Die Datei wurde im INPUT-Modus geoeffnet
    Das System-Handle zur Datei ist 2009267424
    Die Datei ist als ASCII-Datei geoeffnet

    Beispiel 2:
    #INCLUDE "vbcompat.bi"
    #INCLUDE "crt.bi"

    DIM f AS FILE PTR, i AS INTEGER

    ' Öffne eine Datei, und schreibe einige Zeilen in diese
    OPEN "test.txt" FOR OUTPUT AS #1
    f = CAST( FILE PTR, FILEATTR( 1, fbFileAttrHandle ))
    FOR i = 1 TO 10
    fprintf( f, !"Line %i\n", i )
    NEXT i
    CLOSE #1

    ' Öffne die Datei erneut, und lese den Text aus dieser

    OPEN "test.txt" FOR INPUT AS #1
    f = CAST( FILE PTR, FILEATTR( 1, fbFileAttrHandle ))
    WHILE feof(f) = 0
    i = fgetc(f)
    PRINT CHR(i);
    WEND
    CLOSE #1

    Unterschiede:
    Zu QBX und VBDOS:
  • Keine für 'Ausgabe = 1'

  • QBX und 16bit-VB (VBDOS) gaben einen DOS-Datenhandle zurück, wenn 'Ausgabe = 2'.

  • 'Ausgabe = 3' kann erst seit freeBASIC ganutzt werden.

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    FILECOPY, FILEDATETIME, FILEEXISTS, FILELEN,
    OPEN, CLOSE, ENCODING


FILECOPY

Syntax: FILECOPY ( Quelle, Ziel )
Typ: Funktion
Kategorie: Datei

Kopiert die Datei 'Quelle' nach 'Ziel'.
Diese Funktion entspricht der VB-Funktion FILECOPY.

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei file.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.
Alternativ können Sie auch die Datei vbcompat.bi einbinden, da diese die file.bi automatisch in Ihr Programm lädt.

  • 'Quelle' ist ein STRING, der den Dateinamen der zu kopierenden Datei enthält.
    Diese Angabe darf eine Pfadangabe enthalten. Wird kein Pfad angegeben, so nimmt freeBASIC an, dass sich die Datei im aktuellen Arbeitsverzeichnis
    befindet.

  • 'Ziel' ist ein STRING, der den Dateinamen enthält, den die Kopie erhalten soll.
    Diese Angabe MUSS einen Dateinamen enthalten, und darf nicht nur aus einer Pfadangabe bestehen, darf eine solche jedoch enthalten.
    Sind 'Quelle' und 'Ziel' identisch, so wird nichts kopiert.

  • Der Rückgabewert ist entweder 0, wenn der Kopiervorgang erfolgreich abgeschlossen wurde, oder 1, wenn ein Fehler aufgetreten ist.
    Mögliche Fehler sind:
    - Die Datei in 'Quelle' existiert nicht.
    - 'Ziel' und Quelle' sind identisch.
    - Als 'Quelle' oder 'Ziel' wird ein unzulässiger Dateiname angegeben. Ein unzulässiger Dateiname enthält Zeichen wie \/|:<>*? oder ".
    - Die Pfadangabe in 'Quelle' oder 'Ziel' existiert nicht.

    • Achtung: Existierende Dateien werden ohne Nachfrage überschrieben!

    Beispiel:
    Achtung: Dieses Beispiel erstellt selbstständig die Dateien 'Src.txt" und 'Dst.txt' in 'C:\TMP\', und löscht diese Dateien nach Programmende
    automatisch. Passen Sie das Programm an, wenn sich in Ihrem Dateisystem in diesem Verzeichnis schon Daten mit den angegebenen Namen befinden,
    da diese sonst überschrieben werden.
    Wenn in Ihrem Dateisystem ein Ordner 'C:\TMP\' existiert, dieser aber keine Dateien 'Src.txt' oder 'Dst.txt' enthält, können Sie dieses
    Beispiel ohne Problem ausführen, da andere Daten nicht beeinflusst werden.
    Das Verzeichnis 'C:\TMP\' wird automatisch erstellt, wenn es noch nicht existiert, und automatisch aus dem System entfernt, wenn sich keine
    Daten darin befinden.
    #INCLUDE "file.bi" ' Die Dateifunktionen aktivieren

    CHDIR "C:\" ' In das Verzeichnis C:\ wechseln
    MKDIR "TMP" ' Ein temporäres Verzeichnis anlegen

    OPEN "TMP\Src.txt" FOR OUTPUT AS #1 ' Eine Datei erstellen und...
    PRINT #1, "Source-File" ' ...mit Text befüllen
    CLOSE #1

    IF FILECOPY("TMP\Src.txt", "TMP\Dst.txt") THEN
    PRINT "Fehler beim kopieren von TMP\Src.txt nach TMP\Dst.txt."
    ELSE
    PRINT "C:\TMP\Src.txt nach C:\TMP\Dst.txt kopiert."
    END IF

    IF FILECOPY("C:\TMP\Src.txt", "Dst.txt") THEN
    PRINT "Fehler beim kopieren von C:\TMP\Src.txt nach C:\Dst.txt."
    ELSE
    PRINT "C:\TMP\Src.txt nach C:\Dst.txt kopiert."
    END IF

    IF FILECOPY("C:\TMP\*.txt", "TMP\Dst.txt") THEN
    PRINT "Fehler beim kopieren von C:\TMP\*.txt nach C:\TMP\Dst.txt."
    ELSE
    PRINT "C:\TMP\*.txt nach C:\TMP\Dst.txt kopiert."
    END IF

    IF FILECOPY("C:\TMP\Src.txt", "C:\TMP\Src.txt") THEN
    PRINT "Fehler beim kopieren von C:\TMP\Src.txt nach C:\TMP\Src.txt."
    ELSE
    PRINT "C:\TMP\Src.txt nach C:\TMP\Src.txt kopiert."
    END IF

    IF FILECOPY("C:\ThisFolderDoesSurelyNotExist\Src.txt", "C:\TMP\Src.txt") THEN
    PRINT "Fehler beim kopieren von C:\ThisFolderDoesSurelyNotExist\Src.txt nach C:\TMP\Src.txt."
    ELSE
    PRINT "C:\ThisFolderDoesSurelyNotExist\Src.txt nach C:\TMP\Src.txt kopiert."
    END IF

    ' Die erstellten Daten löschen
    KILL "TMP\Src.txt"
    KILL "TMP\Dst.txt"
    KILL "Dst.txt"

    ' Das Verzeichnis TMP löschen, wenn sich keine Daten oder Unterordner mehr darin befinden.
    RMDIR "TMP"

    GETKEY
    Ausgabe:
    C:\TMP\Src.txt nach C:\TMP\Dst.txt kopiert.
    C:\TMP\Src.txt nach C:\Dst.txt kopiert.
    Fehler beim kopieren von C:\TMP\*.txt nach C:\TMP\Dst.txt.
    Fehler beim kopieren von C:\TMP\Src.txt nach C:\TMP\Src.txt.
    Fehler beim kopieren von C:\ThisFolderDoesSurelyNotExist\Src.txt nach C:\TMP\Src.txt.

    Unterschiede:
    zu QBX:
  • neu in freeBASIC

    • zu VBDOS
  • keine

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    FILEATTR, FILEDATETIME, FILEEXISTS, FILELEN,
    OPEN, CLOSE


FILEDATETIME

Syntax: FILEDATETIME( Dateiname )
Typ: Funktion
Kategorie: Datei

FILEDATETIME gibt den Zeitpunkt (Datum und Uhrzeit) als Timeserial zurück, an dem die Datei zuletzt bearbeitet wurde.
Siehe Serial Numbers zu Timeserials.

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei file.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.
Alternativ können Sie auch die Datei vbcompat.bi einbinden, da diese die file.bi automatisch in Ihr Programm lädt.

  • 'Dateiname' ist ein STRING oder ein ZSTRING PTR, der angibt, welche Datei analysiert werden soll. Er kann eine Pfadangabe enthalten,
    muss aber nicht. Enthält 'Dateiname' keinen Pfad, geht freeBASIC automatisch davon aus, dass sich die Datei im aktuellen
    Arbeitsverzeichnis befindet.

  • Der Rückgabewert ist ein Timeserial, das Datum und Uhrzeit der letzten Bearbeitung enthält, oder 0, wenn ein Fehler aufgetreten ist.
    Da es sich hierbei um einen Dateserial handelt, der auch eine Uhrzeit enthält, ist der Rückgabewert vom Typ DOUBLE.

    • Beispiel:
    #INCLUDE "vbcompat.bi"

    DIM filename AS STRING, d AS DOUBLE

    Print "Bitte geben Sie einen Dateinamen ein:"
    LINE INPUT filename

    IF FILEEXISTS( filename ) THEN
    d = FILEDATETIME( filename )
    PRINT "Datei wurde zuletzt geaendert am ";
    PRINT FORMAT( d, "dd.mm.yyyy, hh:mm:ss" )
    ELSE
    PRINT "Datei wurde nicht gefunden"
    END IF
    Ausgabe:
    Bitte geben Sie einen Dateinamen ein:
    D:\BASIC\freeBASIC\fbc.exe
    Die Datei wurde zuletzt geändert am 16.11.2006, 00:15:02.

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    FILEATTR, FILECOPY, FILEEXISTS, FILELEN,
    OPEN, CLOSE


FILEEXISTS

Syntax: FILEEXISTS(Dateiname)
Typ: Funktion
Kategorie: Datei

Überprüft, ob eine Datei existiert oder nicht.

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei file.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.
Alternativ können Sie auch die Datei vbcompat.bi einbinden, da diese die file.bi automatisch in Ihr Programm lädt.

  • 'Dateiname' ist ein STRING oder ein ZSTRING PTR, der den Namen der Datei enthält, deren Existenz bestätigt werden soll. Er kann eine
    Pfadangabe enthalten, muss aber nicht. Enthält 'Dateiname' keinen Pfad, geht freeBASIC automatisch davon aus, dass sich die Datei im
    aktuellen Arbeitsverzeichnis befindet.

  • Der Rückgabewert ist entweder -1, wenn die Datei existiert, oder 0, wenn dies nicht der Fall ist.

    • Beispiel:
    #INCLUDE "vbcompat.bi"

    DIM filename AS STRING

    PRINT "Bitte geben Sie einen Dateinamen ein: "
    LINE INPUT filename

    IF FILEEXISTS( filename ) THEN
    PRINT "Datei gefunden: " & filename
    ELSE
    PRINT "Datei nicht gefunden: " & filename
    END IF

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    FILEATTR, FILECOPY, FILEDATETIME, FILELEN,
    OPEN, CLOSE, DIR


FILELEN

Syntax: FILELEN ( Dateiname )
Typ: Funktion
Kategorie: Datei

Gibt die Länge von 'Dateiname' in Bytes zurück

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei file.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.
Alternativ können Sie auch die Datei vbcompat.bi einbinden, da diese die file.bi automatisch in Ihr Programm lädt.

  • 'Dateiname' ist ein STRING, der den Dateinamen der zu analysierenden Datei enthält. Dieser kann eine Pfadangabe enthalten. Wird nur
    ein Dateiname ohne Pfad angegeben, geht freeBASIC davon aus, dass sich die Datei im aktuellen Arbeitsverzeichnis befindet.
    Wenn 'Dateiname' nicht existiert, wird keine Datei erstellt.

  • Der Rückgabewert ist eine INTEGER-Zahl, die die Größe der Datei in Bytes angibt, oder 0, wenn die Datei nicht existiert.
    Achtung: Null wird auch dann zurückgegeben, wenn die Datei tatsächlich null Bytes groß ist.

    • Beispiel:
    #INCLUDE "file.bi"

    DIM fbc AS STRING
    fbc = "C:\BASIC\freeBASIC\fbc.exe"

    PRINT "Der fbc ist"; FILELEN(fbc); " Bytes gross, das sind:"
    PRINT FILELEN(fbc) \ (1024 * 1024); " Megabytes,";
    PRINT (FILELEN(fbc) \ 1024) MOD 1024 ; " Kilobytes und";
    PRINT FILELEN(fbc) MOD 1024 ; " Bytes."

    GETKEY
    Ausgabe:
    Der fbc ist 568832 Bytes gross, das sind:
    0 Megabytes, 555 Kilobytes und 512 Bytes.

    Unterschiede:
    zu QBX:
  • neu in freeBASIC

    • zu VBDOS
  • keine

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    FILEATTR, FILECOPY, FILEDATETIME, FILEEXISTS,
    OPEN, CLOSE, LOF


FIX

Syntax: FIX(Variable AS SINGLE/DOUBLE) AS INTEGER
Typ: Funktion
Kategorie: Zählsysteme

FIX verwandelt eine beliebige Zahl in eine INTEGER-Zahl, indem der Nachkommateil
abgeschnitten wird.
Wenn die Eingabezahl ein INTEGER ist, bleibt sie unverändert.
Beispielsweise gibt FIX(1.9) 1 und FIX(-1.9) gibt -1 zurück

Es bestehen Ähnlichkeiten zwischen FIX und INT. Sie sind jedoch nicht gleich:
Während FIX(-1.9) -1 ausgibt, liefert INT(-1.9) -2.
Bei positiven Zahlen besteht jedoch kein Unterschied.

Siehe auch:
INT, CINT


FLIP

Syntax: FLIP [Quellseite, Zielseite]
Typ: Anweisung
Kategorie: Gfx

Der Befehl FLIP hat die selbe Funktion wie die Befehle PCOPY und SCREENCOPY:
Er kopiert den Inhalt einer Bildschirmseite auf eine andere.

Wenn ein Bildschirmmodus im OpenGL-Modus initiiert wurde, bewirkt FLIP eine
Bildschirmaktualisierung; mehrere Bildschirmseiten sind in diesem Modus nicht
verfügbar.

Siehe auch:
SCREEN (Anweisung), SCREENCOPY

Unterschiede: Neu in freeBASIC.


FOR...NEXT

Typ: Anweisung
Kategorie: Schleifen
Syntax:
FOR Variable [AS TYP] = Wert1 TO Wert2 [STEP Wert3]
   ' Programmcode
NEXT

Wiederholt den Codeblock zwischen FOR und NEXT, wobei eine Variable bei jedem Durchlauf um einen bestimmten Wert erhöht wird.

  • 'Variable' ist die Variable, deren Wert sich beim Schleifendurchlauf verändern soll.

  • 'AS TYP' ist erst seit freeBASIC v0.17 zulässig. Es wirkt wie:
    DIM Variable AS TYP
    Das bedeutet, die Variable muss nicht vor Beginn des FOR-NEXT-Blocks dimensioniert werden.
    Achtung: Diese Dimensionierung ist dem FOR-NEXT-Block zuzurechnen, und gehört daher auch zu diesem SCOPE. Nach NEXT existiert die so
    initialisierte Variable nicht mehr.
    Wird die Kommandozeile
    -lang qb
    verwendet, so wird die Fehlermeldung 'duplicated definition' ausgegeben, wenn 'Variable' schon zuvor definiert war.
    Bei
    -lang fb
    oder
    -lang deprecated
    werden die normalen SCOPE-Regeln angewandt. Das bedeutet, eine neue Variable wird erstellt, der Wert der alten ist innerhalb des
    SCOPEs (also des FOR...NEXT-Blocks) nicht verfügbar.
    Siehe dazu auch die Kommandozeile und die FB-Dialektformen.
  • 'Wert1' ist der Wert, den 'Variable' beim ersten Schleifendurchlauf erhalten soll.

  • Die Schleife ist beendet, sobald 'Variable' den Wert von 'Wert2' erreicht oder überschritten hat.

  • Bei jedem Durchlauf der Schleife wird 'Variable' um den Wert von 'Wert3' erhöht.
    Wird 'Wert3' ausgelassen, nimmt freeBASIC automatisch 1 an.
    Auch negative Werte sind für 'Wert3' erlaubt; in diesem Fall wird 'Variable' bei jedem Durchlauf vermindert, und die Schleife ist beendet,
    sobald 'Variable' kleiner oder gleich 'Wert2' ist.
    Selbstverständlich können auch Fließkommawerte eingesetzt werden.
    Vorsicht: Sie erzeugen eine Endlosschleife, wenn 'Wert3' ein Fließkommawert kleiner oder gleich 0.5 ist, und 'Variable' ein Ganzzahl-Typ
    ist, da bei jeder Neuberechnung des Wertes von 'Variable' gerundet wird. Dabei stellt 0.5 die Grenze zwischen Auf- und Abrunden dar.

    • Als Block-Anweisung initialisiert FOR...NEXT seit freeBASIC v0.16 einen SCOPE-Block, der mit der Zeile NEXT
    endet.

    FOR in Prozeduren kann nicht mit Variablen als Zähler verwendet werden, die BYREF übergeben wurden.

    Eine FOR-NEXT-Schleife kann 'manuell' mit der Anweisung EXIT FOR abgebrochen werden.
    Taucht innerhalb des Schleifen-Codes die Anweisung CONTINUE FOR auf, so ignoriert freeBASIC den Code bis zum nächsten NEXT, und springt
    zurück zur FOR-Zeile. Der Schleifenzähler ('Variable') wird dabei um 'Wert3' erhöht.

    Beispiel: Gibt ein Dreieck aus Sternen aus:
    DIM AS INTEGER i, hoehe
    hoehe = 10
    FOR i = 1 TO hoehe
    PRINT STRING(i, "*")
    NEXT

    Ausgabe:
    *
    **
    ***
    ****
    *****
    ******
    *******
    ********
    *********
    **********

    Beispiel: Zählschleife mit automatischer Initialisierung
    PRINT "Zähle von 3 bis 0 in Schritten von -0.2:"
    FOR i AS SINGLE = 3 TO 0 STEP -0.2
    PRINT "i = "; i
    NEXT

    ' Nach dem FOR-NEXT-Block steht die Variable nicht mehr zur Verfügung; ihr Bezeichner kann neu verwendet werden:
    DIM i AS INTEGER
    Selbiges Beispiel für Versionen vor 0.17:
    DIM i AS SINGLE
    PRINT "Zähle von 3 bis 0 in Schritten von -0.2:"
    FOR i = 3 TO 0 STEP -0.2
    PRINT "i = "; i
    NEXT

    ' Die Neudefinition von i ist hier noch nicht möglich.

    FOR in Prozeduren kann nicht mit Variablen als Zähler verwendet werden, die BYREF übergeben wurden.
    Beispiel:
    DECLARE SUB foo ( BYREF a As Integer )

    DIM a AS INTEGER
    foo a
    GETKEY

    SUB foo( BYREF a AS INTEGER )
    FOR a = 1 TO 100
    NEXT a
    END SUB
    'a' ist hier ein Pointer, der nicht unterstützt wird. Das Programm wird mit Fehlermeldung abgebrochen.

    Alternative:
    SUB foo ( a AS INTEGER )
    DIM b AS INTEGER
    b = a
    FOR b = 1 TO 100
    NEXT
    a = b
    END SUB
    Es ist auch möglich, a mit der BYVAL-Klausel zu übergeben.

    Als Block-Anweisung initialisiert FOR...NEXT seit freeBASIC v0.16 einen SCOPE-Block, der mit der Zeile
    NEXT endet. Variablen, die innerhalb einer solchen Schleife deklariert werden, existieren außerhalb nicht mehr.

    Unterschiede:
    zu QB:
  • Im Gegensatz zu QB's Version funktioniert freeBASICs FOR nicht mit Pointern (wie etwa BYREF-Variablen) als Variable.

  • Innerhalb einer Schleife durften keine Variablen definiert werden

  • Die Syntax
    FOR Variable AS TYP = ...
    ist neu in freeBASIC.

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.17 kann FOR seine Zähler-Variable über die Syntax
    FOR Variable AS TYP = ...
    automatisch initialisieren.

  • Seit freeBASIC v0.16 wirkt eine FOR-NEXT-Schleife wie ein SCOPE-Block

    • Siehe auch:
    DO...LOOP, WHILE...WEND,
    CONTINUE, SCOPE,
    EXIT, CONTINUE,
    Schleifen


FOR

Typ: Anweisung

Siehe:
FOR...NEXT


FORMAT

Syntax: FORMAT[$](nummerischer_Ausdruck, FormatString)
Typ: Funktion
Kategorie: Stringmanipulation

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

FORMAT gibt einen nummerischen Ausdruck nach bestimmten Regeln formatiert als STRING aus.

Das Dollarzeichen ($) als Suffix ist optional.

  • 'nummerischer_Ausdruck' ist ein Beliebiger Ausdruck, der als DOUBLE gehandhabt wird. Dies können insbesondere auch Serial
    Numbers     sein.

  • 'FormatString' ist ein String, der festlegt, in welcher Form die Ausgabe sein soll. Sieh dazu untenstehende Tabelle.

    • FORMAT kann Serial Numbers in ein Format zurückverwandeln, das von einem Menschen lesbar ist.

    Diese Funktion ist Teil von FB. Dennoch wird sie vom Compiler so lange ignoriert, bis vbcompat.bi eingebunden wird.

    Allgemeine Formatierungszeichen:
    Symbol | Erklärung
Nullstring | keine besondere Formatierung
0 | Platzhalter für eine Ziffer. Wenn die auszugebende Zahl weniger Ziffern hat, als Platzhalter reserviert wurden, so werden diese mit führenden Nullen aufgefüllt.
# | Platzhalter für eine Ziffer. Funktioniert genauso wie 0, erzeugt aber keine führenden Nullen.
. | Platzhalter für ein Dezimaltrennzeichen. Wenn der Formatierungsstring nur Rauten (#) links vom Punkt (.) enthält, werden Zahlen, die Zahlen, dei kleiner als eins sind ohne Null vor dem Komma ausgegeben. Das Dezimaltrennzeichen kann in den Ländereinstellungen eingestellt werden.
% | Der Ausdruck wird mit 100 multipliziert, und mit einem Prozent-Zeichen (%) ausgegeben.
, | Platzhalter für Tausendertrennzeichen. Zwei aufeinanderfolgende Kommata, oder ein Komma direkt links vom Dezimaltrennzeichen (egal ob die Position eines solchen angegeben wurde oder nicht) bewirken, dass die drei Ziffern zwischen den Kommata bzw. dem Komma und dem Punkt ausgelassen werden; die Zahl wird dabei korrekt gerundet. Das Tausendertrennzeichen kann in den Ländereinstellungen eingestellt werden.
E- E+ e- e+ | Wissenschaftliches Format Die Zahl wird als Zehnerpotenz angegeben. Die Anzahl der Platzhalter für Ziffern (0 und #) links von E-, E+, e- oder e+ gibt dabei an, wie viele Stellen für die Darstellung der Zahl selbst reserviert werden; die Anzahl der Platzhalter rechts gibt an, wie viele Stellen für den Exponenten reserviert werden. E- und e- bewirken, dass das Vorzeichen des Exponenten nur angezeigt wird, wenn er negativ ist. E+ und e+ bewirken, dass das Vorzeichen des Exponenten sowohl angezeigt wird, wenn er positiv als auch wenn er negativ ist.
: ? + $ () Space | Literale Diese Zeichen werden so ausgegeben, wie sie im Formatierungsstring stehen. Wenn Sie andere Zeichen als diese ausgeben wollen, müssen Sie einem einzelnen Zeichen einen Backslash (\) voranstellen, oder die Zeichen in Anführungszeichen (") einschließen. Um einen Backslash auszugeben, müssen Sie also \\ oder "\" in Ihren Formatierungsstring einbauen.
\ | Das nächste Zeichen im Formatierungsstring wird als Literal ausgegeben.
"Text zwischen Anführungszeichen" | Der Text innerhalb der Anführungszeichen wird so ausgegeben, wie er im Formatierungsstring steht.
: | Der Doppelpunkt wird verwendet, um Stunden, Minuten und Sekunden voneinander zu trennen, Wenn Zeitwerte formatiert werden.
/ | Datumstrennzeichen Der Schrägstrich wird verwendet, um Tage, Monate und Jahre voneinander zu trennen, wenn Datumswerte formatiert werden. In den Ländereinstellungen lässt sich einstellen, wie dieses Zeichen interpretiert werden soll.

    Datum/Zeit-Formatierungszeichen:
    Symbol | Erklärung
d | Zeige den Tag als Zahl ohne führende Null an (0-31)
dd | Zeige den Tag als Zahl mit führender Null an (00-31)
ddd | Zeige den Tag als Abkürzung seines Namens an (So-Sa) Die Abkürzung ist von den Ländereinstellungen abhängig.
dddd | Zeige den Tag als vollen Namen an (Sonntag - Samstag) Der Name des Wochentages ist von den Ländereinstellungen abhängig.
ddddd | Zeige das Datum einer Serial Number als vollständiges Datum an, einschließlich Tag, Monat und Jahr. Das Format des Datums ist von den Ländereinstellungen abhängig.
m | Zeige den Monat als Zahl ohne führende Null an (1-12). Wenn 'm' direkt nach 'h' oder 'hh' benutzt wird, wird die Minute ohne führende Null angezeigt (0-59).
mm | Zeige den Monat als Zahl mit führender Null an (01-12). Wenn 'mm' direkt nach 'h' oder 'hh' benutzt wird, wird die Minute mit führender Null angezeigt (00-59).
mmm | Zeige den Monat als Abkürzung seines Namens an (Jan-Dez). Die Abkürzung ist von den Ländereinstellungen abhängig.
mmmm | Zeige den Monat als vollen Namen an (Januar-Dezember). Der Name des Monats ist von den Ländereinstellungen abhängig.
y oder yy | Zeige das Jahr als zweistellige Zahl an (00-99)
yyyy | Zeige das Jahr als vierstellige Zahl an (1900-2040)
h | Zeige die Stunde ohne führende Null an (0-23)
hh | Zeige die Stunde mit führender Null an (00-23)
s | Zeige die Sekunde ohne führende Null an (0-59)
ss | Zeige die Sekunde mit führender Null an (00-59)
ttttt | Zeige die komplette Uhrzeit mit Stunde, Minute und Sekunde an. Das Format der Uhrzeit ist von den Ländereinstellungen abhängig.
AM/PM am/pm | Gib die Zeit als 12-Stunden-Zeit (00:00-11:59) mit AM bzw. am aus, wenn die Uhrzeit vor 12:00 liegt, und mit PM bzw. pm, wenn sie nach 12:00 liegt.
A/P a/p | Gib die Zeit als 12-Stunden-Zeit (00:00-11:59) mit A bzw. a aus, wenn die Uhrzeit vor 12:00 liegt, und mit P bzw. p, wenn sie nach 12:00 liegt.

    Ausgabebeispiel:
    Einfache Zahlenformatierung
    Formatstring 5 -5 .5 5000.5

    Null STRING 5 -5 0,5 5000,5
    0 5 -5 1 5000
    0.00 5,00 -5,00 0,50 5000,50
    #,##0 5 -5 1 5.000
    #,##0.00 5,00 -5,00 0,50 5.000,00
    $#,##0;($#,##0) $5 ($5) $1 $5.000
    $#,##0.00;($#,##0.00) $5,00 ($5,00) $0,50 $5.000,00
    0% 500% -500% 50% 500000%
    0.00% 500,00% -500,00% 50,00% 500000.00%
    0.00E+00 5,00E+00 -5,00E+00 5,00E-01 5,00E+03
    0.00E-00 5,00E00 -5,00E00 5,00E-01 5,00E03

    Zeitformatierung:
    Formatstring Ausgabe

    m/d/yy 12/7/58
    d-mmmm-yy 7-Dezember-58
    d-mmmm 7-Dezember
    mmmm-yy Dezember-58
    dddd Sonntag
    ddddd 07.12.1958
    h:mm AM/PM 8:50 PM
    h:mm:ss AM/PM 8:50:35 PM
    h:mm 20:50
    h:mm:ss 20:50:35
    m/d/yy h:mm 12/7/58 20:50

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch:
    PRINT USING, STR,
    Serial Numbers


FRE

Syntax: FRE AS INTEGER
Typ: Funktion
Kategorie: Verschiedenes

Gibt den verfügbaren RAM-Speicher in Bytes zurück.

mem = FRE
PRINT "Freier Speicher:"
PRINT
PRINT mem; " Bytes"
PRINT mem / 1024; " Kilobytes"
PRINT mem / (1024 * 1024); " Megabytes"

Siehe auch:
DIM, ALLOCATE

Unterschiede: (Zu QB):
FRE braucht keinen Parameter mehr; Es gibt immer den verfügbaren physischen
freien Speicher zurück.


FREEFILE

Syntax: FREEFILE
Typ: Funktion
Kategorie: Datei

Gibt die nächste unbenutzte Dateinummer zurück.

Beispiel:
f = FREEFILE
OPEN "file.ext" FOR INPUT AS #f

Siehe auch:


FUNCTION

Typ: Prozedur
Kategorie: Programmorganisation
Syntax A:
DECLARE FUNCTION Name [OVERLOAD] [Konvention] [ [LIB "DLLName"] ALIAS "AliasName"] [ (Parameterliste) ] [EXPORT]
Syntax B:
[{PRIVATE | PUBLIC }] FUNCTION Name [Konvention] [OVERLOAD] ([Parameterliste]) [STATIC] AS Rückgabetyp
   ' Anweisungen
END SUB

Eine FUNCTION ist eine Prozedur, die einen Wert an das Hauptprogramm zurückgibt.
Siehe auch SUB zum Thema Prozeduren.

Eine FUNCTION kann als erweiterte Form einer SUB angesehen werden; im Gegensatz zu einer solchen kann eine FUNCTION auch einen Wert
zurückgeben. Das bedeutet, dass ihr Bezeichner wie eine Variable eingesetzt wird, deren Wert abhängig von verschiedenen Parametern
wechselt.
COS ist ein Beispiel für eine Funktion.

  • 'Name' ist der Bezeichner, unter dem die FUNCTION aufgerufen wird.

  • 'Parameterliste' ist eine Liste der Form
    [ {BYVAL | BYREF } ] [Parameter1] [AS Typ] [= Wert]   [, _
              [ {BYVAL | BYREF } ] [Parameter2] [AS Typ] [= Wert] ] [, _
                                                               ...]
  • 'Parameter1', 'Parameter2', ... sind die Parameter, die an die Funktion übergeben werden. Parameter sind Variablen (bzw. ihre Werte),
    die in der FUNCTION verwendet werden können.
    Siehe auch Parameterübergabe.
    Nur innerhalb der DECLARE-Zeile kann der Bezeichner des Parameters ausgelassen werden; der Datentyp muss immer angegeben werden.

  • 'Typ' ist der Datentyp des übergebenen Parameters; siehe Datentypen.
    Auch UDTs (user defined Types; siehe TYPE (UDT)) können verwendet werden.

  • Durch das '= Wert' wird ein Parameter als optional deklariert; er kann beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird
    an die FUNCTION für diesen Parameter 'Wert' übergeben.

  • BYVAL und BYREF regeln die Art der Parameterübergabe an die SUB. Siehe dazu auch OPTION BYVAL.

  • Zu 'Konvention siehe die Referenz-Stichwörter CDECL, PASCAL und STDCALL.

  • Siehe den entsprechenden Referenz-Eintrag zu OVERLOAD

  • 'Rückgabetyp' ist der Datentyp des Rückgabewerts.
    Auch UDTs (User defined Types; siehe TYPE (UDT)) sind erlaubt. Siehe dazu weiter unten.

  • Die STATIC-Klausel bewirkt, dass alle Variablen innerhalb der FUNCTION zwischengespeichert werden. Das bedeutet, dass die Werte von
    Variablen, die in der FUNCTION verwendet werden, nach einem Aufruf nicht verloren gehen, sondern beim nächsten Aufruf der FUNCTION
    wieder verfügbar sind.
    Siehe auch STATIC (Schlüsselwort)

  • Zu EXPORT siehe den entsprechendenn Eintrag in dieser Referenz

    • Der Wert der FUNCTION kann von übergebenen Parametern abhängig sein FUNCTIONs werden dazu verwendet, häufig auftretende Berechnungen zusammenzufassen.
    Es kann auch ein Pointer zurückgegeben werden.

    Eine FUNCTION ist dasselbe wie eine SUB, abgesehen von der Möglichkeit, Werte zurückzuliefern.
    Der Wert einer Funktion kann auf dreierlei Weise gesetzt werden:
  • Über ihren Bezeichner: FunktionsName = Ausdruck

  • Über das Symbol "FUNCTION": FUNCTION = Ausdruck

  • Über RETURN: RETURN Ausdruck
    Achtung: RETURN funktioniert wie FUNCTION = Ausdruck : EXIT FUNCTION

    • Es gibt einige gute Gründe, in Ihrem Programm FUNCTIONs einzusetzen:
  • Reduzierung von redundanten Programmzeilen

  • Möglichkeit der Wiederverwendung von Programmzeilen in anderen Projekten

  • Leichtere Les- und Wartbarkeit des Programms

  • Leichtere Erweiterbarkeit Ihres Programms

    • Der Rückgabewert einer FUNCTION kann beim Aufruf dieser auch ignoriert werden. Dies kann dann von Sinn sein, wenn die FUNCTION z.B.
    darüber Informiert, ob ihr Code erfolgreich ausgeführt wurde. Um den Rückgabewert einer Funktion zu ignorieren, setzen Sie diese einfach
    wie eine SUB ein.

    Beispiel:
    DECLARE FUNCTION twice (x)

    FUNCTION twice (x)
    RETURN x * 2
    PRINT "Diese Zeile wird nie ausgegeben"
    END FUNCTION

    PRINT twice (10) 'Gibt 20 aus, das Doppelte von 10

    Eine Function kann auch einen ganzen UDT zurückgeben:
    TYPE udt
    v1 AS INTEGER
    v2 AS INTEGER
    END TYPE

    DECLARE FUNCTION bla(foo AS INTEGER, bar AS INTEGER) AS udt

    DIM var AS udt
    var = bla(1, 3)

    PRINT "Var: v1 ="; var.v1; ", v2 ="; var.v2
    'Ausgabe: "Var: v1 = 10, v2 = 30"
    SLEEP

    FUNCTION bla(foo AS INTEGER, bar AS INTEGER) AS udt
    DIM var AS udt
    var.v1 = foo*10
    var.v2 = bar*10
    bla = var
    END FUNCTION

    Einem Funktionsnamen können mehrere Prozeduren zugewiesen werden; siehe OVERLOAD.

    Seit freeBASIC v0.17 kann eine FUNCTION auch Teil eines UDTs sein:
    Type MyUDT
    x As Integer
    y As Integer
    z As Integer

    Declare Function SumOfAll ()
    End Type

    Function MyUDT.SumOfAll () As Integer
    Return This.x + This.y + This.z
    End Function

    Dim var As MyUDT
    With var
    .x = 5
    .y = 10
    .z = -3
    End With

    ? var.SumOfAll
    GetKey
    Ausgabe:
    12

    Unterschiede:
    zu QB:
  • Parameter können optional sein

  • Der Rückgabewert kann mit FUNCTION = Ausdruck oder RETURN Ausdruck festgelegt werden.

  • FUNCTIONs können überladen werden

  • Der Rückgabewert kann beim Aufruf der Funktion ignoriert werden.

    • zu früheren Versionen von freeBASIC
  • Bis freeBASIC v0.17 war es auch zulässig, das STATIC-Schlüsselwort links vom Prozedur-Header zu platzieren; seit v0.17 allerdings
    ist diese Form
    STATIC SUB Name
    ungültig.

  • Seit freeBASIC v0.17 ist es zulässig, auf Prozedurebene (z.B. innerhalb einer FUNCTION) TYPEs, UNIONs und ENUMs zu erstellen.

  • Seit freeBASIC v0.16 ist es zulässig, Arrays undefinierter Größe auch innerhalb von FUNCTIONs zu definieren. (z.B. DIM foo().)

  • FUNCTION overloading ist erst seit freeBASIC v0.14 möglich; siehe OVERLOAD.

  • Seit freeBASIC v0.14 können FUNCTIONs ganze UDTs zurückgeben.

  • Seit freeBASIC v0.14 kann FUNCTION innerhalb von ASM-Blocks eingesetzt werden, um den Rückgabewert zu bestimmen.

  • Seit freeBASIC v0.13 kann RETURN als Shortcut für FUNCTION = Ausdruck : EXIT FUNCTION eingesetzt werden. Damit verbunden ist,
    dass GOSUB und ON...GOSUB nicht mehr auf Prozedurebene eingesetzt werden können.

  • Variable Argumente sind erst seit freeBASIC v0.13 möglich; siehe VA_ARG.

  • Optionale Parameter existieren in FUNCTIONs erst seit freeBASIC v0.13.

  • Seit freeBASIC v0.13 kann der Rückgabewert auch über FUNCTION = Ausdruck gesetzt werden.

  • Seit freeBASIC v0.12 müssen in den DECLARE-Zeilen keine Parameter-Namen mehr genannt werden; es ist jedoch immer noch zulässig.

    • Siehe auch:
    SUB, PROPERTY, OPERATOR,
    DECLARE, OVERLOAD,
    EXIT, END,
    BYVAL, BYREF, SHARED,
    PRIVATE (Klausel), PUBLIC (Klausel),
    VA_ARG,
    Prozeduren
    Functions
    Parameterübergabe


Liste der Schlüsselwörter beginnend mit G

GET
GET #
GET (Grafik)
GETJOYSTIC
GETKEY
GETMOUSE
GOSUB
GOTO


GET (Datei)

Syntax: GET #Dateinummer, [Position], Variable [, Menge]
Typ: Anweisung/Funktion
Kategorie: Datei

Liest Daten aus einer Datei, die im BINARY oder RANDOM-Modus geöffnet wurde.

  • '#Dateinummer' ist die Nummer, die beim Öffnen der Datei mit OPEN zugewiesen wurde.

  • 'Position' ist die Position innerhalb der Datei, von der gelesen werden soll. Für BINARY-Dateien ist es die Nummer des Bytes, für
    RANDOM-Dateien ist das die Nummer des Datensatzes.
    Wird dieser Parameter ausgelassen, liest freeBASIC von der Position des Dateicursors. Diese ist abhängig von den letzten
    Lese/Schreibzugriffen auf die Datei und der SEEK Anweisung.
    Direkt nach dem Öffnen zeigt der Dateicursor immer auf die erste Stelle in der Datei.

  • 'Variable' ist ein Bezeichner, in dem der eingelesene Wert gespeichert werden soll. Dies kann eine einfache Variable, ein Array oder
    ein UDT (user defined Types; siehe TYPE) sein.

  • 'Menge' wird eingesetzt, sobald die Daten in einen ALLOCATE-Puffer eingelesen werden sollen. Dadurch wird GET mitgeteilt,
    wie viele Speicherstellen eingelesen werden sollen. Gelesen werden
    Menge * SizeOf(Puffer_Datentyp)
    Bytes.
    Wird 'Menge' ausgelasen, nimmt freeBASIC automatisch 1 an. Es wird also immer eine ganze Speicherstelle gelesen. (Entspricht LEN(DatenPufferTyp)
    Bytes, also z.B. 4 Bytes bei einem INTEGER PTR.)
    Bei anderen Datentypen als ALLOCATE-Datenpuffern wird der Parameter 'Menge' ignoriert.

  • Wird GET als Funktion eigesetzt, ist der Rückgabewert eine der freeBASIC-Fehlernummern.
    In diesem Fall müssen die Parameter in Klammern gesetzt werden; die Syntax lautet also:
    Variable = Get(#Dateinummer, [Position], Variable)

    • Da mit GET an jeder beliebigen Stelle einer beliebigen Datei ein einzelnes Byte oder einen beliebig langen String einlesen kann, ist es
    möglich, GET sehr vielseitig zu nutzen.

    Im BINARY-Modus richtet sich die Anzahl der einzulesenden Bytes richtet sich nach dem Datentyp der Variable, in die gelesen wird:
  • BYTE und UBYTE - 1 Byte (8 bit)

  • SHORT und USHORT - 2 Byte (16 bit)

  • INTEGER, UINTEGER und LONG - 4 Bytes (32 bit)

  • LONGINT und ULONGINT - 8 Bytes (64 bit)

  • STRINGs (fester und variabler Länge) - Lässt sich mit LEN ermitteln

  • ZSTRINGs (fester Länge) - gelesen werden
    LEN(ZstringVariable) - 1
    Bytes. Ein Byte wird als Terminierungs-Byte benötigt. Siehe dazu auch ZSTRING.

  • ZSTRING PTR - werden wie ALLOCATE-Puffer behandelt. (siehe unten)

  • WSTRINGs (fester Länge) - gelesen werden wie bei ZSTRINGs
    LEN(WstringVariable) - 1
    Bytes. Ein Byte wird als Terminierungs-Byte benötigt. Siehe dazu auch WSTRING (Datentyp).

  • ALLOCATE-Puffer - Der Parameter 'Menge' gibt an, wie viele Bytes gelesen werden. Achten Sie dabei darauf, dass genügend
    Speicherplatz reserviert wurde!

  • Arrays - Indexzahl * LEN(Datentyp)

  • UDTs - Lässt sich mit LEN ermitteln

    • Im RANDOM-Modus wird jeweils ein Datensatz eingelesen. Die Länge eines Satzes wird bereits beim Öffnen der Datei festgelegt. Siehe dazu
    OPEN.
    RANDOM-Daten werden kaum verwendet, da der BINARY-Modus vielseitigere Zugriffsmöglichkeiten bietet.

    Wenn das Dateiende erreicht wird, bevor die gewünschte Datenmenge eingelesen wurde, wird der Lesevorgang einfach vorzeitig abgebrochen.
    Die Stellen des Lesepuffers ('Variable'), die nicht aus der Datei befüllt werden können, erhalten den Wert 0, unabhängig davon, welcher
    Wert zuvor gespeichert war.

    Beispiel 1:
    Drei mal vier Bytes aus der Datei 'file.ext' einlesen:
    DIM FixedLenBuffer AS STRING * 4
    DIM VarLenBuffer AS STRING
    DIM IntegerBuffer AS INTEGER
    VarLenBuffer = SPACE(4)

    f = Freefile
    Open "file.ext" For Binary As #f
    Get #f, , FixedLenBuffer
    Get #f, 1, VarLenBuffer
    Get #f, 1, IntegerBuffer
    Close #f
    Wie Sie sehen, müssen Sie einen String variabler Länge zuerst mit einem temporären String vorbelegen, damit festgelegt ist, welche
    Länge der einzlesende Datensatz haben soll. GET wird die Länge eines Strings variabler Länge nicht verändern. Dies ist auch dann der
    Fall, wenn der Parameter 'Menge' benutzt wird.

    Um ganze Arrays oder UDTs zu lesen, geben Sie einfach nur den Bezeichner ohne Index bzw. Verweis auf einen Record an
    Beispiel 2:
    Type UDT
    a As Integer
    b As Double
    c As String * 5
    End Type

    Dim inparray(5) As Integer
    Dim inpUDT As UDT

    f = Freefile
    Open "file.ext" For Binary As #f

    Get #f, , inparray()
    Get #f, , inpUDT

    Close #f
    In inparray werden 5 * 4 = 20 Bytes eingelesen; 5 ist die Anzahl der Indizes, 4 ist die Länge einer Integer-Variable.
    In inpUDT werden 4 + 8 + 5 = 17 Bytes eingelesen. Es ist die Summe der Längen der Records des UDTs.

    Bei der Verwendung von Datenpuffern, deren Pointer angegeben ist, verwenden sie die Ziel-des-Pointers-Syntax
    *Pointer
    oder
    Pointer[index]
    Außerdem müssen Sie angeben, wie viele Bytes gelesen werden sollen. Dazu dient der Parameter 'Menge'.
    Beispiel 3:
    f = Freefile
    Open "file.ext" For Binary As #f

    Dim x As Byte Ptr
    x = Allocate(8)

    Get #f, 1, *x , 4
    Get #f, 5, x[4], 4

    DeAllocate x
    Close #f

    Achten Sie bei der Verwendung von GET sehr genau auf die Datentypen!
    Beispiel 4:
    Dim v1 As Byte, v2 As String * 2
    Dim f As integer

    v1 = 33
    v2 = "33"
    f = FreeFile

    Open "file.ext" For Binary As #f
    Put #f, , v1
    Put #f, , v2
    Close #f

    Open "file.ext" For Binary As #f
    Get #f, , v2
    Get #f, , v1
    Close #f

    Print v1, v2
    GetKey
    Ausgabe:
    51     !3
    Wie Sie sehen, wird in die Datei beim ersten Zugriff zuerst ein BYTE-Wert und ANSCHLIESSEND ein 2-Byte-STRING geschrieben. Beim zweiten
    Zugriff wird zuerst ein 2-Byte-STRING und anschließend ein BYTE-Wert eingelesen. Ergebnis ist, dass nicht - wie anzunehmen - wieder
    zwei mal die Ausgabe '33' erfolgt, sondern nur Datenmüll auf dem Bildschirm erscheint.
    Obwohl die Informationen fehlerfrei gelesen wurden, kann mit den Informationen nicht gearbeitet werden, da sie nach dem Lesen auf die
    falsche Art und Weise behandelt werden.
    Werden beim Lesezugriff die beiden GET-Zeilen vertauscht, so erfolgt die korrekte Ausgabe:
    33     33
    Die Ursache hierfür liegt darin, dass im BINARY- und RANDOM-Modus (mit denen GET und PUT ja arbeiten) die Daten nicht in einem für
    Menschen lesbaren Format abgelegt werden, sondern binär behandelt werden, d.h. so geschrieben werden, wie sie vom Prozessor behandelt
    werden. Hierbei existieren Unterschiede zwischen der Behandlungsweise von Zeichenketten (des STRINGs) und Zahlen (des BYTE-Werts).

    Unterschiede:
    zu früheren Versionen von freeBASIC:
  • GET kann seit freeBASIC v0.13 als Funktion eingesetzt werden

  • Seit freeBASIC v0.10 können ganze Arrays gelesen werden.

    • Zu QB:
  • GET kann auch als Funktion eingesetzt werden.

  • Ganze Arrays und UDTs können eingelesen werden.

  • Die Verwendung von ALLLOCATE-Datenpuffern ist möglich

    • Siehe auch:
    OPEN, CLOSE, FREEFILE,
    GET #, PUT #,
    freeBASIC-Fehlernummern,
    GET (Grafik)


GET (Grafik)

Syntax: GET [QuellPuffer], [STEP] (x1, y1)-[STEP](x2, y2), ZielPuffer
Typ: Anweisung
Kategorie: Gfx

Speichert einen Ausschnitt aus einem Grafikfenster (bzw. vom Bildschirm bei Vollbildmodi)
in einem Array

  • 'QuellPuffer' ist ein Bildpuffer im Sinne von Interne Pixelformate: Bildpuffer, wie er mit IMAGECREATE verwendet wird.
    Wird 'Puffer' ausgelassen, liest freeBASIC direkt vom Bildschirm.

  • '(x1, y1)' und '(x2, y2)' sind die Koordinaten der Eckpunkte eines Rechtecks, dessen Inhalt kopiert werden soll.
    Dabei steht die erste Koordinate für die linke obere Ecke und die Zweite für die rechte obere Ecke.
    Wenn der angegebene Bereich (teilweise) außerhalb der Bildschirmgrenzen liegt, wird der Fehler 'unzulässiger Funktionsaufruf' ('illegal
    function call') ausgelöst. Wird dieser Fehler nicht durch ON ERROR behandelt, führt dies zum Programmabsturz.

  • 'STEP' bewirkt, dass die angegeben Koordinaten relativ zur Position des Grafik-Cursors sind. Dabei kann für jede Koordinate eine eigene
    STEP-Klausel gesetzt werden.

  • 'ZielPuffer' ist ein Bildpuffer, in dem der Bildschirmausschnitt gespeichert wird.
    Ebenso wie 'QuellPuffer' handelt es sich hierbei um einen Bildpuffer, wie er unter oben angegebenen Link erklärt wird.

    • GET wird benutzt, um einen Bildschirmausschnitt zu speichern, um ihn später mit PUT (Grafik) zu verwenden.
    Die Koordinaten werden von den letzten WINDOW- und VIEW (Grafik)-Anweisung beeinflusst und müssen beide innerhalb der aktuellen Fenstergrenzen
    (bzw. Bildschirmgrenzen) liegen.

    Der angegebene Puffer muss groß genug sein, um den Bildschirmausschnitt speichern zu können. Die dafür benötigte Größe hängt von der Größe
    des Bildschirmausschnitts und der verwendeten Farbtiefe ab.
    IMAGECREATE erzeugt automatisch einen Puffer, der ein Bild angegebener Größe aufnehmen kann.
    Siehe auch Interne Pixelformate: Bildpuffer zur manuellen Berechnung des Speicherplatzbedarfs.

    Siehe auch PUT (Grafik) für Beispiele zum Umgang mit Bildpuffern.

    Siehe auch:
    GET (Datei), PALETTE GET,
    PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    SCREEN (Anweisung),
    WINDOW, VIEW (Grafik)

    Unterschiede
    Zu QB:
  • Im Gegensatz zur QB-Version verkleinert sich die benötigte Feldgröße nicht, wenn Sie eine geringere Farbtiefe als 8 bpp verwenden.

  • Wenn Sie multidimensionale Arrays als Bildpuffer verwenden, achten Sie darauf, dass freeBASIC die Daten in Zeilen-Reihenfolge speichert
    (QB speichert in Spalten-Reihenfolge).
    Was sie also in QB mit
    PUT (100, 100), sprites(0, 7)
    implementiert haben, muss in freeBASIC
    PUT (100, 100), sprites(7, 0)
    lauten.

  • freeBASIC erlaubt neben Arrays auch andere Formen von Bildpuffern.

  • Der Interne Aufbau eines Bildpuffers unterscheidet sich von dem, der in QB genutzt wurde.

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.17 benutzt GET das neue Bildpuffer-Format; siehe dazu Interne Pixelformate: Bildpuffer.

  • Die Möglichkeit, einen Quellpuffer anzugeben, existiert erst seit freeBASIC v0.15

  • Seit freeBASIC v0.13 wird ein Laufzeitfehler ausgelöst, wenn versucht wird, Bereiche zu scanen, die außerhalb der Bildschirmgrenzen
    liegen.

  • Die Möglichkeit, anstelle von Arrays auch Pointer als Puffer anzugeben, existiert erst seit freeBASIC v0.12


GET

Typ: Anweisung/Funktion

GET ist ein Schlüsselwort, das zum Datei- und Grafikbefehl und als Aktionswort
eingesetzt werden kann.

Siehe:
GET (Datei)
GET (Grafik)
PALETTE GET


GETJOYSTICK

Syntax: GETJOYSTICK(ID, Buttons[, [x][, [y][, [z][, [r][, [u][, v]]]]]])
Typ: Funktion
Kategorie: Funktion

GETJOYSTICK gibt die Position des Joysticks und den Status seiner Buttons zurück.

  • ID ist die Nummer des Joysticks. Die Joystick-IDs liegen zwischen 0 und 15.

  • Buttons enthält ein Bitfeld, das angibt, welche Buttons gedrückt werden,
    und welche nicht; ein gesetztes Bit repräsentiert dabei einen gedrückten
    Button. Die BIT-Funktion kann hier sehr gut angewendet werden.

  • x und y geben die aktuelle Position des Joysticks relativ zum Maximalausschlag
    an. Sie liegen zwischen -1.0 und +1.0.

  • z, r, u und v geben die Positionen zusätzlicher Joystick-Achsen zurück.
    Sie liegen zwischen -1.0 und +1.0.

  • Der Rückgabewert (sofern abgefragt) gibt an, ob die Joystickabfrage
    erfolgreich war. Er ist entweder 0, wenn der Status erfolgreich abgefragt
    wurde, oder 1, wenn ein Fehler aufgetreten ist.
    Fehler können auftreten, wenn ungültige IDs oder Joysticks, die nicht
    existieren angegeben werden, oder falls ein Fehler in der Joystick-API
    vorliegt.

    • GETJOYSTICK wird dazu verwendet, den Status eines Joystick-Geräts auszulesen
    (Auch Joypads und andere Gamecontroler können so abgefragt werden). Dabei wird
    jeder Joystick über eine eindeutige ID identifiziert. Bis zu 16 Joysticks
    können verwendet werden.
    Sobald GETJOYSTICK aufgerufen wird, speichert es den aktuellen Status der
    Joystick-Achsen und -Buttons in den Speicherstellen, deren Adressen übergeben
    wurden.
    Die Buttons-Speicherstelle muss dabei vom Typ INTEGER sein. In ihr wird ein
    Bitfeld gespeichert, das angibt, welche Buttons gerade gedrückt werden. Bis
    zu 32 Buttons werden unterstützt. Der Status des ersten Buttons wird dabei
    im letzten Bit (mit der Bitnummer 0) gespeichert.
    Die Informationen zu den Achsen werden relativ zum Vollausschlag in SINGLE-Variablen
    gespeichert. Das Ergebnis -1.0 entspricht dabei einem Vollausschlag nach links
    (für x) oder nach vorne (für y); +1.0 bedeutet entsprechend einem
    Vollausschlag nach rechts oder hinten. 0.0 steht bei allen Achsen für die
    Ruheposition.
    Ein Joystick wird immer zumindest die X- und Y-Achsen unterstützen, manche
    Controller bieten aber noch zusätzliche Achsen. Wenn eine zusätzliche
    Achse verfügbar ist, wird ihr Status in den entsprechenden Variablen
    gespeichert; ihr Wert liegt zwischen -1.0 und +1.0.
    Wenn eine Achse nicht unterstützt wird, schreibt freeBASIC an die entsprechende
    Speicherstelle einen Wert, der kleiner als -1.0 ist.
    Wenn der Joystick mit der angegebenen ID nicht verfügbar ist, gibt
    freeBASIC -1 bei den Buttons zurück und alle Achsen haben einen Wert, der
    kleiner als -1.0 ist.

    Beispiel:
    SCREEN 12

    DIM AS SINGLE x, y
    DIM AS INTEGER buttons, result, i

    CONST JoystickID = 0

    ' Prüfe, ob die Joystick-Abfrage arbeitet:

    IF GETJOYSTICK(JoystickID, buttons, x, y) THEN
    PRINT "Joystick existiert nicht, oder ein Fehler ist aufgetreten."
    PRINT
    PRINT "Beliebige Taste drücken um fortzusetzen"
    SLEEP
    END
    END IF

    DO
    GETJOYSTICK JoystickID, buttons, x, y

    LOCATE 1,1
    PRINT USING "x: +#.### y: +#.### Buttons: #### "; x; y; buttons

    ' Zeige an, welche Buttons gerade gedrückt werden:
    FOR i = 0 TO 26
    IF (buttons AND (1 SHL i)) THEN
    PRINT "Button ";i ;" gedrueckt. "
    ELSE
    PRINT "Button ";i ;" nicht gedrueckt."
    END IF
    NEXT
    ' Bei Tastendrück beenen.
    LOOP UNTIL LEN(INKEY)
    Wie man sieht, muss der Funktionswert muss nicht abgefragt werden; GETJOYSTICK kann
    auch als Anweisung eingesetzt werden. In diesem Fall entfallen die Klammern; der
    Rückgabewert geht verloren.

    Unterschiede: Neu in freeBASIC

    Siehe auch:
    GETMOUSE, GETKEY


GETKEY

Syntax: GETKEY
Typ: Funktion
Kategorie: Eingabe

Wartet mit der Programmausführung, bis eine Taste gedrückt wird.
GETKEY ist also ein Ersatz für SLEEP. Im Gegensatz zu SLEEP
allerdings löscht GETKEY den Tastaturpuffer, nachdem eine Taste gedrückt wird.

Beispiel:
PRINT "beliebige Taste drücken, um fortzusetzen"
GETKEY
PRINT LEN(INKEY)

Siehe auch:
SLEEP,
GETMOUSE, GETJOYSTICK,
INKEY, INPUT (Funktion), MULTIKEY

Unterschiede: Neu in freeBASIC.


GETMOUSE

Syntax: GETMOUSE x, y[, [Rad][, [Buttons]]]
Typ: Anweisung
Kategorie: Eingabe

GETMOUSE liefert die Position der Maus und den Status der Buttons und des Mausrades
zurück.

  • Die Position wird in den Variablen 'x' und 'y' zurückgegeben; Beide müssen
    vom Typ INTEGER sein. Wenn sich die Maus außerhalb des
    Fensters befindet, liefern 'x' und 'y' -1.
    Diese Koordinaten richten sich nach dem Anzeigemodus:
    - In Grafikmodi geben Sie die Position in Pixeln an; die linke obere Ecke
    entspricht dabei den Koordinaten 0, 0.
    - In Textmodi wird die Position des Cursors in Zeilen und Spalten ausgegeben; die
    linke obere Ecke entspricht dabei den Koordinaten 1, 1.
    - Siehe auch: SCREEN (Anweisung)
    Änderungen am Koordinatensystem durch VIEW und WINDOW haben keinen Einfluss auf
    die von GETMOUSE zurückgelieferten Koordinaten.

  • 'Rad' gibt den Status des Mausrads zurück: Wenn Sie das Mausrad von sich
    wegdrehen, wird diese Variable jeweils um den Wert 1 erhöht. Drehen Sie es
    auf sich zu, wird 'Rad' um 1 vermindert.
    'Rad' startet bei jeder Programmausführung mit 0.
    Wenn sich die Maus außerhalb des Fensters befindet, liefert 'Rad' -1.
  • 'Buttons' gibt an, welche Maustasten gerade gedrückt sind:
    Bit 0 wird gesetzt, wenn die LINKE Maustaste gedrückt wird.
    Bit 1 wird gesetzt, wenn die RECHTE Maustaste gedrückt wird.
    Bit 2 wird gesetzt, wenn die MITTLERE Maustaste gedrückt wird.
    Siehe dazu BIT

  • Wenn keine Maus angeschlossen ist, werden alle übergeben Variablen auf -1
    gesetzt.

    • GETMOUSE funktioniert seit freeBASIC v0.14 nicht nur in Grafikmodi, sondern
    auch in Textmodi.

    Beispiel:
    DIM AS INTEGER x, y, buttons

    ' Videomodus 320x200x8 setzen
    SCREEN 13

    DO
    ' Lade Mauskoordinaten ohne Mausrad.
    GETMOUSE x, y,, buttons

    LOCATE 1, 1
    IF x < 0 THEN
    PRINT "Mouse not available or not on window"
    ELSE
    PRINT USING "Mouse position: ###:### Buttons: "; x; y;
    ' Buttons auswerten
    IF Bit(buttons, 0) THEN PRINT "L";
    IF Bit(buttons, 1) THEN PRINT "R";
    IF Bit(buttons, 2) THEN PRINT "M";
    PRINT " "
    END IF
    LOOP WHILE INKEY = ""

    Änderungen (zu QB):
    Neu in freeBASIC.

    Siehe auch:
    SCREEN (Anweisung),
    GETKEY, GETJOYSTICK


GOSUB

Syntax: GOSUB label
Typ: Anweisung
Kategorie: Programmorganisation

Springt zu einem Label, und speichert, von wo der Sprung ausgeführt wurde, um später
noch einaml dorthin zurückzukehren.
GOSUB hat eine ähnliche Funktion wie SUB. Die SUB-Methode
sollte jedoch bevorzugt werden, da durch GOSUB oft unübersichtlicher Code entsteht.
GOSUB ist der Vorgänger von SUB.

GOSUB verzweigt zu einer beliebigen Programmstelle. Um von dort zum Hauptprogramm
zurückzukehren, benutzen Sie RETURN.

Achtung: Seit freeBASIC v0.16b, März-Release darf GOSUB nicht mehr auf
Prozedurebene verwendet werden. Stattdessen muss GOTO, oder eine SUB oder
FUNCTION verwendet werden.

Beispiel:
GOSUB message
END

message:
PRINT "Welcome!
RETURN

Unterschiede
(zu QB):
  • GOSUB ist auf Prozedurebene nicht mehr zulässig

    • (zu früheren freeBASIC-Versionen):
  • Seit freeBASIC v0.16b, März-Release ist es nicht mehr zulässig, GOSUB auf
    Prozedurebene zu verwenden.

    • Siehe auch:
    RETURN, GOTO,
    SUB, FUNCTION,
    Prozeduren,
    GOTO und GOSUB


GOTO

Syntax: GOTO label
Typ: Anweisung
Kategorie: Programmorganisation

Springt zu einem beliebigen Label.
Ein Label ist eine Zahl, oder eine Zeichenfolge mit einem abschließenden
Doppelpunkt. Die Zeichenfolge darf kein Befehl, Name einer SUB/FUNCTION oder
einer bereits bestehenden Variable sein. Für den Namen von Labels gelten die selben
Regeln wie für die Namen von Variablen.
Jedes Label darf nur einmal vergeben werden! Es ist ebenfalls unzulässig,
den selben Namen innerhalb zweier SUBs/FUNCTIONs/Module doppelt zu verwenden.
Eine GOTO-Anweisung bezieht sich immer auf ein Label innerhalb der selben SUB/
FUNCTION/ des selben Moduls.

Beispiel:
1 GOTO 4
2 PRINT "Ciao"
3 GOTO ende
4 PRINT "Welcome!
5 GOTO 2

ende:
END

GOTO erzeugt oft (fast immer!) schlecht les- und wartbaren Code, und sollte
daher weitestgehend vermieden werden.
Ersatz dafür bieten Strukturen wie DO...LOOP, FOR...NEXT, SUB, und FUNCTION.

Siehe auch:
GOSUB,
DO...LOOP, FOR...NEXT, SUB,
SUB, FUNCTION,
EXIT
Prozeduren,
GOTO und GOSUB


Liste der Schlüsselwörter beginnend mit H

HEX
HIBYTE
HIWORD
HOUR


HEX

Syntax: HEX[$] (Ausdruck [, Stellen])
Typ: Funktion
Kategorie: Zählsysteme

HEX gibt den hexadezimalen Wert eines beliebigen numerischen Ausdrucks als
String zurück.
Hexadezimale Zahlen enthalten Ziffern aus dem Bereich 0-F (0123456789ABCDEF).

  • 'Ausdruck' ist eine Ganzzahl (eine Zahl ohne Kommastellen), die ins
    Hexadezimalformat übersetzt werden soll

  • 'Stellen' ist die Anzahl der Stellen, die dafür aufgewandt werden soll. Ist
    'Stellen' größer als die benötigte Stellenzahl, wird der Rückgabewert mit
    führenden Nullen aufgefüllt.
    Ist 'Stellen' kleiner als die benötigte Stellenzahl, werden nur die hinteren
    Zeichen des Rückgabewerts ausgegeben.
    Wird 'Stellen' ausgelassen, besteht der Rückgabewert aus so vielen Zeichen,
    wie benötigt werden, um die Zahl korrekt darzustellen.
    Dieser Parameter steht erst seit freeBASIC v0.16b zur Verfügung!

  • Der Rückgabwert ist ein String, der den Wert von 'Ausdruck' im
    Hexadezimalformat enthält.

    • Das Dollarzeichen ($) als Suffix ist optional.

    Beispiel
    PRINT HEX(54321)
    PRINT HEX(255, 4)
    PRINT HEX(70000, 3)
    Ausgabe:
    D431
    00FF
    170

    Um einen hexadezimalen Wert in einen dezimalen zurückzuverwandeln, benutzen
    Sie VAL. Damit VAL den nachfolgenden STRING als
    Hexadezimalwert behandelt, muss ihm ein "&H" vorausgehen:
    PRINT VAL("&HB0")
    (gibt 192 aus.)

    Siehe auch:
    BIN, OCT, VAL,
    WHEX


HIBYTE

Syntax: HIBYTE (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

Gibt das obere Byte eines Ausdrucks zurück.
HIBYTE hat die selbe Funktion wie
CUNSG(Ausdruck) SHR 8

Beispiel:
foo = &b10000100000 ' = 1056 dezimal
PRINT HIBYTE(foo)
PRINT CUNSG(foo) SHR 8
Ausgabe:
2
2

Siehe auch:
HIWORD, LOBYTE, LOWORD

Unterschiede: Neu in freeBASIC


HIWORD

Syntax: HIWORD (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

Gibt das obere Word eines Ausdrucks zurück.
HIWORD hat die selbe Funktion wie
CUNSG(Ausdruck) SHR 16

Beispiel:
foo = &b11000000000000000 ' = 98304 dezimal
PRINT HIWORD(foo)
PRINT CUNSG(foo) SHR 16
Ausgabe:
1
1

Siehe auch:
HIBYTE, LOBYTE, LOWORD

Unterschiede: Neu in freeBASIC


HOUR

Syntax: HOUR(Serial)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

HOUR extrahiert die Stunde einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Serial Number behandelt wird.

  • Der Rückgabewert ist die Stunde, die in der Serial Number gespeichert ist.

    • Beispiel:
    Die aktuelle Stunde aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM Stunde AS INTEGER
    Stunde = HOUR(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


Liste der Schlüsselwörter beginnend mit I

IF...THEN
IIF
IMAGECONVERTROW
IMAGECREATE
IMAGEDESTROY
IMP
IMPORT
INCLIB
INCLUDE
INKEY
INP
INPUT
INPUT (Anweisung)
INPUT #
INPUT (Dateimodus)
INPUT (Funktion)
INSTR
INT
INTEGER
IS
ISDATE


#IF

Typ: Metabefehl
Kategorie: Präprozessoren

Syntax: #IF (Bedingung)
Syntax (Erweitert):
#IF (Bedingung)
   '...Programmcode
[#ELSEIF (Bedingung)
   ...]
[#ELSE
   ...]
#ENDIF

#IF leitet einen Mechanismus ein, der den Nachstehenden Code nur komipiliert, wenn die Bedingung erfüllt ist. Es kann ein alternativer Code
angegeben werden, der unter anderen Bedingungen ausgeführt werden soll.

Grundsätzlich funktioniert der Metabefehl #IF genau so, wie IF...THEN. Der Unterschied liegt darin, dass
IF...THEN den Code lediglich nicht ausführt, wenn die Bedingung nicht erfüllt wurde, während er durch #IF gar nicht erst komipiliert
wird. Daher darf Bedingung auch nur aus einfachen Ausdrücken (Ausdrücke, die nur Konstanten enthalten, und keine Variablen) bestehen.
Ebenso eingesetzt werden können #DEFINE-Symbole sowie die FB-eigenen vordefinierten Symbole.

Dieser Metabefehl ermöglicht die Einbindung von C/C++ Headern (wodurch C/C++ Libs benutzt werden können). Außerdem wird die Portabilität
zu verschiedenen Systemen gewährleistet.

Wenn die Bedingung nach #IF erfüllt (wahr) ist, wird der folgende Code komipiliert. Die Befehle nach #ELSEIF und #ELSE werden übergangen.
Andernfalls werden nacheinander die Bedingungen hinter den #ELSEIFs geprüft. Ist keine Bedingung wahr, wird der Code hinter #ELSE komipiliert.

Beispiel:
#IF DEFINED(__FB_WIN32__)
#INCLUDE "ProjectWin.bi"
#ELSEIF DEFINED(__FB_LINUX__)
#INCLUDE "ProjectLinux.bi"
#ELSE
#ERROR "Plattform wird nicht unterstützt
#ENDIF

Siehe auch:
#IFDEF, ##IFNDEF, IF...THEN,
Präprozessoren

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC.

    • zu früheren Versionen von freeBASIC:
  • - keine -


IF...THEN

Typ: Anweisung
Kategorie: Bedingungen

Einfache Syntax:
IF Bedingung THEN [:] Anweisungen [ELSE Anweisungen] [END IF]

Blockstruktur-Syntax:

IF Bedingung1 THEN
   ' Code
[ELSEIF Bedingung2 THEN
   ' Code]
[ ... ]
[ELSE
   ' Code]
END IF

IF...THEN führt einen Codeteil nur dann aus, wenn eine Bedingung erfüllt ist.

  • 'Bedingung', ist ein nummerischer Ausdruck, der entweder wahr/erfüllt (ungleich null) oder falsch/nicht erfüllt (gleich null) sein kann.

  • 'Code' bzw. 'Anweisungen' steht für einen beliebigen freeBASIC-Programmcode, der ausgeführt werden soll, wenn die Bedingung erfüllt
    wurde.

    • Mit IF...THEN werden einfache Entscheidungen getroffen. Um viele Bedingungen zu prüfen, wird bevorzugt SELECT CASE verwendet.

    Die Bedingungen werden in der Reihenfolge abgearbeitet, in der sie im Code stehen.
    Der Code hinter ELSE wird abgearbeitet, wenn keine der Vorhergeheden Bedingungen wahr ist.
    Der IF...THEN-Block muss mit END IF abgeschlossen werden.

    END IF beendet einen IF...THEN-Block. Wenn IF nur als einzeiliger Befehl eingesetzt wird, ist er optional; das soll das Portieren von
    C-Code erleichtern.

    Als Block-Anweisung initialisiert IF...THEN seit freeBASIC v0.16 einen SCOPE-Block, der mit der Zeile END IF
    endet. Variablen, die innerhalb eines solchen Blocks deklariert werden, existieren außerhalb nicht mehr.

    Beispiel: Einfaches Ratespiel
    RANDOMIZE TIMER
    x = RND * 10

    PRINT "Rate die Zahl zwischen 0 und 10)"

    DO
    INPUT "Rate..."; y
    IF x = y THEN
    PRINT "richtig!"
    EXIT DO
    ELSEIF x > y THEN
    PRINT "zu klein!"
    ELSE
    PRINT "zu groß!"
    END IF
    LOOP

    Unterschiede
    zu QB und VB:
  • Innerhalb eines IF...THEN-Blocks durften keine Variablen definiert werden.

  • In einzeiligen IF's (Syntax A) muss END IF benutzt werden, wenn direkt hinter dem THEN ein Doppelpunkt (:) folgt.

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.16b wirkt ein IF...THEN-Block wie ein SCOPE-Block

  • Erst seit freeBASIC v0.15 muss END IF benutzt werden, wenn direkt hinter dem THEN ein Doppelpunkt (:) folgt.

    • Siehe auch:
    #IF, SELECT CASE, IIF,
    Ausdrücke und Operatoren,
    Bedingungsstrukturen


#IFDEF

Syntax: #IFDEF Symbol
Typ: Metabefehl
Kategorie: Päprozessoren

Das ist die Kurzform für:
#IF DEFINED(Symbol)
Die verkürzte Form ist:
#IFDEF Symbol
Es erspart Ihnen die Eingabe von 6 Zeichen.

Symbol darf jede Art von Symbol sein, auch eines, das mit CONST erstellt wurde.

Siehe auch:
#IFNDEF, #IF
Präprozessoren

Unterschiede: Neu in freeBASIC.


#IFNDEF

Syntax: #IFNDEF Symbol
Typ: Metabefehl
Kategorie: Präprozessoren

Dies ist die Kurzform für:
#IF NOT DEFINED(Symbol)
Die verkürzte Form ist:
#IFNDEF Symbol
Es erspart Ihnen die Eingabe von 9 Zeichen.

Symbol darf jede Art von Symbol sein, auch eines, das mit CONST erstellt wurde.

Siehe auch:
#IFDEF, #IF
Präprozessoren

Unterschiede: Neu in freeBASIC.


IIF

Syntax: IIF ( Bedingung, Ausdruck_wenn_wahr, Ausdruck_wenn_falsch )
Typ: Funktion
Kategorie: Bedingungen

IIF liefert einen von zwei Werten zurück, abhängig davon, ob eine Bedingung erfüllt oder nicht erfüllt wurde.

  • 'Bedingung' ist ein nummerischer Ausdruck, der entweder gleich oder ungleich null sein kann. Ist der Wert des Ausdrucks gleich null,
    so ist die Bedingung nicht erfüllt.

  • 'Ausdruck_wenn_wahr' wird als Ergebnis der Funktion zurückgegeben, wenn die Bedingung erfüllt wurde. Es muss ein nummerischer Ausdruck
    sein, also eine Ganzzahl, ein Fließkommawert oder ein Pointer.

  • 'Ausdruck_wenn_falsch' wird als Ergebnis der Funktion zurückgegeben, wenn die Bedingung nicht erfüllt wurde. Es muss ein nummerischer
    Ausdruck sein, also eine Ganzzahl, ein Fließkommawert oder ein Pointer.

    • IIf liefert einen numerischen Wert, abhängig vom Ergebnis der Bedingungsauswertung. Die typische Anwendung ist mitten in einem Ausdruck;
    so wird vermieden, daß ein Bedingungsausdruck unnötig aufgeteilt werden muß.

    IIf berechnet den Ausdruck nur bis das Ergebnis feststeht. Das spart Zeit und kann auch verhindern, daß Ausdrücke ausgewertet werden,
    die ungültige Ergebnisse nach Auswertung von Bedingung hätten.

    Wie bereits erwähnt müssen alle Parameter nummerischer Natur sind. Dies schließt allerdings auch Pointer ein, so dass über einen Umweg
    auch mit STRINGs gearbeitet werden kann.

    Beispiel 1:
    DIM AS INTEGER a, b
    ? "Ist a > b? Antwort: "; *IIF(a > b, @"Ja", @"Nein")

    Beispiel 2:
    DIM AS INTEGER a, b, x, y, z
    a = (x + y + IIF(b > 0, 4, 7)) \ z

    Dieser Code ist äquivalent zu:
    DIM AS INTEGER a, b, x, y, z, temp
    IF b > 0 THEN temp = 4 ELSE temp = 7
    a = (x + y + temp) \ z

    Es obliegt dem Programmierer, zu entscheiden, welche Form die günstigere ist.

    Unterschiede
    zu QB:
  • neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • IIF existiert seit freeBASIC v0.12

    • Siehe auch:
    IF...THEN,
    Ausdrücke und Operatoren
    Bedingungsstrukturen


IMAGECONVERTROW

Syntax: IMAGECONVERTROW src, src_bpp, dst, dst_bpp, width, [isrgb]
Typ: Anweisung
Kategorie: Gfx

Kopiert eine bestimmte Anzahl von Pixeln von einem Grafikpuffer in einen anderen,
und konvertiert dabei die Anzahl der Bits pro Pixel in der Kopie auf einen
gewünschten Wert.

  • 'src' ist ein Pointer beliebigen Typs (ANY PTR) an die Adresse, an der die
    Bildzeile beginnt, die konvertiert werden soll.
    Die Quelle kann entweder ein Bildpuffer im high/truecolor-Format sein (mit
    24 oder 32 bpp), oder ein Bildpuffer im palettenindizierten Format mit ein
    bis acht bpp.
    Die Konversion eines palettenindizierten Bildes wird nur dann korrekte
    Ergebnisse erzielen, wenn Sie in einem Bildschirmmodus arbeiten, der eine
    korrekte Palette benutzt, während Sie die Konversion durchführen.

  • 'src_bpp' ist die Anzahl der Bits pro Pixel in der Quelle. Zulässig sind die
    Werte 1-8, 24 und 32.

  • 'dst' ist ein Pointer beliebingen Typs (ANY PTR) an den Beginn der Zeile, in
    die das konvertierte Bild geschrieben werden soll. Der Pointer darf auf einen
    Bereich innerhalb eines Bildpuffers für ein 16bpp oder einen 32bpp-Modus
    zeigen.
    Nur wenn das Quellbild ein palettenindiziertes Bild ist, kann diese Adresse
    auch auf einen Bildpuffer für ein Bild mit 1-8bpp verweisen.

  • 'dst_bpp' ist die Anzahl der Bits pro Pixel im Zielpuffer. Zulässig sind die
    Werte 1-8, 16 und 32.

  • 'width' ist die Breite einer Zeile in Pixeln, oder auch die Anzahl der Pixel
    des gesamten Bildes, berechnet nach Breite * Höhe. Auf diese Art kann ein
    ganzes Bild in einem Schritt konvertiert werden; dies ist jedoch nur möglich,
    wenn die Bildinformation in einem Stück abgespeichert ist, und nicht durch
    Padding-Bytes unterbrochen wird.
    In einem normalen freeBASIC-Bildpuffer (wie er von GET (Grafik) verwendet
    wird) ist dies der Fall, jedoch nicht zwingend in allen Arten von
    Bildpuffern. Beispielsweise werden die Zeilen von BMP-Bildern so weit mit
    Padding-Bytes aufgefüllt, dass ihre Anzahl ein Vielfaches von vier ergibt.
    PNG-Bilder haben immer ein Filter-Byte zu Beginn jeder Zeile.

  • 'isrgb' wird verwendet, um bei High/Truecolor-Bildern (ab einer Farbtiefe
    von 15bpp) die Reihenfolge der Rot-, Grün- und Blauanteil-Bytes festzulegen.
    Wird hier null angegeben, so vertauscht freeBASIC während der Konversion die
    Position des Rot- und Blaukanals; die Reihenfolge der Teilfarbinformationen
    wird also umgekehrt.
    Wird hier ein Wert ungleich null angegeben, oder wird der Parameter
    ausgelassen, so behält freeBASIC die Reihenfolge der Farbkanäle bei, so wie
    es in 'src' vorgegeben wurde.

    • Beispiel:
    OPTION EXPLICIT
    DIM AS ANY PTR img8, img32
    DIM AS INTEGER i, y

    ' Erstelle ein 32bpp-Bild der Größe 100x100 Pixel
    SCREENRES 320, 200, 32, , -1
    img32 = IMAGECREATE(100, 100)

    ' Erstelle ein 8bpp-Bild der Größe 100x100 Pixel
    SCREENRES 320, 200, 8, , -1
    img8 = IMAGECREATE(100, 100)

    ' Nach Zufall einige Punkte auf dem 8bpp-Bild verteilen:
    FOR i = 1 TO 1000
    PSET img8, (INT(RND * 100), INT(RND * 100)), INT(RND * 256)
    NEXT i

    ' Ein 8bpp-Grafikfenster öffnen, um das Bild anzuzeigen
    SCREENRES 320, 200, 8
    PUT (10, 10), img8

    GETKEY

    ' Kopiere die Daten in den 32bpp-Bildpuffer:
    FOR y = 0 TO 99
    IMAGECONVERTROW(img8 + (4 + y * 100) , 8, _
    img32 + (4 + y * 100 * 4) , _
    32, 100)
    NEXT y

    ' Ein 32bpp-Grafikfenster öffnen, um das Bild anzuzeigen
    SCREENRES 320, 200, 32
    PUT (10, 10), img32

    GETKEY

    ' Speicher für die Bilder freigeben
    IMAGEDESTROY img8
    IMAGEDESTROY img32

    Unterschiede:
    zu QB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.16

    • Siehe auch:
    IMAGECREATE, IMAGEDESTROY,
    GET (Grafik), PUT (Grafik),
    SCREEN (Anweisung), SCREENRES


IMAGECREATE

Syntax: IMAGECREATE(Breite, Hoehe[, Farbe])
Typ: Funktion
Kategorie: Gfx

IMAGECREATE reserviert einen Speicherbereich als Datenpuffer für ein Bild.

  • Breite und Höhe sind die Maße des Bildes in Pixeln.

  • Farbe ist ein optionaler Parameter, der eine Farbnummer angibt, mit der der Puffer bei seiner Erstellung gefüllt sein soll. Wenn dieser
    Parameter ausgelassen wird, setzt freeBASIC die Transparenzfarbe des jeweiligen Modus ein.

  • Der Rückgabewert ist ein Pointer auf den Beginn des reservierten Speicherbereichs.

    • Diese Funktion reserviert einen Speicherbereich, in dem Pixeldaten gepuffert werden können. Sobald dieser Puffer erstellt wurde, können
    alle Drawing Primitives (Einfachste Grafikfunktionen) darauf zugreifen.
    Bei seiner Erstellung wird der Speicherbereich mit der angegebenen Farbe oder der Transparenzfarbe des jeweiligen Modus ausgefüllt (Für
    indizierte Grafikmodi ist die Transparenzfarbe 0, für alle anderen ist es &HFF00FF).

    IMAGECREATE gibt, ähnlich wie ALLOCATE, einen Pointer auf den reservierten Speicherbereich zurück, und funktioniert nur, wenn bereits
    ein Grafikmodus mit SCREEN (Anweisung) oder SCREENRES initiiert wurde. Falls IMAGECREATE fehlschlägt, ist das Ergebnis 0.
    Bildpuffer, die Sie mit IMAGECREATE erstellt haben, müssen mit IMAGEDESTROY entfernt werden, sobald Sie sie nicht mehr benötigt
    werden, um den Speicherplatz freizugeben; diese Speicherfreigabe wird nicht automatisch erledigt, wenn das Programm beendet wird!

    Zum Speicheraufbau eines Bildpuffers siehe Interne Pixelformate: Bildpuffer.

    Beispiel:
    Dim Img As Byte Ptr
    Dim Cut As Byte Ptr

    Screen 15, 32

    Img = Imagecreate(64, 64, RGBA(64, 160, 0, 255))
    Cut = Imagecreate(32, 32)

    If Img = 0 OR Cut = 0 Then
    Print "Speicher konnte nicht reserviert werden!"
    If Img Then ImageDestroy Img
    IF Cut Then ImageDestroy Cut
    End If

    Circle Img, (32, 32), 28, RGBA(255, 0, 0, 128), , , , F
    Get Img, (0, 0)-(31, 31), Cut

    Put Img, (32, 32), Cut, Pset
    Put (160, 120), Img, Pset
    Put (180, 140), Img, Alpha

    Imagedestroy Img
    Imagedestroy Cut
    GetKey

    Unterschiede:
    zu QB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • Seit v0.17 stehen zwei Speicherformate für Bildpuffer zur Verfügung. Siehe Interne Pixelformate für Details.

  • IMAGECREATE existiert seit freeBASIC v0.14

    • Siehe auch:
    IMAGEDESTROY, IMAGECONVERTROW,
    GET (Grafik), PUT (Grafik),
    PSET (Grafik),
    SCREEN (Anweisung), SCREENRES,
    Interne Pixelformate


#IMAGEDESTROY

Syntax: IMAGEDESTROY image
Typ: Anweisung
Kategorie: Gfx

Gibt den mit IMAGECREATE reservierten Speicher wieder frei.

image ist der Name des Puffers, der freigegeben werden soll.

Beispiel: Siehe IMAGECREATE.

Unterschiede: Neu in freeBASIC.

Siehe auch:
IMAGECREATE


IMP

IMP kann als einfacher und kombinierter Operator eingesetzt werden:

logischer Operator (einfacher Operator)

Syntax: Ausdruck1 IMP Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

Ein bitweiser Operator, der die selbe Funktion hat wie
(NOT a)OR b.

IMP wird benutzt, um logische Folgerungen auszuwerten; das Ergebnisbit wird nur
dann nicht gesetzt, wenn das zweite Operanden-Bit nicht gesetzt ist, während das
Erste gesetzt ist.

Beispiel 1: IMP in einer IF-THEN-Bedingung:
IF (a = 1) IMP (b = 7) THEN
PRINT "Moeglich sind:"
PRINT "a = 1 und b = 7"
PRINT "a <> 1 aber b = 7"
PRINT "a <> 1 und b <> 7"
ELSE
PRINT "a = 1 aber b <> 7."
END IF

Beispiel 2: Komplement zweier Zahlen mit IMP:
DIM AS INTEGER z1, z2

z1 = 6
z2 = 10

PRINT z1, BIN(z1, 4)
PRINT z2, BIN(z2, 4)
PRINT "---", "----"
PRINT (z1 IMP z2) AND 15, BIN( (z1 IMP z2) AND 15, 4)
GETKEY
Ausgabe:
  6           0110
 10           1010
---           ----
 11           1011

Anmerkung dazu: Die angewandten AND 15 bewirken, dass nur die letzten vier Bits
angezeigt werden. Der Grund dafür ist, dass INTEGER-Variablen aus 32bit bestehen.
Die übrigen 28bits werden selbstverständlich auch mit IMP verglichen. Würden
diese in dieses Beispiel miteinbezogen, würde dieses Beispiel einen Teil seiner
Anschaulichkeit verlieren.

Siehe auch:
NOT, AND (Operator), OR (Operator), XOR (Operator), EQV,
Logische Operatoren

kombinierter Operator

Syntax: Wert IMP= Ausdruck
Typ: Operator
Kategorie: logische Operatoren

Das kombinierte IMP ist eine Kurzform von
Wert = Wert IMP Ausdruck
Das kombinierte IMP also setzt die Bits im Ergebnis nach den Bedingungen, nach denen
auch das einfache IMP arbeitet.

Beispiel:
DIM AS UBYTE a

a = &B00110011
PRINT BIN(a, 8)
a IMP= &B01010101
PRINT "01010101"
PRINT "--------"

PRINT BIN(a, 8)
GETKEY
Ausgabe:_
00110011
01010101
--------
11011101

Siehe auch:
einfaches IMP,
NOT, AND (Operator), OR (Operator), XOR (Operator), EQV,
Logische Operatoren


IMPORT

Typ: Schlüsselwort

Wird zusammen mit EXTERN (Module) verwendet.


INCLIB

Syntax A: #INCLIB "LibName.a"
Syntax B: '$INCLIB: "LibName.a"
Typ: Metabefehl
Kategorie: Programmorganisation

Lädt eine Bibliothek (*.a-Datei) in den Link-Vorgang, wodurch dem Programmierer
das Kompilern vereinfacht wird. (Man erspart sich die Kommandozeile
FBC Quelldatei -a Lib.)

  • 'LibName.a' ist der Dateiname der einubindenden Bibliothek, eventuell mit Pfadangabe.
    Wenn kein Pfad angegeben wird, sucht freeBASIC zuerst im aktuellen
    Arbeitsverzeichnis, dann im Verzeichnis, in dem sich der Quellcode befindet,
    und schließlich in den System-Include-Verzeichnissen nach der einzubindenden
    Datei.

  • Sowohl Slashes (/) als auch Backslashes (\) werden als Pfad-Trennzeichen
    akzeptiert.

    • Um zu vermeiden, dass ein Codeteil mehrmals eingebunden wird (z.B. weil in der
    eingebundenen Datei weitere INCLIBs stehen), kann das Schlüsselwort ONCE verwendet
    werden. Dadurch werden alle INCLIBs in der eingebundenen Datei ignoriert.

    Beispiel (unvollständiger Codeauszug):
    #INCLIB: "mylib" 'Dadurch wird mylib.a in den Link-Vorgang eingebunden.

    Achtung:
    Seit freeBASIC v0.14 werden ESCAPE-Chars in #INCLIB-Anweisungen nicht mehr
    interpretiert.
    (Siehe OPTION ESCAPE)

    Unterschiede:
    zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Die Variante '$INCLIB ist seit freeBASIC v0.17 nicht mehr zulässig.

  • Escape-Chars werden seit freeBASIC v0.14 in INCLIB-Anweisungen nicht mehr
    interpretiert.

    • INCLUDE, DECLARE


INCLIB

Siehe:
$INCLIB


INCLUDE

Syntax A: #INCLUDE [ONCE] "Datei"
Syntax B: '$INCLUDE [ONCE] 'Datei'
Typ: Metabefehl
Kategorie: Programmorganisation

$INCLUDE bindet Programmcode aus einer anderen Quellcodedatei ein. Dies hat zur
Folge, dass der eingebundene Code beim Kompilern so behandelt wird, als
stünde er an der Stelle, an der sich im echten Code $INCLUDE befindet.
Dadurch lässt sich ein Programm in mehrere Teile zerlegen, wodurch es
übersichtlicher wird.

  • 'Datei' ist der Dateiname des einubindenden Codes, eventuell mit Pfadangabe.
    Wenn kein Pfad angegeben wird, sucht freeBASIC zuerst im aktuellen
    Arbeitsverzeichnis, dann im Verzeichnis, in dem sich der Quellcode befindet,
    und schließlich in den System-Include-Verzeichnissen nach der einzubindenden
    Datei.

  • Sowohl Slashes (/) als auch Backslashes (\) werden als Pfad-Trennzeichen
    akzeptiert.

  • 'ONCE' verhindert, dass Daten doppelt eingebunden werden. Dies kann
    geschehen, wenn die eingebundene Datei ebenfalls INCLUDE-Befehle enthält.

    • Beispiel:
    #INCLUDE "vbcompat.bi"

    Im Gegensatz zu QB können in per $INCLUDE eingebundene Daten auch 'ausführbare'
    Befehle enthalten.

    Es hat sich durchgesetzt, Deklarationsdateien (Dateien, die lediglich
    COMMON/DIM [SHARED]-, DECLARE-, oder TYPE-Anweisungen enthalten) mit der Erweiterung
    BI zu kennzeichnen.
    BI's werden oft eingesetzt, um die Prozeduren einer LIB/DLL zu deklarieren.

    Achtung:
    Seit freeBASIC v0.14 werden ESCAPE-Chars in #INCLUDE-Anweisungen nicht mehr
    interpretiert.
    (Siehe OPTION ESCAPE)

    Unterschiede:
    Zu QB:
  • Wenn der Pfadname einen Unterstrich enthält, müssen doppelte Anführungsstriche
    statt einfacher verwendet werden.

  • Es können auch 'echte' BAS-Files eingebunden werden, die auch 'ausführbare' Anweisungen
    enthalten.

  • Das Schlüsselwort 'ONCE' steht zur Verfügung

    • zu früheren freeBASIC-Versionen
  • Die Variante '$INCLUDE ist seit freeBASIC v0.17 nicht mehr zulässig.

  • Escape-Chars werden seit freeBASIC v0.14 in INCLUDE-Anweisungen nicht mehr
    interpretiert.

    • INCLIB, DECLARE


INCLUDE

Siehe:
$INCLUDE


INKEY

Syntax: INKEY[$]
Typ: Funktion
Kategorie: Eingabe

Gibt einen String zurück, der die zuletzt gedrückte Taste enthält.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
PRINT "Drücken Sie 'q' um zu beenden"
DO
LOOP UNTIL INKEY = "q"

Siehe auch:
INPUT (Anweisung), INPUT (Funktion), LINE INPUT

Unterschiede (zu QB):
Bei erweiterten Zeichen (z.B. Pfeiltasten) ist das erste Zeichen CHR(255). (In QB war es CHR(0).)


INP

Syntax: INP Portnummer
Typ: Funktion
Kategorie: Hardware

ab freeBASIC v0.15b

Liest ein Byte von einem Port.

  • 'Portnummer' ist die Nummer des Ports, von dem gelesen werden soll.
    Zugriffe auf den VGA-Port werden immer noch emuliert, wie in freeBASIC v0.14.

    • Wenn der Zugriff auf den Port fehlschlägt, wird ein Laufzeit-Fehler erzeugt.

    für freeBASIC bis Version 0.14

    Emuliert den VGA-Port.

    Diese Funktion emuliert den INP-Zugriff auf den VGA-Port. Nur der Port &H3C9
    funktioniert wirklich; alle anderen Ports liefern 0 zurück.
    Im Normalfall benötigen Sie diese Funktion nicht; benutzen Sie stattdessen
    PALETTE.

    Siehe auch:
    OUT, WAIT,
    PALETTE, PALETTE GET,
    SCREEN (Anweisung), SCREENSYNC

    Unterschiede (zu QB):
    INP wird nur noch dazu verwendet, um die PALLETTE-Einträge zu lesen. Er emuliert
    einen Zugriff auf den VGA-Port (&H3C9). Dieser Port ist der einzige, auf den Sie
    zugreifen können. INP wurde nur beibehalten, um die Kompatibilität zu QB-Programmen
    zu bewahren, die INP zur Palette-Manipulation benutzten.
    Ein Zugriff auf jeden anderen Port wird daher 0 zurückgeben.

    Grund: Ein direkter Zugriff auf die I/O-Ports ist nicht mehr möglich.

    Siehe auch:
    OUT, WAIT


INPUT

Syntax: INPUT ["Frage" {; | , } ] Variable[ {; | , } Variable [...] ]
Typ: Anweisung
Kategorie: Eingabe

Durch INPUT wird in einem Grafik- oder Konsolenfenster an der aktuellen Cursorposition die angegebene Frage ausgegeben. Wenn hinter der
Frage ein Semikolon (;) steht, hängt freeBASIC automatisch ein Fragezeichen an. Ein Komma stattdessen unterdrückt dieses Feature.
Wird keine Frage angegeben, wird generell kein Fragezeichen ausgegeben.

Nachdem die Ausgabe erfolgt ist, hat der Benutzer die Möglichkeit, einen oder mehrere Werte einzugeben.
Die Werte werden dann in den angegebenen Variablen gespeichert. Dabei müssen die einzelnen Werte durch Kommata getrennt werden; dies
bedeutet natürlich, dass Beispielsweise STRING-Eingaben keine Kommata enthalten dürfen.
Um dennoch STRINGS mit Kommata eingeben zu können, setzen Sie ihre Eingabe einfach in "Anführungszeichen".
Diese aber lassen sich nicht durch ähnliche 'Tricks' ersetzen. Ansonsten erfüllen sie die selbe Funktion wie Kommata.
Gibt der User mehrere Werte an, als in der Anweisung angegeben, werden die überflüssigen Werte einfach ignoriert.
Gibt der Benutzer zu wenige Daten an, befüllt freeBASIC die fehlenden Variablen mit 0 bzw. Nullstrings.
Wird versucht, einer numerischen Variable einen String zuzuweisen, erhält die Variable den Wert 0.

In Versionen von freeBASIC, die älter sind als v0.16 konnte an eine INTEGER-Stelle keine Fließkommazahl eingegeben werden; freeBASIC
erzeugte hier einen Fehler.
Seit v0.16 rundet freeBASIC eine eingegebene Fließkommazahl automatisch zu einem Integer, wie dies schon unter QB geschah.

Beispiel:
DIM wert1 AS INTEGER
DIM wert2 AS SINGLE
DIM wert3 AS STRING
INPUT "Gib 3 Werte an: ", wert1, wert2, wert3

PRINT wert1, wert2, wert3
SLEEP
Auswertungsbeispiel A:
Gib 3 Werte an: 10, 2.5, String
10      2.5      String

Auswertungsbeispiel B:
Gib 3 Werte an: String, 1
0      1
(wert3 hat hier den Wert "", also CHR(0).)

INPUT kann durchaus für einfache Eingaben verwendet werden. Jedoch wird INPUT hauptsächlich von Anfängern verwendet; fortgeschrittene
Programmierer verwenden oft eigene Ersatz-Routinen, die erweiterte Fähigkeiten besitzen, oder von der LOCATE-Anweisung
unabhängig sind.

Siehe auch:
INPUT (Funktion), INPUT #,
PRINT (Anweisung),
LINE INPUT, INPUT #

Unterschiede
zu QB:
  • Es ist möglich, Werte einzugeben, die länger sind als 256 Zeichen. Die Länge der Eingabe wird nur durch die maximale Länge eines
    Strings begrenzt, die derzeit bei 2GB liegt.

  • Bis freeBASIC v0.16 konnten an INTEGER-Stellen keine Fließkommazahlen eingegeben werden.
    In jüngeren Verisionen von freeBASIC wurde dieses Feature hinzugefügt; seither rundet freeBASIC Fließkommazahlen wie in QB
    automatisch zu INTEGERn.

    • zu früheren Versionen von freeBASIC
  • Erst seit v0.16 rundet freeBASIC eine eingegebene Fließkommazahl automatisch zu einem INTEGER, wenn keine Fließkommavariable zur
    Verfügung steht.


INPUT (Datei)

INPUT #f, Variable [, Variable [, ...] ]
Typ: Anweisung
Kategorie: Datei

Liest Daten aus einer Datei, die im INPUT-Modus geöffnet wurde.
Dabei wird Datensatz für Datensatz aus einer sequentiellen Datei gelesen.
Die eingelesenen Daten werden in den angegebenen Variable gespeichert.

'#f' ist die Dateinummer, die durch die OPEN-Anweisung
zugewiesen wurde.

'Variable' ist eine beliebige Variable beliebigen Typs.

Beispiel:
Öffnen der Datei liste.dat und ausgeben aller Datensätze in der Datei
auf dem Bildschirm:
DIM satznr AS INTEGER
DIM satz AS STRING
satznr = 0

OPEN "liste.dat" FOR INPUT AS #1

DO
satznr = satznr + 1
INPUT #1, satz

PRINT satznr, satz
LOOP UNTIL EOF(1)
Die Länge eines Datensatzes wird beim schreiben in die Datei mit
WRITE # festgelegt.
Bei unpassenden Datentypen gelten die selben Regeln wie bei INPUT (Anweisnung).

Siehe auch:
INPUT (Anweisung), INPUT (Funktion),
OPEN, CLOSE,
LINE INPUT #, INPUT (Dateimodus)
WRITE #, OUTPUT


INPUT (Dateimodus)

Typ: Schlüsselwort
Kategorie: Datei

Wird mit OPEN benutzt, um eine Datei im sequentiellen
Lesemodus zu öffnen

Siehe auch:
INPUT (Anweisung), INPUT #, INPUT (Funktion),
OPEN,
OUTPUT, APPEND


INPUT (Funktion)

Syntax: INPUT[$](n, [#f])
Typ: Funktion
Kategorie: Eingabe

Liest eine bestimmte Menge an Zeichen von der Tastatur oder aus einer Datei.

  • 'n' ist ein INTEGER-Wert zwischen 0 und 255, der festlegt, wie viele Zeichen gelesen werden sollen.

  • '#f' ist die Dateinummer einer mit OPEN in einem sequentiellen Modus (INPUT, OUTPUT, APPEND) geöffneten Datei. Sie legt die Datei
    fest, aus der gelesen werden soll.
    Wird dieser Parameter ausgelassen, liest freeBASIC von der Tastatur; die Programmausführung wird dafür unterbrochen.

    • Beispiel 1: Von der Tastatur lesen
    DIM k AS STRING

    PRINT "1) laden"
    PRINT "2) speichern"
    PRINT "3) neu"
    PRINT
    PRINT "0) Beenden"
    PRINT

    k = INPUT(1)

    PRINT "gewählt: ";
    SELECT CASE k
    CASE "1"
    PRINT "laden"
    CASE "2"
    PRINT "speichern"
    CASE "3"
    PRINT "neu"
    CASE "0"
    END
    END SELECT

    Beispiel 2: Die ersten drei Zeichen aus der Datei "file.ext" lesen
    f = FREEFILE
    OPEN "file.ext" FOR INPUT AS #f
    PRINT INPUT(3, #f)

    Siehe auch:
    INPUT-Varianten,
    INKEY,
    GETKEY, MULTIKEY
    OPEN,
    WINPUT (Funktion)


INPUT

Typ: Anweisung/Funktion

INPUT ist ein Schlüsselwort, das als Anweisung, Funktion und Dateimodus eingesetzt
werden kann.

Siehe:
INPUT (Anweisung)
LINE INPUT
WIDTH (Funktion)
INPUT #
LINE INPUT #
INPUT (Dateimodus)


INSTR

Syntax: INSTR ([Start,] String1, [ANY] String2)
Typ: Funktion
Kategorie: Stringmanipulation

Prüft, ob String2 oder Teile davon in String1 vorkommt und liefert die Position
innerhalb String1 zurück.

  • 'Start' ist eine Zahl vom Typ INTEGER, die angibt, von welchem Zeichen an
    String1 durchsucht werden soll. Wenn 'Start' ausgelassen wird, durchsucht INSTR
    ab Anfang

  • INSTR prüft, ob der gesamte 'String2' in 'String1' vorkommt. Wird die ANY-
    Klausel verwendet, prüft INSTR nur, ob irgend eines der Zeichen aus 'String2'
    vorkommt.

  • Der Rückgabewert ist die erste Position, an der 'String2' bzw. Teile davon
    in 'String1' gefunden wurden. Falls keine Treffer erzielt werden, liefert
    INSTR 0 zurück.

    • Seit freeBASIC v0.15b dürfen die Strings auch NULs (CHR(0)) enthalten.

    Beispiel:
    PRINT INSTR("abcdefg", "def")
    PRINT INSTR(4, "Das Leben ist ein Hund", ANY "Wasser")
    Ausgabe:
    4
    6

    Unterschiede:
    (Zu QB):
  • Die ANY-Klausel ist neu in freeBASIC

    • zu früheren Versionen
  • Die ANY-Klausel kann erst seit freeBASIC v0.15 eingesetzt werden.

    • Siehe auch:
    MID (Funktion)


INT

Syntax: INT(numerischer Ausdruck)
Typ: Funktion
Kategorie: Zählsysteme

Verwandelt einen numerischen Ausdruck in die nächstkleinere oder gleiche
INTEGER-Zahl.
INT(4.9) wird beispielsweise 4 zurückgeben, während INT(-1.3) -2 ausgibt.

Siehe auch:
FIX, CINT


INTEGER

Typ: Datentyp

INTEGER-Zahlen sind vorzeichenbehaftete 32-bit-Ganzzahlen.
Sie liegen im Bereich zwischen -2147483648 und 2147483647.
Berechnung der Bereiche:
-(2 ^ 31) bis (2 ^ 31) - 1

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede (Zu QB):
INTEGER-Variablen sind nun 32-bit-Zahlen. (In QB waren sie 16-bit-Zahlen)


IS

Typ: Schlüsselwort
Kategorie: Bedingungen

Siehe SELECT CASE.


ISDATE

Syntax: ISDATE( Datummstring )
Typ: Funktion
Kategorie: Zeit/Datum

Überprüft, ob ein String in ein Date Serial konvertiert werden kann.

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

  • 'Datumsstring' ist ein STRING, der analysiert werden soll.

  • Der Rückgabewert ist entweder gleich -1, wenn der String ein Datum enthält, oder gleich 0, wenn dies nicht der Fall ist.

    • Damit freeBASIC einen String als Datum anerkennt, muss er im FB-Datumsformat gegeben sein. Die einzelnen Segmente (Tag, Monat, Jahr)
    dürfen durch die Zeichen Minus (-), Slash (/) und Punkt (.) voneinander abgetrennt werden. Alle drei Segmente Müssena angegeben werden,
    ansonsten ist das Ergebnis dieser Funktion gleich 0. Werden in einem String zwei verschiedene Trennzeichen benutzt, so wird ebenfalls
    kein Datum erkannt.
    Vor und nach einem Trennzeichen sowie vor und nach dem Datum an sich dürfen beliebig viele Leerzeichen eingefügt werden; jedoch müssen
    die Ziffern eines Datumssegments direkt beisammen stehen, und dürfen nicht durch Leerzeichen getrennt werden.
    Enthält ein korrekt formatierter Datumsstring neben dem Datum und Leerzeichen noch andere Zeichen, so wird 0 ausgegeben.
    ISDATE arbeitet auch mit ZSTRINGs und WSTRINGs

    Beispiel 1:
    #Include "vbcompat.bi"

    DIM s AS String, d AS Integer

    DO
    Print
    Print "Bitte geben Sie ein Datum ein: "

    Line Input s

    If s = "" Then Exit Do

    If IsDate( s ) Then
    d = DateValue( s )
    Print "Jahr : "; Year ( d )
    Print "Monat : "; Month( d )
    Print "Tag : "; Day ( d )
    Else
    Print "'"; s; "' ist kein zulaessiges Datum"
    End If

    Loop

    Beispiel 2:
    #Include "vbcompat.bi"

    #Define FB_QM Chr(34) ' Das Anführungszeichen (")

    Data "01.01.01"
    Data "01/01/01"
    Data "01-01-01"
    Data "01,01,01"
    Data "01.01/01"
    Data "01.01"
    Data " 01 . 01 . 01 "
    Data "01. 01. 0 1"
    Data "01.01.01 a"
    Data "End"

    Dim s As String

    Do
    Read s
    If s = "End" Then Exit Do

    Color 15
    ? FB_QM; s; FB_QM; Tab(40)

    If IsDate(s) Then
    Color 10
    ? "ist ein gueltiges Datum"
    Else
    Color 12
    ? "ist kein gueltiges Datum"
    End If
    Loop

    GetKey
    Ausgabe:
    "01.01.01"                             ist ein gueltiges Datum
    "01/01/01"                             ist ein gueltiges Datum
    "01-01-01"                             ist ein gueltiges Datum
    "01,01,01"                             ist kein gueltiges Datum
    "01.01/01"                             ist kein gueltiges Datum
    "01.01"                                ist kein gueltiges Datum
    " 01 . 01 . 01 "                       ist ein gueltiges Datum
    "01. 01. 0 1"                          ist kein gueltiges Datum
    "01.01.01 1"                           ist kein gueltiges Datum

    Sie können in dieses Beispiel gerne weitere Test-Daten einbauen: fügen Sie einfach eine weitere DATA-Zeile vor der Zeile
    Data "End"
    ein.

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    Serial Numbers


Liste der Schlüsselwörter beginnend mit K

KILL


KILL

Syntax: KILL(Dateiname)
Typ: Funktion
Kategorie: Datei

Löscht eine Datei von einem Datenträger.

  • 'Dateiname' ist ein String, der den Namen einer Datei enthält, die gelöscht werden soll. Er muss ihre Erweiterung enthalten und kann
    mit einer Pfadangabe versehen sein. Wird kein Arbeitspfad angegeben, so sucht KILL die Datei im aktuellen Arbeitsverzeichnis; siehe
    CURDIR.
    Die Verwendung von Wildcards ist nicht möglich. (Siehe DIR zu Wildcards.)

  • Der Rückgabewert der Funktion ist entweder -1, wenn der Löschvorgang erfolgreich abgeschlossen wurde, oder gleich 0, wenn ein Fehler
    aufgetreten ist.
    Mögliche Fehler sind:
    - ungenügende Zugriffsrechte auf die Datei (z.B. weil diese noch von einem anderen Prozess geöffnet ist)
    - Datei existiert nicht.

    • Vorsicht! Die zu löschende Datei wird NICHT in den Papierkorb verschoben;
    sie wird unwiederbringlich gelöscht!

    Beispiel:
    KILL "file.ext"

    Siehe auch:
    MKDIR, RMDIR, CHDIR, CURDIR,
    SHELL


Liste der Schlüsselwörter beginnend mit L

LBOUND
LCASE
LEFT
LEN
LET
LIB
LINE
LINE (Grafik)
LINE INPUT
LINE INPUT #
LOBYTE
LOC
LOCAL
LOCATE
LOCATE (Anweisung)
LOCATE (Funktion)
LOCK
LOF
LOG
LONG
LONGINT
LOOP
LPOS
LPRINT
LPRINT USING
LSET
LTP
LTRIM
LOWORD


LBOUND

Syntax: LBOUND(Array[, Dimension])
Typ: Funktion
Kategorie: Speicherverwaltung

LBOUND gibt den kleinsten Index des angegebenen Arrays zurück.

  • 'Array' ist der Name des Arrays, dessen unterster Index zurückgegeben werden soll.

  • 'Dimension' ist die Nummer der Dimension, dessen unterster Index zurückgegeben werden soll.
    Wird dieser Wert ausgelassen, so nimmt freeBASIC automatisch 1 an.
    Ist 'Dimension' gleich 0, so wird die Indexgrenze für Dimension 1 abgefragt.
    Ist 'Dimension' kleiner als 0, so werden ungültige Werte erzeugt.
    Ist 'Dimension' größer als die Anzahl der Dimensionen so wird...
    ...in Versionen unter v0.16 der Wert -1 ausgegeben, um anzuzeigen, dass diese Dimension nicht existiert.
    ...in Versionen ab v0.16 der Wert 0 ausgegeben.
    Ebenso arbeitet LBOUND auch bei Arrays unbekannter Größe.

    • Beispiel:
    DIM Array(-10 TO 10, 5 TO 15, 1 TO 2) AS INTEGER
    DIM unArray() AS INTEGER

    PRINT LBOUND(Array, 1)
    PRINT LBOUND(Array, 2)
    PRINT LBOUND(Array, 3)
    PRINT LBOUND(Array, 4)
    PRINT
    PRINT LBOUND(unArray)
    Ausgabe für freeBASIC-Versionen ab v0.16:
    -10
     5
     1
     0

     0

    Ausgabe für freeBASIC-Versionen bis v0.16:
    -10
     5
     1
    -1

    -1

    Siehe auch:
    UBOUND, DIM


LCASE

Syntax: LCASE[$] (Text AS STRING)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt einen String aus, der nur aus Kleinbuchstaben besteht.
Sonderzeichen (wie z.B. +, -, *, /, ...) sowie Umlaute werden davon ausgenommen.
Die Umwandlung geschieht dadurch, dass zum ASCII-Wert des zu verwandelnden
Zeichens 32 hinzugefügt wird.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
PRINT LCASE("Hello World abCDefGH")
Ausgabe:
hello world abcdefgh

Siehe auch:
UCASE


LEFT

Syntax: LEFT[$](Text AS STRING, n)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt die ersten 'n' Zeichen des angegebenen Strings 'Text' zurück.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
Text$ = "hello world"
PRINT LEFT(Text$, 5) 'Ausgabe: "hello"

Siehe auch:
RIGHT, MID (Funktion)


LEN

Syntax: LEN(variable)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt die Größe einer Variablen in Bytes an.
LEN kann mit Strings verwendet werden (gibt die Zahl der Zeichen zurück), oder
mit Variablen anderen Typs, inclusive benutzerdefinierte Typen.

Beispiel:

PRINT LEN("hello world") ' Ausgabe: 11
PRINT LEN(INTEGER) ' Ausgabe: 4

LEN entspricht der C/C++ Funktion SIZEOF

Unterschiede (Zu QB):
Funktioniert auch mit Datentypen und benutzerdefinierten Typen.


LET

Syntax: [LET] Variable = Ausdruck
Typ: Anweisung
Kategorie: Verschiedenes

LET hat keine praktische Funktion mehr; es wurde nur beibehalten, um die Kompatibilität
zu älteren BASIC-Dialekten zu wahren.
Stattdessen sollte LET einfach ausgelassen werden.

Beispiel:
LET a = 15 + 7
b = 3 * 6


LIB

Syntax: DECLARE { SUB | FUNCTION } Name LIB LibName ALIAS Aliasname (...
Typ: Klausel
Kategorie: Programmorganisation

Bindet eine SUB/FUNCTION aus einer Lib/DLL ein.

  • 'LibName' ist der Dateiname (evtl. mit Pfad) der Lib/DLL.

  • Die anderen Parameter entsprechen denen von DECLARE

    • Seit freeBASIC v0.15b muss die ALIAS-Klausel verwendet werden, wenn eine
    Prozedur aus einer LIB/DLL eingebunden wird; in früheren Versionen konnte die
    ALIAS-Klausel ausgelassen werden; in diesem Fall wurde der Prozedurbezeichner (hier 'Name')
    als ALIAS-Name verwendet.

    Siehe auch:
    DECLARE

    Unterschiede: Neu in freeBASIC


#LIBPATH

Syntax:#LIBPATH Pfad
Typ: Metabefehl
Kategorie: Programmorganisation

Fügt einen weiteren Pfad zu der Liste der Verzeichnisse hinzu, in dem der Compiler nach einzubindenden Bibliotheken suchen soll.

  • Pfad ist ein String, der den Pfad enthält, der zur Liste hinzugefügt werden soll.

    • Dieser Metabefehl wirkt genau so, als ob der Pfad über die Kommandozeilenoption '-p' hinzugefügt wurde.

    Relative Pfade werden ausgehend vom Arbeitsverzeichnis des FBC berechnet, nicht relativ zum Verzeichnis des Quellcodes.
    Kann der Pfad nicht gefunden werden, so wird KEIN Fehler erzeugt.

    Beispiel:
    #LibPath __PATH__

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • #LIBPATH existiert seit freeBASIC v0.17

    • Siehe auch:
    #INCLIB, #INCLUDE


LINE (Grafik)

Syntax: LINE [Puffer,] [[STEP] (x1, y1)]-[STEP] (x2, y2)[, [Farbe][, [B|BF][, Stil]]]
Typ: Anweisung
Kategorie: Gfx

Zeichnet eine Linie von einem angegebenen Punkt zu einem Zweiten, oder ein
Rechteck, dessen Eckpunkte die beiden Angegebenen Punkte sind.

  • 'Puffer' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter
    Puffer oder ein Array. Beide können mit PUT
    angezeigt werden. Wird 'Puffer' ausgelassen, zeichnet freeBASIC direkt auf den Bildschirm.

  • '(x1, y1)' und '(x2, y2)' sind die Koordinaten, zwischen denen sich die Linie/
    das Rechteck befinden soll.
    Die Koordinaten werden durch die letzten WINDOW- und
    VIEW (Grafik)-Befehle beeinflusst.

  • 'Farbe' ist die Nummer einer Farbe. Welche Nummer für welche Farbe steht,
    ist von der letzen SCREEN-Anweisung sowie den
    letzten PALETTE-Befehlen abhängig.

  • Ist das 'B'-Flag gesetzt, wird ein Rechteck anstatt einer Linie gezeichnet.

  • Ist das 'BF'-Flag gesetzt, wird ein ausgefülltes Rechteck gezeichnet.

  • 'Stil' ist eine 16-bit-Maske, die den Stil der Linie festlegt.
    "Stil der Linie" bedeutet, auf welche Art die Linie gestrichelt gezeichnet
    werden soll.
    Für jedes gesetzte Bit der Maske wird ein Pixel gezeichnet.
    Wird Stil ausgelassen, nimmt freeBASIC 65535 (entspricht &b1111111111111111)
    an, was eine Volllinie zeichnet.

  • Ist das 'B'- oder 'BF'-Flag gesetzt, hat 'Stil' keine Wirkung.

  • Beispiel:
    Zeichnet eine rote Strichlinie in einem weißen Rechteck, und zeigt es 3 Sekunden
    lang an.
    DIM t AS SINGLE
    ' Vollbildmodus 320x200x8 einstellen.
    SCREEN 13, , ,1

    LINE (20, 20)-(300, 180), 4, , &HFF00
    LINE (140, 80)-(180, 120), 15, B

    t = TIMER
    DO: LOOP UNTIL TIMER > t + 3

    Unterschiede (zu QB):
  • In freeBASIC ist es möglich, in einen Datenpuffer zu zeichnen

    • Siehe auch:
    PSET, CIRCLE, PAINT,
    DRAW (Grafik), DRAW STRING,
    GET (Grafik), PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    POINT, VIEW (Grafik), WINDOW
    SCREEN (Anweisung)


#LINE

Syntax: #LINE Zeilennummer [ "Modulname" ]
Typ: Metabefehl
Kategorie: Präprozessor

#LINE setzt die aktuelle Zeilennummer und den Dateinamen des Moduls fest.
Diese Festlegungen haben keinen Einfluss auf die eigentliche Programmausführung, sie dienen lediglich dem Programmierer, der auf diese
Art Teile seines Programmes 'markieren' kann.

  • 'Zeilennummer' ist ein positiver Zahlenwert oder null, der festlegt, welche Zeilennummer der #LINE-Anweisung zugewiesen werden soll.
    Nachfolgende Compiler-Warungen und Fehlermeldungen, die sich auf Zeilen hinter der #LINE-Anweisung beziehen, werden davon
    beeinflusst.

  • 'Modulname' ist ein String, der den Namen des Moduls enthält, wie er in Fehlermeldungen ausgegeben werden soll. Wird dieser
    Parameter ausgelassen, so behält freeBASIC den Originalnamen bei.

    • Die FB-eigenen vordefinierten Symbole __LINE__ und __FILE__ werden durch #LINE automatisch aktualisiert. Ebenso beachtet auch ERMN den
    hier bestimmten Modulnamen. Daneben ändern sich auch die Compiler- und Laufzeit-Fehlermeldungen.

    Durch diese Direktive können Quellcodes von anderen Programmen für den FBC erstellt werden, für die ebenso Warnungen und Fehlermeldungen
    ausgegeben werden können, die auf die richtigen Stellen im Fremd-Programm verweisen.
    Beispiel:
    #line 155 "outside.src"

    Error 1000
    Ausgabe:
    Aborting due to runtime error 1000 at line 157 of outside.src()

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • #LINE existiert seit freeBASIC v0.17

    • Siehe auch:
    __LINE__, __FILE__,
    ERMN


LINE INPUT (Datei)

Syntax: LINE INPUT #f, variable AS STRING
Typ: Anweisung
Kategorie: Datei

Liest eine ganze Zeile aus einer im INPUT-Modus geöffneten Datei in eine Variable.
Genau wie bei LINE INPUT sollte eine STRING-Variable verwendet werden, da sonst
unsinnige Werte einlesen werden.

Beispiel:
DIM zeile AS STRING
OPEN "Datei.txt" FOR INPUT AS #1

DO
LINE INPUT #1, zeile
PRINT zeile
LOOP UNTIL EOF(1)

Siehe auch:
INPUT #,
PRINT #, WRITE #
OPEN (Anweisung), CLOSE,
INPUT (Dateimodus), OUTPUT, APPEND,
LINE INPUT


LINE INPUT

Syntax: LINE INPUT ["Frage" { , | ; } ] Variable AS STRING
Typ: Anweisung
Kategorie: Eingabe

Gibt die Frage - sofern angegeben - auf dem Bildschirm an der aktuellen
Cursorposition aus.
Anschließend hat der Benutzer die Möglichkeit, einen Text einzugeben.

  • 'Variable' ist eine Variable, die vom Typ STRING sein muss.

    • Im Gegensatz zu INPUT (Anweisung) gibt es bei LINE INPUT nur die
    Möglichkeit, EINE Variable einzugeben. Diese muss zudem vom Typ STRING sein.
    Dafür treten keine Probleme mit Sonderzeichen wie Kommata (,) oder "Anführungszeichen" auf.

    Siehe auch:
    INPUT (Anweisung), LINE INPUT #


LINE

Typ: Anweisung

LINE wird eingesetzt als:
  • LINE

  • LINE INPUT

  • LINE INPUT #

  • #LINE


LOBYTE

Syntax: LOBYTE (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

Gibt das niedere Byte eines Ausdrucks zurück.
LOBYTE hat die selbe Funktion wie
Ausdruck AND 255

Beispiel:
foo = &b10000100000 ' = 1056 dezimal
PRINT LOBYTE(foo)
PRINT foo AND 255
Ausgabe:
32
32

Siehe auch:
HIBYTE, HIWORD, LOWORD

Unterschiede: Neu in freeBASIC


LOC

Syntax: LOC (Dateinummer)
Typ: Funktion
Kategorie: Datei

Gibt die Position des Cursors innerhalb einer im BINARY-Modus geöffneten Datei
zurück.

Beispiel:
OPEN "mydata.ext" FOR BINARY AS #1

DO
GET #1, , dummy
IF dummy = ASC("A") THEN EXIT DO
LOOP UNTIL LOC(1) = LOF(1)

firstPos = LOC(1)
If firstPos = LOF(1) THEN firstPos = 0
CLOSE #1

IF firstPos THEN
PRINT "In dieser Datei kommt 'A' zum ersten mal an Byte"; firstPos; " vor."
ELSE
PRINT "In dieser Datei kommt 'A' nie vor."
END IF

Siehe auch:
LOF, EOF,
OPEN, BINARY

Unterschiede (Zu QB):
LOC funktioniert in keinem anderen Modus als dem BINARY-Modus.


LOCAL

Typ: Schlüsselwort
Kategorie: Fehlerbehandlung

Wird zusammen mit ON ERROR benutzt. LOCAL bewirkt, dass
die Fehlerbehandlungsroutine nur für die gerade aktive Prozedur gilt, und
nicht für das gesamte Modul.


LOCATE (Anweisung)

Syntax: LOCATE [Zeile][, Spalte][, sichtbar]
Typ: Anweisung
Kategorie: Konsole

Setzt die Position des Cursors in die angegebene Zeile und Spalte.

  • Zeile ist die Y-Koordinate, sozusagen der Hochwert.
    Wird dieser Parameter ausgelassen, verwendet freeBASIC die aktuelle Cursorzeile.

  • Spalte ist die X-Koordinate, sozusagen der Rechtswert.
    Wird dieser Parameter ausgelassen, verwendet freeBASIC die aktuelle Cursorspalte.

  • 'sichtbar' gibt an, ob ein blinkender Cursor angezeigt werden soll, oder nicht.
    Wenn ein Cursor angezeigt werden soll, muss 'sichtbar' ungleich null sein.
    Wird dieser Parameter ausgelassen, wird der Cursor angezeigt.

    • Beispiel:
    LOCATE 5, 10, 0
    PRINT "Zeile 5, Spalte 10"
    PRINT "Zeile 5, Spalte 1"
    PRINT "Kein Cursor."
    PRINT
    SLEEP
    LOCATE , , 1
    PRINT "Cursor aktiv"
    SLEEP

    Siehe auch:
    COLOR (Anweisung),
    WIDTH (Anweisung),
    PRINT (Anweisung),
    INPUT (Anweisung)

    Unterschiede (zu QB):
    Es gibt kein optionales Cursor-, Start- oder End-Argument.


LOCATE (Funktion)

Syntax: LOCATE
Typ: Funktion
Kategorie: Konsole

Die Funktion Locate gibt Informationen über die aktuelle Cursorposition zurück.

Der zurückgegebene Wert wird folgendermaßen berechnet:
(Spalte OR (Zeile SHL 8) OR (sichtbar SHL 16))
Das untere Byte ist also die Spalte, das obere Byte die Zeile, und im oberen
Word wird das Sichtbarkeits-Flag angegeben.

Beispiel:
DIM AS INTEGER pst, row, lin, vis

pst = LOCATE
row = LOBYTE(pst)
lin = LOBYTE( HIBYTE(pst) )
vis = HIWORD(pst)

PRINT "Cursorposition:"
PRINT "Line: "; lin
PRINT "Row: "; row
Print "visible: "; vis

PRINT

LOCATE 10, 2, 0

pst = LOCATE
row = LOBYTE(pst)
lin = LOBYTE( HIBYTE(pst) )
vis = HIWORD(pst)

PRINT "Cursorposition:"
PRINT "Line: "; lin
PRINT "Row: "; row
Print "visible: "; vis

SLEEP

Unterschiede (zu QB): LOCATE kann auch als Funktion eingesetzt werden, nicht nur als Anweisung.

Siehe auch:
LOCATE (Anweisung),
COLOR (Funktion),
WIDTH (Funktion),
SCREEN (Funktion)


LOCATE

Typ: Anweisung/Funktion

LOCATE ist ein Schlüsselwort, das als Anweisung und als Funktion eingesetzt
werden kann.
Siehe:
LOCATE (Anweisung)
LOCATE (Funktion)


LOCK

Syntax: LOCK Dateinummer [, {Satznr. | [Start] TO Ende}]
Typ: Anweisung
Kategorie: Datei

LOCK sperrt den Zugriff auf eine Datei oder einen Teil der Datei, wenn die
Satznummer oder die Start- und Endposition angegeben sind.

Dieser Befehl ist nützlich, wenn mehrere Programme, Benutzer oder Prozesse
auf die selbe Datei zuzugreifen versuchen.

  • Dateinummer ist die Dateinummer, der Datei, auf die der Zugriff gesperrt
    werden soll. Die Dateinummer wurde durch eine OPEN-Anweisung zugewiesen.

  • In sequentiellen Modi (INPUT, OUTPUT, APPEND) und im RANDOM-Modus ist Satznr. die
    Nummer eines Datensatzes, auf den der Zugriff gesperrt werden soll. Auf alle
    anderen Datensätze kann frei zugegriffen werden.
    Im BINARY-Modus ist Satznr. die Nummer des Bytes
    innerhalb der Datei, auf das der Zugriff verweigert werden soll.

  • Sollen mehrere Datensätze bzw. mehrere Bytes gesperrt werden, kann mit
    'Start TO Ende'
    ein zu sperrender Bereich angegeben werden; Start ist dabei die Nummer des
    ersten Datensatzes bzw. Bytes, und Ende die Nummer des letzten Datensatzes
    bzw. Bytes, das gesperrt werden soll.

    • UNLOCK entsperrt eine Datei wieder.
    Für UNLOCK gilt die selbe Syntax wie für LOCK.

    Dateien, die noch nicht mit UNLOCK freigegeben wurden, sollten nicht ein zweites
    Mal mit LOCK geserrt werden!

    Beispiel:
    Eine Datei sperren, 100 Bytes lesen, und anschließend wieder entsperren.
    Um dieses Programm ausführen zu können, sollten Sie sicher stellen,
    dass die Datei 'file.ext' existiert, sich im aktuellen Arbeitsverzeichnis
    befindet, und mindestens 100 Bytes lang ist.
    DIM array(1 to 100)
    f = FREEFILE
    OPEN "file.ext" FOR BINARY AS #f
    LOCK #f, 1 TO 100
    FOR i = 1 TO 100
    GET #f, i, array(i)
    NEXT
    UNLOCK #f, 1 TO 100
    CLOSE #f

    Siehe auch:
    UNLOCK, OPEN


LOF

Syntax: LOF (Dateinummer)
Typ: Funktion
Kategorie: Datei

Gibt die Länge einer geöffneten Datei in Bytes zurück.

Beispiel:
f = FREEFILE
OPEN "file.ext" FOR BINARY AS #f
PRINT LOF(f)
CLOSE #f

Siehe auch:
LOC, OPEN


LOG

Syntax: LOG ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Logarithmus zur eulerischen Zahl e zurück.
e ist näherungsweise 2.718281828459045.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.
    Dieser Wert muss größer als null sein, andernfalls wird ein Fehler erzeugt.

  • Der Rückgabewert ist ein DOUBLE-Wert, der den Logarithmus von 'Zahl' zur e enthält.

    • LOG ist die Gegenfunktion zu EXP

    Es kann zu Unklarheiten kommen, da in der Mathematik der natürliche Logarithmus
    (zur Basis e) in der Regel mit LN bezeichnet wird, während der
    dekadische Logarithmus (zur Basis 10) meist mit LOG bezeichnet wird.
    In freeBASIC bezeichnet LOG - wie in den meisten Programmiersprachen - den
    natürlichen Logarithmus.

    Der Logarithmus ist die Gegenfunktion zu Potenzen; betrachtet man die Gleichung
    x = e ^ k
    so gilt:
    k = LOG(x)

    Beispiel:
    Um den Exponenten 'k' zu einer beliebigen Basis 'b' zu berechnen, der die Zahl 'x' ergibt,
    benutzen Sie folgenden Code:
    (b ^ k = x)
    DECLARE FUNCTION LogX (x AS DOUBLE, b AS DOUBLE) AS DOUBLE

    FUNCTION LogX (x AS DOUBLE, b AS DOUBLE)
    LogX = LOG(x) / LOG(b)
    END FUNCTION

    PRINT LogX!(100, 10) 'Ergebnis: 2, denn 10 ^ 2 = 100.

    Siehe auch:
    EXP
    mathematische Operatoren


LONG

Typ: Datentyp

Der Typ LONG ist der selbe wie der Typ INTEGER. Er wurde
nur aus Kompatibilitätsgründen beibehalten

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST


LONGINT

Typ: Datentyp

LONGINT-Zahlen sind vorzeichenbehaftete 64-bit-Ganzzahlen.
Sie liegen im Bereich zwischen -9223372036854775808 und 9223372036854775807.
Berechnung der Bereiche:
-(2 ^ 63) bis (2 ^ 63) - 1

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede (zu QB):
Neu in freeBASIC.


LOOP

Typ: Schlüsselwort
Kategorie: Schleifen

Siehe DO...LOOP.


LOWORD

Syntax: LOWORD (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

Gibt das niedere Word eines Ausdrucks zurück.
LOWORD hat die selbe Funktion wie
Ausdruck AND 65535

Beispiel:
foo = &b11000000000000000 ' = 98304 dezimal
PRINT LOWORD(foo)
PRINT foo AND 65535
Ausgabe:
32768
32768

Siehe auch:
HIBYTE, HIBYTE, LOBYTE

Unterschiede: Neu in freeBASIC


LPOS

Syntax: LPOS (n)
Typ: Funktion
Kategorie: Drucker

Gibt die Nummer der Zeichen zurück, die seit dem letzten Zeilenumbruch an den
Drucker gesendet wurden.

  • 'n' ist die Nummer des LPT-Ports, an dem der Drucker angeschlossen wurde.
    Dieser Wert liegt zwischen 0 und 3.
    0 und 1 stehen dafür für LPT1, 2 für LPT2 und 3 für LPT3.

    • Siehe auch:
    LPRINT (Anweisung), POS


LPRINT

Syntax: LPRINT Printausdruck
Typ: Anweisung
Kategorie: Hardware

  • 'Printausdruck' ist ein Ausdruck, der wie bei PRINT (Anweisung) formatiert
    sein muss; er unterliegt den dort genannten Regeln.

    • Einige Drucker beginnen mit dem Druckauftrag erst, wenn ein CHR(12) (End of Page)
    gedruckt wird.

    LPRINT schreibt immer auf den Drucker an LPT1.

    Siehe auch:
    LPRINT USING,
    LPOS,
    OPEN LPT,
    PRINT (Anweisung), PRINT #,
    WIDTH


LPRINT USING

LPRINT

Syntax: LPRINT USING PrintUsingausdruck
Typ: Anweisung
Kategorie: Hardware

Gibt Daten über den Standarddrucker aus.

  • 'PrintUsingausdruck' ist ein Ausdruck, der wie bei PRINT USING formatiert
    sein muss; er unterliegt den dort genannten Regeln.

    • Einige Drucker beginnen mit dem Druckauftrag erst, wenn ein CHR(12) (End of Page)
    gedruckt wird.

    LPRINT USING schreibt immer auf den Drucker an LPT1.

    Siehe auch:
    LPRINT (Anweisung),
    LPOS,
    OPEN LPT,
    PRINT USING, PRINT USING #,
    WIDTH


LPRINT

Typ: Anweisung/Funktion
Kategorie: Hardware

LPRINT ist ein Schlüsselwort, das als Aktionswort und Anweisung eingesetzt
werden kann.

Siehe:
WIDTH LPRINT
LPRINT (Anweisung)
LPRINT USING


LPT

LPT wird zusammen mit OPEN LPT eingesetzt.


LSET

Syntax: LSET Ziel AS STRING, Quelle AS STRING
Typ: Anweisung
Kategorie: Stringmanipulation

LSET befüllt den String 'Ziel' mit dem String 'Quelle', behält aber
die Länge von 'Ziel' bei.
Es wird benutzt, um Strings linksbündig zu formatieren.

  • War der String 'Ziel' vor der Bearbeitung mit LSET fünf Zeichen lang, so ist er
    auch nach der Bearbeitung noch fünf Zeichen lang, unabhängig von der Länge
    des Strings Quelle.

  • Ist der String 'Quelle' länger als 'Ziel', so werden die vorderen Zeichen
    des Strings nach 'Ziel' kopiert, der Rest von 'Quelle' wird ignoriert.

  • Der String 'Quelle' bleibt bei der Operation komplett unverändert.

    • DIM Quelle AS STRING
    DIM Ziel AS STRING

    Ziel = "012345679"
    Quelle = "***"
    PRINT Ziel, Quelle

    LSET Ziel, Quelle
    PRINT Ziel, Quelle
    Ausgabe:
    0123465789   ***
    ***          ***

    Siehe auch:
    RSET

    Unterschiede (zu QB):
    Die Syntax ist nicht mehr LSET Ziel=Quelle, sondern LSET Ziel, Quelle


LTRIM

Syntax: LTRIM[$](Stringausdruck [, [ANY] Entfernen])
Typ: Funktion
Kategorie: Stringmanipulation

LTRIM (left trim) entfernt bestimmte führende Zeichen aus einem String.

Das Dollarzeichen ($) als Suffix ist optional.

  • 'Stringausdruck' ist der String, der gekürzt werden soll.

  • 'Entfernen' ist ein String, der angibt, welche Zeichen entfernt werden
    sollen. Wird dieser Parameter ausgelassen, entfernt freeBASIC automatisch
    alle Leerzeichen am Anfang des Strings.
    'Entfernen' darf aus mehreren Zeichen bestehen.

  • Wird die ANY-Klausel verwendet, entfernt freeBASIC jedes Zeichen aus
    'Entfernen' vom Anfang von 'Stringausdruck'

    • Beispiel:
    PRINT LTRIM(" hello")
    PRINT LTRIM("hello World", "he")
    PRINT LTRIM("hello World", "eh")
    PRINT LTRIM("hello World", ANY "eh")
    GETKEY
    Ausgabe:
    hello
    llo World
    hello World
    llo World

    Unterschiede:
    (Zu QB):
  • Die ANY-Klausel ist neu in freeBASIC

    • zu früheren Versionen
  • Die ANY-Klausel und der Parameter 'Entfernen' kann erst seit freeBASIC v0.15
    eingesetzt werden.

    • Siehe auch:
    RTRIM, TRIM, INSTR


Liste der Schlüsselwörter beginnend mit M

MID
MID (Funktion)
MID (Anweisung)
MKD
MKDIR
MKI
MKL
MKLONGINT
MKS
MKSHORT
MOD
MONTH
MINUTE
MULTIKEY
MUTEXCREATE
MUTEXDESTROY
MUTEXLOCK
MUTEXUNLOCK


#MACRO

Syntax:
#MACRO Bezeichner [(Parameterliste)]
   ' Makro-Code
#ENDMACRO
Typ: Metabefehl
Kategorie: Präprozessor

#MACRO erstellt ebenso wie #DEFINE ein Makro, ermöglicht aber die Erstellung mehrzeiliger Makros.

  • 'Bezeichner' ist der Name des zu erstellenden Makros.

  • 'Parameterliste' ist eine Liste von Parametern, von denen das Makro abhängig ist. Dafür müssen Variablen verwendet werden, die bis
    dahin noch nicht verwendet wurden.
    Die Parameterliste ist optional

  • 'Makro-Code' ist ein normaler freeBASIC-Programmcode. In ihm dürfen die in 'Parameterliste' spezifizerten Variablen vorkommen.

    • Taucht nach der Definition eines Makros sein Bezeichner im Code auf, so wird der Bezeichner durch den Makro-Code ersetzt. Ebenso ersetzt
    freeBASIC die Parameter der Parameterliste durch die beim Aufruf angegebenen Parameter.
    Das Auslassen von Parameter ist bei Makros nicht möglich.

    Mit #IFDEF, #IFNDEF und DEFINED kann überprüft werden, ob ein Makro definiert wurde.
    Mit #UNDEF kann ein Makro gelöscht werden, z.B. um den Bezeichner als Variable zu benutzen, oder um ihn mit einem neuen Makro zu belegen.

    Beispiel 1:
    #MACRO Add( a, b )
    a + b
    #endmacro

    PRINT Add( "Hello", " World" )
    PRINT Add( 1, 2 )
    Ausgabe:
    Hello World
     3

    Beispiel 2:
    #macro Print2( a, b )
    Print a;
    Print " ";
    Print b;
    Print "!"
    #endmacro

    Print2( "Hello", "World" )
    Ausgabe:
    Hello Wordl!

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • existiert seit freeBASIC v0.17

    • Siehe auch:
    #ENDMACRO,
    #DEFINE, #UNDEF,
    #IFDEF, #IFNDEF, DEFINED,
    Präprozessoren


MID (Anweisung)

Syntax: MID[$](text, start[, length]) = Ausdruck
Typ: Anweisung
Kategorie: Stringmanipulation

Ersetzt einen Teil eines STRINGs durch einen anderen.

  • 'text' ist ein Stringausdruck, der verändert werden soll

  • 'start' ist die Nummer des Zeichens, ab dem die Änderung beginnen soll. Enthält
    start' einen größeren Wert, als der String lang ist, oder einen Wert kleiner als
    1, wird nichts geändert

  • 'lenght' gibt an, wie viele Zeichen geändert werden sollen.
    Wird 'length' ausgelassen, richtet sich die Anzahl der Zu ändernden Zeichen nach
    der Länge des nachfolgenden 'Ausdruck'.
    Ist 'length' größer als der nachfolgende Ausdruck lang ist, wird automatisch die
    Länge des Ausdrucks verwendet.
    Ist der Ausdruck länger als 'length' groß ist, werden nur die ersten Zeichen aus
    'Ausdruck' verwendet.

    • Beispiel:
    DIM text AS STRING

    text = "abc 123"
    PRINT text ' Ausgabe: "abc 123"
    MID(text, 5, 3) = "4" + "56"
    PRINT text ' Ausgabe: "abc 456"
    MID(text, 1, 2) = "def"
    PRINT text ' Ausgabe: "dec 456"

    Siehe auch:
    MID (Funktion), STRING (Datentyp)


MID (Funktion)

Syntax: MID[$](Ausdruck AS STRING, Start[, Länge])
Typ: Funktion
Kategorie: Stringmanipulation

Gibt einen Ausschnitt eines STRINGS zurück.

  • 'Ausdruck' ist Der String, der analysiert werden soll.

  • 'Start' ist die Position des ersten Zeichens innerhalb des Strings, das zurückgegeben
    werden soll.

  • 'Länge' ist die Anzahl der Zeichen, die zurückgegeben werden sollen.
    Wenn 'Länge' ausgelassen wird, gibt MID alle Zeichen des STRINGs ab 'Start'
    zurück; MID funktioniert dann wie RIGHT

  • Wird für einen der Parameter null (bzw. ein Nullstring) angegeben, ist der Rückgabewert
    ein Leerstring.

    • Beispiel:

    PRINT MID("abcdefg" , 3, 2) 'Ausgabe: "cd"
    PRINT MID("abcdefg" , 3) 'Ausgabe: "cdefg"
    PRINT MID("abc" + "defg", 2, 1) 'Ausgabe: "b"

    Siehe auch:
    MID (Anweisung), INSTR,
    LEFT, RIGHT


MID

Typ: Anweisung/Funkion

MID ist ein Schlüsselwort, das als Anweisung und als Funktion eingesetzt werden
kann.

Siehe:
MID (Anweisung)
MID (Funktion)


MINUTE

Syntax: MINUTE(Serial)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

MINUTE extrahiert die Minute einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Serial Number behandelt wird.

  • Der Rückgabewert ist die Minute, die in der Serial Number gespeichert ist.

    • Beispiel:
    Die aktuelle Minute aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM min AS INTEGER
    min = MINUTE(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


MKD

Syntax: MKD[$](numerischer Ausdruck AS DOUBLE)
Typ: Funktion
Kategorie: Speicherorganisation

Verwandelt eine DOUBLE-Zahl in einen 8-Byte-STRING.
Wurde in älteren BASIC-Dialekten oft mit FIELD benutzt.

Das Dollarzeichen ($) als Suffix ist optional.

Kleines Beispiel (Syntax):
DIM n AS DOUBLE
n = 1.2345
E$ = MKD(n)

Siehe auch:
CHR,
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
ASC,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


MKDIR

Syntax: MKDIR(Ordnername)
Typ: Funktion
Kategorie: Datei

Erstellt einen Ordner mit angegebenen Namen im aktuellen Arbeitsverzeichnis.

  • 'Ordnername' ist ein String, der den Namen des Ordners enthält, der erstellt
    werden soll. Enthält dieser String eine komplette Pfadangabe, so wird der
    neue Ordner nicht im aktuellen Arbeitsverzeichnis, sondern im angegebenen
    Pfad erstellt.

  • Der Rückgabewert ist entweder 0, wenn der Ordner erstellt werden konnte,
    oder -1, wenn ein Fehler aufgetreten ist. Dies kann z.B. bedeuten, dass ein
    Ordner mit angegebenen Namen schon existiert, dass 'Ordnername' unzulässige
    Zeichen enthält, oder dass auf das angegebe Gerät nicht zugegriffen werden
    kann (z.B. auf eine CD)

    • Beispiel
    MKDIR "data"
    ? MKDIR("C:\BASIC\Testfolder")
    Erstellt den Ordner 'data' im aktuellen Arbeitsverzeichnis, und den Ordner
    'Testfolder' in C:\BASIC. Wenn 'Testfolder' erstellt werden kann, wird 0
    ausgegeben, ansonsten -1.

    Unterschiede:
    Zu QB:
  • MKDIR kann auch als Funktion eingesetzt werden

    • Siehe auch:
    RMDIR, CHDIR, CURDIR,
    SHELL


MKI

Syntax: MKI[$](numerischer Ausdruck AS INTEGER)
Typ: Funktion
Kategorie: Speicherorganisation

Verwandelt eine INTEGER-Zahl in einen 4-Byte-STRING.
Wurde in älteren BASIC-Dialekten oft mit FIELD benutzt.

Das Dollarzeichen ($) als Suffix ist optional.

Kleines Beispiel (Syntax):
DIM n AS INTEGER
n = 43
e$ = MKI$(n)

Siehe auch:
CHR,
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
ASC,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


MKL

Syntax: MKL[$](numerischer Ausdruck AS LONG)
Typ: Funktion
Kategorie: Speicherorganisation

Verwandelt eine LONG-Zahl in einen 4-Byte-STRING.
Wurde in älteren BASIC-Dialekten oft mit FIELD benutzt.

Das Dollarzeichen ($) als Suffix ist optional.

Kleines Beispiel (Syntax):
DIM n AS LONG
n = 43
e$ = MKL$(n)

Siehe auch:
CHR,
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
ASC,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD

(MKL hat die selbe Funktion wie MKI, und wurde nur aus
Kompatibilitätsgründen beibehalten.)


MKLONGINT

Syntax: MKLONGINT[$](numerischer Ausdruck AS LONGINT)
Typ: Funktion
Kategorie: Speicherorganisation

Verwandelt eine LONGINT-Zahl in einen 8-Byte-STRING.

Das Dollarzeichen ($) als Suffix ist optional.

Kleines Beispiel (Syntax):
DIM n AS LONGINT
n = 12345
e$ = MKLONGINT(n)

Siehe auch:
CHR,
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
ASC,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD

Unterschiede: Neu in freeBASIC.


MKS$

Syntax: MKS$(numerischer Ausdruck AS SINGLE)
Typ: Funktion
Kategorie: Speicherorganisation

Verwandelt eine SINGLE-Zahl in einen 4-Byte-STRING.
Wurde in älteren BASIC-Dialekten oft mit FIELDbenutzt.

Kleines Beispiel (Syntax):

DIM n AS SINGLE
n = 1.2345
e$ = MKS$(n)

Siehe auch:
CHR,
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
ASC,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD


MKSHORT

Syntax: MKSOHRT[$](numerischer Ausdruck AS SHORT)
Typ: Funktion
Kategorie: Speicherorganisation

Verwandelt eine SHORT-Zahl in einen 2-Byte-STRING.

Das Dollarzeichen ($) als Suffix ist optional.

Kleines Beispiel (Syntax):
DIM n AS LONGINT
n = 12345
e$ = MKSHORT(n)

Siehe auch:
CHR,
MKSHORT,
MKI,
MKL,
MKLONGINT,
MKS,
MKD,
ASC,
CVSHORT,
CVI,
CVL,
CVLONGINT,
CVS,
CVD

Unterschiede: Neu in freeBASIC.


MOD

Syntax A: Ergebnis = Zahl1 MOD Zahl2
Syntax B: Ergebnis MOD= Zahl
Typ: Operator
Kategorie: mathematische Funktionen

Gibt den Rest der Division Zahl1 / Zahl2 zurück (Modulo).

  • 'Zahl1', 'Zahl2' und 'Zahl' sind INTEGER-Werte. Wird MOD mit
    Fließkommazahlen (SINGLE oder DOUBLE) verwendet, so werden diese zuerst zu
    INTEGER-Werten gerundet.

  • Beim Kombinierten MOD (Syntax B) wird in 'Ergebnis' der Rest der Division
    aus 'Ergebnis' und 'Zahl' zurückgegeben; es ist die Kurzform für
    Ergebnis = Ergebnis MOD Zahl

    • Beispiel:
    DIM n AS INTEGER

    PRINT 47 MOD 7
    PRINT 5.6 MOD 2.1
    PRINT 5.1 MOD 2.8

    n = 11
    n MOD= 3
    PRINT n
    Ausgabe:
    5
    0
    2
    2
    47 geteilt durch 7 ergibt einen Rest von 5.
    5.6 wird gerundet auf 6 während 2.1 auf 2 gerundet wird. Dadurch wird die Aufgabe
    zu 6 MOD 2, das bedeutet 6 geteilt durch 2; Das Ergebnis ist 0.
    5.1 wird gerundet auf 5 während 2.8 auf 3 gerundet wird. Dadurch wird die Aufgabe
    zu 5 MOD 3, das bedeutet 5 geteilt durch 3; Das Ergebnis ist 2.

    Siehe auch:
    SHL, SHR,
    mathematische Operatoren


MONTH

Syntax: MONTH(Serial)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

MONTH extrahiert den Monat einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Serial Number behandelt wird.

  • Der Rückgabewert ist der Monat des Jahres, der in der Serial Number gespeichert ist.

    • Beispiel:
    Den heutigen Monat des Jahres aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM monat AS INTEGER
    monat = MONTH(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


MONTHNAME

Syntax: MONTHNAME(Monat [, Kurzform])
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Gibt den Namen eines Monats aus.

  • 'Monat' ist die Nummer des Monats, also 1 für Januar, 2 für Februar und so weiter.

  • Der Rückgabewert ist ein String, der den Namen des Monats enthält.

  • 'Kurzform' ist ein Wert der entweder gleich oder ungleich null ist. Wenn er ungleich null ist, wird ein abgekürzter Monatsname ausgegeben,
    der aus zwei Zeichen besteht, ansonsten wird der volle Name ausgegeben.

    • Beispiel:
    Den Namen des aktuellen Monats mit NOW ermitteln:
    #INCLUDE "vbcompat.bi"
    DIM Monat AS STRING
    Monat = MONTHNAME(MONTH(NOW)))

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


MULTIKEY

Syntax: MULTIKEY(Scancode)
Typ: Funktion
Kategorie: Eingabe

Reagiert auf (multiple) Tastendrücke.
Diese Funktion zeigt an, ob die angegebene Taste gerade gedrückt wird.

  • 'Scancode' ist der DOS-Hardware Scancode der Taste, auf die die Anfrage
    stattfinden soll
    (Siehe DOS Keyboard Scancodes.)

  • Der Rückgabewert ist entweder -1, wenn die angegebene Taste gerade gedrückt
    wird, ansonsten ist das Ergebnis 0.

  • Der Tastaturpuffer wird nicht geleert, wenn MULTIKEY verwendet wird; jede gedrückte
    Taste wird gespeichert, bis sie durch INKEY abgefragt
    wird. Damit kein Überlauf im Tastaturpuffer stattfindet, müssen Sie diesen
    selbstständig leeren; es empfielt sich daher, MULTIKEY in Kombination mit
    INKEY zu verwenden.

    • Multikey kann erst seit Version v0.14 im Konsolen-Modus eingesetzt werden; in
    früheren Versionen von freeBASIC war der Einsatz von MULTIKEY auf Grafikmodi
    beschränkt.

    Das Arbeiten mit MULTIKEY ist komfortabler als der alleinige Einsatz von INKEY;
    da das gleichzeitige Drücken zweier Tasten mit einer einfachen AND-Verknüfung
    geschehen kann:
    IF MULTIKEY(&H01) AND (MULTIKEY(&H2A) OR MULTIKEY(&H36) THEN ...
    Der Code hinter THEN würde ausgelöst, wenn Escape (Code &H01) und gleichzeitig (AND)
    entweder die linke Shifttaste (Code &H2A) oder (OR) die rechte Shifttaste (Code &H36)
    gedrückt sind.
    Mit INKEY dagegen wäre eine Unterscheidung zwischen linker und rechter Shift-
    Taste gar nicht möglich.

    Da MULTIKEY den Tastaturpuffer nicht leert, bietet es sich an, in Schleifen die
    Bedingug zum Verlassen der Schleife mit INKEY zu prüfen, während alle anderen
    Tastatureingaben bequem mit MULTIKEY ausgewertet werden, wie in diesem Beispiel.

    Ist dies nicht möglich, kann der Tastaturpuffer mit diesem Code leer gehalten
    werden:
    WHILE LEN(INKEY) : WEND

    Beispiel:
    DIM AS INTEGER work_page, x, y

    'Bildschirmmodus 640x480x8 mit zwei Seiten initialisieren
    SCREEN 18, ,2
    COLOR 2, 15
    work_page = 0
    x = 320
    y = 240

    DO
    ' Eine Seite beschreiben, während die andere angezeigt wird
    SCREENSET work_page, work_page XOR 1

    ' Überprüfe die Pfeiltasten und aktualisiere die Koordinaten
    ' x, y entsprechend.
    IF MULTIKEY(&h4D) AND x < 639 THEN x += 1
    IF MULTIKEY(&h4B) AND x > 0 THEN x -= 1
    IF MULTIKEY(&h50) AND y < 479 THEN y += 1
    IF MULTIKEY(&h48) AND y > 0 THEN y -= 1

    CLS
    CIRCLE(x, y), 30, , , , ,F

    ' Seite wechseln
    work_page = work_page XOR 1

    LOOP UNTIL INKEY = CHR(27) ' Bis ESC gedrückt wird weitermachen

    ' Setze aktive und sichtbare Bildschirmseite wieder auf 0
    SCREENSET

    PRINT "beliebige Taste drücken um zu beenden..."
    GETKEY

    Anmerkung:
    Sämtliche Keyboard-Scancodes sind in der Datei fbgfx.bi als Symbole mit verständlichen
    Namen definiert. Indem Sie diese Datei mit INCLUDE einbinden, ersparen
    Sie sich beim Programmieren das nachsehen, welcher Code für welche Taste steht.
    Beispiel:
    #INCLUDE "fbgfx.bi"

    IF MULTIKEY(SC_F1) THEN PRINT "F1 wurde gedrückt."
    IF MULTIKEY(SC_LEFT) THEN PRINT "Linke Pfeiltaste wurde gedrückt."
    IF MULTIKEY(SC_RIGHT) THEN PRINT "Rechte Peiltaste wurde gedrückt."
    '...

    Sollte die Datei fbgfx.bi sich nicht in Ihrem Include-Verzeichnis befinden,
    können Sie den Code verwenden, der unter DOS Keyboard Scancodes der Referenz hinterlegt
    ist.

    Unterschiede:
    zu QB:
  • Neu in freeBASIC

    • zu früheren Versionen von freeBASIC:
  • Seit Version v0.15 können die erweiterten Scan Codes auch in der DOS-Version abgefragt werden.

  • Seit Version v0.14 kann MULTIKEY auch im Konsolen-Modus eingesetzt werden.

    • Siehe auch:
    INKEY,
    SCREEN (Anweisung),
    DOS Keyboard Scancodes


MUTEXCREATE

Syntax: MUTEXCREATE
Typ: Funktion
Kategorie: Programmorganisation

Erstellt einen Mutex, und gibt einen Handle zu diesem zurück.

  • Der Rückgabewert ist eine INTEGER-Variable, die einen Mutex eindeutig
    identifiziert. Über sie wird später auf den Mutex zugegriffen.

    • Mutex (englisch Mutual Exclusion, deutsch gegenseitiger Ausschluss) bezeichnet Verfahren,
    mit denen verhindert wird, dass nebenläufige Prozesse gleichzeitig auf Daten
    zugreifen und so unter Umständen inkonsistente Zustände herbeiführen.
    (Auszug aus Wikipedia; siehe http://de.wikipedia.org/wiki/Mutex)

    Wenn zwei Threads (siehe THREADCREATE) gleichzeitig versuchen, auf eine globale Variable
    oder eine Datei zuzugreifen, kann dies zu Problemen führen.
    Durch Mutexe kann dies verhindert werden, indem ein Thread dazu gezwungen wird,
    darauf zu warten, dass ein anderer Thread seinen Zugriff beendet hat.

    Ein Mutex kann entweder gesperrt oder entsperrt sein. Wenn ein Thread versucht,
    auf diesen Mutex zuzugreifen, muss er warten, bis dieser entsperrt wurde. Dazu
    verwendet man MUTEXLOCK und MUTEXUNLOCK.
    Auch das sperren eines Mutexes gilt als Zugriff; bei der Durchführung dieses
    Vorgangs wird also auf die Entsperrung gewartet.

    Beispiel (aus dem examples-Ordner Ihres freeBASIC-Verzeichnisses):
    DEFINT a-z
    OPTION EXPLICIT

    DECLARE SUB consumer ( BYVAL param AS INTEGER )
    DECLARE SUB producer ( BYVAL param AS INTEGER )

    DIM SHARED produced AS INTEGER, consumed AS INTEGER
    DIM consumer_id AS INTEGER, producer_id AS INTEGER

    produced = MUTEXCREATE
    consumed = MUTEXCREATE
    IF( ( produced = 0 ) OR ( consumed = 0 ) ) THEN
    PRINT "Error creating mutexes! Exiting..."
    END 1
    END IF

    MUTEXLOCK produced
    MUTEXLOCK consumed

    consumer_id = THREADCREATE(@consumer)
    producer_id = THREADCREATE(@producer)
    IF( ( producer_id = 0 ) OR ( consumer_id = 0 ) ) THEN
    PRINT "Error creating threads! Exiting..."
    END 1
    END IF

    THREADWAIT consumer_id
    THREADWAIT producer_id

    MUTEXDESTROY consumed
    MUTEXDESTROY produced

    SLEEP

    '------------------------------------------------------------------------------'

    SUB consumer ( BYVAL param AS INTEGER )
    DIM i AS INTEGER

    FOR i = 0 TO 9
    MUTEXLOCK produced
    PRINT ", consumer gets:", i
    MUTEXUNLOCK consumed
    NEXT i
    END SUB

    SUB producer ( BYVAL param AS INTEGER )
    DIM i AS INTEGER

    FOR i = 0 TO 9
    PRINT "Producer puts:", i;
    MUTEXUNLOCK produced
    MUTEXLOCK consumed
    NEXT i
    END SUB
    Zunächst sind beide Mutexe gesperrt. Wenn der Prozessor zuerst versucht,
    den Thread 'consumer' auszuführen, stößt er auf das Hindernis,
    das 'produced' bereits gesperrt ist. Es kann erst dann gesperrt werden, wenn es
    entsperrt wurde. Der Prozessor wartet also mit der Ausführung des Threads
    'consumer', und setzt mit der Ausführung der anderen Threads in der
    Warteliste fort. (Hier: Thread 'producer').
    'producer' greift zuerst auf keinen Mutex zu, und wird sofort durchgeführt.
    Dann wird 'produced' entsperrt - 'consumer' kann also ausgeführt werden. Wenn
    der Prozessor dennoch zuerst veruscht, die Schleife in 'producer' einmal zu durchlaufen,
    stößt er auf das Hindernis, dass 'consumed' bereits gesperrt ist. Er muss
    also darauf warten, dass dieser Mutex von 'consumer' entsperrt wird.

    Siehe auch:
    MUTEXDESTROY, MUTEXLOCK, MUTEXUNLOCK,
    CONDCREATE, CONDDESTROY, CONDWAIT, CONDSIGNAL, CONDBROADCAST,
    THREADCREATE, THREADWAIT,
    LOCK, UNLOCK


MUTEXDESTROY

Syntax: MUTEXDESTROY Mutex
Typ: Anweisung
Kategorie: Programmorganisation

Löscht einen Mutex.

  • 'Mutex' ist der Handle zu einem mit MUTEXCREATE erstellten Mutex.

    • Der Mutex kann dabei sowohl gesperrt als auch entsperrt sein; es wird nicht auf
    seine Entsperrung gewartet.

    Beispiel: Siehe MUTEXCREATE.

    Siehe auch:
    MUTEXCREATE, MUTEXLOCK, MUTEXUNLOCK,
    CONDCREATE, CONDDESTROY, CONDWAIT, CONDSIGNAL, CONDBROADCAST,
    THREADCREATE, THREADWAIT


MUTEXCREATE

MUTEXLOCK

Syntax: MUTEXLOCK Mutex
Typ: Anweisung
Kategorie: Programmorganisation

Sperrt den Zugriff auf einen Mutex.

  • 'Mutex' ist der Handle zu einem mit MUTEXCREATE erstellten Mutex.

    • Ein Mutex kann nicht zweimal gesperrt werden. Ist ein Mutex bereits gesperrt,
    wartet der Prozessor mit der Ausführung des Threads, bis der Mutex von
    einem anderen Thread entsperrt wurde.

    Beispiel: Siehe MUTEXCREATE.

    Siehe auch:
    MUTEXCREATE, MUTEXDESTROY, MUTEXUNLOCK,
    CONDCREATE, CONDDESTROY, CONDWAIT, CONDSIGNAL, CONDBROADCAST,
    THREADCREATE, THREADWAIT


MUTEXUNLOCK

Syntax: MUTEXUNLOCK
Typ: Funktion
Kategorie: Programmorganisation

Entsperrt einen Mutex.

  • 'Mutex' ist der Handle zu einem mit MUTEXCREATE erstellten Mutex.

    • Der Mutex wird in jedem Fall entsperrt, egal ob er zuvor gesperrt oder entsperrt
    war.

    Beispiel: Siehe MUTEXCREATE.

    Siehe auch:
    MUTEXCREATE, MUTEXDESTROY, MUTEXLOCK,
    CONDCREATE, CONDDESTROY, CONDWAIT, CONDSIGNAL, CONDBROADCAST,
    THREADCREATE, THREADWAIT,
    LOCK, UNLOCK


Liste der Schlüsselwörter beginnend mit N

NAME
NAMESPACE
NEXT
NOT
NOKEYWORD
NOW


NAME

Syntax: NAME NameAlt AS STRING, NameNeu AS STRING
Typ: Anweisung
Kategorie: Datei

Benennt eine Datei um.

  • 'NameAlt' ist ein String, der den Namen der Datei enthält, die umbenannt werden
    soll.

  • 'NameNeu' ist ein String, der den neuen Dateinamen enthält, den 'NameAlt'
    erhalten soll.

  • FreeBASIC geht davon aus, dass sich die Datei 'NameAlt' im aktuellen
    Arbeitsverzeichnis befindet.
    Ist dies nicht der Fall, muss 'NameAlt' eine Pfadangabe enthalten. Diese
    darf absolut oder relativ sein.
    (Siehe CHDIR zu absolute und relative Pfadangaben.)

  • Enthält 'NameNeu' eine Pfadangabe, die nicht das aktuelle Arbeitsverzeichnis
    oder der Pfad von 'NameAlt' ist, wird 'NameAlt' in den bei 'NameNeu' angegeben
    Ordner verschoben.
  • Vorsicht: Wenn 'NameAlt' mit Pfad angegeben wurde, muss auch 'NameNeu' die
    selbe Pfadangabe enthalten, da die Datei sonst ins aktuelle Arbeitsverzeichnis
    verschoben wird!

    • Beispiel:
    ' Benenne die Datei "dsc001.jpg" zu "landscape.jpg" um:
    NAME "dsc001.jpg", "landscape.jpg"

    ' Verschiebe die Datei Dialog.bas von C:\BASIC\Projekt\ nach C:\BASIC\Beispiele\
    ' ohne sie umzubenennen
    NAME "C:\BASIC\Projekt\Dialog.bas", "C:\BASIC\Beispiele\Dialog.bas"

    Unterschiede
    (Zu QB):
  • Die Syntax "NAME NameAlt AS NameNeu" wurde abgelöst durch die besser
    strukturierte Version
    "NAME NameAlt, NameNeu".
    Da freeBASIC ein 32bit-Compiler ist, werden auch lange Dateinamen bis zu 255
    Zeichen unterstützt.


NAMESPACE

Syntax:
NAMESPACE Bereichsname
   ' Programmcode
END NAMESPACE

Typ: Anweisung
Kategorie: Programmorganisation

Definiert einen Codeteil als Namespace. Innerhalb eines Namespaces dürfen
Symbole benutzt werden, die in einem anderem Namespace bereits benutzt wurden.

Namespaces werden üblicherweise in Libraries verwendet, um keine Symbolbezeichner
benutzen zu müssen, die der Anwender der Lib eventuell ebenfalls benutzen möchte.
Wird z.B. in der Lib ein Type 'Point' verwendet, kann der User einen eigenen Type
'Point' definieren, wenn der Type in der Lib innerhalb eines Namespaces
definiert wurde.

Außerhalb eines Namespaces kann über die Syntax 'Bereichsname.Bezeichner' auf
ein Element des Namespaces zugegriffen werden, oder indem der Namespace via
USING in den 'Globalen Namespace' eingebunden wurde.
Über WITH kann (noch) nicht auf die Elemente eines Namespaces zugegriffen werden.

Innerhalb eines Namespaces dürfen ausschließlich Deklarationen stehen;
sogenannte 'ausführbare' Anweisungen sind unzulässig.
Im Detail sind die erlaubten Anweisungen innherhalb eines Namespaces:
  • DIM

  • STATIC

  • COMMON

  • DECLARE

  • TYPE

  • UNION

  • ENUM

  • CONST

    • NAMESPACE Forms
    TYPE Point ' Ein 2D-Punkt
    x As Integer
    y As Integer
    End Type
    /' Da sich die folgenden Zeilen innerhalb des Namespaces befinden, beziehen
    sich alle Aufrufe von 'Point' auf Forms.Point. '/

    SUB AdjustPoint( BYREF pt AS POINT, BYVAL newx AS INTEGER, BYVAL newy AS INTEGER )
    pt.x = newx
    pt.y = newy
    END SUB
    END NAMESPACE

    TYPE Point ' Ein 3D-Punkt
    x AS INTEGER
    y AS INTEGER
    z AS INTEGER
    END TYPE

    SUB AdjustPoint( BYREF PT As Point, BYVAL newx AS INTEGER, BYVAL newy AS INTEGER, BYVAL newz AS INTEGER )
    pt.x = newx
    pt.y = newy
    pt.z = newz
    END SUB

    DIM pt1 AS Point
    AdjustPoint( pt1, 1, 1, 1 )
    DIM pt2 AS Forms.Point
    Forms.AdjustPoint( pt2, 1, 1 )

    Unterschiede:
  • Neu in freeBASIC v0.16s

    • Siehe auch:
    USING (Namespace),
    EXTERN


NEXT

Syntax: NEXT [Variable]
Typ: Schlüsselwort
Kategorie: Schleifen/Fehler

Siehe auch:
FOR...NEXT (Schleifen)
RESUME (Fehler)

Unterschiede (zu QB):
Auch mehrere Zähler werden unterstützt.
Beispiel:
NEXT a, b, c


NOKEYWORD

Syntax: OPTION NOKEYWORD Schlüsselwort
Typ: Schlüsselwort
Kategorie: Programmorganisation

Entfernt ein Symbol aus der internen FB-Schlüsselwortliste.

  • 'Schlüsselwort' ist ein beliebiges Schlüsselwort aus dem freeBASIC-Sprachschatz, das in diesem Programm nicht mehr mit seiner
    ursprünglichen Wirkung verwendet werden soll.

    • Das Symbol kann damit in Ihrem Programm wie eine Variable verwendet werden, seine Funktion ist dafür aber nicht mehr verfügbar.
    OPTION NOKEYWORD wird hauptsächlich dazu verwendet, um Routinen aus externen Libs zu deklarieren, die den selben Namen wie FB-Schlüsselwörter
    haben.

    OPTION NOKEYWORD kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
    -lang deprecated
    kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
    -lang fb
    kompiliert, so ist OPTION NOKEYWORD nicht mehr zulässig! Verwenden Sie in diesem Fall anstelle von OPTION NOKEYWORD den Metabefehl #UNDEF.
    Die Auswirkungen sind dieselben.

    Beispiel:
    OPTION NOKEYWORD GOTO

    DECLARE SUB Goto

    Goto

    SUB GOTO
    PRINT "Der Befehl GOTO existiert in diesem Programm nicht mehr."
    END SUB
    Ausgabe:
    Der Befehl GOTO existiert in diesem Programm nicht mehr.

    Ohne die Zeile OPTION NOKEYWORD würde der Compiler die Fehlermeldung
    error 14: Expected identifier, found: 'Goto'
    DECLARE SUB Goto
    ausgeben.

    Oben aufgeführtes Beispiel muss also in freeBASIC ab v0.17 folgendermaßen lauten:
    #UNDEF GOTO

    DECLARE SUB Goto

    Goto

    SUB GOTO
    PRINT "Der Befehl GOTO existiert in diesem Programm nicht mehr."
    END SUB

    Unterschiede:
    zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption
    -lang deprecated
    kompiliert wurde. Wollen Sie diese nicht verwenden, so benutzen Sie den Metabefehl #UNDEF.

  • NOKEYWORD existiert erst seit freeBASIC v0.12.

    • zu QB:
  • Neu in freeBASIC

    • Siehe auch:
    OPTION, #UNDEF


NOT

Syntax: NOT Ausdruck
Typ: Operator
Kategorie: logische Operatoren

Vertauscht die Bits im Quellausdruck; aus 1 wird 0 und aus 0 wird 1.

NOT wird in Bedingungen eingesetzt, um eine Aussage ins Gegenteil zu verkehren.

Beispiel 1: AND in einer IF-THEN-Bedingung:
IF (a = 1) AND NOT (b = 7) THEN
PRINT "a = 1 aber b <> 7."
ELSE
PRINT "Moeglich sind..."
PRINT "a <> 1 aber b = 7"
PRINT "a <> 1 und b <> 7"
PRINT "a = 1 aber b = 7"
END IF

Beispiel 2: Logische Inversion einer Zahl mit NOT
DIM AS UBYTE zahl = 100

PRINT zahl, BIN(zahl, 8)
PRINT "---", "--------"
PRINT (NOT zahl) AND 255, BIN(NOT zahl, 8)
GETKEY
Ausgabe:
100           01100100
---           --------
155           10011011

Anmerkung: Das AND 255 bewirkt hier, dass die Zahl wie ein UBYTE behandelt wird;
ohne diesen Operator würde freeBASIC den Ausdruck 'NOT zahl' zu einem INTEGER
konvertieren, was das Beispiel weniger Anschaulich gestalten würde.

AND (Operator), OR (Operator), XOR (Operator), IMP, EQV,
Logische Operatoren


NOW

Syntax: NOW
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Diese Funktion gibt die aktuelle Systemzeit als Serial Number aus. Der Rückgabetyp ist DOUBLE.
Diese Funktion wird vom Compiler solange ignoriert, bis die Datei vbcompat.bi in den Quellcode eingebunden wurde.

Beispiel:
#INCLUDE "vbcompat.bi"
a! = NOW
PRINT FORMAT(a!, "yyyy/mm/dd hh:mm:ss")
Ausgabebeispiel:
2005/11/06 18:40:14

Unterschiede
zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


Liste der Schlüsselwörter beginnend mit O

OCT
OFFSETOF
ONCE
ON
ON ERROR
ON...GOSUB
ON...GOTO
OPEN
OPEN (Anweisung)
OPEN (Funktion)
OPEN COM
OPEN CONS
OPEN ERR
OPEN LPT
OPEN PIPE
OPEN SCRN
OPERATOR
OPTION
OR
OR (Methode)
OR (Operator)
OUT
OUTPUT
OVERLOAD


OCT

Syntax: OCT[$] (Ausdruck [, Stellen])
Typ: Funktion
Kategorie: Zählsysteme

OCT gibt den oktalen Wert eines beliebigen Ausrducks als String zurück.
Oktalzahlen haben die Basis 8; die Ziffern reichen von 0 bis 7.

  • 'Ausdruck' ist eine Ganzzahl (eine Zahl ohne Kommastellen), die ins
    Oktalformat übersetzt werden soll

  • 'Stellen' ist die Anzahl der Stellen, die dafür aufgewandt werden soll. Ist
    'Stellen' größer als die benötigte Stellenzahl, wird der Rückgabewert mit
    führenden Nullen aufgefüllt.
    Ist 'Stellen' kleiner als die benötigte Stellenzahl, werden nur die hinteren
    Zeichen des Rückgabewerts ausgegeben.
    Wird 'Stellen' ausgelassen, besteht der Rückgabewert aus so vielen Zeichen,
    wie benötigt werden, um die Zahl korrekt darzustellen.

  • Der Rückgabwert ist ein String, der den Wert von 'Ausdruck' im Oktalformat
    enthält.

    • Das Dollarzeichen ($) als Suffix ist optional.

    Beispiel:
    PRINT OCT(8)
    PRINT OCT(20, 4)
    PRINT OCT(100, 2)
    Ausgabe:
    10
    0024
    44

    Um eine Oktalzahl in ihre dezimale Form zurückzuverwandeln, wird
    VAL verwendet:
    DIM oktal AS STRING

    oktal = "100"

    'Kennung &O zeigt an, dass der folgende String eine Oktalzahl ist.
    oktal = "&O" + oktal

    PRINT VAL(oktal)
    Gibt 64 aus.

    Siehe auch:
    HEX, BIN, VAL,
    WOCT


OFFSETOF

Syntax: OFFSETOF( TypeName, RecordName )
Typ: Funktion
Kategorie: Speicherverwaltung

OFFSETOF gibt die Adresse eines Records innerhalb eines TYPEs relativ zu seinem
Anfang zurück.

  • 'TypeName ist der Name des Typs, auf den sich der Rückgabewert beziehen soll.

  • 'RecordName' ist der Name des Records, dessen Adresse zurückgegeben werden soll.

    • Beispiel:
    OPTION EXPLICIT

    TYPE MyType
    x AS SINGLE
    y AS SINGLE
    UNION
    b AS BYTE
    i AS INTEGER
    END UNION
    END TYPE

    PRINT "Offset von x = "; OFFSETOF(MyType, x)
    PRINT "Offset von y = "; OFFSETOF(MyType, y)
    PRINT "Offset von b = "; OFFSETOF(MyType, b)
    PRINT "Offset von i = "; OFFSETOF(MyType, i)

    Ausgabe:
    Offset von x =  0
    Offset von y =  4
    Offset von b =  8
    Offset von i =  8

    Unterschiede (zu QB):
    Neu in freeBASIC.

    Siehe auch:
    TYPE,
    SIZEOF,
    VARPTR


ON ERROR

Syntax: ON [LOCAL] ERROR GOTO { label | 0 }
Typ: Anweisung
Kategorie: Fehlerbehandlung

ON ERROR bewirkt einen Programmsprung an ein angegebenes Label, sobald ein Fehler
auftritt.

Um ON ERROR in Ihrem Programm verwenden zu können, müssen sie den Compiler mit
der Option -ex aufrufen; siehe die Kommandozeile

  • Das Label muss sich auf Modulebene befinden, darf also nicht in einer SUB oder
    FUNCTION sein.

  • Wird das optionale Schlüsselwort LOCAL verwendet, gilt die Fehlerbehandlung
    nur für die aktuelle Prozedur. In diesem Fall sucht freeBASIC nach dem
    Label innerhalb der aktuellen Prozedur.

  • Wird 0 als Label angegeben, werden aktivierte Fehlerbehandlungsroutinen
    ignoriert; wenn ein Fehler auftritt, führt freeBASIC keinen Sprung aus.

    • Beispiel:
    ON ERROR GOTO errorhandler 'Legt fest, an welches Label verzweigt werden soll.
    ERROR 24 'Fehler 24 simulieren
    PRINT "Diese Zeile wird nicht angezeigt."

    errorhandler:
    PRINT "Fehler #"; ERR; " ist aufgetreten!" 'Fehlernummer anzeigen
    PRINT "Beliebige Taste zum beenden"
    GETKEY
    END 'Programm beenden

    Siehe auch:
    ERROR (Anweisung), ERR (Funktion),
    RESUME,
    Fehlernummern


ON...GOSUB

Syntax: ON Ausdruck GOSUB label1[, label2 [, ...] ]
Typ: Anweisung
Kategorie: Programmorganisation

Verzweigt zu verschiedenen Labels, abhängig vom Wert des Ausdrucks.

  • 'Ausdruck' ist ein beliebiger numerischer Ausdruck, dessen Wert zu einem
    INTEGER gerundet wird.
    Nicht zulässig sind STRINGs, ZSTRINGs und WSTRINGs

  • 'label1', 'label2', ... sind Labels, wie sie mit GOTO, oder GOSUB verwendet werden

    • Ist der Wert von 'Ausdruck' gleich 1 wird zum ersten Label verzweigt, ist er
    gleich 2 zum Zweiten, und so fort.
    Ist der Wert von 'Ausdruck' kleiner als 1 oder größer als die Anzahl der Labels,
    so wird das Programm mit der Anweisung nach ON GOSUB fortgesetzt.
    Da der Sprung durch GOSUB durchgeführt wurde, kann anschließend durch
    RETURN zum Hauptprogramm zurückgeführt werden.

    ON...GOSUB wurde sollte durch SELECT CASE ersetzt
    weden, da diese Form sehr viel übersichtlicher ist.

    Da GOSUB und RETURN seit freeBASIC v0.16 auf Prozedurebene nicht mehr zulässig
    sind, darf auch ON GOSUB nur noch auf Modulebene eingesetzt werden.

    Beispiel:
    choice = 3
    ON choice GOSUB labela, labelb, labelc
    PRINT "Good bye."
    GETKEY
    END

    labela:
    PRINT "choice a"
    RETURN

    labelb:
    PRINT "choice b"
    RETURN

    labelc:
    PRINT "choice c"
    RETURN
    Ausgabe:
    choice c
    Good bye.

    Unterschiede
    (zu QB):
  • ON GOSUB ist auf Prozedurebene nicht mehr zulässig

    • (zu früheren freeBASIC-Versionen):
  • Seit freeBASIC v0.16b, März-Release ist es nicht mehr zulässig, ON GOSUB auf
    Prozedurebene zu verwenden.

    • Siehe auch:
    ON...GOTO, GOSUB, RETURN,
    GOTO,
    SELECT CASE


ON...GOTO

Syntax: ON Ausdruck GOTO label1[, label2 [, ...] ]
Typ: Anweisung
Kategorie: Programmorganisation

Verzweigt zu verschiedenen Labels, abhängig vom Wert des Ausdrucks.

  • 'Ausdruck' ist ein beliebiger numerischer Ausdruck, dessen Wert zu einem
    INTEGER gerundet wird.
    Nicht zulässig sind STRINGs, ZSTRINGs und WSTRINGs

  • 'label1', 'label2', ... sind Labels, wie sie mit GOTO, oder GOSUB verwendet werden

    • Ist der Wert von 'Ausdruck' gleich 1 wird zum ersten Label verzweigt, ist er
    gleich 2 zum Zweiten, und so fort.
    Ist der Wert von 'Ausdruck' kleiner als 1 oder größer als die Anzahl der Labels,
    so wird das Programm mit der Anweisung nach ON GOTO fortgesetzt.
    Dieser Befehl sollte ersetzt werden durch SELECT CASE.

    Beispiel:
    choice = 3
    ON choice GOTO labela, labelb, labelc

    labela:
    PRINT "choice a"
    END

    labelb:
    PRINT "choice b"
    END

    labelc:
    PRINT "choice c"
    END

    Siehe auch:
    ON...GOSUB, GOTO, RETURN,
    GOSUB,
    SELECT CASE


ON

Typ: Schlüsselwort

ON wird eingesetzt mit:
Siehe:
ON ERROR
ON...GOSUB
ON...GOTO


ONCE

Typ: Schlüsselwort
Kategorie: Programmorganisation

Unterbindet, dass ein Codeteil doppelt eingebunden wird.
Siehe dazu INCLUDE.


OPEN (Anweisung)

Syntax: OPEN Datei FOR Dateimodus [ACCESS Zugriffsart] [LOCK Sperrart] [ENCODING "Format"] AS [#]Dateinummer [LEN = Recordlänge]
Typ: Anweisung
Kategorie: Datei

Bereitet eine Datei auf einen Lese- und/oder Schreibzugriff vor, und weist der Datei
eine Dateinummer zu.

OPEN kann auch zum Zugriff auf verschiedene Geräte verwendet werden; siehe
OPEN-Varianaten.

  • 'Datei' ist der Name einer Datei, auf die zugegriffen werden soll.
    Wird kein Pfad angegeben, geht freeBASIC davon aus, dass sie sich im aktuellen
    Arbeitsverzeichnis befindet.
    Wenn die Datei nicht existiert, wird sie neu erstellt.
    (Ausnahme: INPUT-Modus)

  • 'Dateimodus' gibt an, in welchem Modus die Datei geöffnet werden soll.
    Möglich sind:
    - RANDOM
    - INPUT
    - OUTPUT
    - APPEND
    - BINARY
    Abhängig vom Dateimodus stehen verschiedene Dateioperationen zur Verfügung.

  • '#Dateinummer' ist eine Nummer, über die später auf die Datei bzw. das Gerät
    zugegriffen wird. Diese Nummer darf nicht doppelt vergeben werden!
    Möglich sind die Nummern 1 bis 255.
    '#Dateinummer' darf auch eine Variable sein.
    Die Führende Raute ist optional, sollte aber verwendet werden, um sicherzustellen,
    dass eine Dateinummer bezeichnet wird.

  • 'ENCODING "Format"' steht erst seit freeBASIC v0.15 Jubiläumsversion zur
    Verfügung.
    Bei sequentiellen Modi (INPUT, OUTPUT und APPEND) kann mit diesem Parameter
    angegeben werden, wie die Datei Codiert werden soll. '"Format"' ist dabei
    einer von diesen Strings, der angibt, wie die Datei codiert sein soll:
    - ASCII
    - UTF-8
    - UTF-16
    - UTF-32
    Dadurch ist es möglich, ohne großen Aufwand Unicode-Dateien nach derzeit
    gültigen Codierungsregeln zu erstellen.
    Wird der Parameter ENCODING ausgelassen, nimmt freeBASIC automatisch
    'ENCODING "ASCII"' an.
    Im BINARY- und RANDOM-Modus kann die ENCODING-Klausel nicht eingesetzt werden.

  • 'Zugriffsart' gibt an, welche Zugriffe gestattet sind:
    - READ : Nur Lesezugriff
    - WRITE : Nur Schreibzugriff
    - READ WRITE: Lese- und Schreibzugriff
    Siehe dazu auch ACCESS
    Sinnvollerweise wird diese Klausel nur mit dem RANDOM oder dem BINARY-Modus
    verwendet.

  • 'Sperrart' gibt an, wie andere Prozesse auf die gerade geöffnete Datei
    zugreifen dürfen:
    - READ : Andere Prozesse dürfen auf die Datei zugreifen, sie aber nicht
    lesen.
    - WRITE : Andere Prozesse dürfen auf die Datei zugreifen, nicht aber in
    sie schreiben.
    - READ WRITE: Andere Prozesse dürfen NICHT auf die Datei zugreifen.

  • 'Recordlänge' legt fest, wie viele Bytes ein Record lang sein soll; siehe
    RANDOM

    • Beispiel:
    Öffnen der UTF-8-Datei "file.ext" im aktuellen Arbeitsverzeichnis, und ihre erste
    Zeile auf dem Bildschirm ausgeben.
    f = FREEFILE
    OPEN "file.ext" ENCODING "UTF-8" FOR INPUT AS #f
    LINE INPUT #f, ln$
    PRINT ln$
    CLOSE #f

    Zugriff auf Geräte (Gültig für freeBASIC ab v0.15b)

    Neben Dateien lassen sich auch 'Geräte' öffnen. Geräte sind entweder von freeBASIC
    verwaltete Speicherbereiche, in denen verschiedene, interne Informationen gespeichert
    werden, oder externe Anschlüsse wie die COM-Ports oder der LTP-Druckerport.
    Um mit OPEN ein Gerät zu öffnen, wird einfach einer dieser Bezeichner bei 'Gerät'
    angegeben.
    (Anmerkung: Diese Syntax-Regeln sind erst ab freeBASIC v0.15b gültig; siehe
    unten für die älteren Regeln.)

    LPT Dieses Gerät ermöglicht die Kommunikation mit dem LPT-Port und
    dadurch mit dem Drucker.
    Siehe auch: LPRINT (Anweisung)
    - Keine Genauen Daten -

    Unterschiede (zu QB):
    OPEN kann auch als Funktion eingesetzt werden, und unterstützt die Geräte
    PIPE, CONS, ERR, LPT, SCRN und (unter Win32) COM.

    Siehe auch:
    OPEN-Varianaten,
    INPUT #, LINE INPUT #,
    WRITE #, PRINT #, PRINT USING #,
    GET #, PUT #,
    FREEFILE, LOC, LOF, EOF
    RANDOM, INPUT (Dateimodus), OUTPUT, APPEND, BINARY
    CLOSE


OPEN (Funktion)

Syntax: OPEN ([Gerät] Datei FOR Dateimodus [ACCESS Zugriffsart] [LOCK Sperrart] AS [#]Dateinummer [LEN = Recordlänge])
Typ: Funktion
Kategorie: Datei

Bereitet eine Datei oder ein Gerät auf einen Lese- und/oder Schreibzugriff vor,
und weist der Datei oder dem Gerät eine Dateinummer zu.

  • Die Parameter entsprechen denen der OPEN-Varianten

  • Der Rückgabewert ist dann eine Fehlernummern

    • Beispiel:
    Prüfe, ob die Datei "file.ext" existiert:
    f = FREEFILE
    SELECT CASE OPEN ("file.ext FOR INPUT AS #f)
    CASE 0
    PRINT "Datei existiert und ist bereit."
    CLOSE #f
    CASE 2
    PRINT "Datei existiert nicht!"
    CASE ELSE
    PRINT "Fehler beim Öffnen der Datei!"
    END SELECT

    Siehe auch:
    OPEN-Varianten,
    Fehlernummern


OPEN COM

Syntax: OPEN COM "COMn:Optionen, erweiterte_Optionen" [FOR Dateimodus] AS [#]Dateinummer
Typ: Anweisung
Kategorie: Hardware

Diese Version von OPEN steht derzeit nur in der Win32-Version von freeBASIC v0.15b
und deren Nachfolgern zur Verfügung!

Anmerkung:
Die folgenden Daten sind teils der QBX PDS 7.1-Hilfe entnommen; es besteht kein
Anspruch auf Korrektheit.

Bereitet den Zugriff auf einen COM-Port vor.

  • 'n' ist die Nummer des Ports, auf den zugegriffen werden soll.

  • 'Optionen' ist eine Zeile dieses Formats:
    [Geschwindigkeit] [,[Parität] [,[Datenbits] [,[Stopbits]]]]
    Die einzelnen Elemente werden später erklärt.

  • '#Dateinummer' ist die Nummer, über die später auf den Port zugegriffen
    werden soll.
    Möglich sind die Nummern 1 bis 255.
    '#Dateinummer' darf auch eine Variable sein.
    Die Führende Raute ist optional, sollte aber verwendet werden, um sicherzustellen,
    dass eine Dateinummer bezeichnet wird.

    • Die Parameter in 'Optionen haben die folgenden Bedeutungen:
    Option | Beschreibung | Bereich (Standard fettgedruckt)
Geschwindigkeit | gibt die Geschwindigkeit der Datenübermittlung in Baud (Bits pro Sekunde) an. Nur die Nebenstehenden Geschwindigkeiten sind zulässig! | 75, 110, 150, 300, 600, 1200, 1800, 2400, 9600
Parität | gibt die Parität an: none even odd space mark error checking | N E O S M PE
Datenbits | Anzahl der Datenbits pro Byte | 5, 6, 7, oder 8
Stopbits | Anzahl der Stopbits | 1, 1.5, odr 2(1)
  • Erweiterte_Optionen
    CSn Set the CTS duration (in ms) (n>=0), 0 = turn off, default = 1000
    DSn Set the DSR duration (in ms) (n>=0), 0 = turn off, default = 1000
    CDn Set the Carrier Datect duration (in ms) (n>=0), 0 = turn off
    OPn Set the "Open Timeout" (in ms) (n>=0), 0 = turn off
    TBn Set the "Transmit Buffer" size (n>=0), 0 = default, depends on platform
    RBn Set the "Receive Buffer" size (n>=0), 0 = default, depends on platform
    RS Suppress RTS detection
    LF (or ASC) Communicate in ASCII mode (add LF to every CR) - Win32 doesn't support this one
    BIN The opposite of LF and it'll always work
    PE Enable "Parity" check
    DT Keep DTR enabled after CLOSE
    FE Discard invalid character on error
    ME Ignore all errors
    IRn IRQ number for COM (only supported on DOS)

    • Die Reihenfolge innerhalb dieser Liste muss eingehalten werden. Benutzen Sie
    Kommata, um Platzhalter zu verwenden:
    OPEN "COM1: ,N,8," FOR INPUT AS #1

    Wenn Sie acht Datenbits verwenden, müssen Sie als Parität 'none' (N) angeben.

    Beispiel:
    OPEN COM "COM1:9600,N,8,1" AS #1
    'Zugriff auf COM1 mit 9600 Baud, ohne Paritäts-Bit, acht Datenbits, ein Stopbit

    Unterschiede zu QB:
    OPEN COM lässt sich auch als Funktion einsetzen; siehe OPEN (Funktion).
    Es wurde von Problemen bei der Verwendung von OPEN COM unter Windows XP
    berichtet.

    Siehe auch:
    OPEN (Anweisung), OPEN (Funktion),
    INP, OUT, WAIT,
    LPRINT (Anweisung), LPRINT USING


OPEN CONS

OPEN ERR

Typ: Anweisung
Kategorie: Datei

CONS ist das Standard-Ausgabegerät. Dies ist im Normalfall das Konsole-Fenster;
Durch BATCH kann die Ausgabe aber auch umgeleitet werden: Wird das Programm mit
Umleitungszeichen (<, >, |) aufgerufen, interpretiert sie CONS entsprechend.
Auf CONS können nur Ausgaben erfolgen; ein Versuch von CONS zu lesen führt zu
einer Endlosschleife.

OPEN CONS wird - je nach Version des FB-Compilers mit unterschiedlicher Syntax
eingesetzt:

Syntax für freeBASIC ab v0.15b

Syntax: OPEN CONS [FOR Dateimodus] AS [#]Dateinummer

  • 'Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten. ERR wird
    immer für sequentielle Ausgabe geöffnet (im OUTPUT-Modus.)
    Wird 'FOR Dateimodus' ausgelassen, gibt CONS immer auf dem Bildschirm aus,
    unabhängig, ob die Eingabe umgeleitet wurde.

  • 'Dateinummer' ist eine Ganzzahl zwischen 0 und 255, über die später auf den
    Puffer zugegriffen wird. Sie darf nicht doppelt vergeben werden, und verhält
    sich wie eine Dateinummer der OPEN-Anweisung.

    • Beispiel:
    ' Quelltext zu ConsTest.exe
    f = FREEFILE
    OPEN CONS FOR OUTPUT AS #f
    PRINT #f "HELLO"
    CLOSE #f
    Wird dieses Programm normal aufgerufen, gibt freeBASIC "HELLO" auf dem
    Bildschirm aus, jedoch führt die Zeile
    ConsTest>>ConTestOut.txt
    zu einer Ausgabe in die Datei ConTestOut.txt.
    LOCATE (Anweisung) und COLOR (Anweisung) haben keine Auswirkung auf die Ausgaben, die
    mit CONS gemacht werden.

    für freeBASIC bis v0.14

    Syntax: OPEN "CONS:" FOR Dateimodus AS [#]Dateinummer
    OPEN "CONS:" FOR INPUT AS #1
    Die Elemente dieses Befehls entsprechen denen von v0.15b.

    Siehe auch:
    OPEN-Varianaten,
    PRINT #, WRITE #,
    FREEFILE,
    OUTPUT, APPEND,
    CLOSE


OPEN ERR

Typ: Anweisung
Kategorie: Datei

Mit ERR können Ein- und Ausgaben auf das Fehler-Gerät erfolgen; das Fehlergerät
ist immer der Bildschirm. ERR wird verwendet, wenn die Ausgabe von CONS umgeleitet
wird; die Ausgabe auf ERR wird immer noch auf dem Bildschirm erscheinen.

OPEN ERR wird - je nach Version des FB-Compilers mit unterschiedlicher Syntax
eingesetzt:

Syntax für freeBASIC ab v0.15b

Syntax: OPEN ERR FOR Dateimodus AS [#]Dateinummer

  • 'Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten. ERR wird
    immer für sequentielle Ausgabe geöffnet (im OUTPUT-Modus.)

  • 'Dateinummer' ist eine Ganzzahl zwischen 0 und 255, über die später auf den
    Puffer zugegriffen wird. Sie darf nicht doppelt vergeben werden, und verhält
    sich wie eine Dateinummer der OPEN-Anweisung.

    • Beispiel:
    ' Quelltext ConsErrTest.exe
    c = FREEFILE
    e = FREEFILE
    OPEN CONS FOR OUTPUT AS #c
    OPEN ERR FOR OUTPUT AS #e
    PRINT #c, "HELLO"
    PRINT #e, "FINISHED"
    CLOSE #c, #e
    Wird dieses Programm mit der Zeile
    ConsErrTest>>ConErrTestOut.txt
    aufgerufen, gibt freeBASIC die Zeile "HELLO" in die Datei aus, während "FINISHED"
    auf dem Bildschirm erscheint. Ohne die Umleitungszeichen erscheinen Beide Zeilen
    auf dem Bildschirm.
    LOCATE (Anweisung) und COLOR (Anweisung) haben keine Auswirkung auf die Ausgaben, die
    mit CONS oder ERR gemacht werden.

    für freeBASIC bis v0.14

    Syntax: OPEN "ERR:" FOR Dateimodus AS [#]Dateinummer
    OPEN "ERR:" FOR INPUT AS #1
    Die Elemente dieses Befehls entsprechen denen von v0.15b.

    Siehe auch:
    OPEN-Varianaten,
    PRINT #, WRITE #,
    FREEFILE,
    OUTPUT, APPEND,
    CLOSE


OPEN COM

Syntax: OPEN LPT ["LPT:Windows_Printer_Name,TITLE=Doc_Title,EMU=TTY"] [FOR Dateimodus] AS #Dateinummer
Typ: Anweisung
Kategorie: Hardware

Anmerkung:
OPEN COM konnte noch nicht erfolgreich getestet werden...

Diese Anweisung bereitet einen Drucker darauf vor, Daten vom PRINT # Befehl
auszugeben.
Im Gegensatz zu LPRINT kann jeder Drucker angesprochen werden, der im System
registriert ist. Auch USB-Drucker können verwendet werden.

  • 'Windows_Printer_Name' ist der Name des Druckers, wie er im System
    eingetragen ist. Wird dieser Parameter ausgelassen, benutzt freeBASIC
    automatisch den Standarddrucker.

  • 'Doc_Title' ist der Titel, der Name, der im Viewer des Drucker-Spoolers
    angezeigt wird. Wird dieser Parameter ausgelassen, verwendet freeBASIC einen
    Standardtitel, der den Namen der Anwendung enthält, die den Druckauftrag
    ausgesandt hat.

  • Das Argument 'EMU=TTY" ermöglicht die Benutzung der Sonderzeichnen CR (CHR(13),
    Carry Return), LF (CHR(10), Line Feed), BS (CHR(8), Backspace), TAB (CHR(9),
    Tabulator), etc. Dies funktioniert sogar dann, wenn der Drucker ein GDI
    Drucker ist, und diese Sonderzeichen selbst nicht interpretieren kann.
    Wenn 'EMU=TTY' ausgelassen wird, müssen die Daten in der Druckersprache
    gesendet werden (ESC/P, HPGL, PostScript, ...). Andere Emulationen werden
    noch nicht unterstützt.

  • 'FOR Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten. ERR wird
    immer für sequentielle Ausgabe geöffnet (im OUTPUT-Modus.)
    Wird 'FOR Dateimodus' ausgelassen, gibt CONS immer auf dem Bildschirm aus,
    unabhängig, ob die Eingabe umgeleitet wurde.

  • '#Dateinummer' ist die Nummer, über die später auf den Port zugegriffen
    werden soll.
    Möglich sind die Nummern 1 bis 255.
    '#Dateinummer' darf auch eine Variable sein.
    Die Führende Raute ist optional, sollte aber verwendet werden, um sicherzustellen,
    dass eine Dateinummer bezeichnet wird.

    • Beispiel 1:
    Hello World Drucken
    f = FREEFILE
    OPEN LPT FOR OUTPUT AS #f
    PRINT #1,"Hello World!"
    PRINT #f, CHR(12) 'new page: most printer drivers do nothing until the new page is received
    CLOSE

    Beispiel 2:
    Den Inhalt der Datei test.txt auf dem Windows-Drucker "ReceiptPrinter" drucken
    DIM RptInput AS STRING
    RptFilehandle = FREEFILE

    OPEN "test.txt" FOR INPUT AS #RptFilehandle

    Printhandle = FREEFILE
    OPEN LPT "LPT:ReceiptPrinter,TITLE=ReceiptWinTitle,EMU=TTY" AS #Printhandle

    WHILE NOT EOF(RptFilehandle)
    LINE INPUT #RptFilehandle, RptInput
    PRINT #Printhandle, RptInput
    WEND

    CLOSE #Printhandle ' Ein CHR(12) zum bestätigen des Druckauftrages ist nicht
    ' notwendig. Wenn allerdings eine neue Seite begonnen werden
    ' soll, muss dennoch CHR(12) gesendet werden.
    CLOSE #RptFilehandle

    PRINT "Beliebige Taste zum beenden drücken..."
    GETKEY
    END

    Siehe auch:
    OPEN-Varianaten,
    PRINT #, WRITE #,
    LPRINT,
    FREEFILE, CLOSE


OPEN PIPE

Typ: Anweisung
Kategorie: Datei

PIPE ist ein Gerät, auf das mit INPUT # zugreifen kann.
In PIPE wird die Ausgabe eines SHELL-Befehls gespeichert.
Die Ausgabe dieses Befehls wird aber nicht auf den Bildschirm geleitet, sondern in einen
Dateipuffer umgeleitet, auf den mit INPUT # und LINE INPUT # zugegriffen werden
kann.

OPEN PIPE wird - je nach Version des FB-Compilers mit unterschiedlicher Syntax
eingesetzt:

Syntax für freeBASIC ab v0.15b

Syntax: OPEN PIPE "Shellbefehl" FOR Dateimodus AS [#]Dateinummer

  • '"Shellbefehl"' ist eine beliebige Kommandozeile, wie sie mit SHELL
    aufgerufen werden kann. Diese Kommandozeile wird normal ausgeführt.

  • 'Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten. ERR wird
    immer für sequentielle Eingabe geöffnet (im INPUT-Modus.)

  • 'Dateinummer' ist eine Ganzzahl zwischen 0 und 255, über die später auf den
    Puffer zugegriffen wird. Sie darf nicht doppelt vergeben werden, und verhält
    sich wie eine Dateinummer der OPEN-Anweisung.

    • Beispiel:
    f = FREEFILE
    OPEN PIPE "dir *.*" FOR INPUT AS #f

    DIM s AS STRING

    DO UNTIL EOF(f)
    LINE INPUT #f, s
    PRINT s
    LOOP

    für freeBASIC bis v0.14

    Syntax: OPEN "PIPE:Shellbefehl" FOR Dateimodus AS [#]Dateinummer
    OPEN "PIPE:dir *.*" FOR INPUT AS #1
    Die Elemente dieses Befehls entsprechen denen von v0.15b.

    Siehe auch:
    OPEN-Varianaten,
    INPUT #, LINE INPUT #,
    FREEFILE, LOC, LOF, EOF
    INPUT (Dateimodus),
    CLOSE,
    SHELL


OPEN SCRN

Typ: Anweisung
Kategorie: Datei
Syntax: OPEN SCRN [FOR Dateimodus] AS #Dateinummer

Über SCRN kann auf das Standardausgabegerät im Lese- und Schreibmodus zugegriffen
werden. Das Standardausgabegerät ist im Normalfall das Konsole-Fenster;
Durch BATCH-Umleitungszeichen kann die Ausgabe aber auch umgeleitet werden: Wird
das Programm mit Umleitungszeichen (<, >, |) aufgerufen, interpretiert sie SCRN
entsprechend.
SCRN funktioniert also genauso wie CONS, mit dem Unterschied, dass auch von SCRN
gelesen werden kann.

  • 'Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten. ERR wird
    immer für sequentielle Ausgabe geöffnet (im OUTPUT-Modus.)

  • 'Dateinummer' ist eine Ganzzahl zwischen 0 und 255, über die später auf den
    Puffer zugegriffen wird. Sie darf nicht doppelt vergeben werden, und verhält
    sich wie eine Dateinummer der OPEN-Anweisung.

    • Beispiel 1: Schreiben auf SCRN
    ' Quelltext zu ScrnTest.exe
    f = FREEFILE
    OPEN SCRN AS #f
    PRINT #f, "Test"
    CLOSE #f
    Wird dieses Programm normal ausgeführt, erscheint die Zeile "Test" auf dem
    Bildschirm. Beim Aufruf des Programms mit dieser Zeile allerdings:
    ScrnTest>>ScrnTestOut.txt
    Wird "Test" in die Datei ScrnTestOut.txt geschrieben.
    LOCATE (Anweisung) und COLOR (Anweisung) haben keine Auswirkung auf die Ausgaben, die
    mit SCRN gemacht werden.

    Beispiel 2: Lesen von SCRN
    Es wird angenommen, dass die Datei ScrnTestOut.txt im aktuellen
    Arbeitsverzeichnis liegt, und mindestens eine Zeile enthält; am besten lassen
    Sie die datei vom obigen Beispielcode vorbereiten.
    ' Quelltext zu ScrnTest.exe
    DIM f AS INTEGER, s AS STRING
    f = FREEFILE
    OPEN SCRN AS #f
    LINE INPUT #f, s
    PRINT s
    CLOSE #f
    Beim normalen Aufruf des Programmes können Sie über die Tastatur einen String
    eingeben, der an s übergeben wird. Beim Aufruf des Programmes mit der
    Kommandozeile
    ScrnTest < ScrnTestOut.txt
    allerdings wird nicht von der Tastatur, sondern aus der Datei ScrnTestOut.txt
    gelesen.

    Siehe auch:
    OPEN-Varianaten,
    PRINT #, WRITE #,
    INPUT #, LINE INPUT #,
    FREEFILE,
    INPUT (Dateimodus), OUTPUT, APPEND,
    CLOSE


OPEN

Typ: Anweisung/Funktion

OPEN ist ein Schlüsselwort, das als Anweisung mit in verschiedenen Varianten und
als Funktion eingesetzt werden kann.

Siehe:
OPEN (Anweisung)
OPEN PIPE
OPEN CONS
OPEN COM
OPEN ERR
OPEN LPT
OPEN SCRN
OPEN (Funktion)


OPERATOR

Syntax A: DECLARE OPERATOR Typ ( Parameter ) AS DatenTyp
Syntax B:
OPERATOR Typ ( Parameter) AS DatenTyp
    ' Anweisungen
END OPERATOR

Typ: Prozedur
Kategorie: Programmorganisation

Erstellt einen überladenen Operator.
Da die FB-eigenen Operatoren i.d.R. nicht dazu in der Lage sind, mit UDTs umzugehen (sondern nur mit einzelnen Records) existiert die
Möglichkeit, bei jeder Anwendung eines Operators eine Prozedur aufzurufen, die die Berechnungen übernimmt.

Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

  • 'Typ' ist der Typ des Operators, etwa +, -, ...
    Siehe dazu die Tabelle unten

  • 'Parameter' ist eine Parameterliste, wie sie auch bei FUNCTION verwendet wird. Je nach Art des Operators, der überladen werden soll, hat
    diese Liste einen oder zwei Parameter.

  • 'DatenTyp' ist ein beliebiger Datentyp, der vom Operator zurückgegeben werden soll.

  • 'Anweisungen' ist ein Programmcode, der den selben Regeln folgt wie in einer FUNCTION.
    Dieser Code wird ausgeführt, um den Wert der Operation zu berechnen.

    • Die FB-eigenen Operatoren wie =, +, ... haben vordefinierte Verhaltensweisen. Diese Operatoren können überladen werden, um andere
    Verhaltensweisen zu erwirken, wenn zumindest einer der Operanden ein UDT (User defined Type - siehe TYPE (UDT)) ist.
    Siehe auch OVERLOAD zum Überladen von Prozeduren.

    Für jeden Operator dürfen mehrere Prozeduren vorhanden sein, die sich durch ihre Parameterliste unterscheiden müssen.
    Der CAST-Operator kann auch so überladen werden, dass die Parameterliste für mehrere Prozeduren die selbe ist; in diesem Fall müssen
    sich die Prozeduren durch den Rückgabetyp unterscheiden.

    Diese Operatoren können überladen werden:
    Bezeichnung | Syntax
Wertzuweisung | OPERATOR LET ( { BYVAL | BYREF } rhs AS DatenTyp )
Typenumwandlung | OPERATOR CAST ( { BYVAL | BYREF } rhs AS DatenTyp )
Negierung | OPERATOR - ( { BYVAL | BYREF } rhs AS DatenTyp )
Addition | OPERATOR + ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Subtraktion | OPERATOR - ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Multiplikation | OPERATOR * ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Division | OPERATOR / ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Integerdivision | OPERATOR \ ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Potenzierung | OPERATOR ^ ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Modulus | OPERATOR MOD ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Shift Left | OPERATOR SHL ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Shift Right | OPERATOR SHR ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
logisches NOT | OPERATOR NOT ( { BYVAL | BYREF } rhs AS DatenTyp )
logisches AND | OPERATOR AND ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
logisches OR | OPERATOR OR ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
logisches XOR | OPERATOR XOR ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
logisches IMP | OPERATOR IMP ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
logisches EQV | OPERATOR EQV ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Vergleich: Gleichheit | OPERATOR = ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Vergleich: Ungleichheit | OPERATOR <> ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Verlgeich: Größer als | OPERATOR > ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Vergleich: Kleiner als | OPERATOR < ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Vergleich: Größer oder Gleich | OPERATOR >= ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
Vergleich: Kleiner oder Gleich | OPERATOR <= ( { BYVAL | BYREF } lhs AS DatenTyp, { BYVAL | BYREF } rhs AS DatenTyp )
    Sowie die Kombinierte Berechnung und Wertzuweisung (z.B. +=) für alle Operatoren mit Ausnahme von CAST und LET.

    'lhs' und 'rhs' sind dabei jeweils die Operanden, die zur Durchführung der Operation benötigt werden. Dabei steht 'lhs' immer links vom
    Operator ('left hand subscript') und 'rhs' rechts vom Operator ('right hand subscript').
    Generell kann man dabei für Operatoren mit zwei Operanden diese Syntax verwenden:
    Ergebnis = lhs OPERATOR rhs
    Für Operatoren mit nur einem Operanden gilt entsprechend:
    Ergebnis = OPERATOR rhs

    Weiter werden sogenannte statische und nicht-statische Operatoren unterschieden.
    Nicht-statische Operatoren sind alle Kombinierten Operatoren (z.B. +=), sowie LET und CAST. Sie haben keinen Rückgabetyp; die Zuweisung
    eines Wertes geschieht in diesem Fall über das Schlüsselwort THIS. THIS nimmt hierfür den Datentyp des Typs
    an, auf den sich der Operatoren beziehen soll.
    Daher müssen nicht-statische Operatoren einem Typ immer fest zugeordnet werden. Dies geschieht dadurch, dass ihre Deklarierung schon
    innerhalb des TYPE-Blocks ( siehe TYPE (UDT)) stattfindet; der eigentlichen Prozedur muss außerdem TypeName.
    vorangestellt werden.

    Statische Operatoren sind alle anderen Operatoren, also Operatoren, die nicht direkt einen Wert zuweisen.
    Sie müssen unabhängig vom Typ deklariert werden, und besitzen einen Rückgabetyp.

    Generell können alle Prozeduren so überladen werden, dass Parameter verschiedener Datentypen verwendet werden können. In vielen Fällen
    ist dies jedoch gar nicht nötig, da über CAST der UDT in ein Format gebracht werden kann, für das bereits eine Prozedur existiert.
    Sofern genügend Informationen vorhanden sind, wird der Compiler einen Ausdruck entsprechend umformen, um eine Berechnung durchführen zu
    können.
    Ist beispielsweise der Operator '+=' nicht definiert, kann der Ausdruck
    UDT += Wert
    Dennoch durchgeführt werden, wenn die Operatoren '+' und 'LET' entsprechend überladen wurden; der Compiler wird obigen Ausdruck
    automatisch zu
    UDT = UDT + Wert
    übersetzen.

    Beispiel:
    Type Vector2D
    As Single x, y

    Declare Operator Cast() As String

    End Type

    Declare Operator + ( lhs As Vector2D, rhs As Vector2D ) As Vector2D

    Operator Vector2D.cast () As String
    Return "(" + Str(x) + ", " + Str(y) + ")"
    End Operator

    Operator + ( lhs As Vector2D, rhs As Vector2D ) As Vector2D
    Return Type( lhs.x + rhs.x, lhs.y + rhs.y )
    End Operator

    Dim a As Vector2D = Type( 1.2, 3.4 )
    Dim b As Vector2D = Type( 8.9, 6.7 )

    Print "a = "; a
    Print "b = "; b
    Print "a + b = "; a + b

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • OPERATOR existiert seit freeBASIC v0.17

    • Siehe auch:
    THIS,
    TYPE (UDT), FUNCTION,
    OVERLOAD


OPTION

Syntax: OPTION Programmstandard
Typ: Anweisung
Kategorie: Verschiedenes

OPTION setzt verschiedene Standards in Ihrem Programm.
'Programmstandard' ist eines von diesen Schlüsselwörtern:
  • BASE

  • PRIVATE (Schlüsselwort)

  • BYVAL

  • DYNAMIC (Schlüsselwort)
    • oder STATIC (Schlüsselwort)
  • EXPLICIT

  • ESCAPE

  • NOKEYWORD

    • OPTION-Zeilen sollten die ersten Zeilen Ihres Programmes darstellen, da eine Änderung eines Standards während des Programmverlaufs
    zu Problemen führen kann.
    Dieses Beispiel verdeutlicht die Problematik:
    DECLARE SUB s1 (a AS INTEGER)

    OPTION BYVAL

    DECLARE SUB s2 (b AS INTEGER)

    SUB s1(a AS INTEGER)
    END SUB

    SUB s2(a AS INTEGER)
    END SUB
    Der Versuch, dieses Programm zu compilern würde fehlschlagen. Während der Zeile
    DECLARE SUB s1 (a AS INTEGER)
    gilt OPTION BYVAL noch nicht; in dieser Zeile wird also noch angenommen, dass der Parameter 'a' BYREF übergeben wird.
    Der zugehörige Sub-Header
    SUB s1(a AS INTEGER)
    wird allerdings schon durch OPTION BYVAL beeinflusst; hier wird angenommen, dass 'a' BYVAL übergeben werden soll. Aufgrund des
    Unterschieds zwischen Deklarationszeile und Prozedurkopf gibt der Compiler die Fehlermeldung
    error 56: Type mismatch, at parameter 1 (a) of s1()
    Sub s1 (a As Integer)
    aus.

    Unterschiede:
    zu QB:
  • Unter QB war nur OPTION BASE möglich.

    • zu früheren Versionen von freeBASIC:
  • Rufen Sie bitte die einzelnen Einträge auf, um die Versionsunterschiede für die verschiedenen Standards im Speziellen einzusehen.

  • Erst seit freeBASIC v0.14 gelten Programmstandards auch, wenn sie in Dateien festgelegt wurden, die per #INCLUDE eingebunden wurden.

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.17 können Programmstandards nur noch dann mit OPTION festgelegt werden, wenn die Kommandozeilenoption
    -lang deprecated
    angegeben wurde. Wurde mit
    -lang fb
    kompiliert, darf OPTION nicht mehr genutzt werden. Sehen Sie bitte die einzelnen Schlüsselwörter ein, um entsprechende Walkarounds
    nachzulesen.


OR (Methode)

Typ: Schlüsselwort
Kategorie: Gfx

OR ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING
eingesetzt wird.

Die Farbe des gezeichneten Pixels ist das Ergebnis eines logischen OR des zu
zeichnenden Pixels mit dem zu überschreibenden Pixel.

Beispiel:
An der Position (100, 100) befindet sich ein Pixel mit dem Farbattribut 172.
Dieses soll nach der OR-Methode mit einem Pixel des Farbattributs 15
überzeichnet werden. Das Ergebnis ist ein Pixel des Farbattributs 175.
Dies ergibt sich folgendermaßen:
Dezimal    Binär
 172       10101100
  15       00001111
--OR----------OR---
 175       10101111

Die OR-Methode kann mit allen Farbtiefen angewandt werden, also sowohl in
palettenindizierten Modi als auch in high/truecolor-Modi. Beachten Sie, dass in
palettenindizierten Modi das sichtbare Ergebnis nicht nur von den Farbattributen,
sondern auch von den zugeordneten Paletten-Einträgen abhängig ist.
Siehe dazu PALETTE und Standardpaletten.

Siehe auch:
OR (Operator),
PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
OR (Methode), AND (Methode),
PSET (Methode), PRESET (Methode),
ALPHA, ADD, TRANS, CUSTOM


OR (Operator)

logischer Operator

OR kann als einfacher und kombinierter Operator eingesetzt werden:

logischer Operator (einfacher Operator)

Syntax: Ausdruck1 OR Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

OR vergleicht zwei Werte Bit für Bit, und setzt im Ergebnis nur dann ein Bit,
wenn mindestens ein Bit der entsprechenden Stelle in den Ausdrücken gesetzt waren.
OR wird in Bedingungen eingesetzt, wenn mindestens eine Aussage erfüllt sein muss.

Beispiel 1: OR in einer IF-THEN-Bedingung:
IF (a = 1) OR (b = 7) THEN PRINT "Entweder a = 1 oder b = 7." ELSE PRINT "a <> 1 und b <> 7."

Beispiel 2: Komplement zweier Zahlen mit OR:
DIM AS INTEGER z1, z2

z1 = 6
z2 = 10

PRINT z1, BIN(z1, 4)
PRINT z2, BIN(z2, 4)
PRINT "---", "----"
PRINT z1 OR z2, BIN(z1 OR z2, 4)
GETKEY
Ausgabe:
  6           0110
 10           1010
---           ----
 14           1110

kombiniertes OR,
NOT, AND (Operator), XOR (Operator), IMP, EQV,
Logische Operatoren

kombinierter Operator

Syntax: Wert OR= Ausdruck
Typ: Operator
Kategorie: logische Operatoren

Das kombinierte OR ist eine Kurzform von
Wert = Wert OR Ausdruck
Ebenso wie der einfache Operator setzt das Kombinierte OR die Bits im Ergebnis,
wenn im Ausgangswert und/oder im Ausdruck das entsprechende Bit gesetzt war.

Beispiel:
DIM AS INTEGER w, bnr

INPUT "Bitte geben Sie die Nummer des Bits ein, das gesetzt werden soll.", bnr

w OR= (1 SHL bnr)

PRINT "2 ^ "; bnr; " = "; w
GETKEY
Ausgabebeispiel:
Bitte geben Sie die Nummer des Bits ein, das gesetzt werden soll. 5
2 ^ 5 = 32

Siehe auch:
einfaches OR,
NOT, OR, XOR, IMP, EQV,
Logische Operatoren


OR

OR kann als Operator, als kombinierter Operator und als Methode bei PUT (Grafik) und DRAW STRING eingesetzt
werden.

Siehe:
OR (Operator)
OR (Methode)


OUT

Syntax: OUT Port, Wert AS BYTE
Typ: Anweisung
Kategorie: Hardware

ab freeBASIC v0.15b

Schreibt ein Byte an einen Port.

  • 'Portnummer' ist die Nummer des Ports, auf den geschrieben werden soll.
    Zugriffe auf den VGA-Port werden immer noch emuliert, wie in freeBASIC v0.14.

    • Wenn der Zugriff auf den Port fehlschlägt, wird ein Laufzeit-Fehler erzeugt.

    für freeBASIC bis v0.14

    Emuliert den VGA-Grafik-Port.

    OUT wird verwendet, um die Einträge der VGA-Pallette zu bearbeiten. Die einzigen
    funktionierenden Ports sind &H3C7, &H3C8 und &H3C9.
    Sie werden diesen Befehl normalerweise nicht benötigen; zur
    Farbmanipulation dient der Befehl PALETTE.

    Siehe auch:
    PALETTE, PALETTE GET,
    INP, WAIT

    Unterschiede (zu QB):
    OUT ist auf die Emulation des VGA-Ports begrenzt; nur die Ports &H3C7, &H3C8 und
    &H3C9 funktionieren.
    Der Versuch, auf eine andere Adresse zu schreiben, hat keine Funktion

    Grund: Ein direkter Zugriff auf die I/O-Ports ist nicht mehr möglich. Benutzen Sie
    Libs, um auf die Ports zuzugreifen.

    Siehe auch:
    INP, WAIT


OUTPUT

Typ: Schlüsselwort
Kategorie: Datei

Wird benutzt mit OPEN verwendet, um Daten in eine Datei zu
schreiben.
Vorsicht: Wenn Sie eine bereits bestehende Datei FOR OUTPUT öffnen, wird sie gelöscht
und neu angelegt!

Siehe auch:
OPEN,
INPUT (Dateimodus),
WRITE #, PRINT #


OVERLOAD

Syntax: DECLARE FUNCTION Funktionsname OVERLOAD (Parameterliste) AS Typ
Typ: Klausel
Kategorie: Programmorganisation

Mit der OVERLOAD-Klausel können Sie Prozeduren mit unterschiedlicher Parameterliste
aber gleichem Prozedurnamen deklarieren, ohne die Fehlermeldung "Symbol already defined"
zu erhalten.
Sobald das Symbol zum ersten mal deklariert wird, muss OVERLOAD angegeben werden;
die folgenden Deklarationen dürfen die OVERLOAD-Klausel nicht tragen.

Beispiel:

DECLARE FUNCTION SUM OVERLOAD (a AS INTEGER, b AS INTEGER) AS INTEGER
DECLARE FUNCTION SUM (a AS SINGLE, b AS SINGLE) AS SINGLE

FUNCTION SUM (a AS INTEGER, b AS INTEGER) AS INTEGER
FUNCTION = a + b
END FUNCTION

FUNCTION SUM (a AS SINGLE, b AS SINGLE) AS SINGLE
FUNCTION = a + b
END FUNCTION

DIM AS INTEGER a , b
DIM AS SINGLE a1, b1
a = 2
b = 3
a1 = 2.0
b1 = 3.0
PRINT SUM (a , b )
PRINT SUM (a1, b1)
SLEEP

Unterschiede: Neu in freeBASIC

Siehe auch:
DECLARE, FUNCTION, SUB,
Prozeduren


Liste der Schlüsselwörter beginnend mit P

PAINT
PALETTE
PALETTE GET
PASCAL
PCOPY
PEEK
PIPE
PMAP
POINT
POINTER (Datentyp)
POKE
POS
PRESERVE
PRESET
PRESET (Grafik)
PRESET (Methode)
PRINT
PRINT (Anweisung)
PRINT #
PRINT USING
PRINT USING #
PRIVATE
PRIVATE (Klausel)
PRIVATE (Schlüsselwort)
PROCPTR
PROPERTY
PSET
PSET (Grafik)
PSET (Methode)
PTR
PUBLIC
PUT
PUT #
PUT (Grafik)


PAINT

Syntax: PAINT [Puffer] [STEP] (x, y)[, [Füllfarbe][, Randfarbe] ]
Typ: Anweisung
Kategorie: Gfx

Grafikbefehl zum ausfüllen eines Bereiches mit einer Farbe. Auch bekannt
als 'flood-fill' oder 'paint bucket'.

  • 'Puffer' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter Puffer
    oder ein Array. Beide können mit PUT angezeigt
    werden. Wird 'Puffer' ausgelassen, zeichnet freeBASIC direkt auf den Bildschirm.

  • 'x' und 'y' sind Koordinaten innerhalb der auszufüllenden Fläche.

  • Wenn Füllfarbe eine Zahl oder ein numerischer Ausdruck ist, wird die Fläche
    in der Farbe mit der angegebenen Farbnummer ausgefüllt.
    Für die Farbnummern gelten dann die selben Regeln wie bei COLOR (Anweisung).
    Wenn hier ein STRING angegeben wird, behandelt freeBASIC
    diesen als Muster, in dem dem die Fläche ausgefüllt werden soll.
    Ein Füllmuster beschreibt immer einen 8x8 Pixel großen Bereich. Jedes
    Zeichen innerhalb des Muster-Strings beschreibt dabei die Farbe eines Pixels.
    Je nach Farbtiefe können die Muster-Strings unterschiedlich lang sein; die
    maximale Länge berechnet sich aus den Formeln:
    Für Farbtiefen 1, 2, 4 und 8:
    size = 8 * 8 = 64
    Für Farbtiefen 15 und 16:
    size = (8 * 8) * 2 = 128
    Für Farbtiefen 24 und 32:
    size = (8 * 8) * 4 = 256
    (size gibt die Größe in Bytes an.)
    Wenn der übergebene String kleiner ist (weniger Zeichen besitzt), werden
    die fehlenden Bytes durch CHR(0) ersetzt.

  • 'Randfarbe' ist die Farbnummer der Bereichsgrenze. PAINT füllt nur den
    Bereich innerhalb dieser Grenzen mit der Füllfarbe aus.

    • Beispiel:
    Einen weißen, innen rot ausgefüllten Kreis zeichnen und 3 Sekunden warten:
    DIM t AS SINGLE

    SCREEN 13
    CIRCLE (160, 100), 30, 15
    PAINT (160, 100), 1 , 15

    t = TIMER
    DO
    LOOP UNTIL TIMER > t + 3

    Siehe auch:
    PSET, LINE (Grafik), CIRCLE,
    DRAW (Grafik), DRAW STRING,
    GET (Grafik), PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    VIEW (Grafik), WINDOW,
    SCREEN (Anweisung), COLOR (Anweisung),

    Unterschiede (zu QB):
  • Der optionale Parameter 'Hintergrund' existiert unter freeBASIC nicht mehr.

  • Es ist möglich, in einen Datenpuffer zu zeichnen.


PALETTE GET

Typ: Anweisung
Kategorie: Gfx
Syntax A: PALETTE GET index, color
Syntax B: PALETTE GET index, r, g, b
Syntax C: PALETTE GET USING arrayname(idx)

PALETTE GET speichert den Farbwert eines Paletteeintrags in einer Variable, einem
Array, oder in drei einzelnen Speicherstellen.

  • 'index' ist der Farbindex, dessen RGB-Wert zurückgegeben werden soll.

  • 'color' ist eine Variable, in der der RGB-Wert gespeichert werden soll.

  • 'r', 'g' und 'b' sind Variablen, in denen die einzelnen Teilfarben gespeichert
    werden sollen.

  • 'arrayname' ist der Name eines Arrays, in dem alle Palette-Einträge gespeichert
    werden sollen. 'idx' ist dabei der Index des Arrays, ab dem das Speichern beginnen
    soll.

    • Um die Palette-Einträge auszulesen mussten bisher OUT und INP
    verwendet werden. PALETTE GET soll diese beiden Anweisungen ersetzen.
    Indem ein Index angegeben wird, liefert PALETTE GET den zugehörigen RGB-Wert
    zurück und speichert ihn in einer Variable, oder teilt ihn in seine
    Einzelfarben auf, und speichert diese in drei Variablen.
    Wenn die komplette Palette kopiert werden soll, können ihre Elemente über
    PALETTE GET USING in ein Array kopiert werden.

    PALETTE GET [USING] ist sozusagen die Gegenfunktion zu PALETTE [USING].

    Beispiel:
    DIM clr AS INTEGER, r AS INTEGER, g AS INTEGER, b AS INTEGER, i AS INTEGER
    DIM clrs(15) AS INTEGER

    SCREEN 12

    PALETTE GET 1, clr
    PRINT "Der RGB-Farbwert von Farbe 1 ist &H"; HEX(clr)
    PRINT

    PALETTE GET 2, r, g, b
    PRINT "Farbe 2 setzt sich aus diesen Farben zusammen:"
    PRINT "Rot: ";r ;" Gruen: ";g ;" Blau: ";b
    PRINT

    PALETTE GET USING clrs(0)
    PRINT "Alle Farben:"
    FOR i = 0 TO 15
    PRINT "Farbe ";i ;": "; HEX(clrs(i)); "h"
    NEXT

    SLEEP

    Siehe auch:
    PALETTE,
    SCREEN


PALETTE

Typ: Anweisung
Kategorie: Gfx
Syntax A: PALETTE [Index, Farbe]
Syntax B: PALETTE Index, Blauwert, Grünwert, Rotwert
Syntax C: PALETTE USING ArrayName[(idx)]

Bearbeitet die aktuelle Farbpalette.

  • 'Index' ist die Nummer der Farbe, die bearbeitet werden soll.

  • 'Farbe' ist der neue BGR-Farbwert, der der angegebenen Farbnummer zugewiesen
    werden soll.

  • 'Blauwert', 'Grünwert' und 'Rotwert' sind die einzelnen Farbanteile.

  • 'ArrayName(idx)' ist ein Array, in dem sich alle neuen Farbwerte befinden.
    'idx' ist dabei der Index innerhalb von ArrayName, ab dem die Farbeinträge beginnen.
    Ein mit ALLOCATE reservierter Speicherbereich kann nicht verwendet werden;
    PALETTE kann mit einem solchen Speicherbereich noch nicht umgehen.

    • PALETTE ändert die aktuellen Einträge in der Farbpalette (nur in Grafik-Modi).
    Die Anweisung wird nur bei Modi bis 8 bpp eingesetzt; bei höheren Farbtiefen
    hat PALETTE keinen Effekt.
    Ein Aufruf von PALETTE ohne Parameter stellt die Standard-Palette wieder her.

    'Index' und 'Farbe' sind abhängig vom aktuellen Bildschirmmodus:
    Bildschirmmodus | Indexbereich | Farbbereich
1 | 0-3 | 0-15
2 | 0-1 | 0-15
7, 8 | 0-15 | 0-15
9 | 0-15 | 0-63
11 | 0-1 | siehe unten
12 | 0-15 | siehe unten
13, 14, 15, 16, 17, 18, 19, 20, 21 | 0-255 | siehe unten

    In den Bildschirmmodi 1, 2, 7, 8 und 9 können Sie jeder Farbnummer einen Index
    aus einer Vordefinierten Palette zuweisen.
    In den anderen Bildschirmmodi müssen Sie die Farbe als BGR-Farbwerte angeben.
    Diese haben das Format &HBBGGRR. BB, GG und RR sind jeweils der blau-, grün-
    und rot-Wert der Farbe.
    Jede Teilfarbe kann dabei einen Wert zwischen &H0 und &H3F annehmen (0-63 als dezimale
    Werte.)
    Eine alternative Methode der Angabe der Farbe ist diese Methode:
    clr = rot OR (grün SHL 8) OR (blau SHL 16)
    Auch hier müssen rot, grün und blau zwischen 0 und 63 liegen.

    Der nächste SCREEN (Anweisung)-Befehl stellt
    die Standardpalette wieder her.
    Siehe auch Standardpaletten.

    Alternativ zum PALETTE-Befehl können Sie den OUT-Befehl
    verwenden, um die Palette zu bearbeiten; diese Methode ist allerdings veraltet,
    und sollte nicht mehr verwendet werden.

    Seit Version 0.13b ist es auch möglich, die Teilfarben als einzelne
    Parameter anzugeben. Hier kann jeder Farbanteil zwischen 0 und 255 liegen.

    PALETTE USING ändert alle Einträge der Palette auf einmal; die dazu nötigen Farbwerte
    werden dabei aus einem Array gelesen. Dazu muss ein Array übergeben werden, das groß
    genug ist, um Farbwerte für jeden Index des aktuellen Bildschirmmodus zu enthalten.
    Für 1 bpp müssen das 2 Elemente, für 2 bpp 4, für 4 bpp 16
    und für 8 bpp 256 Elemente sein.
    Die Elemente dieses Feldes müssen dabei vom Typ INTEGER
    sein, und das oben angegebene Format besitzen.
    Die Farben, die in 'ArrayName' ab Index 'Index' gespeichert sind, werden dann
    den Farbnummern zugewiesen, wobei bei den Palette-Einträgen mit Farbe 0 begonnen
    wird.
    Die Verwendung von Palette USING mit Teilfarben ist nicht möglich; jedes Element
    des Arrays muss einen BGR-Wert enthalten.

    Jede Veränderung der Palette wird sofort auf dem Bildschirm sichtbar.

    Beispiel:
    SCREEN 12 'Bildschirmmodus 640x480 @ 16 Farben initialisieren

    'Vertikale Streifen in allen 16 Farben zeichnen
    FOR i = 0 TO 15
    LINE (i * 40, 0)-((i + 1) * 40, 479), i, BF
    NEXT

    'Auf Tastendruck warten
    GETKEY

    'Farbverlauf von Schwarz nach Blau
    FOR i = 0 TO 15
    rot = 0
    grn = 0
    blu = i * 4
    clr = rot OR (grn SHL 8) OR (blu SHL 16)
    PALETTE i, clr
    NEXT

    GETKEY

    'Farbverlauf von Schwarz nach Grün
    FOR i = 0 TO 15
    PALETTE i, 0,(i + 1) * 16 - 1, 0
    NEXT

    GETKEY

    'Farbverlauf von Schwarz nach Rot
    DIM Farben(15) AS INTEGER
    FOR i = 0 TO 15
    Farben(i) = i * 4
    NEXT
    PALETTE USING Farben
    GETKEY

    'Standardpalette wiederherstellen
    PALETTE
    GETKEY

    Siehe auch:
    PALETTE GET,
    SCREEN (Anweisung),
    COLOR (Anweisung), OUT,
    Standardpaletten


PASCAL

Typ: Schlüsselwort
Kategorie: Fremdsprachen

Sorgt dafür, dass die Parameter bei einem Prozeduraufruf nach PASCAL-Konventionen
übergeben werden.

PASCAL gewährleistet die Kompatibilität zu PASCAL-Libs mit freeBASIC.

Siehe auch:
DECLARE, CDECL, STDCALL

Unterschiede: Neu in freeBASIC.


PCOPY

Syntax: PCOPY Quellseite, Zielseite
Typ: Anweisung
Kategorie: Gfx

Kopiert den Inhalt einer Bildschirmseite auf eine andere.
PCOPY wird benutzt, um weiche Animationen zu erzeugen, indem auf eine
unsichtbare Arbeitsseite gezeichnet wird, deren Inhalt per PCOPY auf die aktive
übertragen wird.
Auch bekannt als 'double buffering' oder 'page flipping'

'Quellseite' und 'Zielseite' sind die Nummern von Bildschirmseiten, die in einem
vorhergehenden SCREEN (Anweisung)-Befehl erstellt
wurden.
Die 'Zielseite' wird mit dem Inhalt der 'Quellseite' überschrieben, wenn
PCOPY aufgerufen wird.

Siehe auch:
FLIP, SCREENCOPY,
SCREEN (Anweisung)


PEEK

Syntax: PEEK ([Datentyp,] Adresse) AS Datentyp
Typ: Funktion
Kategorie: Speicherverwaltung

PEEK liest einen Wert direkt vom RAM.

  • 'Datentyp' ist der Datentyp des Wertes, der gelesen werden soll; von 'Datentyp' hängt ab, wie viele Bytes gelesen werden. Auch STRINGs
    und UDT's (user-defined types; siehe TYPE) werden akzeptiert. Die zu lesende Datenmenge richtet sich hier
    nach der Lange des STRINGs bzw. der Größe des UDT's.
    Wird 'Datentyp' ausgelassen, nimmt freeBASIC automatisch UBYTE an.

  • 'Adresse' ist ein Pointer auf die Speicherstelle im RAM, von der gelesen werden soll.

    • Mit PEEK und POKE wurden in älteren BASIC-Dialekten Pointer-Funktionen erstellt.

    Beispiel: Wert dreier Variablen aus dem Speicher lesen:
    DIM ByteVal AS BYTE, ShortVal AS SHORT, IntVal AS INTEGER
    DIM AS INTEGER ByteAddr, ShortAddr, IntAddr

    ByteAddr = VARPTR(ByteVal)
    ShortAddr = VARPTR(ShortVal
    IntAddr = VARPTR(IntVal)

    ByteVal = 127
    ShortVal = 32767
    IntVal = 2 ^ 31 - 1

    PRINT ByteVal, ShortVal, IntVal
    PRINT PEEK(BYTE, ByteAddr), PEEK(SHORT, ShortAddr), PEEK(INTEGER, IntAddr)

    Diese Form funktioniert einwandfrei. FreeBASIC hat jedoch eigene Pointer-Funktionen,
    die ein komfortableres Programmieren ermögichen. Mit den FB-eigenen Funktionen würde dieses Beispiel so aussehen:

    DIM ByteVal AS BYTE, ShortVal AS SHORT, IntVal AS INTEGER
    DIM BytePtr AS BYTE PTR, ShortPtr AS SHORT PTR, IntPtr AS INTEGER PTR

    BytePtr = @ByteVal
    ShortPtr = @ShortVal
    IntPtr = @IntVal

    ByteVal = 127
    ShortVal = 32767
    IntVal = 2 ^ 31 - 1

    PRINT ByteVal, ShortVal, IntVal
    PRINT *BytePtr, *ShortPtr, *IntPtr

    Die Syntax *Pointer gibt also den Wert zurück, der an der Speicherstelle steht, auf die der Pointer zeigt. Wie viele Bytes
    gelesen werden, hangt dabei vom Typ des Pointers ab (BYTE PTR, SINGLE PTR, ...)

    Unterschiede
    zu QB:
  • Unter QB war es nicht möglich, den Datentyp des zu lesenden Werts festzulegen; es wurde immer ein UBYTE zurückgegeben.

    • zu früheren Versionen von freeBASIC
  • Erst seit freeBASIC v0.16 ist der Standard-Rückgabetyp für PEEK UBYTE; davor war es BYTE.

  • Erst seit freeBASIC v0.13 ist es möglich, STRINGs und UDTs zu lesen.

    • Siehe auch:
    POKE,
    VARPTR, SADD
    Pointer,
    Datentypen


PIPE

PIPE wird zusammen mit OPEN PIPE eingesetzt.


PMAP

Syntax: PMAP(Koordinate, Funktion)
Typ: Funktion
Kategorie: Gfx

Wandelt Sichtfensterkoordinaten in physische Koordinaten um.

  • 'Koordinate' ist ein Ausdruck, der die umzuwandelnde Koordinate angibt.

  • 'Funktion' gibt an, auf welche Weise die Koordinate umgewandelt werden soll.

    • PMAP verwandelt die Sichtfensterkoordinaten (abhängig von der letzten WINDOW-Anweisung)
    in physische Koordinaten (Abhängig von der letzten VIEW (Grafik)-Anweisung).
    Je nach Wert von 'Funktion' liefert PMAP verschiedene Werte zurück.

    Funktion: | Ausgabe:
0 | Behandelt den Ausdruck wie die X-Sichtfensterkoordinate, und gibt die physische Koordinate zurück.
1 | Behandelt den Ausdruck wie die Y-Sichtfensterkoordinate, und gibt die physische Koordinate zurück.
2 | Behandelt den Ausdruck wie die physische X-Koordinate, und gibt die Sichtfensterkoordinate zurück.
3 | Behandelt den Ausdruck wie die physische Y-Koordinate, und gibt die Sichtfensterkoordinate zurück.

    (Die Sichtfensterkoordinaten sind die Koordinaten, die durch VIEW (Grafik)
    bestimmt werden; WINDOW beeinflusst die physischen Koordinaten.)

    Siehe auch:
    WINDOW, VIEW (Grafik)


POINT

Syntax A: POINT(x, y [, Puffer] )
Syntax B: POINT(Funktion)
Typ: Funktion
Kategorie: Gfx

Gibt Informationen über die zuletzt gesetzten Pixel oder die Farbe eines Pixels zurück.

  • '(x, y)' Sind die Koordinaten des Pixels, dessen Farbe zurückgegeben werden soll.

  • 'Puffer' ist ein Puffer, wie er mit PUT (Grafik) verwendet wird. Wird 'Puffer' ausgelassen, so
    liest freeBASIC direkt vom Bildschirm.
  • 'Funktion' gibt an, welche Koordinate zurückgegeben werden soll.

  • Wenn POINT mit zwei Argumenten aufgerufen wird, sind die Koordinaten (x, y) von den letzten WINDOW und VIEW (Grafik)-Anweisungen abhängig.

  • Wenn die Koordinaten außerhalb des aktuellen Clipping-Bereichs liegen, gibt POINT -1 zurück.

  • Andernfalls ist das Ergebnis eine Zahl im Format, das auch bei COLOR verwendet wird.

    • Wenn POINT mit nur einem Parameter aufgerufen wird, wird die aktuelle Grafikcursorposition ausgegeben; der zurückgegebene Wert hängt von
    'Funktion' ab:
    0 | Aktuelle physische X-Koordinate.
1 | Aktuelle physische Y-Koordinate.
2 | Aktuelle X-Bildschirmkoordinate. Wenn WINDOW nicht eingesetzt wurde, ist das Ergebnis das selbe wie für POINT(0)
3 | Aktuelle Y-Bildschirmkoordinate. Wenn WINDOW nicht eingesetzt wurde, ist das Ergebnis das selbe wie für POINT(1)

    Siehe auch:
    PSET, PMAP,
    COLOR (Anweisung), VIEW (Grafik),
    WINDOW


POINTER

Typ: Schlüsselwort
Kategorie: Speicherverwaltung

POINTER wird mit DIM, TYPE und DECLARE verwendet um eine Variable oder Funktion als
Pointer zu definieren.

Das POINTER-Schlüsselwort wird meist mit PTR abgekürzt, was die selbe Bedeutung hat.

Beispiel:
DECLARE FUNCTION foobar (Parameter AS INTEGER) AS INTEGER PTR

TYPE mytype
a AS INTEGER
b AS INTEGER POINTER
END TYPE

DIM var AS STRING POINTER
DIM typ AS mytype POINTER

Siehe auch:
PTR,
ALLOCATE, PEEK, POKE,
Pointer

Unterschiede: Neu in freeBASIC.


POKE

Typ: Anweisung
Syntax: POKE [Datentyp,] Adresse, Wert
Kategorie: Speicherverwaltung

POKE schreibt einen Wert direkt in den RAM.

  • 'Datentyp' ist der Datentyp des Wertes, der geschrieben werden soll; von 'Datentyp' hängt ab, wie viele Bytes geschrieben werden.
    Auch STRINGs und UDT's (user-defined types; siehe TYPE) werden akzeptiert. Die zu schreibende Datenmenge
    richtet sich hier nach der Lange des STRINGs bzw. der Größe des UDT's.
    Wird 'Datentyp' ausgelassen, nimmt freeBASIC automatisch UBYTE an.

  • 'Adresse' ist ein Pointer auf die Speicherstelle im RAM, auf die geschrieben werden soll.

  • 'Wert' ist der Wert, der an die angegebene Adresse geschrieben werden soll.

    • Mit PEEK und POKE wurden in älteren BASIC-Dialekten Pointer-Funktionen erstellt.

    Beispiel: Ändern einer Variablen direkt über ihre Adresse.
    DIM x AS BYTE, addr AS INTEGER
    addr = VARPTR(x)
    x = 5
    PRINT x
    POKE BYTE, addr, 10
    PRINT x

    Diese Form funktioniert einwandfrei. FreeBASIC hat jedoch eigene Pointer-Funktionen,
    die ein komfortableres Programmieren ermöglichen. Mit den FB-eigenen Funktionen würde dieses Beispiel so aussehen:

    DIM x AS BYTE, addr AS BYTE PTR
    addr = @x
    x = 5
    PRINT x
    *addr = 10
    PRINT x

    Die Syntax *Pointer = Ausdruck setzt also den Wert, der an der Speicherstelle steht, auf die der Pointer zeigt. Wie viele
    Bytes geschrieben werden, hängt dabei vom Typ des Pointers ab (BYTE PTR, SINGLE PTR, ...)

    Unterschiede
    zu QB:
  • Unter QB war es nicht möglich, den Datentyp des zu schreibende Werts festzulegen; es wurde immer ein UBYTE geschrieben.

    • zu früheren Versionen von freeBASIC
  • Erst seit freeBASIC v0.16 ist der Standard-Datentyp für POKE UBYTE; davor war es BYTE.

  • Erst seit freeBASIC v0.13 ist es möglich, STRINGs und UDTs zu schreiben.

    • Siehe auch:
    PEEK
    VARPTR, SADD
    Pointer,
    Datentypen


POS

Syntax: POS[(Zahl)]
Typ: Funktion
Kategorie: Konsole

Gibt die horizontale (links-rechts) Position des Cursors zurück.
1 bedeutet dabei ganz links.

Der optionale Parameter 'Zahl' hat keine Bedeutung; er besteht nur aus
Kompatibilitätsgründen zu QB.

Beispiel:
PRINT "Position: "; POS
PRINT "hello world";
PRINT "Position: "; POS

Siehe auch:
LOCATE (Anweisung), LOCATE (Funktion), CSRLIN


#PRAGMA

Syntax A: #PRAGMA Option = Wert
Syntax B: #PRAGMA PUSH(Option)
Syntax C: #PRAGMA POP(Option)

Ermöglicht es, die Compiler-Optionen im Code zu verändern.

  • Syntax A verändert die Compiler-Optionen

  • Syntax B speichert die aktuelle Einstellung

  • Syntax C stellt die zuletzt gespeicherte Einstellung wieder her.

    • Gültige Werte für 'Option' und 'Wert':
    Option | Wert | Bedeutung
msbitfield | 0 | Verwende Bitfields, die mit gcc kompatibel sind (Standard)
 | (ungleich Null) | Verwende Bitfields, die mit den Microsoft-C-compilern kompatibel sind

    Beispiel:
    ' Die aktuellen Einstellungen zwischenspeichern
    #PRAGMA PUSH(msbitfields)

    ' umschalten zu MSVC-kompatiblen Bitfields
    #PRAGMA msbitfields=1

    ' Code, der MS-kompatible Bitfields benötigt...

    ' Original-Einstellung wiederherstellen
    #PRAGMA POP(msbitfields)


PRESERVE

Syntax: REDIM PRESERVE array(...) AS Datentyp
Typ: Schlüsselwort
Kategorie: Speicherverwaltung

Wird mit REDIM benutzt, um ein Array zu redimensionieren,
ohne seine Elemente zu löschen.
Wenn das Array vergrößert wird, werden die neuen Elemente mit 0 (bzw. mit Nullstrings)
initiiert; die alten Elemente bleiben erhalten

REDIM PRESERVE funktioniert nur bei DYNAMIC-Arrays;
STATIC-Arrays können nicht redimensioniert werden.

Beispiel:
'$DYNAMIC
DIM array(1 TO 3) AS INTEGER = {10, 5, 8}

REDIM PRESERVE array(2 TO 10) AS INTEGER
FOR i = 2 TO 10
PRINT "array("; i; ") = "; array(i)
NEXT
Dadurch wird das Element 1 auf das 2. Element des neuen Arrays verschoben.
Die Ausgabe sieht dann so aus:
array(2) = 10
array(3) = 5
array(4) = 8
array(5) = 0
array(6) = 0
array(7) = 0
array(8) = 0
array(9) = 0
array(10) = 0

Siehe auch:
DIM, REDIM,
STATIC (Metabefehl), DYNAMIC (Metabefehl)


PRESET (Grafik)

Typ: Anweisung
Syntax: PRESET [Puffer], [STEP] (x, y), [Farbe]
Kategorie: Gfx

PRESET funktioniert wie PSET (Grafik).
Der einzige Unterschied besteht darin, dass, wenn das Argument 'Farbe'
ausgelassen wird, die aktuelle Hintergrundfarbe verwendet wird. Diese wird durch
die COLOR (Anweisung) festgelegt, und hat standardmäßig den
Wert null.

Siehe auch:
PRESET (Methode), PSET (Grafik), COLOR (Anweisung)


PRESET

Typ: Schlüsselwort
Kategorie: Gfx

PRESET ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING
eingesetzt wird.

Bei der Wiedergabe von Pixeldaten aus Bildpuffern funktioniert die PRESET-
Methode fast genau so, wie die PSET-Methode,
nur mit dem Unterschied, dass die Farbnummer der gezeichneten Pixel das Ergebnis
eines Logischen NOT der gespeicherten Daten sind.
Ausgegeben wird also ein invertiertes Bild, d.h. ein Bild mit umgekehrten Farben.

Siehe auch:
PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
AND (Methode), OR (Methode), XOR (Methode),
PSET (Methode),
ALPHA, ADD, TRANS, CUSTOM


PREET

PRESET

Typ: Anweisung

PRESET ist ein Schlüsselwort, das als Anweisung und als Methode bei der Grafikwiedergabe
eingesetzt werden kann.

Siehe:
PRESET (Anweisung)
PRESET (Methode)


PRINT

Syntax: PRINT Printausdruck
Typ: Anweisung
Kategorie: Konsole

Gibt Text auf dem Bildschirm (bzw auf der Konsole) an der aktuellen Textcursorposition
aus.
PRINT lässt sich auf vielerlei weise einsetzen. Der Funktionsumfang reicht
von der Ausgabe einfacher STRING-Konstanten (PRINT "Hello World") oder Nummern
(PRINT 101) über die Ausgabe von Variablen (PRINT a oder PRINT name$) bis hin
zur Ausgabe komplexer Ausdrücke (PRINT a + (b * c) ).
Um mehrere Ausdrücke auszugeben, trennen Sie diese durch Semikolons
(PRINT a; b), um sie direkt aneinander zu hängen, oder Kommata (PRINT a, b),
um sie durch einen Tabspace zu trennen.

Die Verwendung eines Semikolons ermöglicht die Ausgabe zweier Elemente mit
einem Befehl.
Beispiel:
name$ = "Linus"
PRINT "Name: "; name$

Nach der Ausgabe des Ausdrucks wird der Textcursor um eine Zeile nach unten und
in die erste Spalte dieser Zeile versetzt. Ein Semikolon hinter dem Ausdruck
unterdrückt dieses Feature.
Beispiel:
PRINT "Hello ";
PRINT "world";
PRINT "!"

Kommata erfüllen die selbe Funktion wie Semikolons, fügen aber ein Tabspace ein.
Beispiel:
x = 30
PRINT "x is ",
PRINT x
PRINT "hello", "world", "and", "goodbye"

Wenn Der Ausdruck nicht mit einem Semikolon oder einem Komma endet, wird ein
Zeilenumbruch eingeleitet.
Beispiel:
PRINT "Welcome"
PRINT
PRINT "...and goodbye!"

Ein CRLF (CHR(13) + CHR(10); die EDV-Version eines Zeilenumbruchs) im
Ausgabestring wird dazu führen, dass freeBASIC bei der Ausgabe des Strings eine
neue Zeile begonnen wird.

Seit Version v0.15b ist es möglich, PRINT durch ein '?' zu ersetzen; der
Compiler behandelt dieses Zeichen wie ein ganz normales PRINT. Sämtliche oben
genannten Funktionen stehen auch mit diesem Shortcut zur Verfügung:
? "hello world"
? "a:", a
? "b:",
? b

Wenn nur Stringkonstanten verwendet werden, ist es nicht zwingend nötig, diese
durch Semikola (;) bzw. Komata (,) zu trennen; sie können einfach durch ein
Leerzeichen getrennt aufgeführt werden, und werden dann wie ein einziger String
behandelt.
Nutzvoll kann dies bei der Verwendung von ESCAPE-Chars (Siehe OPTION ESCAPE) mit
dem Dollarzeichen-Präfix sein:
OPTION ESCAPE
PRINT "Normaler String mit \34Escape Chars\34" $" und mit Literalen \34"

Siehe auch:
PRINT-Befehle,
WRITE (Anweisung)
LOCATE (Anweisung), COLOR (Anweisung), WIDTH (Anweisung),
INPUT (Anweisung),
WRITE #,
OPTION ESCAPE


PRINT (Datei)

Syntax: PRINT #f, Print-Ausdruck
Typ: Anweisung
Kategorie: Datei

Schreibt Daten in eine Datei, die für sequentiellen Schreibzugriff (im OUTPUT- oder
APPEND-Modus) geöffnet ist.

  • '#f' ist die Dateinummer, die durch OPEN zugewiesen wurde.

  • 'Print-Ausdruck' ist ein Ausdruck, für den die selben Regeln gelten, wie
    für PRINT (Anweisung)

    • An den Stellen, an denen bei PRINT ein Zeilenumbruch erzeugt wird, schreibt PRINT #
    ein CRLF (ein CHR(13) + CHR(10) ). Dies entspricht einem Zeilenumbruch.

    Siehe auch:
    PRINT-Befehle,
    WRITE #,
    OPEN,
    INPUT #, LINE INPUT #


#PRINT

(Datei)

Syntax: #PRINT Text
Typ: Metabefehl
Kategorie: Ausgabe

Durch #PRINT gibt der Compiler einen Text aus.
Text ist dabei eine beliebige Zeichenfolge, die nicht in Anführungszeichen stehen
muss; der Text wird genau so ausgegeben, wie er im Quellcode steht.
#PRINT kann zur Fehlerfindung verwendet werden.

Beispiel:
#PRINT Now compiling module foo

Unterschiede (zu QB):
Neu in freeBASIC.

Siehe auch:
PRINT-Befehle,
#ERROR


PRINT USING (Datei)

Syntax: PRINT #chanel, USING PRINT_USING-Ausdruck
Typ: Anweisung
Kategorie: Datei

PRINT #Kanal USING schreibt einen Formatierten Text in eine Datei, die für sequentiellen Schreibzugriff (im OUTPUT- oder APPEND-Modus) geöffnet ist.

Dabei gelten die Regeln von PRINT # und PRINT USING.

Siehe auch:
PRINT-Befehle,
OPEN (Anweisung),


PRINT USING

Syntax: PRINT USING "PRINT USING-Ausdruck"; Variablen
Typ: Anweisung
Kategorie: Konsole

Gibt einen Text formatiert aus.

FORMAT bietet bessere Möglichkeiten, einen String zu formatieren; PRINT USING ist
dafür unter jeder Plattform voll verfügbar.

  • 'PRINT USING-Ausdruck' ist ein STRING, der bestimmte Formatierungszeichen enthält.

  • 'Variablen' sind Ausdrücke, die durch Semikolons getrennt werden.

    • Folgende Formatierungszeichen sind möglich:
    ZIFFERNFORMATIERUNG
    # | Platzhalter für eine anzuzeigende Ziffer. Hat die darzustellende Zahl weniger Ziffern, wird die Zahl rechtsbündig dargestellt und die Platzhalter links mit Leerzeichen aufgefüllt. Sind nicht genug # für eine große Zahl angegeben wird die Ganzzahl ohne Beachtung der Formatierungszeichen ausgegeben.
. | setzt die Position des Dezimaltrennzeichens
+ | reserviert einen Platz für das Vorzeichen der Zahl.
^ ^ | Bewirkt, dass eine Zahl in Zehnerpotenzschreibweise ausgedrückt wird. Zuerst muss mit # und . der eigentliche Zahlenbereich festgelegt werden. Die Anzahl der Potenzzeichen ^ legt die Anzahl der Zeichen für den Exponenten fest. Beachten Sie, dass auch das e+ bzw. e- zwei Zeichen braucht.
_ | Schreibt das Nachfolgende Zeichen als Literal aus; _# wird also als # ausgegeben.
STRINGFORMATIERUNG |
! | Gibt nur das erste Zeichen eines Strings aus.
& | Gibt die nachfolgende STRING-Variable komplett aus.
\ \ | Gibt n + 2 Zeichen der STRING-Variable aus. n ist die Anzahl der Leerzeichen (mindestens eins) zwischen den Schrägstrichen.

    Beispiel:
    FOR exponent = 1 TO 5
    PRINT USING "10 ^ # = #####"; exponent; 10 ^ exponent
    NEXT
    PRINT USING "\ \";"1234"
    PRINT USING "_# +#.###";-15.12345
    PRINT USING "+#.########^^^^"; -1234.5678
    PRINT USING "& Text 2"; "Text 1"
    Ausgabe:
    10 ^ 1 =    10
    10 ^ 2 =   100
    10 ^ 3 =  1000
    10 ^ 4 = 10000
    10 ^ 5 = 100000
    123
    # -15.12345
    -1.23456780e+03
    Text 1 Text 2

    Siehe auch:
    PRINT-Befehle, COLOR (Anweisung),
    FORMAT

    Unterschiede (zu QB):
    Die Formatierungszeichen \\ geben keinen String aus, wenn kein Leerzeichen zwischen
    ihnen ist; die Minimale Ausgabelänge eines STRINGs ist also 3.
    Wenn die Länge des Auszugebenden Ausdrucks den reservierten Platz überschreitet,
    wird kein % mehr ausgegeben.


PRINT

Typ: Anweisung/Metabefehl
Kategorie: Konsole/Datei/Präprozessoren

PRINT ist ein Schlüsselwort, das als Anweisung und Metabefehl eingesetzt
werden kann.

Siehe:
PRINT (Anweisung)
PRINT USING
PRINT #
PRINT USING #
#PRINT
VIEW PRINT


PRIVATE (Klausel)

Syntax: PRIVATE { SUB | FUNCTION } Name (Parameterliste)
Typ: Klausel
Kategorie: Programmorganisation

Siehe SUB/FUNCTION zu weiteren Details zur Syntax.

Ein Programm kann aus mehreren Modulen, d.h. aus mehreren BAS-Dateien bestehen.
Welche Dateien zum Projekt gehören sollen, wird dem Compiler in der Kommandozeile mitgeteilt:
fbc Optionen Dateiname1 Dateiname2 ...
(Siehe dazu Die Kommandozeile)

Aus einem bestimmten Modul können dabei immer alle Prozeduren aufgerufen werden, die sich in diesem befinden. Prozeduren aus anderen
Modulen können nur dann aufgerufen werden, wenn diese Prozeduren PUBLIC sind. PRIVATE Prozeduren hingegen können nur aus dem Modul
heraus aufgerufen werden, in dem sie sich befinden.

Es dürfen in mehreren Modulen mehrere Prozeduren mit dem selben Bezeichner vorhanden sein, sofern diese PRIVATE sind.

Beispiel:
Ein Projekt besteht aus den Modulen A und B.
Das Modul A besitzt die Prozeduren Priv1 (PRIVATE), Priv2 (PRIVATE) und Pub1 (PUBLIC).
Das Modul B besitzt die Prozeduren Priv1 (PRIVATE), Priv2 (PRIVATE) und Pub2 (PUBLIC).
Wird gerade Code aus Modul A ausgeführt, so können Priv1 aus A, Priv2 aus A, Pub1 aus A und Pub2 aus B aufgerufen werden. Priv1 aus B und
Priv2 aus B können nicht aufgerufen werden.
Wird gerade Code aus Modul B ausgeführt, so können Priv1 aus B, Priv2 aus B, Pub1 aus A und Pub2 aus B aufgerufen werden. Priv1 aus B und
Priv2 aus B können nicht aufgerufen werden.

PRIVATE legt explizit für eine SUB/FUNCTION, dass diese PRIVATE sein soll, unabhängig vom gesetzten Standard.
(Siehe OPTION. Beachten Sie dazu auch die FB-Dialektformen.)
Auf PRIVATE-Prozeduren kann nur das Modul zugreifen, in dem sich die Prozedur befindet; PUBLIC-Routinen sind allen Modulen zugänglich.

Die PRIVATE-Klausel muss vor der SUB-Anweisung stehen, darf jedoch nicht in der DECLARE-Anweisung stehen.

Beispiel:
Kompileren Sie diese Dateien mit folgender Kommandozeile:
fbc PrivatePublicTest1.bas PrivatePublicTest2.bas
' PrivatePublicTest1.bas
DECLARE SUB PrivateSub ()
DECLARE SUB PublicSub ()

PublicSub
PrivateSub

PRIVATE SUB PrivateSub ()
PRINT "PrivateSub in PrivatePublicTest1.bas"
END SUB

'------------------------------------------------------------------------------'

' PrivatePublicTest2.bas
DECLARE SUB PrivateSub ()
DECLARE SUB PublicSub ()

PRIVATE SUB PrivateSub ()
PRINT "PrivateSub in PrivatePublicTest2.bas"
END SUB

PUBLIC SUB PublicSub ()
PRINT "PublicSub in PivatePublicTest2.bas
PrivateSub
END SUB

Unterschiede:
zu QB:
  • neu in freeBASIC

    • Siehe auch:
    PRIVATE, PUBLIC,
    OPTION,
    DECLARE, SUB, FUNCTION


PRIVATE (Schlüsselwort)

Syntax: OPTION PRIVATE
Typ: Schlüsselwort
Kategorie: Programmorganisation

Ein Programm kann aus mehreren Modulen, d.h. aus mehreren BAS-Dateien bestehen.
Welche Dateien zum Projekt gehören sollen, wird dem Compiler in der Kommandozeile mitgeteilt:
fbc Optionen Dateiname1 Dateiname2 ...
(Siehe dazu Die Kommandozeile)

Aus einem bestimmten Modul können dabei immer alle Prozeduren aufgerufen werden, die sich in diesem befinden. Prozeduren aus anderen
Modulen können nur dann aufgerufen werden, wenn diese Prozeduren PUBLIC sind. PRIVATE Prozeduren hingegen können nur aus dem Modul
heraus aufgerufen werden, in dem sie sich befinden.

Es dürfen in mehreren Modulen mehrere Prozeduren mit dem selben Bezeichner vorhanden sein, sofern diese PRIVATE sind.

Beispiel:
Ein Projekt besteht aus den Modulen A und B.
Das Modul A besitzt die Prozeduren Priv1 (PRIVATE), Priv2 (PRIVATE) und Pub1 (PUBLIC).
Das Modul B besitzt die Prozeduren Priv1 (PRIVATE), Priv2 (PRIVATE) und Pub2 (PUBLIC).
Wird gerade Code aus Modul A ausgeführt, so können Priv1 aus A, Priv2 aus A, Pub1 aus A und Pub2 aus B aufgerufen werden. Priv1 aus B und
Priv2 aus B können nicht aufgerufen werden.
Wird gerade Code aus Modul B ausgeführt, so können Priv1 aus B, Priv2 aus B, Pub1 aus A und Pub2 aus B aufgerufen werden. Priv1 aus B und
Priv2 aus B können nicht aufgerufen werden.

Das Schlüsselwort PRIVATE bestimmt zusammen mit OPTION, dass SUBs und FUNCTIONs standardmäßig PRIVATE sein sollen.
Wenn Sie OPTION PRIVATE verwenden, müssen Sie explizit die PUBLIC-Klausel verwenden, wenn eine Prozedur PUBLIC sein soll.

OPTION PRIVATE kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist OPTION PRIVATE nicht mehr zulässig! Geben Sie in diesem Fall bei explizit an, ob eine Prozedur PRIVATE oder PUBLIC
sein soll.
Siehe dazu auch die FB-Dialektformen.

Beispiel:
Compilert Sie diese Dateien mit folgender Programmzeile:
fbc PrivatePublicTest1.bas PrivatePublicTest2.bas
' PrivatePublicTest1.bas
OPTION PRIVATE

DECLARE SUB PrivateSub ()
DECLARE SUB PublicSub ()

PublicSub
PrivateSub

SUB PrivateSub ()
PRINT "PrivateSub in PrivatePublicTest1.bas"
END SUB

'------------------------------------------------------------------------------'

' PrivatePublicTest2.bas
DECLARE SUB PrivateSub ()
DECLARE SUB PublicSub ()

SUB PrivateSub ()
PRINT "PrivateSub in PrivatePublicTest2.bas"
END SUB

PUBLIC SUB PublicSub ()
PRINT "PublicSub in PivatePublicTest2.bas
PrivateSub
END SUB

Unterschiede:
zu QB:
  • neu in freeBASIC

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption
    -lang deprecated
    kompiliert wurde.

    • Siehe auch:
    PRIVATE, PUBLIC,
    OPTION,
    DECLARE, SUB, FUNCTION


PRIVATE (UDT)

Syntax:
TYPE TypeName
   PRIVATE:
   ' Deklaration privater Records

   PUBLIC:
   ' Deklaration öffentlicher Records
END TYPE
Typ: Schlüsselwort
Kategorie: Programmorganisation

Dieses Schlüsselwort ist in dieser Form nur dann zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

Legt fest, dass folgende UDT-Records PRIVATE sein sollen, d.h. dass ein Zugriff nur von TYPE-eigenen Prozeduren aus zulässig sein soll.

Seit mit freeBASIC v0.17 die objektorientierte Programmierung möglich ist, existiert die Möglichkeit, den Zugriff auf UDT-Records (siehe
TYPE (UDT))einzuschränken. Der Zweck liegt darin, dass der Zugriff auf den entsprechenden Record nur noch über Userdefinierte Prozeduren
ermöglicht wird, die mögliche Fehler schon beim Zugriffsversuch abfangen, den Wert in ein besser verwertbares Format umwandeln, etc.

Der Type wird dazu regulär definiert.
Innerhalb der Typen-Deklaration wird die Zeile
PRIVATE:
eingefügt, sobald ein Record private sein soll, d.h. wenn der Zugriff darauf eingeschränkt soll. PRIVATE gilt innerhalb des TYPEs so lange,
bis es durch ein PUBLIC-Schlüsselwort abgelöst wird.
Standardmäßig sind alle Records PUBLIC. Dies ist auch dann der Fall, wenn eine vorhergehende Typendeklaration mit PRIVATE abgeschlossen
wurde.

Auf PUBLIC-Records kann aus jeder Programmsituation zugegriffen werden; auf PRIVATE-Records dürfen nur TYPE-eigene Prozeduren (SUBs,
FUNCTIONs, PROPERTYs, OPERATORs, Klassen-Konstruktoren und Klassen-Destruktoren) zugreifen.
Beachten Sie, dass auch die Prozeduren eines TYPEs PRIVATE oder PUBLIC sein können.
Ein Zugriff auf einen privaten Record von außerhalb einer TYPE-eigenen Prozedur führt zu der Compiler-Fehlermeldung
Illegal member access
Als generelle Merkregel kann dienen: Auf Private Records kann nur über das THIS-Schlüsselwort zugegriffen werden.

Es ist erlaubt, innerhalb eines TYPEs beliebig viele PRIVATE- und PUBLIC-Blöcke einzurichten.

Beispiel:
Type SecureIntArray
Private:
_ubound As Integer
_lbound As Integer
_data As Integer Ptr

Public:
Declare Property datas (index As Integer ) As Integer
Declare Property datas (index As Integer, new_value As Integer)

Declare Sub Redim (low As Integer, up As Integer)

Declare Constructor ()
Declare Destructor ()
End Type

Constructor SecureIntArray()
With This
._ubound = 0
._lbound = 0
._data = Allocate(4)
End With
End Constructor

Destructor SecureIntArray()
DeAllocate This._data
End Destructor

Property SecureIntArray.datas (index As Integer) As Integer
With This
If (index < ._lbound) Or (index > ._ubound) Then Return 0

Return ._data[index - ._lbound]
End With
End Property

Property SecureIntArray.datas (index As Integer, new_value As Integer)
With This
If (index < ._lbound) Or (index > ._ubound) Then Return

._data[index - ._lbound] = new_value
End With
End Property

Sub SecureIntArray.Redim (low As Integer, up As Integer)
If low > up Then Return

With This
DeAllocate ._data

._ubound = up
._lbound = low
._data = Allocate( (up - low + 1) * 4 )

End With
End Sub

Dim As SecureIntArray mySecInt
Dim As Integer i

mySecInt.Redim 0, 20 ' Wir erstellen ein Array mit den Indizes 0 bis 20...
For i = 0 To 24 ' und versuchen, bis zum Index 24 werte einzufügen.
mySecInt.datas(i) = 2 * i ' Die Property wird diesen Versuch abblocken.
Next

For i = 0 To 24 ' Genauso, wie auch die abfrage von Werten außer der Array-Dimensionen fehlschlägt.
Print i, mySecInt.datas(i)
Next

GetKey

'Print mySecInt._data ' Der Pointer ist nicht verfügbar, da es sich um ein PRIVATE-Feld handelt.

Unterschiede:
zu QB und VB:
  • In dieser Verwendung neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • PUBLIC bei UDTs existiert seit freeBASIC v0.17

    • Siehe auch:
    PRIVATE, PUBLIC (UDT),
    TYPE (UDT), THIS,
    SUB, FUNCTION, PROPERTY, OPERATOR,
    CONSTRUCTOR (Klassen), DESTRUCTOR (Klassen)


PRIVATE

Typ: Schlüsselwort/Klausel
Kategorie: Programmorganisation

PRIVATE wird in der modularen Programmierung und zusammen mit UDTs (user defined Types; siehe TYPE (UDT)) eingesetzt.

Siehe...
  • PRIVATE als Klausel legt explizit für eine SUB oder FUNCTION fest, dass diese PRIVATE sein soll.

  • PRIVATE als Schlüsselwort wird zusammen mit OPTION eingesetzt, und setzt einen Standard, der für das gesamte Programm gilt;
    wird OPTION PRIVATE gesetzt, muss explizit die PUBLIC-Klausel angewandt werden, wenn eine Prozedur PUBLIC sein soll.

  • PRIVATE bei UDTs regelt die Zugriffsrechte auf Records bei UDTs.

    • Siehe auch:
     PUBLIC, OPTION,
    DECLARE, SUB, FUNCTION,
    TYPE (UDT)


PROCPTR

Syntax: PROCPTR(Prozedurname)
Typ: Funktion
Kategorie: Speicherverwaltung

Gibt die Adresse einer Prozedur im Speicher zurück.
Diese Funktion lässt sich auch durch die Form
@Prozedurname
ersetzen.

Beispiel:
DECLARE SUB dummy

PRINT PROCPTR(dummy)
PRINT @dummy

SUB dummy
' ...
END SUB

Siehe auch:
Pointer, PTR

Unterschiede: Neu in freeBASIC.


PROPERTY

Syntax A:
TYPE TypeName
    FeldName [(Indizes)] AS DatenTyp

    ' Wert abfragen
    DECLARE PROPERTY PropertyName (                                     ) AS DatenTyp
    DECLARE PROPERTY PropertyName ( [ BYREF | BYVAL ] Index AS DatenTyp ) AS DatenTyp

    ' Wert setzen
    DECLARE PROPERTY PropertyName ( [ BYREF | BYVAL ] Index     AS DatenTyp, [ BYREF | BYVAL ] NeuerWert AS DatenTyp )
    DECLARE PROPERTY PropertyName (                                          [ BYREF | BYVAL ] NeuerWert AS DatenTyp )
END TYPE

Syntax B:
PROPERTY TypeName.PropertyName [ (Parameterliste) ] AS DatenTyp
   ' Anweisungen
END PROPERTY
Typ: Prozedur
Kategorie: Programmorganisation

Erstellt eine Property einer Klasse.
Eine Property kann mit einem UDT-Record (Siehe TYPE (UDT)) gleichgesetzt werden; jedoch wird bei jedem Zugriff auf dieses Record ein
User-Definiertes Unterprogramm aufgerufen.

Informieren Sie sich zuerst über Prozeduren in freeBASIC, bevor Sie sich mit dem Thema Properties und Klasen befassen. Siehe dazu auch
SUB, FUNCTION.
Ebenso nötig sind Kenntnisse über UDTs (User defined Types - siehe TYPE (UDT).)

Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

  • 'TypeName' ist der Name eines UDTs, wie er unter TYPE (UDT) erklärt wird.

  • 'Indizes' zeigt an, dass auch Arrays verwendet werden können; wie üblich ist die Anzahl der Dimensionen in diesem Fall aber fest.

  • 'FeldName' ist der Name eines UTD-Records. Mindestens ein solcher Record muss existieren, um eine Property einzufügen. Es dürfen
    selbstverständlich auch mehrere Records verwendet werden.

  • 'PropertyName' ist der Name der Property; dieser Bezeichner wird auch verwendet, um das Unterprogramm zu identifizieren, das beim
    Zugriff auf die Property aufgerufen wird.
    'PropertyName' darf auch überladen werden, d.h. es dürfen mehrere Property-Prozeduren mit dem selben Bezeichner existieren, die sich
    dann durch ihre Parameterliste unterscheiden müssen.
    In manchen Fällen MUSS sogar eine Overloaded Property vorhanden sein; immer wenn der Wert einer Property vom User gesetzt werden
    kann, muss er auch abfragbar sein.
    Siehe dazu auch OVERLOAD.

  • 'NeuerWert' ist ein Wert, der an die Speicherstelle der Property übergeben werden soll. Er wird an das Unterprogramm übergeben, und
    dort abhängig von den 'Anweisungen' bearbeitet.

  • 'Index' wird verwendet, wenn 'FeldName' ein Array ist. Über diesen Parameter kann der Index des Feldelements angegeben werden.
    Theoretisch ist es auch möglich, hier andere Parameter zu übergeben, z.B. einen Pointer auf eine ganze Struktur von Parametern.

  • 'Parameterliste' ist eine Parameterliste, die den Parametern in Syntax A entspricht.

  • 'Anweisungen' ist ein Programmcode, der den Regeln einer FUNCTION folgt.
    Ein Rückgabewert kann mit PROPERTY, TypeName.PropertyName und RETURN gesetzt werden.

    • PROPERTY-Felder werden dazu genutzt, um auf Werte innerhalb eines TYPES zuzugreifen, und bei jedem Zugriff eine bestimmte Prozedur
    aufzurufen.
    So, wie sie den Wert eines UDT-Records setzen und abfragen können, können auch Properties gesetzt und abgefragt werden. Die zugehörigen
    Prozeduren haben dabei den selben Bezeichner; sie unterscheiden sich lediglich durch die Anzahl der Parameter.

    Befindet sich der TYPE innerhalb eines NAMESPACEs, so wird die Zuordnung genau so durchgeführt, wie bei normalen Prozeduren innerhalb
    von NAMESPACEs; es ist möglich, den Bezeichner des TYPEs als Präfix vor den Bezeichner der Property zu hängen, oder mittels USING
    das Präfix für den gesamten Code überflüssig machen.

    Innerhalb der Prozedur kann auf die übrigen Records des zugeordneten Typs über das Schlüsselwort THIS zugegriffen werden.

    Bei der Bearbeitung der Records des Types mit mathematischen Operatoren (+, -, ...) kann das Prinzip "Operator Overloading" angewandt
    werden; siehe hierzu OPERATOR.

    Beispiel 1: Abfragen und Setzen von Werten eines UDTs mittels Properties
    Type Vector2D
    As Single x, y
    Declare Operator Cast() As String
    Declare Property Length() As Single
    Declare Property Length( ByVal new_length As Single )
    End Type

    Operator Vector2D.cast () As String
    Return "(" + Str(x) + ", " + Str(y) + ")"
    End Operator

    Property Vector2D.Length() As Single
    Length = Sqr( x * x + y * y )
    End Property

    Property Vector2D.Length( ByVal new_length As Single )
    Dim m As Single = Length
    If m <> 0 Then
    '' new vector = old / length * new_length
    x *= new_length / m
    y *= new_length / m
    End If
    End Property

    Dim a As Vector2D = ( 3, 4 )

    Print "a = "; a
    Print "a.length = "; a.length
    Print

    a.length = 10

    Print "a = "; a
    Print "a.length = "; a.length
    Ausgabe:
    a = (3, 4)
    a.length =  5

    a = (6, 8)
    a.length =  10

    Mittels der Schlüsselwörter PRIVATE und PUBLIC kann festgelegt werden, vonn welchen Programmpunkten aus auf bestimmte Records des UDTs
    zugegriffen werden darf. PRIVATE-Records können dabei nur von UDT-eigenen Properties angesprochen werden, PUBLIC-Records sind dem
    gesamten Modul zugänglich.
    Standardmäßig sind alle Records PUBLIC.
    Um festzulegen, welche Records PRIVATE bzw. PUBLIC sind, wird innerhalb einer Typen-Deklaration einfach ein 'PRIVATE:' oder 'PUBLIC:'
    eingefügt; alle folgenden Elemente folgen der zuletzt genannten Regel.
    Innerhalb eines Types kann mehrmals der Status PRIVATE/PUBLIC gewechselt werden:

    Beispiel 2: Verwaltung einer Liste mit Properties ohne Möglichkeit für den User, auf die Liste direkt zuzugreifen:
    Type MyList
    ' hier gilt noch PUBLIC:
    Declare Constructor () ' wird automatisch bei Erstellung aufgerufen
    Declare Destructor () ' wird automatisch bei Beendigung aufgerufen

    Private: ' Nur interne Verwendung
    count As Integer ' Anzahl der Listenelemente
    adresses As Integer Ptr ' Pointer auf ein Datenfeld; jedes Element des Feldes zeigt auf einen ZSTRING
    strings As ZString Ptr ' Hilfs-Pointer, zum leichteren Umgang mit den ZSTRINGs

    Public: ' Für den User
    ' Eigenschaften
    Declare Property Items (index As Integer) As String ' Listenelement Nr. 'index' ausgeben
    Declare Property Items (index As Integer, value As String) ' Wert v. Listenelement Nr. 'index' setzen

    ' Methoden
    Declare Sub AddItem(index As Integer, value As String) ' Neues Element zur Liste hinzufügen
    Declare Sub DelItem(index As Integer) ' Element Nr. 'index' aus Liste löschen
    Declare Function ItemCount() As Integer ' Anzahl der Listenelemente ausgeben
    End Type
    '=============================================================================='
    Dim As MyList Liste
    Dim As Integer i

    Liste.Items (1) = "nein"
    Liste.AddItem 2, "abbrechen"
    Liste.AddItem 1, "ja"
    Liste.AddItem 2, "delete me"

    For i = 1 To Liste.ItemCount
    ? i, Liste.Items(i)
    Next
    ?

    Liste.DelItem 2

    For i = 1 To Liste.ItemCount
    ? i, Liste.Items(i)
    Next

    GetKey
    '=============================================================================='
    Constructor MyList ()
    This.count = 1
    This.adresses = CAllocate(1)
    This.strings = CAllocate( Len("") )
    This.adresses[0] = Cast( Integer, This.strings )
    End Constructor
    '..............................................................................'
    Destructor MyList ()
    Dim As Integer i

    With This
    For i = 1 To .Count
    .Strings = Cast( ZString Ptr, .adresses[i - 1] )
    DeAllocate .Strings
    Next

    DeAllocate .adresses
    End With
    End Destructor
    '------------------------------------------------------------------------------'
    Property MyList.Items(index As Integer) As String
    If (index < 1) Or (index > This.Count) Then Return "" ' Überprüfe, ob Listenindex existiert;
    ' Wenn nein, beende Prozedur

    This.Strings = Cast( ZString Ptr, This.adresses[index - 1] ) ' Finde richtige Adresse des Strings
    Return *This.Strings ' Gib gewünschten String zurück
    End Property
    '..............................................................................'
    Property MyList.Items(index As Integer, value As String)
    Dim As Integer i
    Dim As ZString Ptr tmp

    With This
    If (index < 1) Or (index > .Count) Then Return ' Überprüfe, ob Listenindex existiert;
    ' Wenn nein, beende Prozedur

    .Strings = Cast( ZString Ptr, .adresses[index - 1] ) ' Finde richtige Adresse des Strings
    tmp = ReAllocate( .Strings, Len(value) + 1) ' Reserviere Speicherplatz für neuen String
    If tmp Then .Strings = tmp Else Return ' Fahre nur fort, wenn Reservierung erfolgreich

    .adresses[index - 1] = Cast( Integer, .Strings ) ' Speichere neue Adresse

    For i = 0 To Len(value) - 1 ' Kopiere neuen String in neue Speicherstelle
    .Strings[i] = value[i]
    Next
    .Strings[ Len(value) ] = 0 ' Setze letztes Element auf 0, da es ein ZSTRING ist

    End With
    End Property
    '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
    Sub MyList.AddItem(index As Integer, value As String)
    Dim As Integer i
    Dim As Integer Ptr tmp

    With This
    If (index < 1) Or (index > .Count + 1) Then Return ' Überprüfe, ob Listenindex existiert;
    ' Wenn nein, beende Prozedur

    tmp = ReAllocate(.adresses, .Count + 1) ' reserviere Speicher für eine neue Adresse
    If tmp Then .adresses = tmp Else Return ' Fahre nur fort, wenn Reservierung erfolgreich

    For i = .Count - 1 To index - 1 Step - 1 ' Verschiebe bisher gespeicherte Adressen i.d. Adress-
    .adresses[i + 1] = .adresses[i] ' liste um eins nach vorne, um Platz für das neue
    Next ' Element zu schaffen
    .count += 1 ' Erhöhe den Element-Zähler um eins

    .Strings = Allocate( Len(value) + 1 ) ' Reserviere Speicherplatz für neuen String

    For i = 0 To Len(value) - 1 ' Kopiere neuen String in neue Speicherstelle
    .Strings[i] = value[i]
    Next
    .Strings[ Len(value) ] = 0 ' Setze letztes Element auf 0, da es ein ZSTRING ist

    .adresses[index - 1] = Cast( Integer, .Strings ) ' Speichere die Adresse des neuen Elements
    End With
    End Sub
    '..............................................................................'
    Sub MyList.DelItem(index As Integer)
    Dim As Integer i
    Dim As Integer Ptr tmp

    With This
    If (index < 1) Or (index > .Count) Then Return ' Überprüfe, ob Listenindex existiert;
    ' Wenn nein, beende Prozedur

    .Strings = Cast( ZString Ptr, .adresses[index - 1] ) ' Lösche den String aus dem Speicher
    DeAllocate .Strings

    tmp = Allocate(.Count - 1) ' Erstelle temporäre Kopie der Adress-Liste ohne zu
    For i = 0 To .Count - 1 ' löschendes Element
    If i < index - 1 Then
    tmp[i] = .adresses[i]
    ElseIf i = index - 1 Then
    ' keine Aktion, da Element gelöscht werden soll!
    Else
    tmp[i - 1] = .adresses[i]
    End If
    Next

    Count -= 1 ' aktualisiere Zähler
    DeAllocate .adresses ' Entferne alte Adressliste
    .adresses = tmp ' Übernehme neue Adressliste
    End With
    End Sub
    '..............................................................................'
    Function MyList.ItemCount() As Integer
    Return This.Count
    End Function
    Ausgabe:
    1   ja
    2   delete me
    3   nein
    4   abbrechen

    1   ja
    2   nein
    3   abbrechen
    Dieses Beispiel verdeutlicht die Vorteile der PROPERTY-Methode:
    Zwar ist der Aufwand auf den erten Blick etwas höher; für jeden denkbaren Zugriff ist eine eigene Prozedur von Nöten. Allerdings kann
    hierbei gleich festgelegt werden, ob der Zugriff im Lese und/oder Schreibmodus erfolgen darf; hier z.B. kann jederzeit die Anzahl der
    Elemente in der Liste abgefragt werden, jedoch kann der Wert nur über .AddItem und .DelItem geändert werden.
    Außerdem kann automatisch überprüft werden, ob die angegebenen Parameter überhaupt zulässig sind; hier z.B. wird in jeder Property (mit
    Ausnahme von .ItemCount, das ja keine Parameter besitzt) geprüft, ob sich 'index' im zulässigen Bereich befindet.
    Dank der Möglichkeit, einen CONSTRUCTOR zu verwenden, wird die Liste automatisch voll funktionsfähig initiiert, und der DESTRUCTOR sorgt
    dafür, dass keine Reste im Speicher zurück bleiben.
    Und nicht zuletzt ist der Einsatz der erstellten Eigenschaften und Methoden im Modullevel denkbar einfach. Bedenken Sie den Aufwand,
    dessen es bedarf, um in ein STRING-Array ein Element an beliebiger Stelle einzufügen. Und dabei kann immer noch ein Fehler unterlaufen,
    wenn Indizes außerhalb des Zulässigen Bereichs angegeben werden.

    Unterschiede:
    zu QB:
  • neu in freeBASIC

    • zu VB:
  • Die Verwendung von Properties und Methoden wurde der VB-Syntax nachempfunden, jedoch existierte keine Möglichkeit, solche selbst
    zuerstellen

    • zu älteren freeBASIC-Versionen
  • PROPERTY existiert seit freeBASIC v0.17

    • Siehe auch:
    SUB, FUNCTION, OPERATOR,
    CONSTRUCTOR (Klassen), DESTRUCTOR (Klassen),
    THIS, TYPE (UDT),
    PUBLIC, PRIVATE,
    OVERLOAD


PSET (Grafik)

Syntax: PSET [Puffer], [STEP] (x, y)[,Farbe]
Typ: Anweisung
Kategorie: Gfx

PSET zeichnet einen einzelnen Pixel auf den Bildschirm oder in einen Bildpuffer.

  • 'Puffer' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter Puffer oder ein Array. Beide können mit
    PUT angezeigt werden. Wird 'Puffer' ausgelassen, zeichnet freeBASIC direkt auf den Bildschirm.

  • 'x' und 'y' sind die Koordinaten des Punktes im Grafikfenster bzw. auf dem Bildschirm.

  • 'STEP' gibt an, dass die angegebenen Koordinaten relativ zur aktuellen Position des Grafikcursors sind.

  • 'Farbe' ist das Farbattribut.
    Es ist abhängig vom aktuellen Bildschirmmodus, der von der letzten SCREEN (Anweisung) gewählt wurde.
    Wenn 'Farbe' ausgelassen wird, verwendet PSET standardmäßig die Farbe, die von der letzten
    COLOR-Anweisung eingestellt wurde.

    • PSET zeichnet einen einzelnen Pixel auf den Bildschirm. Die Position des Pixels ist abhängig von den letzten
    VIEW (Grafik) und WINDOW-Anweisungen.

    Beispiel:
    SCREEN 12

    PSET (100, 100), 15 ' weißen Punkt an den Koordinaten 100, 100 zeichnen
    GETKEY ' Warte auf Tastendruck

    CLS ' Bildschirm löschen
    WINDOW SCREEN (0, 0)-(63.9, 47.9) ' physischen Darstellungsbereich ändern
    PSET (10, 10), 1 ' blauen Punkt an den Koordinaten 10, 10 zeichnen
    ' Entspricht bei diesem Darstellungsbereich den
    ' Koordinaten 100, 100
    GETKEY

    CLS
    WINDOW ' physischen Darstellungsbreich zurücksetzen
    VIEW (50, 50)-(590, 430) ' Gültigkeitsbereich neu festlegn
    PSET (50, 50), 2 ' grünen Punkt an den Koordinaten 50, 50 zeichnen.
    ' Entspricht den Koordinaten 100, 100 im Gesamtfenster
    ' (wenn der Gültigkeitsbereich ignoriert wird.)
    GETKEY

    PSET ist auch ein Schlüsselwort bei PUT (Grafik).

    Siehe auch:
    PSET (Methode),
    PRESET (Grafik), LINE (Grafik), CIRCLE, PAINT,
    DRAW (Grafik), DRAW STRING,
    GET (Grafik), PUT (Grafik),
    IMAGECREATE, IMAGEDESTROY
    POINT, VIEW (Grafik), WINDOW
    SCREEN (Anweisung)


PSET

PRESET

Typ: Schlüsselwort
Kategorie: Gfx

PSET ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING
eingesetzt wird.

Bei der Wiedergabe von Pixeldaten aus einem Bildpuffer nach der PSET-Methode
werden die Daten 1:1 auf dem Bildschirm wiedergegeben; die Wiedergabe erfolgt
unabhängig von Pixeln in der Transparenzfarbe oder vom überzeichneten
Hintergrund.

Siehe auch:
PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
AND (Methode), OR (Methode), XOR (Methode),
PSET (Grafik), PRESET (Methode),
ALPHA, ADD, TRANS, CUSTOM


PSET

Typ: Anweisung

PSET ist ein Schlüsselwort, das als Anweisung und als Methode bei der
Grafikwiedergabe eingesetzt werden kann.

Siehe:
PSET (Anweisung)
PSET (Methode)


PTR

Typ: Schlüsselwort
Kategorie: Speicherverwaltung

PTR wird mit DIM, TYPE und DECLARE verwendet um eine Variable oder Funktion als
Pointer zu definieren.

Beispiel:
DECLARE FUNCTION foobar (Parameter AS INTEGER) AS INTEGER PTR

TYPE mytype
a AS INTEGER
b AS INTEGER PTR
END TYPE

DIM var AS STRING PTR
DIM typ AS mytype PTR

Siehe auch:
POINTER (Datentyp),
ALLOCATE, PEEK, POKE,
Pointer

Unterschiede: Neu in freeBASIC.


PUBLIC

Typ: Schlüsselwort
Kategorie: Programmorganisation
Syntax A: PUBLIC { SUB | FUNCTION }

Ein Programm kann aus mehreren Modulen, d.h. aus mehreren BAS-Dateien bestehen.
Welche Dateien zum Projekt gehören sollen, wird dem Compiler in der Kommandozeile mitgeteilt:
fbc Optionen Dateiname1 Dateiname2 ...
(Siehe dazu Die Kommandozeile)

Aus einem bestimmten Modul können dabei immer alle Prozeduren aufgerufen werden, die sich in diesem befinden. Prozeduren aus anderen
Modulen können nur dann aufgerufen werden, wenn diese Prozeduren PUBLIC sind. PRIVATE Prozeduren hingegen können nur aus dem Modul
heraus aufgerufen werden, in dem sie sich befinden.

Es dürfen in mehreren Modulen mehrere Prozeduren mit dem selben Bezeichner vorhanden sein, sofern diese PRIVATE sind.

Beispiel:
Ein Projekt besteht aus den Modulen A und B.
Das Modul A besitzt die Prozeduren Priv1 (PRIVATE), Priv2 (PRIVATE) und Pub1 (PUBLIC).
Das Modul B besitzt die Prozeduren Priv1 (PRIVATE), Priv2 (PRIVATE) und Pub2 (PUBLIC).
Wird gerade Code aus Modul A ausgeführt, so können Priv1 aus A, Priv2 aus A, Pub1 aus A und Pub2 aus B aufgerufen werden. Priv1 aus B und
Priv2 aus B können nicht aufgerufen werden.
Wird gerade Code aus Modul B ausgeführt, so können Priv1 aus B, Priv2 aus B, Pub1 aus A und Pub2 aus B aufgerufen werden. Priv1 aus B und
Priv2 aus B können nicht aufgerufen werden.

Standardmäßig sind alle Prozeduren PUBLIC, d.h. es muss nicht für jede SUB/FUNCTION explizit eine PUBLIC-Klausel benutzt werden. Jedoch
kann mit OPTION PRIVATE festgelegt werden, dass Prozeduren standardmäßig PRIVATE
sind.
(Beachten Sie dazu auch die FB-Dialektformen.)

Das PUBLIC-Schlüsselwort muss dabei nur im Prozedurheader stehen, nicht in der DECLARE-Anweisung.

Beispiel:
Compilert Sie diese Dateien mit folgender Programmzeile:
fbc PrivatePublicTest1.bas PrivatePublicTest2.bas
' PrivatePublicTest1.bas
DECLARE SUB PrivateSub ()
DECLARE SUB PublicSub ()

PublicSub
PrivateSub

PRIVATE SUB PrivateSub ()
PRINT "PrivateSub in PrivatePublicTest1.bas"
END SUB

'------------------------------------------------------------------------------'

' PrivatePublicTest2.bas
DECLARE SUB PrivateSub ()
DECLARE SUB PublicSub ()

PRIVATE SUB PrivateSub ()
PRINT "PrivateSub in PrivatePublicTest2.bas"
END SUB

PUBLIC SUB PublicSub ()
PRINT "PublicSub in PivatePublicTest2.bas
PrivateSub
END SUB
Ausgabe:
PublicSub in PrivatePublicTest2.bas
PrivateSub in PrivatePublicTest2.bas
PrivateSub in PrivatePublicTest1.bas

Wie Sie sehen, dürfen zwei Prozeduren mit dem selben Bezeichner existieren, wenn
beide PRIVATE sind.

Unterschiede:
  • zu QB:
    Neu in freeBASIC.

  • zu VB:
    PUBLIC kann nicht mit TYPE verwendet werden.

    • Siehe auch:
    PUBLIC, PRIVATE (Klausel),
    OPTION,
    DECLARE, SUB, FUNCTION,
    Prozeduren, Die Kommandozeile


PUBLIC (UDT)

Syntax:
TYPE TypeName
   PRIVATE:
   ' Deklaration privater Records

   PUBLIC:
   ' Deklaration öffentlicher Records
END TYPE
Typ: Schlüsselwort
Kategorie: Programmorganisation

Dieses Schlüsselwort ist in dieser Form nur dann zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

Legt fest, dass folgende UDT-Records PUBLIC sein sollen, d.h. dass ein Zugriff von jeder Prozedur aus zulässig sein soll.

Seit mit freeBASIC v0.17 die objektorientierte Programmierung möglich ist, existiert die Möglichkeit, den Zugriff auf UDT-Records (siehe
TYPE (UDT))einzuschränken. Der Zweck liegt darin, dass der Zugriff auf den entsprechenden Record nur noch über Userdefinierte Prozeduren
ermöglicht wird, die mögliche Fehler schon beim Zugriffsversuch abfangen, den Wert in ein besser verwertbares Format umwandeln, etc.

Der Type wird dazu regulär definiert.
Innerhalb der Typen-Deklaration wird die Zeile
PUBLIC:
eingefügt, sobald ein Record öffentlich sein soll, d.h. wenn der Zugriff von jedem Punkt aus erlaubt sein soll. PUBLIC gilt innerhalb
des TYPEs so lange, bis es durch ein PRIVATE-Schlüsselwort abgelöst wird.
Standardmäßig sind alle Records PUBLIC. Dies ist auch dann der Fall, wenn eine vorhergehende Typendeklaration mit PRIVATE abgeschlossen
wurde.

Auf PUBLIC-Records kann aus jeder Programmsituation zugegriffen werden; auf PRIVATE-Records dürfen nur TYPE-eigene Prozeduren (SUBs,
FUNCTIONs, PROPERTYs, OPERATORs, Klassen-Konstruktoren und Klassen-Destruktoren) zugreifen.
Beachten Sie, dass auch die Prozeduren eines TYPEs PRIVATE oder PUBLIC sein können.
Ein Zugriff auf einen privaten Record von außerhalb einer TYPE-eigenen Prozedur führt zu der Compiler-Fehlermeldung
Illegal member access
Als generelle Merkregel kann dienen: Auf Private Records kann nur über das THIS-Schlüsselwort zugegriffen werden.

Es ist erlaubt, innerhalb eines TYPEs beliebig viele PRIVATE- und PUBLIC-Blöcke einzurichten.

Beispiel:
Type SecureIntArray
Private:
_ubound As Integer
_lbound As Integer
_data As Integer Ptr

Public:
Declare Property datas (index As Integer ) As Integer
Declare Property datas (index As Integer, new_value As Integer)

Declare Sub Redim (low As Integer, up As Integer)

Declare Constructor ()
Declare Destructor ()
End Type

Constructor SecureIntArray()
With This
._ubound = 0
._lbound = 0
._data = Allocate(4)
End With
End Constructor

Destructor SecureIntArray()
DeAllocate This._data
End Destructor

Property SecureIntArray.datas (index As Integer) As Integer
With This
If (index < ._lbound) Or (index > ._ubound) Then Return 0

Return ._data[index - ._lbound]
End With
End Property

Property SecureIntArray.datas (index As Integer, new_value As Integer)
With This
If (index < ._lbound) Or (index > ._ubound) Then Return

._data[index - ._lbound] = new_value
End With
End Property

Sub SecureIntArray.Redim (low As Integer, up As Integer)
If low > up Then Return

With This
DeAllocate ._data

._ubound = up
._lbound = low
._data = Allocate( (up - low + 1) * 4 )

End With
End Sub

Dim As SecureIntArray mySecInt
Dim As Integer i

mySecInt.Redim 0, 20 ' Wir erstellen ein Array mit den Indizes 0 bis 20...
For i = 0 To 24 ' und versuchen, bis zum Index 24 werte einzufügen.
mySecInt.datas(i) = 2 * i ' Die Property wird diesen Versuch abblocken.
Next

For i = 0 To 24 ' Genauso, wie auch die abfrage von Werten außer der Array-Dimensionen fehlschlägt.
Print i, mySecInt.datas(i)
Next

GetKey

'Print mySecInt._data ' Der Pointer ist nicht verfügbar, da es sich um ein PRIVATE-Feld handelt.

Unterschiede:
zu QB und VB:
  • In dieser Verwendung neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • PUBLIC bei UDTs existiert seit freeBASIC v0.17

    • Siehe auch:
    PUBLIC, PRIVATE (UDT),
    TYPE (UDT), THIS,
    SUB, FUNCTION, PROPERTY, OPERATOR,
    CONSTRUCTOR (Klassen), DESTRUCTOR (Klassen)


PUBLIC

Typ: Schlüsselwort/Klausel
Kategorie: Programmorganisation

PUBLIC wird in der modularen Programmierung und zusammen mit UDTs (user defined Types; siehe TYPE (UDT)) eingesetzt.

Siehe...
  • PUBLIC als Klausel legt explizit für eine SUB oder FUNCTION fest, dass diese PUBLIC sein soll.

  • PUBLIC bei UDTs regelt die Zugriffsrechte auf Records bei UDTs.

    • Siehe auch:
     PRIVATE, OPTION,
    DECLARE, SUB, FUNCTION,
    TYPE (UDT)


PUT (Datei)

Syntax: PUT #Dateinummer, [Position], Daten [, Menge]
Typ: Anweisung/Funktion
Kathegore: Datei

Schreibt Daten in eine BINARY- oder RANDOM-Datei

  • 'Dateinummer' ist die Nummer einer Datei, die durch eine OPEN-Anweisung zugewiesen wurde.

  • 'Position' ist die Position innerhalb der Datei, an die geschrieben werden soll.
    Für BINARY-Dateien ist es die Nummer des Bytes, für RANDOM-Dateien ist das die Nummer des Datensatzes.
    Wird dieser Parameter ausgelassen, schreibt freeBASIC an die Position des Dateicursors. Diese ist abhängig von den letzten
    Lese/Schreibzugriffen auf die Datei und der SEEK Anweisung.
    Zeigt die aktuelle Position innerhalb der Datei auf eine bereits beschriebene Position, so wird diese überschrieben.
    Direkt nach dem Öffnen zeigt der Dateicursor immer auf die erste Stelle in der Datei.

  • 'Daten' ist ein Wert, eine Variable oder ein Ausdruck.
    Auch Arrays und UDTs (user defined Types; siehe TYPE) können geschrieben werden.

  • 'Menge' wird eingesetzt, sobald die Daten aus einem ALLOCATE-Puffer geschrieben werden sollen. Dadurch wird PUT mitgeteilt,
    wie viele Speicherstellen aus dem Puffer in die Datei geschrieben werden sollen. PUT schreibt
    Menge * SizeOf(Puffer_Datentyp)
    Bytes.
    Wird 'Menge' ausgelasen, nimmt freeBASIC automatisch 1 an. PUT schreibt also eine einzelne Speicherstelle in die Datei. (Entspricht
    LEN(DatenPufferTyp) Bytes, also z.B. 4 Bytes bei einem INTEGER PTR.)
    Bei anderen Datentypen als ALLOCATE-Datenpuffern wird der Parameter 'Menge' ignoriert.

  • Wird PUT als Funktion eigesetzt, ist der Rückgabewert eine der freeBASIC-Fehlernummern.
    In diesem Fall müssen die Parameter in Klammern gesetzt werden; die Syntax lautet also:
    Variable = PUT(#Dateinummer, [Position], Variable)

    • Der RANDOM-Modus wird nur noch selten verwendet; Die Verwendung sequentieller Modi (INPUT (Dateimodus), OUTPUT und APPEND)
    bzw. des BINARY-Modus hat sich als sinnvoller herausgestellt.
    Es wird nicht garantiert, das freeBASIC RANDOM-Daten im selben Umfang wie QB unterstützt.

    Im BINARY-Modus richtet sich die Anzahl der zu schreibenden Bytes richtet sich nach dem Datentyp der Variable, in die in die Datei
    geschrieben wird:
  • BYTE und UBYTE - 1 Byte (8 bit)

  • SHORT und USHORT - 2 Byte (16 bit)

  • INTEGER, UINTEGER und LONG - 4 Bytes (32 bit)

  • LONGINT und ULONGINT - 8 Bytes (64 bit)

  • STRINGs (fester und variabler Länge) - Lässt sich mit LEN ermitteln

  • ZSTRINGs (fester Länge) - geschrieben werden
    LEN(ZstringVariable) - 1
    Bytes. Das Terminierungs-Byte wird nicht in die Datei übertragen. Siehe dazu auch ZSTRING.

  • ZSTRING PTR - werden wie ALLOCATE-Puffer behandelt. (siehe unten)

  • WSTRINGs (fester Länge) - geschrieben werden wie bei ZSTRINGs
    LEN(WstringVariable) - 1
    Bytes. Das Terminierungs-Byte wird nicht in die Datei übertragen. Siehe dazu auch WSTRING (Datentyp).

  • ALLOCATE-Puffer - Der Parameter 'Menge' gibt an, wie viele Bytes geschrieben werden. Achtung: Auch sie können auch eine größere
    Datenmenge schreiben, als für diesen ALLOCATE-Puffer reserviert wurde. Als ergebnis allerdings werden Sie Datenmüll in Ihrer Datei
    vorfinden.

  • Arrays - Indexzahl * LEN(Datentyp)

  • UDTs - Lässt sich mit LEN ermitteln

    • Beispiel 1:
    Dim buffer AS String

    f = Freefile
    Open "file.ext" For Binary As #f

    buffer = "hello world within a file."
    Put #f, , buffer
    Close #f

    Um Arrays oder UDTs zu schreiben, muss der Bezeichner der entsprechenden Variable ohne Index- oder Recordangabe gegeben sein.
    Type UDT
    a As Integer
    b As Single
    c As String * 5
    END TYPE

    f = Freefile
    Open "file.ext" For Binary As #f

    Dim outarray(5) As Integer
    Dim outUDT As UDT

    Put #f, , outarray()
    Put #f, , outUDT

    Close #f

    Bei der Verwendung von Datenpuffern, deren Pointer angegeben ist, verwenden sie die Ziel-des-Pointers-Syntax
    *Pointer
    oder
    Pointer[index]
    Außerdem müssen Sie angeben, wie viele Bytes geschrieben werden sollen. Dazu dient der Parameter 'Menge'.
    Beispiel 3:
    f = Freefile
    Open "file.ext" For Binary As #f

    Dim x As Byte Ptr
    x = Allocate(8)

    Put #f, 1, *x , 4
    Put #f, 5, x[4], 4

    DeAllocate x
    Close #f

    Achten Sie bei der Verwendung von PUT sehr genau auf die Datentypen!
    Beispiel 4:
    Dim v1 As Byte, v2 As String * 2
    Dim f As integer

    v1 = 33
    v2 = "33"
    f = FreeFile

    Open "file.ext" For Binary As #f
    Put #f, , v1
    Put #f, , v2
    Close #f

    Open "file.ext" For Binary As #f
    Get #f, , v2
    Get #f, , v1
    Close #f

    Print v1, v2
    GetKey
    Ausgabe:
    51     !3
    Wie Sie sehen, wird in die Datei beim ersten Zugriff zuerst ein BYTE-Wert und ANSCHLIESSEND ein 2-Byte-STRING geschrieben. Beim zweiten
    Zugriff wird zuerst ein 2-Byte-STRING und anschließend ein BYTE-Wert eingelesen. Ergebnis ist, dass nicht - wie anzunehmen - wieder
    zwei mal die Ausgabe '33' erfolgt, sondern nur Datenmüll auf dem Bildschirm erscheint.
    Obwohl die Informationen fehlerfrei gelesen wurden, kann mit den Informationen nicht gearbeitet werden, da sie nach dem Lesen auf die
    falsche Art und Weise behandelt werden.
    Werden beim Lesezugriff die beiden GET-Zeilen vertauscht, so erfolgt die korrekte Ausgabe:
    33     33
    Die Ursache hierfür liegt darin, dass im BINARY- und RANDOM-Modus (mit denen GET und PUT ja arbeiten) die Daten nicht in einem für
    Menschen lesbaren Format abgelegt werden, sondern binär behandelt werden, d.h. so geschrieben werden, wie sie vom Prozessor behandelt
    werden. Hierbei existieren Unterschiede zwischen der Behandlungsweise von Zeichenketten (des STRINGs) und Zahlen (des BYTE-Werts).

    Unterschiede
    zu früheren Versionen von freeBASIC:
  • PUT kann seit freeBASIC v0.13 als Funktion eingesetzt werden

  • Seit freeBASIC v0.10 können ganze Arrays gelesen werden.

    • zu QB:
  • PUT kann auch als Funktion eingesetzt werden.

  • Ganze Arrays und UDTs können geschrieben werden.

  • Die Verwendung von ALLLOCATE-Datenpuffern ist möglich

    • Siehe auch:
    PUT (Grafik),
    GET #, OPEN, CLOSE, FREEFILE


PUT (Grafik)

Syntax: PUT [ZielPuffer,] [STEP] (x, y), QuellPuffer [(x1, y1)-(x2, y2)] [,Aktionswort [Parameterliste] ]
Typ: Anweisung/Funktion
Kategorie: Gfx

PUT überträgt Daten (Einen Bildausschnitt) aus einem Puffer auf den Bildschirm oder in einen anderen Puffer. Die Datenquelle ist vom selben
Format, wie es bei GET (Grafik) verwendet wird.

  • 'ZielPuffer' ist ein Bildpuffer im Sinne von Interne Pixelformate: Bildpuffer, wie er mit IMAGECREATE verwendet wird.
    Wird 'Puffer' ausgelassen, zeichnet freeBASIC direkt auf den Bildschirm.

  • '(x, y)' sind die Koordinaten der linken oberen Ecke des Bereichs, der gezeichnet werden soll.

  • 'STEP' gibt an, dass die Koordinaten Relativ zum aktuellen Grafikcursor angegeben sind.

  • 'QuellPuffer' ist der Name das Puffers, in dem der zu zeichnende Bildschirmausschnitt gespeichert ist.
    Ebenso wie 'ZielPuffer' handelt es sich hierbei um einen Bildpuffer, wie er unter oben angegebenen Link erklärt wird.

  • '(x1, y1)-(x2, y2)' ist ein Koordinaten-Bereich innerhalb des Quellpuffers, der ausgegeben werden soll. Der Rest des gespeicherten
    Bildausschnitts wird nicht ausgegeben.
    Wird dieser Bereich ausgelassen, so gibt freeBASIC den Kompletten Pufferinhalt aus.
    (Diese Möglichkeit besteht erst seit freeBASIC v0.15)
  • 'Aktionswort' ist entweder PSET, PRESET, AND, OR, XOR, TRANS, ALPHA, ADD oder CUSTOM.
    Das Aktionswort legt fest, wie die zu zeichnende Grafik (die gespeicherten Daten aus dem Quellpuffer) mit den Pixeln auf dem Bildschirm
    interagieren sollen. Siehe die Tabelle unten für Details.
    Wenn 'Aktionswort' ausgelassen wird, nimmt freeBASIC XOR an.

  • 'Parameterliste' sind Argumente, die im Zusammenhang mit 'Aktionswort' gefordert werden. Siehe unten für Details.

  • Wird PUT als Funktion eigesetzt, ist der Rückgabewert eine der freeBASIC-Fehlernummern.
    Die Syntax bleibt dabei die gleiche, allderdings müssen die Parameter in Klammern gesezt werden, z.B.:
    Ergebnis = PUT( (10, 10), myPic, TRANS )

    • Die Koordinaten sind abhängig von den letzten VIEW (Grafik)- und WINDOW-Anweisungen.
    Die Ausgabe auf dem Bildschirm hängt von den im Puffer gespeicherten Daten, dem Aktionswort und den Pixeln, die bereits auf dem Bildschirm sind.

    Abhängig vom Aktionswort wird die Farbnummer der zu zeichnenden Pixel auf unterschiedliche Art und Weise berechnet; für die Aktionswörter
    PSET, PRESET und TRANS werden zu dieser Berechnung nur die Daten aus dem Quellpuffer herangezogen.
    Für die anderen Aktionswörter wird zusätzlich die Farbe des Pixels zur Berechnung herangezogen, das überzeichnet werden soll:
    Aktionswort | Interaktion der Pixel:
    PSET Gespeichertes Pixel überschreibt Pixel auf dem Bildschirm.
    Mit diesem Aktionswort wird also tatsächlich der Bildschirmausschnitt ausgegeben, der im Puffer gespeichert wurde.
    PRESET Die gespeicherten Pixel werden inventiert und überschreiben die Pixel auf dem Bildschirm. Der neue Farbwert ist das Ergebnis aus
    NOT (alter Farbwert)
    Das Aktionswort PRESET entspricht also PSET, mit dem Unterschied, dass ein invertiertes Bild ausgegeben wird.
    Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi die selbe Farbnummer auch immer die selbe Farbe dar.
    AND Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen ANDs mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten Pixel ist.
    Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi die selbe Farbnummer auch immer die selbe Farbe dar.
    OR Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen ORs mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten.
    Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi die selbe Farbnummer auch immer die selbe Farbe dar.
    XOR Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen XORs mit dem Pixel auf dem Bildschirm und dem im Puffer gespeicherten.
    Beachten Sie, dass das Ergebnis hier auch von der Farbtiefe abhängig ist; während in Modi bis 8bpp die Farbe der ausgegebenen Pixel auch von der Palette abhängig ist, stellt bei allen höheren Modi die selbe Farbnummer auch immer die selbe Farbe dar.
    XOR ist das Standard-Aktionswort.
    TRANS | Überschreibt die Pixel auf dem Bildschirm mit den gespeicherten wie bei PSET. Wenn das gespeicherte Pixel die Masken-Farbe (siehe unten) besitzt, wird es ausgelassen (Das Original-Pixel auf dem Bildschirm wird nicht überschrieben.)
    ALPHA [, AlphaWert] Mit ALPHA lassen sich Transparenz-Effekte erzeugen.
    Die ALPHA-Methode wird verwendet, um Bildschirmausschnitte 'durchscheinend' auszugeben; das Ergebnis der Bildschirmausgabe ist eine 'Mischfarbe' aus dem Pixel, das überzeichnet wurde, und dem, das im Quellpuffer gespeichert war.
    Das Aktionswort ALPHA ist nur in hi/truecolor-Modi verfügbar, also in Modi ab 15bpp.
    'AlphaWert' stellt dabei den Transparenzgrad des zu zeichnenden Ausschnitts bzw. das Mischungsverhältnis der beiden Farben dar; 255 bedeutet dabei volle Überdeckung, 0 keine Überdeckung. 127 ist der exakte Mittelwert zwischen den beiden Farben.
    Soll ein Pixel in der Maskenfarbe gezeichnet werden (siehe unten), so arbeitet ALPHA wie TRANS, d.h. Flächen in der Maskenfarbe werden nicht gezeichnet.
    In 32bpp-Modi ist es auch zulässig, den Parameter 'AlphaWert' auszulassen; in diesem Fall benutzt freeBASIC den Alphawert, der für jeden Pixel einzeln angegeben wurde; dies ist nur in 32bpp-Modi möglich, da nur hier ein eingebetteter Alphawert für jeden Pixel möglich ist; siehe dazu auch Interne Pixelformate
    Wird 'AlphaWert' ausgelassen, jedoch ein Modi mit einer Farbtiefe unter 32bpp verwendet, so geht freeBASIC von AlphaWert = 255 aus; dies entspricht völliger Überdeckung bzw. dem Aktionswort TRANS.
    ADD [, Faktor] Die Farbnummer des gespeicherten Pixels wird mit 'Faktor' multipliziert und zur Sättigung des zu überzeichnenden Pixels addiert.
    'Faktor' ist dabei ein Wert zwischen 0 und 255.
    Ebenso wie TRANS und ALPHA werden Flächen in der Maskenfarbe nicht gezeichnet.
    Das Ergebnis der ADD-Methode sind ebenso wie bei ALPHA durchscheinende Bildschirmausschnitte. Der Transparenzgrad des Ausschnitts ist jedoch nicht nur vom angegebenen Faktor abhängig, sondern auch von der Helligkeit des darunter liegenden Pixels. Beim Überzeichnen schwarzer Pixel verhält sich ADD wie ALPHA; mit zunehmender Helligkeit des zu überzeichnenden Pixels allerdings verschiebt sich das Gleichgewicht der Farbmischung hin zur Transparenz des zu Zeichnenden Pixels.
    Wird 'Faktor' ausgelassen, nimmt freeBASIC automatisch Faktor = 255 an.
    Siehe auch Beispiel 2 zum Unterschied zwischen ADD und ALPHA.
    CUSTOM, blender [, parameter]
  • 'blender' ist ein Pointer auf eine Funktion der Form
    FUNCTION blender ( BYVAL src AS UINTEGER, BYVAL dst AS UINTEGER, BYVAL parameter AS ANY PTR) AS UINTEGER
  • 'src' ist die Farbe des gespeicherten Pixels.
  • 'dst' ist die Farbe des Pixels, der überschrieben werden soll.
  • 'parameter' ist ein Pointer auf eine beliebige Speicherstruktur, mit der Informationen an die Funktion übergeben werden können.
    Wird 'parameter' ausgelassen, so nimmt freeBASIC automatisch 'parameter = 0' an.
    Dieser Parameter existiert erst seit freeBASIC v0.17. In älteren Versionen konnte kein Parameter übergeben werden.
  • Das Ergebnis der FUNCTION ist die Farbe des neuen Pixels.
    • Diese Funktion wird für jedes neu zu zeichnende Pixel aufgerufen; die Farbe wird jedes mal neu berechnet.
    Achten Sie beim Einsatz dieses Aktionsworts darauf, dass die Ausführungsgeschwindigkeit unter aufwändigen Berechnungen leiden wird!

    Die Maskenfarbe hängt von der aktuellen Farbtiefe ab; bei bis zu 8bp ist sie 0, in den höheren Modi (15, 16, 24 und 32 bpp) ist sie &HFF00FF
    (helles Pink). Wollen Sie in Ihrem Programm einen Transparenzeffekt UND ein helles Pink verwenden, müssen Sie die Bildteile, die nicht
    transparent sein sollen durch ein anderes Pink ersetzen. In der Regel ist der Farbunterschied zwischen &HFF00FF und &HFF01FF mit bloßem
    Auge nicht zu erkennen.

    Die im Puffer gespeicherten Pixel müssen zur aktuellen Farbtiefe kompatibel sein; wenn sie ein Bild mit GET einlesen, und später die
    Farbtiefe via SCREEN (Anweisung) ändern, kann es sein, dass die gespeicherten Daten nicht mehr kompatibel sind,
    so dass PUT mit diesem Puffer nicht richtig eingesetzt werden kann. Eine Konversion zwischen verschiedenen Farbtiefen ist mit IMAGECONVERTROW
    möglich.

    Beispiel 1:
    Declare Function checkered_blend( BYVAL src As UInteger, _
    ByVal dest As UInteger, _
    ByVal param As Any Ptr ) AS UInteger

    Screen 14, 16 ' Bildschirmmodus 320x240 bei 16bpp

    Dim As Byte Ptr sprite ' Speicher für ein 32x32-Pixel-
    sprite = ImageCreate( 32, 32 ) ' Sprite reservieren

    Line sprite, ( 0, 0 )-( 31, 31 ), &HFF0000, BF ' ein Sprite Zeichnen
    Line sprite, ( 0, 0 )-( 31, 31 ), &H00FF00, B
    Line sprite, ( 8, 8 )-( 23, 23 ), &HFF00FF, BF
    Line sprite, ( 1, 1 )-( 30, 30 ), &H0000FF
    Line sprite, ( 30, 1 )-( 1, 30 ), &H0000FF

    Dim As Integer i
    For i = 0 To 63 ' Einen Hintergrund zeichnen
    Line( i, 0 )-( i, 240 ), RGB( i * 4, i * 4, i * 4 )
    Next i

    ' Alle Methoden demonstrieren
    Put ( 8, 8 ), sprite, PSET : Locate 3,12 : Print "PSET"
    Put Step( 16, 24 ), sprite, PRESET : Locate 6,12 : Print "PRESET"
    Put Step( -16, 24 ), sprite, AND : Locate 9,12 : Print "AND"
    Put Step( 16, 24 ), sprite, OR : Locate 12,12 : Print "OR"
    Put Step( -16, 24 ), sprite, XOR : Locate 15,12 : Print "XOR"
    Put Step( 16, 24 ), sprite, TRANS : Locate 18,12 : Print "TRANS"
    Put Step( -16, 24 ), sprite, ALPHA, 96 : Locate 21,12 : Print "ALPHA"
    Put Step( 16, 24 ), sprite, ADD, 192 : Locate 24,12 : Print "ADD"
    Put Step( -16, 24 ), sprite, CUSTOM, @checkered_blend : Locate 27,12 : Print "CUSTOM"

    ImageDestroy( sprite ) ' Speicher wieder freigeben
    Sleep : End 0

    ' Benutzerdefinierter Blender: Karierte Ausgabe des Sprites
    Function checkered_blend( ByVal src As UInteger, _
    ByVal dest As UInteger, _
    ByVal param As Any Ptr ) As UInteger
    Static cnt
    Dim As UInteger pixel = IIF(((cnt And 4)ShR 2) XOR ((cnt And 128) ShR 7), src, dest)
    cnt += 1
    Return pixel
    End Function

    Beispiel 2: Unterschiede zwischen ALPHA und ADD
    Screen 15, 16 ' Bildschirmmodus 400x300 bei 16bpp

    Dim As Any Ptr sprite ' Speicher für ein 32x32-Pixel-
    sprite = ImageCreate( 32, 32 ) ' Sprite reservieren

    Line sprite, ( 0, 0 )-( 31, 31 ), &HFF0000, BF ' ein Sprite Zeichnen
    Line sprite, ( 0, 0 )-( 31, 31 ), &H00FF00, B
    Line sprite, ( 8, 8 )-( 23, 23 ), &HFF00FF, BF
    Line sprite, ( 1, 1 )-( 30, 30 ), &H0000FF
    Line sprite, ( 30, 1 )-( 1, 30 ), &H0000FF

    Cls
    Dim As Integer i : FOR i = 0 TO 63 ' Einen Hintergrund zeichnen
    Line( i , 0 )-( i , 300 ), RGB( i * 4, i * 4, i * 4 )
    Line( i + 128, 0 )-( i + 128, 300 ), RGB( i * 4, i * 4, i * 4 )
    Next i

    Put( 0, 0 ), sprite, ADD , 0
    Put( 32, 0 ), sprite, ADD , 0
    Put( 128, 0 ), sprite, ALPHA, 0
    Put( 160, 0 ), sprite, ALPHA, 0
    Draw String (240, 8), "0"
    For i = 1 To 8
    Put ( 0, I * 32), sprite, ADD , i * 32 - 1
    Put ( 32, I * 32), sprite, ADD , i * 32 - 1
    Put ( 128, I * 32), sprite, ALPHA, i * 32 - 1
    Put ( 160, I * 32), sprite, ALPHA, i * 32 - 1
    Draw String (240, I * 32 + 8), Str(i * 32 - 1)
    Next

    GetKey

    Unterschiede
    Zu QB:
  • freeBASIC unterstützt hi/truecolor-Sprites, Transparenzeffekte (auch Alpha-Blending) und Clipping (Einhaltung der Bildschirmgrenzen;
    QB erzeugte bei Koordinaten außerhalb der Bildschirmgrenzen eine Fehlermeldung.)
  • Bei Bildschirmmodi bis zu 8bpp wird immer 1 Byte pro Pixel im Array verwendet. QB konnte bei niedrigeren Farbtiefen mehrere Pixel in
    ein Byte 'packen'.

    • zu früheren freeBASIC-Versionen:
  • Der Parameter 'param AS ANY PTR' in der Funktion 'blender' für das Aktionswort CUSTOM existiert erst seit freeBASIC v0.17

  • Das Aktionswort ADD existiert erst seit freeBASIC v0.17

  • Die Möglichkeit, nur einen Teilbereich des gespeicherten Bildausschnitts auszugeben, besteht erst seit freeBASIC v0.15

  • Die Möglichkeit, einen Zielpuffer anzugeben, existiert erst seit freeBASIC v0.15

  • Das Aktionswort ALPHA existiert erst seit freeBASIC v0.14

  • Das Aktionswort CUSTOM existiert erst seit freeBASIC v0.14

  • Seit freeBASIC v0.14 bricht PUT mit einer Fehlermeldung ab, wenn versucht wird, ein Bild auszugeben, das für eine andere Farbtiefe
    als die aktuell gültige erstellt wurde.

  • Die Möglichkeit, anstelle von Arrays auch Pointer als Puffer anzugeben, existiert erst seit freeBASIC v0.12

    • Siehe auch:
    PUT (Datei),
    GET (Grafik),
    IMAGECREATE,
    SCREEN (Anweisung),
    Arten der Bildpuffer
    Interne Pixelformate


PUT

Typ: Anweisung/Funktion

PUT ist ein Schlüsselwort, das als Datei- und als Grafikbefehl eingesetzt
werden kann.
Siehe:
PUT #
PUT (Grafik)


Liste der Schlüsselwörter beginnend mit R

RANDOM
RANDOMIZE
READ
REALLOCATE
REDIM
REM
RESET
RESTORE
RESUME
RETURN
RGB
RGBA
RIGHT
RMDIR
RND
RSET
RTRIM
RUN


RANDOM

Typ: Schlüsselwort
Kategorie: Datei

RANDOM wird zusammen mit der OPEN-Anweisung verwendet, um
eine Datei im RANDOM-Access-Modus zu öffnen.

Im RANDOM-Modus ist es möglich, Datensätze aus einer Datei von einer beliebigen
Position zu lesen, oder an einer beliebigen Position Datensätze zu schreiben,
im Gegensatz zu den sequentiellen Modi (APPEND, INPUT (Dateimodus), OUTPUT).

Es wird davon abgeraten, den RANDOM-Modus zu verwenden; stattdessen empfielt
sich der BINARY-Modus, oder die sequentiellen Modi(APPEND, OUTPUT, INPUT (Dateimodus)).

Externer Link mit weiteren Informationen:
http://www.petesqbsite.com/sections/express/issue6/index.html#randomaccessfiles.

Siehe auch:
OPEN
GET #, PUT #,
BINARY,
APPEND, OUTPUT, INPUT (Dateimodus),
FIELD


RANDOMIZE

Syntax: RANDOMIZE Zahl AS INTEGER
Typ: Anweisung
Kategorie: Verschiedenes

Setzt die Startzahl für den Zufallsgenerator.
Abhängig von dieser Startzahl werden verschiedene Zufallszahlen von RND ausgegeben.

Durch RANDOMIZE wird der Zufallsgenerator zurückgesetzt. Wird er zweimal
hintereinander mit der selben Startzahl initiiert, ist auch die Folge der
Zufallszahlen dieselbe.

Eine variable Startzahl erzeugt schwerer vorhersehbare Zufallszahlen als eine Feste.
Daher hat es sich als gute Möglichkeit herausgestellt, TIMER
als Startwert zu verwenden; TIMER gibt die Zahl der verstrichenen Sekunden seit
Systemstart zurück, und ist bei jeder Programmausführung ein anderer Wert.

Beispiel:
RANDOMIZE TIMER

Siehe auch:
RND


READ

Syntax: READ Variable1 [,Variable2 [,...] ]
Typ: Anweisung
Kategorie: Speicherverwaltung

Liest Daten, die zuvor mit einer DATA-Anweisung gespeichert
wurden.

Siehe DATA für ein Beispiel.

Siehe auch:
DATA, RESTORE


REALLOCATE

Syntax: dst = REALLOCATE(src, bytes)
Typ: Funktion
Kategorie: Speicherverwaltung

Ändert die Größe eines reservierten Speicherbereichs und gibt einen Pointer auf
sein erstes Byte zurück.

  • 'src' ist ein Pointer auf einen bereits bestehenden Speicherbereich, dessen
    Größe geändert werden soll.

  • 'bytes' ist die neue Größe des Speicherbereichs in Bytes.

  • Die Werte, die im Speicherbereich 'src' gespeichert sind, werden bei der
    Redimensionierung zwischengespeichert.

  • Der Rückgabewert der Funktion ist ein Pointer auf das erste Byte des
    redimensionierten Speicherbereichs. Er kann im selben Pointer gespeichert werden,
    der schon bei 'src' angegeben wurde, darf (und sollte!) aber in einer anderen
    Pointer-Variablen gespeichert werden.
    Die Adresse des redimensionierten Speicherbereichs kann sich von der
    Adresse unterscheiden, auf die 'src' zeigt.

  • Wenn die Redimensionierung fehlschlägt, ist der Rückgabewert der Funktion
    null.

    • REALLOCATE ist kein Teil der freeBASIC Runtime Library, sondern ein Alias von
    'realloc' der C-Lib. Es kann nicht garantiert werden, dass diese Funktion Multithreading
    auf allen Plattformen unterstützt.

    Beispiel:
    DIM a AS INTEGER PTR, b AS INTEGER PTR, i AS INTEGER

    a = ALLOCATE( 5 * LEN(INTEGER) ) ' Speicher für fünf INTEGER-Stellen reservieren
    FOR i = 0 TO 4
    a[i] = (i + 1) * 2 ' Werte in den Speicher schreiben
    NEXT i

    b = REALLOCATE( a, 10 * LEN(INTEGER) ) ' Speicher für fünf zusätzliche Werte reservieren
    FOR i = 5 TO 9
    b[i] = (i + 1) * 2 ' Zusätzliche Werte in den Puffer schreiben
    NEXT i

    FOR i = 0 TO 9 ' Werte ausgeben
    PRINT b[i];
    NEXT i

    DEALLOCATE b ' Speicher freigeben

    Siehe auch:
    ALLOCATE, CALLOCATE, DEALLOCATE,
    Pointer

    Unterschiede: Neu in freeBASIC


REDIM

Syntax:
REDIM [SHARED] Array([Startindex TO] Endindex [, [Startindex TO] Endindex], [, ...]) [AS Typ]

Typ: Anweisung
Kategorie: Speicherverwaltung

Ändert die Größe eines Arrays, oder erstellt ein dynamisches Array.

  • Wenn REDIM benutzt wird, um ein Array erstmalig zu dimensionieren, bewirkt es,
    dass es als dynamisches Array erstellt wird, während DIM
    ein statisches Feld erstellt. Der Metabefehl DYNAMIC bzw. die Einstellung
    OPTION DYNAMIC unterbindet die Erstellung statischer Felder.

  • Wenn 'AS Datentyp' ausgelassen wird, prüft freeBASIC zuerst, ob ein Array
    mit dem angegebenen Namen bereits existiert, und übernimmt seinen Typ.
    Wenn noch kein Array mit diesem Namen existiert, wird der durch die letzte
    DEFxxx-Anweisung festgelegte Standard-Datentyp
    verwendet.

    • Beispiel: Ändern der Größe eines Arrays:
    '$DYNAMIC
    DIM x(3) AS INTEGER
    PRINT UBOUND(x)

    REDIM x(6)
    PRINT UBOUND(x)

    Siehe auch:
    DIM, PRESERVE,
    SCOPE,
    DYNAMIC (Metabefehl) STATIC (Metabefehl)
    UBOUND, LBOUND


REM

Syntax A: REM Kommentar
Syntax B: ' Kommentar
Syntax C:
/'
   Kommentare, mehrzeilig
'/
Typ: Anweisung
Kategorie: Verschiedenes

REM leitet einen Kommentar ein.
Ein Kommentar ist eine Zeile im Programm, die nicht ausgeführt wird; sie kann nützliche Informationen und Notizen enthalten.
Aufgrund besserer Übersichtlichkeit wird bevorzugt das Kommentarsymol (') benutzt. Es hat die selbe Funktion.
Wenn Sie einen größeren Kommentarblock einfügen wollen, können Sie dies mit den Kommentarblock-Zeichen realisieren; ein Kommentarblock beginnt
bei /' und endet bei '/.

Beispiel:
REM blabla etc etc

'Noch ein Kommentar.

/'
Diese Zeilen sind ebenfalls Kommentare.
Sie werden erst durch ein Kommentar-Ende-Zeichen beendet:
'/

#If 0
Auf diese Weise wurde in früheren Versionen ein Kommentarblock realisiert.
#EndIf

Unterschiede
zu QB:
  • Die Kommentarblock-Zeichen existierten unter QB nicht

    • zu früheren Versionen von freeBASIC:
  • Die Kommentarblock-Zeichen existieren erst seit freeBASIC v0.16s


RESET

Syntax: RESET
Typ: Anweisung
Kategorie: Datei

Schließt alle geöffneten Dateien.

Siehe auch:
OPEN, CLOSE


RESTORE

Syntax: RESTORE [label]
Typ: Anweisung
Kategorie: Speicherverwaltung

Gibt an, welche mit DATA gespeicherten Variablen von der nächsten
READ-Anweisung gelesen werden sollen. Bei großen Mengen eingebetteter
Daten kann RESTORE dazu verwendet werden, das einlesen zu organisieren, indem ein
Label angegeben wird, an dem das Lesen begonnen werden soll.
Wird 'Label' ausgelassen, beginnt freeBASIC das Einlesen bei der ersten DATA-
Anweisung.

Beispiel:
RESTORE bar
READ x
PRINT x

RESTORE
READ x, y
PRINT x, y

RESTORE foo
READ x,y
PRINT x,y

DATA 1,2
foo:
DATA 3
bar:
DATA 4

Ausgabe:
4
1       2
3       4
In diesem Beispiel wird nur eine kleine Datenmenge verwendet. Andere Anwendungen
haben jedoch oft größere Datenmengen zu verwalten, so dass die Organisation per
RESTORE sehr nützlich sein kann.

Siehe auch:
DATA, READ


RESUME

Syntax: RESUME [NEXT]
Typ: Anweisung
Kategorie: Fehlerbehandlung

Wird im Zusammenhang mit ON ERROR verwendet und kehrt von
einer Fehlerbehandlungsroutine zu der Anweisung, die den Fehler erzeugt hat zurück.

Das optionale NEXT hinter RESUME bewirkt, dass nach Abarbeitung der Fehlerbehandlungsroutine
nicht zu der Anweisung zurückgesprungen wird, die den Fehler hervorgerufen hat, sondern
zu der darauf folgenden Anweisung.

Beispiel
ON ERROR GOTO FehlerHandler

DIM File AS STRING
INPUT "Welche Datei oeffnen? ", File

OPEN File FOR INPUT AS #1
' ...
END

FehlerHandler:
PRINT "Datei existiert nicht"
INPUT "Bitte geben Sie eine andere Datei an: ", FILE
RESUME

Siehe auch:
ERROR, ON ERROR,
ERR,
GOTO


RETURN

Syntax: RETURN { Ausdruck | [Label] }
Typ: Anweisung
Kategorie: Programmorganisation

Kehrt von einem GOSUB-Aufruf zurück, oder fungiert als Kurzform für:
FUNCTION = Ausdruck : EXIT FUNCTION
oder für
EXIT SUB (erst ab freeBASIC v0.16b, März-Release)

  • Wird Return zum Rücksprung verwendet, ist 'Label' ein optionaler Parameter, der
    angibt, an welcher Stelle das Programm fortgesetzt werden soll.
    Das Label muss zum Zeitpunkt des RETURN-Aufrufs bereits definiert sein, darf
    also nicht hinter der RETURN-Anweisung liegen.
    Achtung: Seit freeBASIC v0.16b, März-Release darf RETURN auf
    Prozedurebene (also in SUBs und FUNCTIONs ausschließlich als Shortcut für
    EXIT SUB bzw. FUNCTION = Ausdruck : EXIT FUNCTION verwendet werden. Die
    Verwendung von GOSUB auf Prozedurebene ist nicht mehr möglich.

  • 'Ausdruck' ist ein beliebiger komplexer Ausdruck, dessen Wert von der
    FUNCTION zurückgegeben werden soll.

    • DECLARE FUNCTION twice (x AS INTEGER) AS INTEGER

    GOSUB message
    PRINT "Rufe jetzt Funktion auf"
    PRINT twice(4)
    END

    message:
    PRINT "Hello World!"
    RETURN

    FUNCTION twice (x AS INTEGER)
    RETURN 2 * x
    END FUNCTION

    Unterschiede
    (zu QB):
  • RETURN funktioniert auch als Shortcut für:
    FUNCTION = Ausdruck : EXIT FUNCTION

    • und
    EXIT SUB
  • RETURN kann nicht mehr auf Prozedurebene eingesetzt werden.

    • (zu früheren Versionen von freeBASIC)
  • Funktioniert seit v0.13 als Shortcut für
    FUNCTION = Ausdruck : EXIT FUNCTION

  • Funktioniert seit v0.16 auch als Shortcut für:
    EXIT SUB

  • RETURN kann seit v0.16 nicht mehr auf Prozedurebene eingesetzt werden.

    • Siehe auch:
    GOSUB,
    FUNCTION, SUB


RGB

Syntax: RGB(rot, grün, blau)
Typ: Funktion
Katerorie: Gfx

Errechnet die gültige 32-Farbnimmer in hi/truecolor-Bildschirmmodi bei
angegebenem Rot-, Grün- und Blau-Wert der Farbe.

'rot', 'grün' und 'blau' müssen dabei zwischen 0 und 255 liegen.

Das Ergebnis der RGB-Funktion entspricht einer Farbnummer im Format &HRRGGBB.
RR, GG und BB sind dabei die Farbkomponenten im Hexadezimalformat.

RGB ist ein Makro, das folgendermaßen definiert ist:
#DEFINE RGB(r,g,b) ((CUINT(r) SHL 16) OR (CUINT(g) SHL 8) OR CUINT(b))

Siehe PUT (Grafik) für ein Beispiel.

Siehe auch:
RGBA, COLOR (Anweisung)

Unterschiede: Neu in freeBASIC


RGBA

Syntax: RGB(rot, grün, blau, alpha)
Typ: Funktion
Katerorie: Gfx

Errechnet die gültige 32-Farbnimmer in hi/truecolor-Bildschirmmodi bei angegebenem
Rot-, Grün-, Blau- und Alpha-Wert der Farbe.

'rot', 'grün', 'blau' und 'alpha' müssen dabei zwischen 0 und 255 liegen.

Das Ergebnis der RGBA-Funktion entspricht einer Farbnummer im Format &HRRGGBBAA.
RR, GG, BB und AA sind dabei die Farbkomponenten im Hexadezimalformat.

RGBA arbeitet genauso wie RGB, abgesehen von der Möglichkeit,
einen Alpha-Wert (Transparenzgrad) anzugeben.
Intern wird diese Funktion so behandelt:
#DEFINE RGBA(r,g,b,a) ((CINT(a) SHL 24) OR (CINT(r) SHL 16) OR (CINT(g) SHL 8) OR CINT(b))

Siehe IMAGECREATE für ein Beispiel.

Siehe auch:
RGB, COLOR (Anweisung)

Unterschiede: Neu in freeBASIC


RIGHT

Syntax: RIGHT[$](Text AS STRING, n)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt die letzten 'n' Zeichen des angegebenen Strings 'Text' zurück.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
Text$ = "hello world"
PRINT RIGHT(Text$, 5) 'Ausgabe: "world"

Siehe auch:
LEFT, MID (Funktion)


RMDIR

Syntax: RMDIR (Verzeichnis)
Typ: Funktion
Kategorie: Datei

Löscht ein Verzeichnis aus dem Dateisystem. Das angegebene Verzeichniss darf
keine Dateien oder Unterordner enthalten.

  • 'Verzeichnis' ist ein String, der den Namen des Ordners enthält, der gelöscht
    werden soll. Enthält dieser String eine komplette Pfadangabe, so wird der
    neue Ordner nicht aus dem aktuellen Arbeitsverzeichnis, sondern aus dem angegebenen
    Pfad gelöscht.

  • Der Rückgabewert ist entweder 0, wenn der Ordner erstellt werden konnte,
    oder -1, wenn ein Fehler aufgetreten ist. Dies kann z.B. bedeuten, dass kein
    Ordner mit angegebenen Namen existiert, dass sich noch Dateien im Ordner
    befinden, oder dass auf das angegebe Gerät nicht zugegriffen werden
    kann (z.B. auf eine CD)

    • Beispiel:
    MKDIR "foo" ' Sicherstellen, dass ein Verzeichnis mit Namen foo existiert
    IF RMDIR("foo") THEN PRINT "In "; CURDIR; "\foo\ befinden sich noch Dateien!"

    ACHTUNG: der Ordner wird nicht in den Windows-Papierkorb verschoben,
    sondern unwiederbringlich gelöscht!

    Siehe auch:
    CHDIR, MKDIR, CURDIR,
    SHELL

    Unterschiede:
    zu QB:
  • Da freeBASIC ein 32bit-Compiler ist, werden auch lange Ordnernamen bis zu 255
    Zeichen akzeptiert; die kurzen DOS-Namen sind nicht nötig.

  • RMDIR kann auch als Funktion eingesetzt werden.


RND

Syntax: RND[(Wiederholung)]
Typ: Funktion
Kategorie: Verschiedenes

Gibt eine zufällige Fließkommazahl zwischen 0 und 1 zurück,
abhängig von der mit RANDOMIZE gesetzten Startzahl.

'Wiederholung' ist ein optionaler Parameter, der entweder gleich oder ungleich
null ist. Wenn er gleich null ist, wird immer die selbe Zufallszahl ausgegeben;
ist er ungleich null, oder wird ausgelassen, wird die nächste Zufallszahl der
Liste ausgegeben.

Beispiel:
RANDOMIZE TIMER

PRINT "Ausgabe von 3 Zufallszahlen zwischen 1 und 6"
FOR i = 1 TO 3
PRINT RND * 5 + 1
NEXT

Siehe auch:
RANDOMIZE

Unterschiede (zu QB):
Das optionale Argument unterscheidet nur zwischen null und ungleich null; der
RND-Reset RND(-1) ist damit unmöglich. Stattdessen muss der Zufallsgenerator mit
RANDOMIZE zurückgesetzt werden.


RSET

Syntax: RSET Ziel AS STRING, Quelle AS STRING
Typ: Anweisung
Kategorie: Stringmanipulation

RSET befüllt den String 'Ziel' mit dem String 'Quelle', behält aber die Länge von
'Ziel' bei.
Es wird benutzt, um Strings rechtsbündig zu formatieren.

War der String 'Ziel' vor der Bearbeitung mit RSET fünf Zeichen lang, so ist er
auch nach der Bearbeitung noch fünf Zeichen lang, unabhängig von der Länge des
Strings Quelle.
Ist der String 'Quelle' länger als 'Ziel', so werden die vorderen Zeichen des
Strings nach 'Ziel' kopiert, der Rest von 'Quelle' wird ignoriert.

Der String 'Quelle' bleibt bei der Operation komplett unverändert.

DIM Quelle AS STRING
DIM Ziel AS STRING

Ziel = "012345679"
Quelle = "***"
PRINT Ziel, Quelle

RSET Ziel, Quelle
PRINT Ziel, Quelle
Ausgabe:
0123465789   ***
       ***   ***

Siehe auch:
LSET

Unterschiede (zu QB):
Die Syntax ist nicht mehr RSET Ziel=Quelle, sondern RSET Ziel, Quelle


RTRIM

Syntax: RTRIM[$](Stringausdruck [, [ANY] Entfernen])
Typ: Funktion
Kategorie: Stringmanipulation

RTRIM (right trim) entfernt bestimmte aneghängte Zeichen aus einem String.

Das Dollarzeichen ($) als Suffix ist optional.

  • 'Stringausdruck' ist der String, der gekürzt werden soll.

  • 'Entfernen' ist ein String, der angibt, welche Zeichen entfernt werden
    sollen. Wird dieser Parameter ausgelassen, entfernt freeBASIC automatisch
    alle Leerzeichen am Ende des Strings.
    'Entfernen' darf aus mehreren Zeichen bestehen.

  • Wird die ANY-Klausel verwendet, entfernt freeBASIC jedes Zeichen aus
    'Entfernen' vom Ende von 'Stringausdruck'

    • Beispiel:
    PRINT LEN( RTRIM("hello ") )
    PRINT RTRIM("hello World", "ld")
    PRINT RTRIM("hello World", "dl")
    PRINT RTRIM("hello World", ANY "dl")
    Ausgabe:
    5
    hello Wor
    hello World
    hello Wor

    Unterschiede:
    (Zu QB):
  • Die ANY-Klausel ist neu in freeBASIC

    • zu früheren Versionen
  • Die ANY-Klausel und der Parameter 'Entfernen' kann erst seit freeBASIC v0.15
    eingesetzt werden.

    • Siehe auch:
    LTRIM, TRIM, INSTR


RUN

Syntax: RUN (Datei)
Typ: Funktion
Kategorie: Programmorganisation

RUN startet eine ausführbare Datei.

  • 'Datei' ist ein STRING, der den vollen Dateinamen (inclusvie Erweiterung .exe)
    der auszuführenden Datei enthält.

  • Der Rückgabewert ist entweder 0, wenn das Programm ordnungsgemäß aufgerufen
    werden konnte, oder -1, wenn ein Fehler aufgetreten ist, z.B. wenn die
    aufzurufende Datei nicht existiert.

    • Nachdem das aufgerufene Programm beendet wurde, erhält das aufrufende
    Programm die Kontrolle nicht mehr zurück. Sie wird ans Betriebssystem
    zurückgegeben.
    Das Bedeutet, dass als Rückgabewert von RUN immer -1 aufgefangen wird, da bei
    Rückgabewert = 0 das Programm ja schon beendet wurde.

    Beispiel:
    Wenn die Datei "file.exe" im aktuellen Arbeitsverzeichnis existiert, wird sie
    durch diesen Code aufgerufen:
    RUN "file.exe"
    PRINT "file.exe" existiert nicht."
    (Da das Programm automatisch beendet wird, wenn file.exe gestartet wird, muss
    nicht geprüft werden, ob der Rückgabewert -1 war.)

    Unterschiede:
    zu QB:
  • Der volle Dateiname inklusive Erweiterung (.exe) muss angegeben werden.

  • RUN kann als Funktion eingesetzt werden

    • Siehe auch:
    CHAIN, EXEC, SHELL,
    END,COMMAND,
    CONSTRUCTOR, DESTRUCTOR


Liste der Schlüsselwörter beginnend mit S

SADD
SCOPE
SCREEN
SCREEN (Anweisung)
SCREEN (Funktion)
SCREENCONTROL
SCREENCOPY
SCREENEVENT
SCREENINFO
SCREENLIST
SCREENLOCK
SCREENPTR
SCREENRES
SCREENSET
SCREENSYNC
SCREENUNLOCK
SCRN
SECOND
SEEK Funktion
SEEK Anweisung
SELECT
SELECT CASE
SETDATE
SETENVIRON
SETMOUSE
SETTIME
SGN
SHARED
SHELL
SHL
SHORT
SHR
SIN
SINGLE
SIZEOF
SLEEP
SPACE
SPC
SQR
STATIC
STATIC (Anweisung)
STATIC (Klausel)
STATIC (Metabefehl)
STATIC (Schlüsselwort)
STDCALL
STEP
STOP
STR
STRPTR
STRING
STRING (Datentyp)
STRING (Funktion)
SUB
SWAP
SYSTEM


SADD

Syntax: SADD (StringVariable)
Typ: Funktion
Kategorie: Speicherverwaltung

Gibt einen Pointer auf eine STRING-Variable zurück.
Achtung: SADD kann nicht durch die Syntax
@StringVariable
ersetzt werden!
(Siehe STRING für Erklärung)

SADD ist ein Alias für STRPTR.

Beispiel:
DIM s AS STRING
PRINT SADD(s)

s = "hello"
PRINT SADD(s)

s = "abcdefg, 1234567, 54321"
PRINT SADD(s), @s

POKE UBYTE, SADD(s$), 65
PRINT s

Unterschiede
zu QB:
  • Auch die Adressen von STRINGs fester Länge können ausgegeben werden.

  • Da freeBASIC ein 32bit-Compiler ist, wird eine 32bit-Adresse ausgeben; in freeBASIC wurde hier ein 16bit-Offset ausgegeben, das
    Segment musste zusätzliche ermittelt werden.

    • Siehe auch:
    STRING (Datentyp),
    VARPTR, STRPTR,
    PEEK, POKE,
    Pointer


SCOPE

Typ: Anweisung
Kategorie: Speicherverwaltung
Syntax:
SCOPE
   ...
END SCOPE

Ein SCOPE-Block ermöglicht es Ihnen, Variablen temporär zu (re)dimensionieren
und zu benutzen.
Wenn eine Variable innerhalb einer SCOPE-Struktur dimensioniert wird, kann Sie
nur bis zum Ende des SCOPE-Blocks verwendet werden; innerhalb dieses Blocks
werden alle Variablen mit dem selben Bezeichner ignoriert. Auf den Wert
gleichnamiger Variablen außerhalb des SCOPE-Blocks kann innerhalb des Blocks nicht
zugegriffen werden. Am Ende des Blocks wird der Wert der gleichnamigen
Bezeichner wiederhergestellt, selbst wenn er innerhalb des Blocks geändert wurde.

Alle Anweisungen innerhalb eines SCOPE-Blocks vor der Redimensionierung einer
Variable werden auf die Variable zugreifen, die außerhalb des Blocks definiert
wurde.

SCOPEs dürfen bis zu einem beliebigen Grad ineinander Verschachtelt sein. Sie
können sowohl auf Modulebene als auch auf Prozedurebene verwendet werden; siehe
Prozeduren

Beispiel 1:
DIM AS INTEGER x = 1, y = 2
PRINT "Initialisierung:"
PRINT "x ="; x; ", "; "y ="; y
PRINT

SCOPE
x += 1
y += 1
PRINT "x und y werden im ersten SCOPE um eins erhoeht."
PRINT "x ="; x; ", "; "y ="; y
PRINT

DIM x AS INTEGER = 11
PRINT "Erstes SCOPE, Redimensionierung von x"
PRINT "x ="; x; ", "; "y ="; y
PRINT

SCOPE
DIM y AS INTEGER = 12
PRINT "Zweites SCOPE, Redimensionierung von y"
PRINT "x ="; x; ", "; "y ="; y
PRINT
END SCOPE

END SCOPE

PRINT "nach den SCOPEs"
PRINT "x ="; x; ", "; "y ="; y
GETKEY
Ausgabe:
Initialisierung:
x = 1, y = 2

x und y werden im ersten SCOPE um eins erhoeht.
x = 2, y = 3

Erstes SCOPE, Redimensionierung von x
x = 11, y = 3

Zweites SCOPE, Redimensionierung von y
x = 11, y = 12

nach den SCOPEs
x = 2, y = 3

Unterschiede
zu QB:
  • Neu in freeBASIC.

    • zu früheren Versionen von freeBASIC
  • SCOPE existiert erst seit freeBASIC v0.15

    • Siehe auch:
    DIM, REDIM


SCREEN (Anweisung)

Syntax: SCREEN Modus[,[ Farbtiefe][,[ ZahlDerSeiten][, Flags[, Bildwiederholrate]]]]
Typ: Anweisung
Kategorie: Gfx

SCREEN setzt den aktuellen Bildschirm-Grafik-Modus.
(Dieser Befehl ist sehr umfangreich; daher finden sie zuerst eine Kurzbeschreibung der Parameter, und weiter unten eine detaillierte
Erklärung zu jedem Parameter.)

  • 'Modus' ist die Nummer des Bildschirmmodus. (Siehe unten.)

  • 'Farbtiefe' ist die Farbtiefe in Bits pro Pixel (bpp).
    Wenn Sie diesen Parameter auslassen, wird die Standard-Farbtiefe für den angegebenen Modus verwendet. Achtung: Die Farbtiefe kann
    im Fenstermodus nicht über der Farbtiefe des Windows-Desktops liegen; wird dennoch eine höhere Farbtiefe angegeben, setzt freeBASIC
    diese automatisch auf die Windows-Farbtiefe zurück.
    (Keine Informationen zu Linux...)

  • 'ZahlDerSeiten' ist die Zahl der Bildschirmseiten, die im Speicher reserviert werden sollen. (Die Verwendung mehrerer
    Bildschirmseiten ermöglicht weichere Animationen).
    Wenn Sie diesen Parameter auslassen, nimmt freeBASIC 1 an.

  • 'Flag' gibt verschiedene Modusinformationen an. (Siehe unten.)
    Wenn dieser Parameter ausgelassen wird, nimmt freeBASIC automatisch 0 an.

  • 'Bildwiederholrate' gibt die Bildwiederholrate in Hz an. Wenn dieser Parameter ausgelassen wird, nimmt freeBASIC automatisch 0 an.
    Dadurch wird automatisch die günstigste Rate ermittelt.

    • Bedeutung der Modi (Auszug aus dem Englischen Handbuch):
    Modus | Auflösung | Text | Farben
0 | Textmodus | 80x25 oder 80x50 Text Spalten / Zeilen, 8x14 Zeichensatz oder 8x8 Zeichensatz. | Jeweils 16 Vorder- und Hintergrundfarben aus der Standardpalette
1 | 320x200 in CGA Emulation. | 40x25 Text Spalten / Zeilen, 8x8 Zeichensatz. | 16 Hintergrundfarben und einen von 4 Fordergrundsets für die COLOR-Anweisung.
2 | 640x200 in CGA Emulation. | 80x25 Text Spalten / Zeilen, 8x8 Zeichensatz. | Gleichzeitig je 2 Farben aus der Standardpalette
7 | 320x200 in EGA Emulation. | 40x25 Text Spalten / Zeilen, 8x8 Zeichensatz. | Gleichzeitig je 16 Farben aus der Standardpalette
8 | 640x200 in EGA Emulation. | 80x25 Text Spalten / Zeilen, 8x8 Zeichensatz. | Gleichzeitig je 16 Farben aus der Standardpalette
9 | 640x350 in EGA Emulation. | 80x25 oder 80x43 Text Spalten / Zeilen, 8x14 oder 8x8 Zeichensatz. | Gleichzeitig je 16 Farben aus der Standardpalette
11 | 640x480 in VGA Emulation. | 80x30 oder 80x60 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 2 Farben aus einem 18bit-Farbraum
12 | 640x480 in VGA Emulation. | 80x30 oder 80x60 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 16 Farbein aus einem 18bit-Farbraum
13 | 320x200 in MCGA Emulation. | 40x25 Text Spalten / Zeilen, 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum
14 | 320x240 | 40x30 Text Spalten / Zeilen, 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
15 | 400x300 | 50x37 Text Spalten / Zeilen, 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
16 | 512x384 | 64x24 oder 64x48 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
17 | 640x400 | 80x25 oder 80x50 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
18 | 640x480 | 80x30 oder 80x60 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
19 | 800x600 | 100x37 oder 100x75 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
20 | 1024x768 | 128x48 oder 128x96 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor
21 | 1280x1024 | 160x64 oder 160x128 Text Spalten / Zeilen, 8x16 oder 8x8 Zeichensatz. | Gleichzeitig je 256 Farben aus einem 18bit-Farbraum oder Truecolor

    Flags ist einer von diesen Werten, die durch ein logisches OR miteinander verknüpft werden können:
    (Binden Sie per #INCLUDE die Datei "fbgfx.bi" ein, um die Bezeichner in der Spalte 'Symbol' verwenden zu
    können)
    Bitte beachten Sie, dass in den Versionen der Datei 'fbgfx.bi', die ab freeBASIC v0.17 ausgeliefert werden, die genannten Konstanten
    Elemente des NAMESPACEs 'FB' sind.
    Wert | Symbol | Wirkung
&H00 | GFX_WINDOWED | Normaler Fenstermodus; Standard-Option.
&H01 | GFX_FULLSCREEN | Vollbildmodus
&H02 | GFX_OPENGL | OpenGL-Modus
&H04 | GFX_NO_SWITCH | kein Moduswechsel
&H08 | Vor v0.17: //kein Symbol// Ab v0.17: GFX_NO_FRAME | Vor v0.17: //keine Belegung// Ab v0.17: Kein Rahmen
&H10 | Vor v0.17: GFX_STENCIL_BUFFER Ab v0.17: GFX_SHAPED_WINDOW | Vor v0.17: Stencil Buffer (Schablonenpuffer) verwenden (nur im OpenGL-Modus) Ab v0.17: Splashscreen-Modus
&H20 | Vor v0.17: GFX_STENCIL_BUFFER Ab v0.17: GFX_ALWAYS_ON_TOP | Vor v0.17: Accumulation Buffer verwenden (nur im OpenGL-Modus) Ab v0.17: Fenster, das immer auf oberster Ebene bleibt
&H40 | Vor v0.17: //kein Symbol// Ab v0.17: GFX_ALPHA_PRIMITIVES | Vor v0.17: //keine Belegung// Ab v0.17: Bearbeite auch ALPHA-Werte bei Drawing Primitives wie PSET, LINE, ...
&H10000 | Vor v0.17: //kein Symbol// Ab v0.17: GFX_ACCUMULATION_BUFFER | Vor v0.17: //keine Belegung// Ab v0.17: Accumulation Buffer (nur im OpenGL-Modus)
&H20000 | Vor v0.17: //kein Symbol// Ab v0.17: GFX_ACCUMULATION_BUFFER | Vor v0.17: //keine Belegung// Ab v0.17: Stencil Buffer (Schablonenpuffer) verwenden (nur im OpenGL-Modus)
&H40000 | Vor v0.17: //kein Symbol// Ab v0.17: GFX_MULTISAMPLE | Vor v0.17: //keine Belegung// Ab v0.17: Bewirkt Vollbild-Antialiasing durch die ARB_multisample-Erweiterung
-1 | GFX_NULL | Grafikmodus ohne visuelles Feedback
  • Wenn das Vollbild-Flag gesetzt ist, wird SCREEN versuchen, den angegebenen Bildschirmmodus zu initialisieren; Wenn es gesetzt ist,
    und das System den Bildschirm nicht im Vollbildmodus initialisieren kann, wird SCREEN versuchen den Bildschirm im Fenstermodus zu
    initialisieren.
    Wenn das Vollbild-Flag nicht gesetzt ist, und das System den Bildschirm nicht im Fenstermodus initialisieren kann, wird SCREEN
    versuchen, den Bildschirm im Vollbildmodus zu initialisieren.
    Wenn beide Versuche fehlschlagen, hat SCREEN keine Auswirkungen.

  • Wenn das OpenGL-Flag gesetzt ist, initiiert die GfxLib den OpenGl-Modus. Alle Drawing Primitives haben keine Auswirkungen, und der
    Bildschirm wird nicht automatisch aktualisiert. Im OpenGL-Modus stehen ihnen nur ein funktionierendes OpenGL-Fenster und die
    Befehle zum direkten Speicherzugriff auf den VideoRAM zur Verfügung.
    Wenn Sie eine Bildschirmaktualisierung durchführen wollen, benutzen Sie die FLIP-Anweisung.

  • Wenn das Moduswechsel-Flag gesetzt ist, kann der User nicht mehr mit [ALT]+[ENTER] zwischen Vollbild- und Fenstermodus hin- und
    herschalten. Der Maximieren-Button am Fenster erscheint als inaktiv.
  • Wenn das Stencil Buffer Flag gesetzt ist, wird ein Stencil Buffer (Schablonenpuffer) erstellt. Dieser Buffer wird verwendet, um
    Pixel zu maskieren, d.h. die Farbe bestimmter Pixel durch eine andere Farbe zu ersetzten oder diese erst gar nicht zu zeichnen.
    Man kann dieses Flag nur setzen, wenn man OpenGL verwendet.

  • Das Accumulation Flag hat auch nur im OpenGL Modus eine Wirkung. Dadurch wird ein Accumulation Buffer erstellt. Dieser kann eine
    höhere Auflösung haben als der Bildschirmmodus. Somit kann man eine Szene z.B. mit einer Auflösung von 1024x768 in den Puffer
    zeichnen, aber mit einer Auflösung von 800x600 auf den Bildschirm rendern. Dies bewirkt eine Glättung der gesamten Szene.
    (Anti-Aliasing)

  • Das Rahmen-Flag bewirkt, dass auf dem Bildschirm ein Grafikbereich ohne Titelleiste und Fensterrahmen erscheint. Der User kann
    dieses Fenster mit der Maus nicht verschieben und es hat keinen Schließen-, Maximieren- und Minimieren-Button. Allerdings reagiert
    das Fenster auf die üblichen Tastaturkommandos, wechselt also mit [ALT] + [ENTER] in den Vollbildmodus, und wird mit [WINDOWSTASTE] + [D]
    minimiert. Es erscheint in der Taskleiste, bekommt dort aber kein Kontextmenü.
    Sinnvollerweise wird dieses Flag nicht mit dem Vollbild-Flag kombiniert.
    Das Rahmen-Flag existiert erst seit freeBASIC v0.17.
  • Das Splashscreen-Flag bewirkt das selbe wie das Rahmen-Flag. Zusätzlich ist die transparente Farbe (modusabhängig) in diesem Fall
    tatsächlich transparent, d.h. der Desktop bzw. die Fenster, die sich hinter dem freeBASIC-Gfx-Fenster befinden, sind 'durch das
    Gfx-Fenster hindurch' sichtbar.
    Siehe PUT (Grafik) für die Transparenzfarben.
    Sinnvollerweise wird dieses Flag nicht mit dem Vollbild-Flag kombiniert.
    Ein Klick auf transparente Flächen wird von SCREENEVENT nicht erkannt; nur 'solide Flächen' werden für die Ereigniserkennung
    beachtet. Es ist auch möglich, 'durch das Fenster hindurch' Elemente anzuklicken, die sich hinter transparenten Flächen befinden.
    Das Splashscreen-Flag existiert erst seit freeBASIC v0.17.
  • Der Grafikmodus ohne visuelles Feedback aktiviert alle Grafikbefehle und reserviert einen entsprechenden Speicherbereich. Auf dem
    Bildschirm werden diese Änderungen jedoch nicht sichtbar.
    Mit GET (Grafik) können von dieser virtuellen Bildschirmseite Ausschnitte eingelesen werden, und
    später in einem sichtbaren Bildschirmmodus mit PUT (Grafik) ausgegeben werden.
    Nützlich, um Grafiken für Betriebssystem-Abhängige Systeme (GDI, Gtk, etc.) einzubinden.
    Wird dieses Flag benutzt, können keine weiteren Flags verwendet werden.

  • Wenn ein Bildschirmmodus einmal eingestellt wurde, können Sie ihn jederzeit durch drücken von [ALT]+[ENTER] zwischen Vollbild- und
    Fenstermodus umschalten, vorausgesetzt, das System unterstützt dies, und das Umschalten wurde nicht durch Verwendung des
    Moduswechsel-Flags unterbunden.

  • Für die Bildschirmmodi 14 und höher bestimmt der Parameter 'Farbtiefe' die Farbtiefe in bpp (Standard ist 8). Für die darunter liegenden
    Modi hat 'Farbtiefe' keine Auswirkung.

  • 'ZahlDerSeiten' gibt an, wie viele Bildschirmseiten reserviert werden sollen.
    Eine Bildschirmseite ist entweder ein Speicherbereich, in dem die Daten gespeichert sind, die auf dem Bildschirm ausgegeben werden
    sollen (sichtbare Seite), oder ein Datenpuffer der selben Größe wie die der sichtbaren Seite.
    (Ein solcher Puffer wird aktive Seite oder Arbeitsseite genannt).
    Sie können auf einer Seite arbeiten, während die andere angezeigt wird; siehe dazu die SCREENSET-Anweisung.
    Sie können beliebig viele Bildschirmseiten reservieren (die einzige Grenze stellt der verfügbare Speicher dar). Wenn Sie 'ZahlDerSeiten'
    nicht angeben, wird nur die aktive Seite (mit der Nummer 0) verfügbar sein.
  • Anders als im Konsole-Modus wird ein Programm beim Klick auf den Schließen-Button nicht beendet; stattdessen wird ein CHR(255) + "k" in den
    Tastaturpuffer geschrieben, der mit INKEY abgerufen werden kann. Diese Kombination entspricht [ALT] + [F4]
    Ein Klick auf den Maximieren-Button hingegen wird automatisch in den Vollbildmodus wechseln, wenn er verfügbar ist.

  • 'Bildwiederholrate' ermöglicht es ihnen, eine Bildwiederholrate für den angegebenen Modus zu setzen. Diese Rate wird nicht unbedingt
    umgesetzt; wenn freeBASIC den Bildschirmmodus nicht mit der angegebenen Rate initialisieren kann, wird es einfach die erste funktionierende
    Rate verwenden. Wenn dieser Parameter ausgelassen wird, nimmt freeBASIC automatisch 0 an. Dadurch wird automatisch die günstigste Rate
    ermittelt.

    • FreeBASIC wird versuchen, den Bildschirmmodus so gut wie möglich zu initialisieren; wenn alle Versuche fehlschlagen, hat SCREEN keine Auswirkungen.
    Die Ausführung des Programms wird mit der Zeile nach der SCREEN-Anweisung fortgesetzt. Sie sollten daher nachprüfen, ob der Bildschirmmodus
    erfolgreich initialisiert wurde; dies können Sie mit der SCREENPTR-Funktion tun:
    SCREEN 14, 16
    IF SCREENPTR = 0 THEN
    PRINT "Fehler! Grafikbildschrim konnte nicht initiiert werden!"
    END
    END IF

    '...

    Standardmäßig wird nach einem erfolgreichen SCREEN-Aufruf der Mauscursor angezeigt; sie können ihn mit SETMOUSE verbergen.

    Ein erfolgreicher SCREEN-Aufruf setzt ...
  • die Nummer der sichtbaren als auch die der aktiven Bildschirmseite auf 0

  • die Palette (siehe Standardpaletten) zurück

  • die Clipping-Bereiche (bestimmt durch die vorhergehenden WINDOW und
    VIEW (Grafik)-Anweisungen) des Bildschirms zurück
  • den Text-Cursor in die obere linke Ecke des Bildschirms

  • den Grafik-Cursor in die Mitte des Bildschirms

  • die Vordergrundfarbe auf Helleweiß (Farbnummer 15 in Modi bis zu 8bpp
    bzw. &hFFFFFF in allen höheren Modi)
  • die Hintergrundfarbe auf Schwarz (Farbnummer 0)

    • Beispiel:
    ' Bildschirmmodus 640x480x32bpp mit 4 Bildschirmseiten im Vollbildmodus
    ' einstellen:
    SCREEN 18, 32, 4, 1
    IF SCREENPTR = 0 THEN
    PRINT "Fehler beim initialisieren des Bildschirmmodus!"
    END
    END IF

    Unterschiede
    zu QB:
  • QBASIC erlaubte keine SCREEN-Flags.

  • freeBASICs SCREEN erlaubt die Bestimmung zusätzlicher Eigenschaften des Bildschirms, wie Farbtiefe, Zahl der Bildschirmseiten und
    wahlweisem Vollbild- oder Fenstermodus.

  • Die Bedeutung der Parameter ist nicht mehr die selbe wie in QB.

  • Es gibt mehr verfügbare Bildschirmmodi.

    • zu früheren freeBASIC-Versionen
  • Seit freeBASIC v0.17 existieren die SCREEN-Flags 'GFX_NO_FRAME', 'GFX_SHAPED_WINDOW', 'GFX_ALPHA_PRIMITIVES', 'GFX_ALWAYS_ON_TOP'
    und 'GFX_GFX_MULTISAMPLE'.

  • Die SCREEN-Flags 'GFX_STENCIL_BUFFER' und 'GFX_ACCUMULATION_BUFFER' haben seit v0.17 eine neue Belegung.

  • Erst seit freeBASIC v0.17 führt ein Aufruf von SCREEN 0 zu einem 80x25-Textmodus mit geleertem Bildschirm

  • Der Grafikmodus ohne visuelles Feedback existiert erst seit v0.15 (Screen-Flag 'GFX_NULL')

  • Das kein-Moduswechsel-Flag exisitert erst seit v0.15 (Screen-Flag 'GFX_NO_SWITCH')

  • Die Möglichkeit, eine Bildwiederholrate anzugeben, existiert erst seit v0.13

    • Siehe auch:
    SCREEN (Funktion)
    PALETTE,
    COLOR (Anweisung), LOCATE (Anweisung),
    SCREENLOCK, SCREENUNLOCK, SCREENPTR,
    SCREENSET, SCREENCOPY, SCREENSYNC,
    SCREENINFO, SCREENLIST,
    SCREENEVENT, SCREENCONTROL,
    PSET (Grafik)


SCREEN (Funktion)

Syntax: SCREEN (Zeile, Spalte, Typ)
Typ: Funktion
Kategorie: Konsole

Gibt Informationen über den Text im Konsole- oder Grafik-Fenster zurück.

  • 'Zeile' ist die Zeile (der Hochwert), in der das Zeichen steht, über
    das Informationen ausgegeben werden sollen.

  • 'Spalte' ist die Spalte (der Rechtswert), in der das Zeichen steht, über
    das Informationen ausgegeben werden sollen.

  • 'Typ' ist die Art der Information, die ausgegeben werden soll.
    Wird hier null angegeben, ist der Rückgabewert der ASCII-Code des
    Zeichens an der angegebenen Position
    Wird hier eins angegeben, ist der Rückgabewert die Farbe des
    Zeichens an der angegebenen Position in der Form
    Vordergrund OR (Hintergrund SHL 8)

    • Beispiel:
    WIDTH 80, 25

    FOR i = 1 TO 16
    COLOR i, (i + 8) MOD 16
    PRINT "1234567890"
    NEXT

    COLOR 15, 0
    LOCATE 1, 20
    PRINT "ASCII-Code in Zeile 5, Spalte 7:"
    LOCATE 2, 20
    PRINT SCREEN(5, 7, 0)

    LOCATE 4, 20
    PRINT "Vordergrundfarbe in Zeile 2, Spalte 10:"
    LOCATE 5, 20
    PRINT (SCREEN(2, 10, 1)) MOD 16

    LOCATE 7, 20
    PRINT "Hintergrundfarbe in Zeile 7, Spalte 5:"
    LOCATE 8, 20
    PRINT (SCREEN(7, 5, 1)) \ 16

    SLEEP

    Siehe auch:
    SCREEN (Anweisung),
    LOCATE, COLOR (Anweisung), WIDTH (Anweisung),
    PRINT (Anweisung)


SCREEN

Typ: Anweisung/Funktion

SCREEN ist ein Schlüsselwort, das als Anweisung und als Funktion eingesetzt
werden kann.
Siehe:
SCREEN (Anweisung)
SCREEN (Funktion)


SCREENCONTROL

Syntax A: SCREENCONTROL Option, [param1 [, param2 [, param3 [, param4]]]]
Syntax B: SCREENCONTROL Option, caption
Typ: Anweisung
Kategorie: Grafik

SCREENCONTROL ermittelt oder bearbeitet Einstellungen der GfxLib.

  • 'Option' ist ein INTEGER-Wert, der festlegt, welche Einstellungen bearbeitet oder ermittelt werden sollen.

  • 'param1', 'param2', 'param3' und 'param4' sind Variablen, die entweder die neuen Einstellungen enthalten, wenn solche geändert
    werden sollen, oder die die abgefragen Einstellungen aufnehmen.
    Alle param-Variablen sind vom Typ INTEGER.

  • 'caption' ist eine STRING-Variable, die ebenso wie die param-Variablen eingesetzt werden.

    • Diese Werte können für 'Option eingesetzt werden:
    Bitte beachten Sie, dass die angegebenen Konstanten aus der fbgfx.bi Elemente des NAMESPACEs 'FB' sind.
    Alle param-Variablen, die hier nicht erwähnt sind, werden mit null ausgefüllt.
    Wert | Konstante in der fbgfx.bi | Bedeutung
0 | GET_WINDOW_POS | Gibt die aktuelle Position des Grafikfensters als Desktopkoordinaten an. param1 enthält dabei die X-Koordinate, param2 die Y-Koordinate. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 und param2 der Wert 0 zurückgegeben.
1 | GET_WINDOW_TITLE | Gibt den Titel des Programmfensters in caption zurück. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so in caption wird ein Leerstring zurückgegeben.
2 | GET_WINDOW_HANDLE | Gibt den Handle des aktiven Programmfensters in param1 zurück. Der Handle ist eine Zahl, die das Fenster im System identifiziert. Unter Windows ist dieser Wert ein HWND. Unter X11 stellt es eine "Window" XID dar. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 der Wert 0 zurückgegeben.
3 | GET_DESKTOP_SIZE | Gibt die aktuelle Größe des Desktops in Pixeln an. param1 enthält dabei die Breite, param2 die Höhe des Desktops.
4 | GET_SCREEN_SIZE | Gibt die aktuelle Größe des Grafikfensters in Pixeln an. param1 enthält dabei die Breite, param2 die Höhe des Grafikfensters. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 und param2 der Wert 0 zurückgegeben.
5 | GET_SCREEN_DEPTH | Gibt die aktuelle Farbtiefe des Grafikfensters in Bits pro Pixel in param1 zurück. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 der Wert 0 zurückgegeben.
6 | GET_SCREEN_BPP | Gibt die aktuelle Farbtiefe des Grafikfensters in Bytes pro Pixel in param1 zurück. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 der Wert 0 zurückgegeben.
7 | GET_SCREEN_PITCH | Gibt in param1 die Breite einer Bildschirmzeile in Bytes aus; dieser Wert ist das Produkt aus der Breite in Pixeln und der Farbtiefe in Bytes pro Pixel. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 der Wert 0 zurückgegeben.
8 | GET_SCREEN_REFRESH | Gibt in param1 die Bildwiderholrate in Hertz zurück. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 der Wert 0 zurückgegeben.
9 | GET_DRIVER_NAME | Gibt den Namen des aktiven Grafiktreibers in caption zurück. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in caption ein Leerstring zurückgegeben.
10 | GET_TRANSPARENT_COLOR | Gibt die aktuelle Maskenfarbe in param1 zurück, die von der aktuellen Farbtiefe abhängig ist. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 der Wert 0 zurückgegeben.
11 | GET_VIEWPORT | Gibt die Koordinaten des aktuellen Viewports (der Clipping-Regionen, die durch VIEW (Grafik) gesetzt wurden, zurück. Dabei nehmen param1 und param2 die X- und Y-Koordinate der linken oberen Ecke, und param3 und param4 die X- und Y-Koordinate der rechten unteren Ecke des Viewports auf. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird param1 und param2 der Wert 0 zurückgegeben.
12 | GET_PEN_POS | Gibt die X- und Y-Koordinate des Grafikcursors in Grafikfensterkoordinaten in param1 und param2 aus. Diese Koordinaten werden von Grafik-Anweisungen benutzt, die über das STEP-Schlüsselwort relative Koordinaten unterstützen. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 und param2 der Wert 0 zurückgegeben.
13 | GET_COLOR | Gibt die von COLOR (Anweisung) festgelegten Farben zurück; param1 nimmt dabei die Vordergrundfarbe, param2 die Hintergrundfarbe auf. Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde, so wird in param1 und param2 der Wert 0 zurückgegeben.
100 | SET_WINDOW_POS | Legt die Position des Grafikfensters in Desktopkoordinaten fest; param1 und param2 sind dabei die neue X- und Y-Koordinate des Grafikfensters relativ zum linken oberen Bildschirmrand. Diese Aktion kann nur ausgeführt werden, wenn bereits ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde. Andernfalls hat die Aktion keine Auswirkungen.
101 | SET_WINDOW_TITLE | Ändert den Text in der Titelleiste des aktiven Fensters. caption enthält dabei den neuen Titel des Fensters. Diese Aktion hat die selbe Auswirkung wie WINDOWTITLE caption (Siehe WINDOWTITLE. Diese Aktion kann nur ausgeführt werden, wenn bereits ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde. Andernfalls hat die Aktion keine Auswirkungen.
102 | SET_PEN_POS | Bestimmt die Position des Grafikcursors. param1 und param2 enthalten dabei die neue X- und Y-Koordinate des Grafikcursors. Diese Koordinaten werden von Grafik-Anweisungen benutzt, die über das STEP-Schlüsselwort relative Koordinaten unterstützen. Diese Aktion kann nur ausgeführt werden, wenn bereits ein Grafikfenster mit SCREEN oder SCREENRES initialisiert wurde. Andernfalls hat die Aktion keine Auswirkungen.

    Beispiel:
    '' include fbgfx.bi for some useful definitions
    #INCLUDE "fbgfx.bi"

    USING FB

    DIM AS EVENT e
    DIM AS INTEGER x, y, pressed, col
    DIM AS ANY PTR img

    SCREENRES 384, 64, 32,, GFX_SHAPED_WINDOW

    img = IMAGECREATE(48, 8)
    DRAW STRING img, (0, 0), "GfxLib"
    FOR y = 0 TO 63
    FOR x = 0 TO 383
    col = POINT(x \ 8, y \ 8, img)
    IF (col <> RGB(255, 0, 255)) THEN
    col = RGB((x + y) AND &hFF, (x + y) AND &hFF, (x + y) AND &hFF)
    END IF
    PSET (x, y), col
    NEXT x
    NEXT y

    pressed = 0
    DO
    IF (SCREENEVENT(@e)) THEN
    SELECT CASE e.type
    CASE EVENT_MOUSE_BUTTON_PRESS
    pressed = -1
    CASE EVENT_MOUSE_BUTTON_RELEASE
    pressed = 0
    CASE EVENT_MOUSE_MOVE
    IF (pressed) THEN
    SCREENCONTROL GET_WINDOW_POS, x, y
    SCREENCONTROL SET_WINDOW_POS, x + e.dx, y + e.dy
    END IF
    END SELECT
    END IF
    SLEEP 5
    LOOP WHILE NOT MULTIKEY(1)

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • SCREENCONTROL existiert seit freeBASIC v0.17

    • Siehe auch:
    SCREEN (Anweisung),, SCREEENRES,
    SCREENINFO, SCREENEVENT,
    WINDOWTITLE,
    VIEW (Grafik)


SCREENCOPY

Syntax: SCREENCOPY [Quellseite][, Zielseite]
Typ: Anweisung
Kategorie: Gfx

SCREENCOPY kopiert den Inhalt einer Bildschirmseite in eine andere.

  • 'Quellseite' ist die Seite, die kopiert werden sein soll.
    Wird dieser Parameter ausgelassen, nimmt freeBASIC automatisch die Nummer
    der aktiven Bildschirmseite an.

  • 'Zielseite' ist die Seite, auf die die Daten kopiert werden soll.
    Die Daten auf dieser Seite werden dabei überschrieben.
    Wird dieser Parameter ausgelassen, nimmt freeBASIC automatisch die Nummer
    der sichtbaren Bildschirmseite an.

    • Wenn durch eine vorhergehende VIEW (Grafik)-Anweisung
    ein Darstellungsfeld definiert wurde, wird nur dieses kopiert; ansonsten kopiert
    SCREENCOPY die gesamte Bildschirmseite.

    Mit SCREENCOPY können Sie in freeBASIC double buffering realisieren; diese Technik
    wird zur Erzeugung flimmerfreier Animationen benutzt.

    SCREENCOPY funktioniert mit jedem Bildschirmmodus, der mit mehreren Seiten
    initiiert wurde. Bei einseitigen Modi hat SCREENCOPY keinen Effekt.
    Diese Befehle haben die selbe Funktion wie SCREENCOPY:
    FLIP
    PCOPY

    Beispiel: Siehe SCREENSET

    Siehe auch:
    SCREEN (Anweisung), SCREENSET

    Unterschiede (zu QB):
    neu in freeBASIC.
    Hat die selbe Funktion wie QBs PCOPY, mit der Ausnahme,
    dass es mit jedem mehrseitigen Bildschirmmodus arbeitet.


SCREENEVENT

Syntax: SCREENEVENT [ (Ereignis)
Typ: Funktion
Kategorie: Eingabe/Ereignisverwaltung

SCREENEVENT gibt Informationen zu einem Systemereignis, das das Grafikfenster betrifft, zurück.

  • 'Ereignis' ist Pointer (ANY PTR) auf einen Datenpuffer, in dem die Informationen gespeichert werden sollen. Ausgegeben werden die
    Daten in Form des UDT (User defined Type - siehe TYPE) 'EVENT'.
    Wird dieser Parameter ausgelassen, so wird nichts kopiert.

  • Der Rückgabewert ist entweder -1, wenn Ereignisse aufgetreten sind, oder 0, wenn dies nicht der Fall ist.

    • Der Typ 'EVENT' ist folgendermaßen definiert:
    TYPE EVENT FIELD = 1
    type AS INTEGER
    UNION
    TYPE
    scancode AS INTEGER
    ascii AS INTEGER
    END TYPE
    TYPE
    x AS INTEGER
    y AS INTEGER
    dx AS INTEGER
    dy AS INTEGER
    END TYPE
    button AS INTEGER
    z AS INTEGER
    END UNION
    END TYPE
    Diese Definition kann direkt aus der 'fbgfx.bi' übernommen werden; durch einfaches einbinden der Datei mittels #INCLUDE ist der Typ (als
    Element des NAMESPACEs 'fb') verfügbar.

    Diese Funktion gibt Informationen zu dem zuletzt aufgetretenen Systemereignis zurück, das in der GfxLib-Ereignistabelle eingetragen
    wurde. Ein Systemereignis ist eine Maus- oder Tastaturaktivität.

    Sofern verfügbar werden die Informationen an die Adresse kopiert, an die der Pointer 'Ereignis' zeigt. Dieser Pointer muss auf einen
    Speicherbereich zeigen, der mindestens 20 Bytes lang ist, da sonst Programmdaten überschrieben werden können, was zu unerwünschten
    Ergebnissen wie Programmabsturz führen kann.

    In die ersten vier Bytes des Puffers wird im INTEGER-Format die ID des Ereignisses geschrieben, d.h. eine Zahl, die angibt, welches
    Ereignis aufgetreten ist. Welche Zahl welches Ereignis beschreibt, kann aus der Tabelle unten eingesehen werden.
    Die restlichen 16 Bytes (vier INTEGER-Stellen) werden mit Informationen befüllt, die vom Typ des Ereignisses abhängig sind.
    Generell ist es sinnvoll, auf den Speicherbereich wie auf einen EVENT PTR zuzugreifen, da so aussagekräftige Bezeichner für die
    Speicherstellen zur Verfügung stehen.

    Wenn der Parameter 'Ereignis' ausgelassen wird, können keine Informationen kopiert werden; daher werden auch keine Ereignisse aus der
    GfxLib-Ereignistabelle entfernt. Ein Aufruf von SCREENEVENT ohne Parameter ist daher eine gute Möglichkeit, um zu prüfen, ob ein
    Ereignis aufgetreten ist, ohne diese tatsächlich abzufragen und auszuwerten, da der Rückgabewert angibt, ob ein relevantes Ereignis
    aufgetreten ist.

    Folgende Bedeutung hat die erste INTEGER-Stelle (der Record .type des UDTs 'EVENT'):
    (Bitte beachten Sie, dass die angegebenen Konstanten in der fbgfx.bi ebenfalls Element des NAMESPACEs 'fb' sind.)
    Ereignisnummer | Konstante in der fbgfx.bi | Bedeutung
1 | EVENT_KEY_PRESS | Dieses Ereignis wird zurückgegeben, wenn eine Taste auf der Tastatur gedrückt wurde. In diesem Fall enthält der Record .scancode den plattformunabhängigen Scancode der Taste. Ist dieser Taste ein ASCII-Code zugeordnet, so kann dieser aus dem Record .ascii gelesen werden, andernfalls hat diese Stelle den Wert 0. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
2 | EVENT_KEY_RELEASE | Eine gedrückte Taste wurde wieder losgelassen. Die Records .scancode und .ascii werden in gleicher weise ausgefüllt wie bei EVENT_KEY_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
3 | EVENT_KEY_REPEAT | Eine Taste wird so lange gedrückt gehalten, bis sie als wiederholter Tastenanschlag behandelt wird. Die Records .scancode und .ascii werden in gleicher weise ausgefüllt wie bei EVENT_KEY_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
4 | EVENT_MOUSE_MOVE | Die Maus wurde bewegt, während sie sich auf dem Programmfenster befand. Die Records .x und .y enthalten die neuen Koordinaten des Mauszeigers. Die Records .dx und .dy enthalten die Differenz der alten Koordinaten zu den Neuen, geben also an, wie weit die Maus bewegt wurde. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
5 | EVENT_MOUSE_BUTTON_PRESS | Einer der Mausbuttons wurde gedrückt. Der Record .button gibt an, welcher das war; 1 symbolisiert dabei den linken, 2 den rechten und 3 den mittleren Mausbutton. Sie können auch die in der fbgfx.bi vordefinierten Konstanten 'BUTTON_LEFT', 'BUTTON_RIGHT' und 'BUTTON_MIDDLE' verwenden. Bitte beachten Sie, dass auch diese Konstanten Elemente des NAMESPACEs 'fb' sind.
6 | EVENT_MOUSE_BUTTON_RELEASE | Einer der Mausbuttons wurde wieder losgelassen. Der Record .button wird in gleicher Weise ausgefüllt wie bei EVENT_MOUSE_BUTTON_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
7 | EVENT_MOUSE_DOUBLE_CLICK | Einer der Mausbuttons wurde doppelt angeklickt. Der Record .button wird in gleicher Weise ausgefüllt wie bei EVENT_MOUSE_BUTTON_PRESS. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
8 | EVENT_MOUSE_WHEEL | Das Mausrad wurde benutzt; die neue Position des Mausrads wird im Record .z eingetragen. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
9 | EVENT_MOUSE_ENTER | Die Maus wurde in das Programmfenster bewegt. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
10 | EVENT_MOUSE_EXIT | Die Maus wurde aus dem Programmfenster bewegt. Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster den Fokus hat.
11 | EVENT_WINDOW_GOT_FOCUS | Das Programmfenster hat den Fokus bekommen. (Es wurde also zum aktiven Fenster)
12 | EVENT_WINDOW_LOST_FOCUS | Das Programmfenster hat den Fokus verloren. (Es ist also in den Hintergrund getreten, da ein anderes Fenster jetzt den Fokus hat.)
13 | EVENT_WINDOW_CLOSE | Der User hat versucht das Fenster zu schließen (z.B. über den Schließen-Button in der Titelleiste, oder über das Kontextmenü des Fensters in der Taskleiste.)

    Beispiel:
    #INCLUDE "fbgfx.bi"

    DIM AS FB.EVENT PTR event
    event = ALLOCATE(20)

    SCREEN 18
    DO
    IF (SCREENEVENT(event)) Then
    SELECT CASE event->type
    CASE FB.EVENT_KEY_PRESS
    IF (event->scancode = FB.SC_ESCAPE) THEN END
    If (event->ascii > 0) THEN
    PRINT "'" & event->ascii & "'";
    ELSE
    PRINT "eine unbekannte Taste";
    End If
    PRINT " wurde gedrueckt (Scancode " & event->scancode & ")"

    CASE FB.EVENT_KEY_RELEASE
    If (event->ascii > 0) THEN
    PRINT "'" & event->ascii & "'";
    ELSE
    PRINT "eine unbekannte Taste";
    End If
    PRINT " wurde losgelassen (Scancode " & event->scancode & ")"

    CASE FB.EVENT_KEY_REPEAT
    If (event->ascii > 0) THEN
    PRINT "'" & event->ascii & "'";
    ELSE
    PRINT "eine unbekannte Taste";
    END IF
    PRINT " wird gehalten (Scancode " & event->scancode & ")"

    CASE FB.EVENT_MOUSE_MOVE
    PRINT "Maus wurde bewegt nach " & event->x & ", " & event->y & " (delta " & event->dx & ", " & event->dy & ")"

    CASE FB.EVENT_MOUSE_BUTTON_PRESS
    IF (event->button = FB.BUTTON_LEFT ) THEN
    PRINT "Die Linke";
    ELSEIF (event->button = FB.BUTTON_RIGHT) THEN
    PRINT "Die rechte";
    ELSE
    PRINT "Die mittlere";
    END IF
    PRINT " Maustaste wurde gedrueckt"

    CASE FB.EVENT_MOUSE_BUTTON_RELEASE
    IF (event->button = FB.BUTTON_LEFT ) THEN
    PRINT "Die Linke";
    ELSEIF (event->button = FB.BUTTON_RIGHT) THEN
    PRINT "Die rechte";
    ELSE
    PRINT "Die mittlere";
    END IF
    PRINT " Maustaste wurde losgelassen"

    CASE FB.EVENT_MOUSE_DOUBLE_CLICK
    IF (event->button = FB.BUTTON_LEFT ) THEN
    PRINT "Die Linke";
    ELSEIF (event->button = FB.BUTTON_RIGHT) THEN
    PRINT "Die rechte";
    ELSE
    PRINT "Die mittlere";
    END IF
    PRINT " Maustaste wurde doppelt gedrueckt"

    CASE FB.EVENT_MOUSE_WHEEL
    PRINT "Das Mausrad wurde verstellt auf " & event->z

    CASE FB.EVENT_MOUSE_ENTER
    PRINT "Die Maus wurde in das Programmfenster bewegt"

    CASE FB.EVENT_MOUSE_EXIT
    PRINT "Die Maus wurde aus dem Programmfenster bewegt"

    CASE FB.EVENT_WINDOW_GOT_FOCUS
    PRINT "Das Programmfenster hat den Fokus erhalten"

    CASE FB.EVENT_WINDOW_LOST_FOCUS
    PRINT "Das Programmfenster hat den Fokus verloren"

    CASE FB.EVENT_WINDOW_CLOSE
    END
    END SELECT
    END IF

    SLEEP 1
    LOOP

    Unterschiede:
    zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • SCREENEVENT existiert seit freeBASIC v0.17

    • Siehe auch:
    SCREEN (Anweisung),
    MULTIKEY, INKEY,
    GETMOUSE,
    NAMESPACE, USING (NAMESPACEs)


SCREENINFO

Syntax: SCREENINFO [w][,[h][,[depth][,[bpp][,[pitch][,[rate][,driver]]]]]
Typ: Anweisung
Kategorie: Gfx

SCREENINFO gibt Informationen über den aktuellen Videomodus zurück.
Verfügbar sind unter anderem der Name des Grafiktreibers, die Farbtiefe, oder
die Bildschirmgröße.

Bedeutung der Parameter:
w | Breite des Bildschirms in Pixeln
h | Höhe des Bildschirms in Pixeln.
depth | Aktuelles Pixelformat in Bits pro Pixel; Es kann 1, 2, 4, 8, 16 oder 32 sein. Siehe Interne Pixelformate.
bpp | Bytes pro Pixel.
pitch | Größe einer framebuffer-Zeile in Bytes.
rate | Bildschirmaktualisierungsrate
driver | Name des aktiven Grafiktreibers, wie "DirectX" oder "X11".

Wenn in dem Zeitpunkt, in dem Sie SCREENINFO aufrufen, kein Grafikfenster aktiv ist,
werden die Daten des Desktops angegeben. Als Treiber wird ein Leerstring zurückgegeben.
Wenn SCREENINFO eine Information nicht nachfragen kann, wird 0 in der entsprechenden
Variable gespeichert.
Wenn Sie den Bildschirmmodus via SCREEN (Anweisung) ändern, sind die
gespeicherten Informationen nicht mehr gültig; Sie müssen SCREENINFO erneut
aufrufen, um die Daten zu aktualisieren.

Beispiel:
DIM AS INTEGER w, h, depth, refresh
DIM driver AS STRING

SCREEN 15, 32

' Informationen über aktuellen Modus nachfragen:
SCREENINFO w, h, depth, , , refresh, driver

PRINT STR(w) + "x" + STR(h) + "x" + STR(depth);
IF (refresh > 0) THEN
PRINT " @ " + STR(refresh) + " Hz";
END IF
PRINT " Unter Verwendung des Treibers " + driver"
SLEEP

' Grafikfenster schließen und Informationen über Desktop nachfragen
SCREEN 0
SCREENINFO w, h, depth
PRINT "Desktopauflösung: " + STR(w) + "x" + STR(h) + "x" + STR(depth)

Siehe auch:
SCREEN (Anweisung), SCREENLIST,
Interne Pixelformate

Unterschiede: Neu in freeBASIC.


SCREENLIST

Syntax: SCREENLIST ([depth])
Typ: Funktion
Kategorie: Gfx

SCREENLIST gibt eine Liste aller unterstützten Bildschirmauflösungen
zurück.

SCREENLIST kann verwendet werden, um zur Laufzeit herauszufinden, welche Vollbildmodi
auf dem Computer verfügbar sind.
Die Funktion arbeitet ähnlich wie DIR: Sie müssen
SCREENLIST zuerst mit dem Parameter 'depth' aufrufen, und angeben, für welche Farbtiefe
die Prüfung durchgeführt werden soll (unterstützt werden die Farbtiefen 8,
15, 16, 24 und 32). Ausgegeben wird die erste unterstützte Auflösung
für diese Farbtiefe, codiert in INTEGER-Zahl. Der nächste Aufruf von
SCREENLIST ohne Parameter gibt die nächste unterstützte Auflösung
im selben Format zurück. Wenn keine weiteren Auflösungen unterstützt
werden, ist das Ergebnis 0.

Das obere Word des Ergebnisses (obere 16 Bit, durch HIWORD
zurückgegeben) enthalten die Höhe, und das untere Word (untere 16 Bit,
durch LOWORD zurückgegeben) die Breite.

Die Auflösungen werden von der Niedrigsten zur Höchsten sortiert
ausgegeben.
Die Funktion kann zu jedem Zeitpunkt aufgerufen werden, auch wenn noch kein
Grafikmodus initiiert wurde.

Beispiel:
DIM AS INTEGER mode, w, h
' Welche 8bit-Auflösungen werden untestützt?
mode = SCREENLIST(8)
WHILE (mode)
w = HIWORD(mode)
h = LOWORD(mode)
PRINT STR(w) + "x" + STR(h)
mode = SCREENLIST
WEND

Unterschiede: Neu in freeBASIC

Siehe auch:
SCREEN (Anweisung), SCREENRES


SCREENLOCK

Syntax: SCREENLOCK
Typ: Anweisung
Kategorie: Gfx

Sperrt den Zugriff auf eine Bildschirmseite.

Die SCREENLOCK-Anweisung sperrt den direkten Zugriff auf die aktive Bildschirmseite.
Sobald eine Bildschirmseite gesperrt wurde, werden die Daten vom Video-RAM nicht
mehr automatisch auf den Bildschirm übertragen, und die drawing primives (wie PSET,
LINE, CIRCLE,...) sind nicht mehr verfügbar, solange die Seite nicht mit SCREENUNLOCK
entsperrt wurde.
Während die aktive Seite gesperrt ist, können Sie ihren Speicherbereich
frei lesen und beschreiben; Sie müssen die Seite mit SCREENUNLOCK entsperren,
um die Änderungen zu aktualisieren.
Sie sollten nach Möglichkeit eine Seite so kurz wie möglich gesperrt halten.
Es ist außerdem nicht zu empfehlen, SCREENLOCK zu verwenden, wenn eine Sperre
zuvor nicht aufgelöst wurde.
Wenn die aktive Seite zugleich auch die Sichtbare Seite ist, bleiben alle Änderungen
so lange unsichtbar, bis die Seite mit SCREENUNLOCK
entsperrt wurde.

Beispiel:
Siehe SCREENPTR

Siehe auch:
SCREEN (Anweisung),
SCREENUNLOCK,
SCREENPTR

Unterschiede: Neu in freeBASIC


SCREENPTR

Syntax: SCREENPTR
Typ: Funktion
Kategorie: Gfx

Die SCREENPTR-Funktion gibt einen Pointer zurück, der auf einen
Speicherbereich zurück, der auf den Datenbereich (Video-RAM oder framebuffer) der
aktiven Bildschirmseite zeigt, oder null, wenn kein Grafikmodus aktiv ist.
SCREENPTR kann dazu verwendet werden, um zu testen, ob ein SCREEN (Anweisung)-Aufruf
erfolgreich war, oder um den Videospeicher direkt zu lesen oder zu beschreiben,
vorausgesetzt, die Seite wurde zuvor mit SCREENLOCK
gesperrt, und nach dem Speicherzugriff mit SCREENUNLOCK entsperrt.

Der von SCREENPTR zurückgelieferte Pointer ist nur nach einem erfolgreichen
SCREEN (Anweisung)-Aufruf gültig, und verliert seine Gültigkeit
nach jeden weiteren SCREEN-Aufruf.

Beispiel:
' Bildschirmmodus 320x200x8bpp setzen
' Keine Angaben zu Bildschirmseiten => nur eine aktive Seite = sichtbare Seite
SCREEN 13

' In 8bpp Modi brauchen Sie einen BYTE PTR für den Speicherzugriff.
DIM framebuffer AS BYTE PTR
framebuffer = SCREENPTR

' Die aktive Seite muss zuerst gesperrt werden, damit ein Zugriff möglich wird.
SCREENLOCK

' Zeichne einen weißen Pixel an den Koordinaten 160, 100
POKE BYTE, framebuffer + (100 * 320) + 160, 15

' Seite entsperren, damit die Änderungen sichtbar werden
SCREENUNLOCK
SLEEP

Siehe auch:
SCREEN (Anweisung),
SCREENLOCK, SCREENUNLOCK

Unterschiede: Neu in freeBASIC


SCREENRES

Typ: Anweisung
Kategorie: Gfx
Syntax: SCREENRES Breite, Höhe[, [Farbtiefe ][, [Seitenzahl][,[ Flags][,Bildwiederholrate]]]]

Initiiert ein Grafikfenster.

  • 'Breite' und 'Höhe sind die Breite und die Höhe des zu initiierenden Grafikfensters

  • Die anderen Parameter entsprechen denen von SCREEN (Anweisung)

    • SCREENRES entspricht der SCREEN-Anweisung aus Version 0.10b. Die Syntax ist ähnlich
    dem jetzigen SCREEN-Befehl, jedoch ist es möglich, eine benutzerdefinierte
    Bildschirmauflösung anzugeben.

    VORSICHT: Geben Sie keine Auflösung an, die die aktuelle Bildschirmgröße übersteigt!
    (Benutzen Sie SCREENINFO, um die aktuelle
    Auflösung zu ermitteln.)

    Siehe SCREEN (Anweisung) für weitere Details, auch zu den
    weiteren Parametern.

    Siehe auch:
    SCREEN (Anweisung)

    Unterschiede: Neu in freeBASIC.


SCREENSET

Syntax: SCREENSET [aktive_Seite][, sichtbare_Seite]
Typ: Anweisung
Kategorie: Gfx

SCREENSET setzt die aktive und die sichtbare Bildschirmseite.

  • 'aktive_Seite' ist die neue Nummer der aktiven Seite. Die aktive Seite ist
    diejenige, auf die gezeichnet wird.
    Wird dieser Parameter ausgelassen, belässt freeBASIC den zuvor
    eingestellten Wert.

  • 'sichtbare_Seite' ist die neue Nummer der sichtbaren Seite. Die sichtbare
    Seite ist diejenige, die angezeigt wird.
    Wird dieser Parameter ausgelassen, belässt freeBASIC den zuvor
    eingestellten Wert.

  • Beide Werte dürfen zwischen 0 und Zahl_der_Seiten - 1 liegen
    Zahl_der_Seiten ist die Zahl der Seiten, die durch den letzen SCREEN (Anweisung)-Aufruf
    festgelegt wurde.

  • Wenn Sie beide Argumente auslassen, werden sowohl die aktive als auch die
    sichtbare Seite auf 0 zurückgesetzt.

    • SCREENSET ermöglicht es Ihnen, die Nummer der aktuellen aktiven und
    sichtbaren Bildschirmseite zu bestimmen.
    Sie können SCREENSET benutzen, um "page-flipping" oder "double-buffering"
    zu ermöglichen.

    Beispiel:
    ' Bildschirmmodus 320x200x8bpp mit 2 Seiten setzen
    ' Hintergrundfarbe auf weiß setzen
    SCREEN 13, ,2
    COLOR ,15

    DIM x AS INTEGER
    x = -40

    ' Eine Seite anzeigen, während die andere bearbeitet wird
    SCREENSET 1, 0

    DO
    CLS
    LINE (x, 80)-(x + 39, 119), 4, BF
    x += 1
    IF (x > 319) THEN x = -40
    ' Warte auf Bildschirmaktualisierung
    SCREENSYNC
    ' aktive Seite auf sichtbare kopieren
    SCREENCOPY
    LOOP WHILE INKEY = ""

    Siehe auch:
    SCREEN (Anweisung),
    SCREENCOPY, SCREENSYNC

    Unterschiede: Neu in freeBASIC


SCREENSYNC

Syntax: SCREENSYNC
Typ: Anweisung
Kategorie: Gfx

Wartet mit der Programmausführung auf eine Bildschirmaktualisierung.
Mit SCREENSYNC wird ein Flimmern des Bildschirms vermieden.
Diese Anweisung soll WAIT ersetzen.

Beispiel: Siehe SCREENSET.

Unterschiede: Neu in freeBASIC

Siehe auch:
SCREEN (Anweisung), SCREENSET,
WAIT


SCREENUNLOCK

Syntax: SCREENUNLOCK [Startzeile][, Endzeile]
Typ: Anweisung
Kategorie: Gfx

Hebt eine Sperrung durch SCREENLOCK auf.

  • 'Startzeile' ist ein optionaler Parameter, der die erste Bildschirmzeile
    (y-Koordinate) angibt, ab der der Bildschirm aktualisiert werden soll.
    Wenn Sie diesen Parameter auslassen, wird die oberste Bildschirmzeile angenommen.

  • 'Endzeile' ist ein optionaler Parameter, der die letzte Bildschirmzeile angibt,
    die aktualisiert werden soll. Wenn Sie 'Endzeile' auslassen, wird die unterste
    Bildschirmzeile angenommen.

  • Werden beide Parameter ausgelassen, entsperrt freeBASIC den gesamten
    Bildschirm.

    • SCREENUNLOCK entsperrt die aktive Bildschirmseite, sofern sie zuvor mit
    SCREENLOCK gesperrt wurde; versuchen Sie nicht,
    SCREENUNLOCK aufzurufen, wenn die Seite zuvor nicht gesperrt wurde.

    Diese Anweisung lässt das System den Bildschirm wieder aktualisieren, und
    aktualisiert ihn bereits beim Aufruf selbst. Diese Aktualisierung kann auf einen
    Bildschirmausschnitt begrenzt werden, indem eine Start- und Endzeile angegeben
    wird.
    Sobald eine Sperre aufgelöst wurde, können Sie wieder die drawing
    primitives (einfachste Grafikfunktionen, wie PSET, LINE, CIRCLE, etc.) einsetzen;
    der direkte Zugriff via SCREENPTR ist jedoch nicht mehr möglich.

    Beispiel: Siehe SCREENPTR

    Siehe auch:
    SCREEN (Anweisung),
    SCREENLOCK,
    SCREENPTR

    Unterschiede: Neu in freeBASIC


SCRN

SCRN wird zusammen mit OPEN SCRN eingesetzt.


SECOND

Syntax: SECOND(Serial)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

SECOND extrahiert die Sekunde einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Serial Number behandelt wird.

  • Der Rückgabewert ist die Sekunde, die in der Serial Number gespeichert ist.

    • Beispiel:
    Die aktuelle Sekunde aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM sek AS INTEGER
    sek = SECOND(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


SEEK (Anweisung)

Syntax: SEEK (Dateinummer, Position)
Typ: Anweisung
Kategorie: Datei

Setzt die Position des Cursors innerhalb einer Datei.

  • 'Dateinummer' ist die Nummer der Datei, die durch eine OPEN-Anweisung
    zugewiesen wurde.

  • 'Position' ist die Neue Position des Cursors.
    Sie ist entweder die Position in Bytes, wenn die Datei im BINARY-Modus
    geöffnet wurde, oder die Nummer des Datensatzes für den RANDOM-Modus
    bzw. die sequentiellen Modi (INPUT, OUTPUT und APPEND)

    • Beispiel: Cursor auf das 100ste Byte in der Datei setzen:
    f = FREEFILE
    OPEN "file.ext" FOR BINARY AS #f
    SEEK f, 100
    CLOSE #f

    Siehe auch:
    SEEK (Funktion),
    OPEN


SEEK (Funktion)

Syntax: SEEK (Dateinummer) AS INTEGER
Typ: Funktion
Kategorie: Datei

Gibt die Position des Cursors innerhalb einer Datei zurück.

  • 'Dateinummer' ist die Nummer der Datei, die durch eine OPEN-Anweisung
    zugewiesen wurde.

    • Der Rückgabewert ist entweder die Position in Bytes, wenn die Datei im
    BINARY-Modus geöffnet wurde, oder die Nummer des Datensatzes für den
    RANDOM-Modus bzw. die sequentiellen Modi (INPUT, OUTPUT und APPEND).

    Beispiel:
    f = FREEFILE
    OPEN "file.ext" FOR BINARY AS #f
    '... Programmcode, Lese/Schreibe-Anweisungen, etc...
    position = SEEK(f)
    '...weitere Anweisungen
    CLOSE #f

    Siehe auch:
    SEEK (Anweisung),
    OPEN


SEEK

Typ: Anweisung/Funktion

SEEK ist ein Schlüsselwort, das als Anweisung und Funktion eingesetzt
werden kann.

Siehe:
SEEK (Anweisung)
SEEK (Funktion)


SELECT CASE

Typ: Anweisung
Kategorie: Bedingungen
Syntax:
SELECT CASE [AS CONST] Ausdruck
CASE (Ausdrucksliste)
   ' Code
[CASE (Ausdrucksliste 2)
   ' Code
[ ... ]
[CASE ELSE
   ' Code
END SELECT

SELECT CASE führt bestimmte Codeteile nur Abhängig vom Wert eines Ausdrucks aus.

SELECT CASE stellt eine etwas übersichtlichere Form dar von:
IF Ausdruck = Ausdrucksliste1 THEN
   ' Code
[ ELSEIF Ausdruck = Ausdrucksliste2 THEN
   ' Code ]
[ ... ]
ELSE
   ' Code
END IF Da nicht in jeder Zeile erneut 'Ausdruck =' geschrieben werden muss, ersprart sich der Programmierer Tipparbeit. Außerdem ist schneller
ersichtlich, welche Bedingung geprüft wird.

  • 'Ausdruck' ist eine beliebige, aber sinnvolle Aneinanderreihung von Konstanten, Variablen, Operatoren und Funktionen, die einen Wert
        beliebigen einfachen Datentyps ergeben.
        Erlaubt sind also die verschiedenen Ganzzahl-Typen, Fließkommatypen, sowie STRINGs inclusive Z- und WSTRINGs.
        Nicht zulässig sind hingegen ganze UDTs (user defined Type; siehe TYPE (UDT)). UDT-Records hingegen
        dürfen selbstverständlich benutzt werden, sofern sie von einem einfachen Datentyp sind. Records, die einem Bitfeld entstammen,
        können erst seit freeBASIC v0.16 eingesetzt werden.
        Siehe dazu auch die FB-Datentypen und Bitfelder.
        Je nach Wert dieses Ausdrucks wird der Code auf verschiedene Art und Weise fortgesetzt.

  • 'Ausdrucksliste' enthält ebenso wie 'Ausdruck' Konstanten, Variablen, Operatoren und Funktionen, die einen Wert ergeben. Dabei
        können pro CASE-Zeile mehrere Ausdrücke angegeben werden. Auch Vergleichsoperatoren können angegeben werden, um anzugeben, in
        welchem Verhältnis 'Ausdruck' zum jeweiligen Element der 'Ausdrucksliste' stehen soll.
        Dazu wird eine bestimmte Syntax angewandt, die weiter unten erläutert wird.
        Der Datentyp von 'Ausdrucksliste' muss der selbe sein wie in 'Ausdruck'!

  • 'Code' stellt normalen freeBASIC-Programmcode dar, der unter gegebenen Voraussetzungen (den Werten von 'Ausdruck' und dem Verhältnis
        zu 'Ausdrucksliste') ausgeführt wird.
  • Entspricht 'Ausdruck' der ersten 'Ausdrucksliste', so führt freeBASIC den Code zwischen
        CASE Ausdrucksliste
        und
        CASE Ausdrucksliste2
        aus.
        Ist dies nicht der Fall, prüft freeBASIC das Verhältnis zwischen 'Ausdruck' und der zweiten, dritten, ... 'Ausdrucksliste', und
        verfährt dort genau so.
        Wird keine der angegebenen Bedingungen erfüllt, führt freeBASIC den Code hinter CASE ELSE aus. Enthält der SELECT-CASE-Block keine
        CASE-ELSE-Zeile, so wird gar kein Code ausgeführt. Die Programmausführung wird hinter dem SELECT-CASE-Block normal fortgesetzt.
  • Auch wenn mehrere Bedingungen erfüllt sind, wird immer nur der Code hinter der ersten zutreffenden CASE-Zeile ausgeführt;
        nachfolgende Bedingungen werden ignoriert.

  • Die Klausel 'AS CONST' bewirkt, dass die Abfrage wesentlich schneller durchgeführt wird, schränkt aber die Wahl der Parameter in den
        Ausdruckslisten ein.
        Details hierzu sind weiter unten aufgeführt.

    • Als Block-Anweisung initialisiert SELECT CASE seit freeBASIC v0.16 einen SCOPE-Block, der mit der Zeile
    END SELECT endet.

    SELECT-CASE-Blocks dürfen bis zu beliebigen Level ineinander verschachtelt werden.

    Syntax einer Ausdrucksliste (Hinter CASE):
    { Ausdruck [TO Ausdruck] | IS (Bedingungsoperator) Ausdruck}]} [, ...]
  • 'Ausdruck' ist ebenso wie in der SELECT-CASE eine sinnvolle Aneinanderreihung von Konstanten, Variablen, Operatoren und Funktionen,
        die einen Wert ergeben müssen, dessen Datentyp der selbe ist, wie vom Ausdruck in der SELECT-CASE-Zeile vorgegeben.

  • Wird nur ein einziger Ausdruck angegeben, so prüft freeBASIC auf Gleichheit der Werte.

  • Sind mehrere Ausdrücke, getrennt durch Kommata angegeben, so prüft freeBASIC jeden einzelnen davon auf Gleichheit; die Bedingung ist
        erfüllt, wenn mindestens ein Ausdruck in der Liste gleich ist.

  • mit TO wird ein Wertebereich angegeben; links vom TO muss dabei der kleinere, rechts der größere Wert stehen. Die Bedingung ist dann
        erfüllt wenn der Ausdruck in der SELECT-CASE-Zeile zwischen den in der CASE-Zeile angegebenen Ausdrücken liegt. Die Werte dieser
        Ausdrücke sind dabei einzuschließen.
        CASE 1 TO 3
        ist also erfüllt, wenn Ausdruck = 1, 2, oder 3.
        Bei STRINGs wird dabei Zeichenweise der ASCII-Wert der Zeichen verglichen. (Siehe dazu ASC).

  • Wird das Schlüsselwort 'IS' eingesetzt, so kann ein eigener Vergleichsoperator angegeben werden. Die Bedingung ist dann nicht mehr
        erfüllt, wenn die Werte in der SELECT-CASE-Zeile und der CASE-Zeile gleich sind, sondern z.B. ungleich, größer als, ...

    • Beispiele für Ausdrucksliste
    SELECT CASE a
       CASE 5                   ' ist a = 5?
       CASE 5 TO 10             ' ist a zwischen 5 und 10?
                                ' Die kleinere Zahl muss zuerst angegeben werden
       CASE IS > 5              ' ist a größer als 5?
       CASE 1, 3 TO 10          ' ist a entweder 1 oder zwischen 3 und 10?
       CASE 1, 3, 5, 7, b + 8   ' ist a gleich 1, 3, 5, 7 oder b + 8?
    END SELECT

    Beispiel, wie SELECT CASE benutzt wird:
    INPUT "Geben Sie eine Nummer zwischen 1 und 10 ein: "; choice
    SELECT CASE choice
       CASE 1
          PRINT "Sie haben 1 angegeben"
       CASE 2
          PRINT "Die Zahl ist 2"
       CASE 3, 4
          PRINT "Die Zahl ist 3 oder 4"
       CASE 5 TO 10
          PRINT "Die Zahl liegt zwischen 5 und 10"
       CASE IS > 10
          PRINT "Die Zahl ist größer als 10"
       CASE ELSE
          PRINT "Die Zahl ist kleiner als 1"
    END SELECT
    Die Zeileneinrückungen sind optional; sie dienen lediglich der besseren Übersichtlichkeit. In Programmiererkreisen sind sie in jedem Falle
    gern gesehen.

    Wenn eine Bedingung Doppelt vorkommt, wird nur der erste Codeblock ausgeführt.

    Beispiel:
    SELECT CASE a
       CASE 1
          PRINT "a ist 1"
       CASE 1, 2
          PRINT "a ist entweder 1 oder 2"
    END SELECT
    Die Zeile "a ist entweder 1 oder 2" wird nur angezeigt, wenn a = 2 ist. Im anderen Fall a = 1 wird nur die Zeile "a ist 1" ausgegeben.

    Beachten Sie bitte, dass die Ausdrücke in der Reihenfolge abgearbeitet werden, in der sie angegeben werden. Im obigen Beispiel wird also
    zuerst geprüft, ob a = 1 ist, danach ob a = 2 ist, u.s.w.
    Wenn sehr häufig solche Prüfungen stattfinden, sollten Sie daher das wahrscheinlichste Ergebnis an die Spitze der Liste stellen, um nicht
    zu viel Zeit zu verlieren.

    In frühen Formen der Sprachfamilie BASIC wurde das Konstrukt ON...GOTO bzw. ON...GOSUB eingesetzt, um solche Prüfstrukturen umzusetzen. Dies gilt
    inzwischen als veraltete und umständliche Technik.

    SELECT CASE AS CONST

    Bei dieser Version wird der Code effizienter umgesetzt, so dass das Programm die Entscheidungen schneller treffen kann. Allerdings gelten
    hier bestimmte Beschränkungen für 'Ausdruck' und 'Ausdrucksliste'
  • 'Ausdruck' muss vom Typ INTEGER oder UINTEGER sein.

  • 'Ausdrucksliste' darf nur Konstanten oder einfache Ausdrücke enthalten, also Ausdrücke, die keine Variablen enthalten.

  • Der Wert des Ausdrucks muss ebenfalls ein INTEGER oder ein UINTEGER sein.

  • Funktionen sind in 'Ausdrucksliste' nur dann erlaubt, sofern es sich um freeBASIC's eigene mathematische Funktionen handelt (wie etwa
        FIX, ABS, SGN,...), der Rückgabetyp INTEGER oder UINTEGER ist, und der Parameter eine Konstante oder ein einfacher Ausdruck wie oben
        beschrieben ist.

  • Der Operator IS steht nicht zur Verfügung

  • Der Wert eines Ausdrucks darf nicht größer als 4097 sein.

    • CASE ELSE ist mit SELECT CASE AS CONST zulässig.

    Durch diese Einschränkungen ist die Abfrage um einiges schneller als das normale SELECT CASE.
    Man spricht von 'spürbaren' Unterschieden bei mehr als vier CASE-Zeilen.

    Unterschiede
    zu QB:
  • Die Variante SELECT CASE AS CONST ist neu in freeBASIC

    • zu früheren Versionen von freeBASIC:
  • Erst seit freeBASIC v0.16 können CASE-Anweisungsblocks manuell über EXIT SELECT verlassen werden.

  • Seit freeBASIC v0.16 initialisiert SELECT CASE einen SCOPE-Block.

  • Bitfelder können in CASE-Zeilen erst seit freeBASIC v0.16 eingesetzt werden.

  • Die Variante SELECT CASE AS CONST existiert erst seit freeBASIC v0.13

    • Siehe auch:
    IF...THEN, IIF,
    ON...GOTO, ON...GOSUB,
    SCOPE,
    EXIT,
    Ausdrücke,
    Bedingungsstrukturen


SELECT

SELECT wird verwendet als SELECT CASE.


SETDATE

Syntax: SETDATE NeuesDatum AS STRING
Typ: Anweisung
Kategorie: Zeit

Ändert das Systemdatum.

  • 'NeuesDatum' ist ein String, der eines der folgenden Formate besitzen muss:
    mm/dd/yyyy
    mm-dd-yyyy
    mm/dd/yy
    mm-dd-yy

  • 'mm' ist dabei der Monat,

  • 'dd' der Tag und

  • 'yy' bzw. 'yyyy' ist das Jahr.

    • Beispiel:
    month$ = "03" ' März
    day$ = "13" ' der 13
    year$ = "1994" ' die Guten alten Zeiten...
    SETDATE month$ + "/" + day$ + "/" + year$

    Siehe auch:
    DATE, TIME,


SETENVIRON

Syntax: SETENVIRON "Variable=Wert"
Typ: Anweisung
Kategorie: Verschiedenes

Verändert die Systemumgebungsvariablen.

Beispiel: Die Systemvariable "PATH" mit "C:" belegen:
SHELL "SET PATH" 'Den Wert von "PATH" anzeigen
SETENVIRON "PATH=C:"
SHELL "SET PATH" 'den neuen Wert von "PATH" anzeigen.

Siehe auch:
ENVIRON, SHELL

Unterschiede (zu QB):
Dieser neue Befehl ersetzt QB's ENVIRON.


SETMOUSE

Syntax: SETMOUSE [x][,[y][,cursor]]
Typ: Anweisung
Kategorie: Gfx

SETMOUSE setzt die Koordinaten des Mauscursors, und bestimmt, ob die Maus
sichtbar oder unsichtbar ist.

  • 'x' und'y' sind die neuen Koordinaten des Mauscursors.

  • 'cursor' ist 1, wenn die Maus angezeigt werden soll, oder 0, wenn sie unsichtbar
    sein soll.

  • Wird einer der Parameter ausgelassen, behält freeBASIC den alten Status
    bei.

    • Beispiel:
    ' Zwei Variablen dimensionieren, in denen die Koordinaten gespeichert werden.
    DIM AS INTEGER x, y

    ' Bildschirmmodus 320x200x8bpp
    SCREEN 13

    ' Mausposition ermitteln und ausgeben.
    GETMOUSE x, y
    PRINT x, y

    ' neue Mausposition setzen und ausgeben.
    SETMOUSE 100, 100
    GETMOUSE x, y
    PRINT x, y

    ' Mauscursor unsichtbar machen
    SETMOUSE , , 0

    ' auch ein unsichtbarer Cursor hat Koordinaten!
    GETMOUSE x, y
    PRINT x, y

    Siehe auch:
    GETMOUSE

    Unterschiede: Neu in freeeBASIC.


SETTIME

Syntax: SETTIME Time AS STRING
Typ: Anweisung
Kategorie: Zeit

SETTIME setzt die neue Systemzeit

  • 'Time' ist ein String, der die neue Zeit angibt.
    Er muss dazu das Format hh:mm:ss besitzen.

  • Diese Anweisung benutzt Funktionen der API, die nicht standardmäßig deklariert
    sind. Unter Windows kann die Datei user32.bi (zu finden im win-Verzeichnis
    ihres freeBASIC-Ordners) eingebunden werden, um die fehlenden Deklarationen
    nachzuholen. (Keine Informationen zu Linux, DOS und XBOX...)

  • Seit freeBASIC v0.16 jedoch gehört die nötige Deklaration zum Standardsatz
    des Compilers; ab dieser Compilerversion ist die manuelle Deklaration also
    nicht mehr nötig.

    • Beispiel:
    #IF NOT __FB_MIN_VERSION__(0, 16, 0)
    #INCLUDE ONCE "WIN\USER32.BI"
    #ENDIF

    DIM t AS STRING
    t = TIME
    PRINT t

    SETTIME ( "14" + MID(t, 3, 6) )
    PRINT TIME

    SETTIME (t)
    PRINT TIME

    SLEEP
    (Danke an volta, der dieses Beispiel geschrieben und mich auf die nötige
    Deklaration, sowie deren Unnötigkeit seit v0.16b aufmerksam gemacht hat.)

    Unterschiede
    Zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • existiert erst seit freeBASIC v0.10 für Windows

  • existiert erst seit freeBASIC v0.13 für Linux

  • seit freeBASIC v0.16 ist die Deklaration über die user32.bi nicht mehr nötig.

    • Siehe auch:
    TIME, DATE,
    TIMER, SETDATE


SGN

Syntax: SGN ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt einen Wert aus, der das Vorzeichen eines Ausdrucks identifiziert.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist ein INTEGER-Wert.
    Er hat...
    * den Wert 1, wenn 'Zahl' größer als null ist,
    * den Wert 0, wenn 'Zahl' gleich null ist, und
    * den Wert -1, wenn 'Zahl' kleiner als null ist.

    • Beispiel:
    DIM x AS DOUBLE
    INPUT "Geben Sie bitte eine Zahl ein: ", x
    IF SGN(x) = -1 THEN
    PRINT "Ihre Zahl war negativ"
    ELSEIF SGN(x) = 1 THEN
    PRINT "Ihre Zahl war positiv"
    ELSE
    PRINT "Ihre Zahl war null"
    END IF
    Ausgabe:
    Geben Sie bitte eine Zahl ein: 8.41
    Ihre Zahl war positiv

    Siehe auch:
    ABS
    mathematische Operatoren


SHARED

Syntax: { DIM | COMMON } SHARED Variablenliste [AS Typ]
Typ: Schlüsselwort
Kategorie: Programmorganisation

SHARED wird zusammen mit DIM und COMMON eingesetzt, und bewirkt, dass Variablen
sowohl auf Modulebene als auch innerhalb von Prozeduren (SUBs undFUNCTIONs)
verfügbar sind.

DIM SHARED bewirkt dabei nur Zugriffsrechte für Prozeduren innerhalb des selben
Moduls, während COMMON SHARED die auf Variablenliste von jeder Prozedur und
von jedem Modul aus zugegriffen werden kann.

Beispiel:
DECLARE MySub ()

DIM SHARED x AS INTEGER
DIM y AS INTEGER

x = 10
y = 5
PRINT "x ist:";x
PRINT "y ist:";y
PRINT

MySub

SUB MySub
PRINT "x ist: "; x
PRINT "y ist: "; y
END SUB
Ausgabe:
x ist: 10
y ist: 5

x ist: 10
y ist: 0

In der Sub MySub kann durchaus mit einer Variable mit dem Namen 'y' gearbeitet
werden:
DECLARE MySub ()

DIM SHARED x AS INTEGER
DIM y AS INTEGER

x = 10
y = 5
PRINT "x ist:";x
PRINT "y ist:";y
PRINT

MySub
PRINT

PRINT "x ist:";x
PRINT "y ist:";y

SUB MySub
y = 15
PRINT "x ist: "; x
PRINT "y ist: "; y
x = 3
END SUB
Ausgabe:
x ist: 10
y ist: 5

x ist: 10
y ist: 15

x ist: 3
y ist: 5

Durch SHARED wird eine Variable von einer lokalen zu einer globalen Variable.
Das bedeutet, dass sie von jedem beliebigen Punkt im Programm aus, also von
jedem Unterprogramm aus gelesen und auch geändert werden kann.
Eine lokale Variable hingegen ist immer nur in der aktuellen Prozedur verfügbar;
Die Variable mit der Bezeichnung 'y' in MySub ist von der Variable mit der
Bezeichnung 'y' im Hauptmodul vollkommen unabhängig.
Um eine lokale Variable einer Prozedur zugänglich zu machen, muss sie in
der Parameterliste der Prozedur erwähnt werden; siehe dazu
Prozeduren (Parameterübergabe), DECLARE, SUB, FUNCTION.

Der Unterschied zwischen DIM/REDIM SHARED und COMMON SHARED liegt darin, dass
DIM/REDIM SHARED-Variablen nur im aktuellen Modul allen Prozeduren zugänglich
sind; COMMON SHARED-Variablen sind im gesamten Programm mit all seinen Modulen
verfügbar.

Siehe auch:
DIM, COMMON

Unterschiede (zu QB):
SHARED ist unter freeBASIC nur noch ein Schlüsselwort, kein eigener Befehl;
es funktioniert nur im Zusammenhang mit DIM, REDIM oder COMMON


SHELL

Syntax: SHELL ([Kommando AS STRING])
Typ: Funktion
Kategorie: Verschiedenes

SHELL führt ein Systemkommando aus, und gibt die Kontrolle an das aufrufende
Programm zurück, sobald das aufgerufene Kommando abgearbeitet wurde.

  • 'Kommando' ist eine Befehlszeile, die an die Konsole übergeben wird. Dies
    kann der Name eines Programms inclusive Parametern oder ein Systemkommando sein.

  • Der Rückgabewert ist 0, wenn der Aufruf erfolgreich war, oder -1, wenn ein
    Fehler aufgetreten ist. Ein Fehler kann z.B. sein, dass die angegebene Datei
    oder der Befehl nicht existiert.

    • Beispiel (Windows):
    SHELL "DIR C:\*.*"

    Beispiel (Linux):
    SHELL "LS"

    Soll das aufgerufene Programm parallel zum FB-Programm laufen, kann unter Win32
    Start gestartet werden:
    SHELL "START notepad"

    Unterschiede
    zu QB:
  • SHELL kann auch als Funktion eingesezt werden.

  • Ohne Parameter wird keine CMD-Sitzung gestartet.

    • Siehe auch:
    RUN, EXEC, CHAIN,
    END,COMMAND,
    CONSTRUKTOR, DESTRUCTOR


SHL

Syntax A: Ergebnis = Zahl1 SHL Zahl2
Syntax B: Ergebnis SHL= Zahl
Typ: Operator
Kategorie: logische Operatoren

Verschiebt alle Bits in der Variable um eine bestimmte Stellenzahl nach links.

  • 'Zahl1', 'Zahl2' und 'Zahl' sind INTEGER-Werte. Wird SHL mit Fließkommazahlen (SINGLE oder DOUBLE) verwendet, so werden diese zuerst
    zu INTEGER-Werten gerundet.

  • Beim Kombinierten SHL (Syntax B) wird der Wert von in 'Ergebnis' um 'Zahl' Stellen nach links verschoben; es ist die Kurzform für
    Ergebnis = Ergebnis SHR Zahl

  • Bits, die über die letzte Stelle hinaus verschoben werden, gehen dabei verloren.

    • SHL ist für einen INTEGER gleichwertig mit der Multiplikation einer Zweierpotenz; der Exponent dabei ist dabei 'Zahl' bzw. 'Zahl2'.
    Ergebnis = Zahl1 SHL Zahl2
    entspricht also
    Ergebnis = Zahl1 * (2 ^ Zahl2)
    SHL wird dabei aber schneller durchgeführt als der oben genannte Ausdruck, selbst wenn (2 ^ Zahl2) durch seinen Wert als Konstante
    ersetzt wird.
    SHL wird daher zur Optimierung des Codes verwendet.

    Beispiel:
    DIM AS UBYTE a, b, c
    DIM AS SINGLE d, e, f

    a = 3
    b = 2
    c = a SHL b

    ? BIN(a, 8); " wird um "; b; " Stellen nach links verschoben. Das Ergebnis ist "; BIN(c, 8); "."
    c SHL= 5
    ? "Um fuenf weitere Stellen nach links verschoben ergibt sich "; BIN(c, 8); "."

    d = 2.9
    e = 2.4
    f = d SHL e

    ? BIN(d, 8); " wird um "; e; " Stellen nach links verschoben. Das Ergebnis ist "; BIN(f, 8); "."
    f SHL= 5
    ? "Um fuenf weitere Stelle nach links verschoben ergibt sich "; BIN(f); "."
    GETKEY
    Ausgabe:
    00000011 wird um 2 Stellen nach links verschoben. Das Ergebnis ist 00001100.
    Um fuenf weitere Stelle nach links verschoben ergibt sich 10000000.
    00000011 wird um  2.4 Stellen nach links verschoben. Das Ergebnis ist 00001100.
    Um fuenf weitere Stelle nach links verschoben ergibt sich 110000000.

    Ein UBYTE hat nur acht Bits. Deswegen geht bei der Verschiebung von &H00001100 um fünf Stellen nach links das erste Bit verloren, wodurch
    das ergebnis &H10000000 zustande kommt.
    Die Variable 'd' wird hier zu 3 auf-, die Variable 'e' zu 2 abgerundet. Deshalb ergeben sich auch für die SINGLE-Zeilen die selben Werte
    wie bei den UBYTE-Zeilen.
    Da für SINGLE-Variablen aber 32 Bit anstelle von 8 reserviert werden, geht das erste Bit nicht verloren. So kommt das Ergebnis &H110000000
    anstelle von &10000000 zustande.
    Dieser Code bietet sich zum experimentieren an; ändern Sie einfach die
    Zahlenwerte für a, b, c, d, e und f.

    SHL ist die Gegenfunktion zu SHR.

    Siehe auch:
    SHR, MOD,
    mathematische Operatoren


SHORT

Typ: Datentyp

SHORT-Zahlen sind vorzeichenbehaftete 16-bit-Ganzzahlen.
Sie liegen im bereich zwischen -32768 und 32767.
Berechnung der Bereiche: -(2 ^ 16) => (2 ^ 16) - 1

Siehe auch:
DIM,
BYTE, UBYTE,
USHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede:
Der Datentyp SHORT ist neu in freeBASIC; er hat die selben Eigenschaften wie der Datentyp INTEGER in QB.


SHR

Syntax A: Ergebnis = Zahl1 SHR Zahl2
Syntax B: Ergebnis SHR= Zahl
Typ: Operator
Kategorie: logische Operatoren

Verschiebt alle Bits in der Variable um eine bestimmte Stellenzahl nach rechts.

  • 'Zahl1', 'Zahl2' und 'Zahl' sind INTEGER-Werte. Wird SHR mit Fließkommazahlen (SINGLE oder DOUBLE) verwendet, so werden diese zuerst
    zu INTEGER-Werten gerundet.

  • Beim Kombinierten SHR (Syntax B) wird der Wert von in 'Ergebnis' um 'Zahl' Stellen nach rechts verschoben; es ist die Kurzform für
    Ergebnis = Ergebnis SHR Zahl

  • Bits, die über die letzte Stelle hinaus verschoben werden, gehen dabei verloren.

    • SHR ist für einen INTEGER gleichwertig mit der Division einer Zweierpotenz; der Exponent dabei ist dabei 'Zahl' bzw. 'Zahl2'.
    Ergebnis = Zahl1 SHR Zahl2
    entspricht also
    Ergebnis = Zahl1 \ (2 ^ Zahl2)
    SHR wird dabei aber schneller durchgeführt als der oben genannte Ausdruck, selbst wenn (2 ^ Zahl2) durch seinen Wert als Konstante
    ersetzt wird.
    SHR wird daher zur Optimierung des Codes verwendet.

    Beispiel:
    DIM AS INTEGER a, b, c
    DIM AS SINGLE d, e, f

    a = 12
    b = 2
    c = a SHR b

    ? BIN(a, 8); " wird um "; b; " Stellen nach rechts verschoben. Das Ergebnis ist "; BIN(c, 8); "."
    c SHR= 1
    ? "Um eine weitere Stelle nach rechts verschoben ergibt sich "; BIN(c, 8); "."

    d = 11.5
    e = 2.4
    f = d SHR e

    ? BIN(d, 8); " wird um "; e; " Stellen nach rechts verschoben. Das Ergebnis ist "; BIN(f, 8); "."
    f SHR= 1
    ? "Um eine weitere Stelle nach rechts verschoben ergibt sich "; BIN(f, 8); "."
    GETKEY
    Ausgabe:
    00001100 wird um 2 Stellen nach rechts verschoben. Das Ergebnis ist 00000011.
    Um eine weitere Stelle nach rechts verschoben ergibt sich 00000001.
    0000100 wird um 2.4 Stellen nach rechts verschoben. Das Ergebnis ist 00000011.
    Um eine weitere Stelle nach rechts verschoben ergibt sich 00000001.

    Bei der Verschiebung von &H00000011 um eine Stelle nach rechts geht das letzte Bit verloren; deswegen ist das Ergebnis &H00000001.
    Die Variable 'd' wird hier zu 12 auf-, die Variable 'e' zu 2 abgerundet. Deshalb ergeben sich auch für die SINGLE-Zeilen die selben
    Werte.
    Dieser Code bietet sich zum experimentieren an; ändern Sie einfach die Zahlenwerte für a, b, c, d, e und f.

    SHR ist die Gegenfunktion zu SHL.

    Siehe auch:
    SHL, MOD,
    mathematische Operatoren


SIN

Syntax: SIN ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Sinus eines Winkels im Bogenmaß zurück.
Der Sinus zu einem Winkel 'w' ist die relative Höhe innerhalb des Normkreises zu
seinem Mittelpunkt.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist ein DOUBLE-Wert, der den Sinus-Wert zum Winkel enthält.

    • Die Gegenfunktion zu SIN lautet ASIN.

    Beispiel:
    CONST pi AS DOUBLE = 3.1415926535897932
    DIM a AS DOUBLE
    DIM r AS DOUBLE

    INPUT "Bitte geben Sie einen Winkel in Grad (DEG) ein: ", a
    r = a * PI / 180 ' Grad in Bogenmaß umrechnen
    PRINT ""
    PRINT "Der Sinus eines " ; a; " Grad-Winkels angle ist"; SIN(r)
    GETKEY
    Ausgabe:
    Bitte geben Sie einen Winkel in Grad (DEG) ein: 30

    Der Sinus eines 30 Grad-Winkels ist 0.5

    Siehe auch:
    ASIN,
    COS, ACOS,
    TAN, ATN, ATAN2,
    mathematische Operatoren


SINGLE

Typ: Datentyp

SINGLE bedeutet einfache Genauigkeit. Variablen vom Typ SINGLE sind vorzeichenbehaftete
32-bit-Fließkommazahlen.
Damit lassen sich circa 7 Nachkommastellen darstellen, der Wertebereich für
SINGLE-Zahlen liegt ungefähr zwischen -10 ^ 38 und +10 ^ 38.
Sie werden benutzt, um Dezimalzahlen zu speichern, die nicht sehr genau sein müssen.
Sie verhalten sich ähnlich wie DOUBLE-Zahlen, sind jedoch nicht so genau.

Beispiel:
DIM a AS SINGLE
a = 0.1234567
PRINT a

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST


SIZEOF

Syntax: SIZEOF(Variable AS ANY)
Typ: Funktion
Kategorie: Speicherverwaltung

SIZEOF gibt die Größe einer Struktur im Speicher aus.

  • Diese Struktur kann eine Variable (a, b$, c(), ...) sein, ein Datentyp (z.B. INTEGER)
    oder ein UDT-Bezeichner (siehe TYPE.

  • Wird SIZEOF an einem String variabler Länge angewandt, wird die Größe des
    Bezeichners ausgegeben.

  • Wird SIZEOF an einem String fester Länge oder an einem ZSTRING angewandt,
    wird die Größe des reservierten Speicherbereichs ausgegeben

    • Das Ergebnis von SIZEOF ist oft gleich dem von LEN, jedoch NICHT IMMER!
    Siehe dazu die Beispiele von ZSTRING und WSTRING (Datentyp).

    Dies zeigt auch dieses Beispiel:
    DIM a AS INTEGER, b AS STRING, c AS STRING * 5, d(5) AS INTEGER

    ? "1) LEN"
    ? LEN(a) ' Ausgabe: 4 => 32bit-Integer
    ? LEN(b) ' Ausgabe: 0 => Leerstring
    ? LEN(c) ' Ausgabe: 5 => 5-Zeichen-String
    ? LEN(d(0)) ' Ausgabe: 4 => 32bit-Integer
    ? LEN(d) ' Ausgabe: 4 => Pointer auf Array, also 32bit-Integer
    ?
    ? "2) SIZEOF"
    ? SIZEOF(a) ' Ausgabe: 4 => 32bit-Integer
    ? SIZEOF(b) ' Ausgabe: 12 => Siehe STRING (Datentyp) für Erklärung
    ? SIZEOF(c) ' Ausgabe: 6 => 5 Zeichen + 1 Nullzeichen CHR(0)
    ? SIZEOF(d(0)) ' Ausgabe: 4 => 32bit-Integer
    ? SIZEOF(d) ' Ausgabe: 4 => Pointer auf Array, also 32bit-Integer
    SLEEP
    Anmerkung: Das Zeichen ? wird seit freeBASIC v0.15b wie ein PRINT (Anweisung)
    interpretiert.

    Siehe auch:
    LEN, OFFSETOF,
    STRING (Datentyp)


SLEEP

Syntax: SLEEP [Zeit] [, Flags]
Typ: Anweisung
Kategorie: Verschiedenes

Wartet eine bestimmte Zeit, oder bis eine Taste gedrückt wird.

  • 'Zeit' ist die Zahl der Millisekunden, die vergehen sollen, bis das Programm
    fortgesetzt wird.

  • Wird 'Zeit ausgelassen, wartet freeBASIC mit der Programmfortsetzung bis
    zum nächsten Tastendruck.

  • Auch wenn eine Wartezeit angegeben wurde, setzt freeBASIC bei einem
    Tastendruck die Programmausführung fort, selbst wenn die Wartezeit noch
    nicht verstrichen ist.

  • 'Flags' wenn für Flags eins angegeben wird, reagiert SLEEP nicht auf
    Tastendrücke; es wird wirklich gewartet, bis die Zeit verstrichen ist.

  • Wird SLEEP ohne 'Zeit', aber mit 'Flags' aufgerufen, wird ein Fehler erzeugt.

    • ACHTUNG: Der Tastaturpuffer wird dadurch nicht beeinflusst! Er muss nach einem
    Aufruf von SLEEP erst neu geleert werden!

    Beispiel:
    PRINT "Drücken Sie bitte eine Taste"
    SLEEP
    PRINT "Sie haben "; INKEY ; " gedrückt."
    PRINT "Warte 5 Sekunden"
    SLEEP 5000

    Siehe auch:
    TIMER, INKEY

    Unterschiede (zu QB):
    Die Zeiteinheit ist 1 Millisekunde, nicht mehr 1 Sekunde.


SPACE

Syntax: SPACE[$](n)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt einen String zurück, der aus 'n' Leerzeichen besteht.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
DIM s AS STRING
s = SPACE(6)
PRINT "nicht eingerückter Text"
PRINT s + "eingerückter Text"

Siehe auch:
STRING (Funktion), TAB, SPC
WSPACE


SPC

Syntax: PRINT [Stringausdruck;]SPC(n)[;Stringausdruck]
Typ: Funktion
Kategorie: Konsole

Wird im Zusammenhang mit PRINT (Anweisung) verwendet, um Texteinrückungen zu erzeugen.
Gibt eine Kette aus Leerzeichen aus. Die Länge dieser Kette berechnet sich
nach der Formel
n MOD Breite
wobei 'Breite' die aktuelle Breite des Konsole-Fensters ist. (Siehe WIDTH (Anweisung))
SPC arbeitet ähnlich wie SPACE, jedoch ist die Kette aus Leerzeichen nie
länger als das Konsole-Fenster derzeit breit ist.

Siehe auch:
PRINT (Anweisung),
SPACE,
WIDTH (Anweisung)


SQR

Syntax: SQR (numerischer Ausdruck)
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt die Quadratwurzel (square root) einer Zahl aus.
SQR hat die selbe Funktion wie number ^ (1/2).

Beispiel:
PRINT SQR(9) ' Ausgabe 3
PRINT 9 ^ (1/2) ' Ausgabe 3
PRINT SQR(20 ^ 2) ' Ausgabe 20

Siehe auch:
mathematische Operatoren


STATIC (Anweisung)

Syntax A:
STATIC Variable1 [AS Typ] [= einfacherAusdruck]  [, Variable2 [AS Typ] [= einfacherAusdruck] [,...] ]
Syntax B:
STATIC AS Typ Variable1   [= einfacherAusdruck], [Variable2 [= einfacherAusdruck] [,...] ]
Syntax C:
STATIC Array([Startindex TO] Endindex [, [Startindex TO] Endindex], [, ...]) [AS Typ] [=> {einfacherAusdruck [, einfacherAusdruck [, ...]] }]
Typ: Anweisung
Kategorie: Speicherverwaltung

Deklariert Variablen oder Arrays einer lokalen Prozedur und speichert sie, wenn die Prozedur beendet wird, so dass ihr Wert beim
nächsten Aufruf wieder verfügbar ist.

  • 'Variable' bzw. 'Array' ist ein Bezeichner für eine Variable oder ein Array, die/das in der lokalen Prozedur dimensioniert und gespeichert
    werden soll

  • 'Typ' ist der Datentyp der Variable/des Arrays. Siehe Datentypen

  • Ebenso wie bei DIM ist es möglich, Variablen-Initiatoren zu verwenden.

    • Beispiel:
    FUNCTION foobar (param AS INTEGER)
    STATIC i

    i *= param
    foobar = i

    END FUNCTION

    STATIC wirkt wie ein DIM, und kann auch den Wert einer Variable initialisieren:
    DECLARE SUB foo

    foo
    foo
    SLEEP

    SUB foo
    STATIC i = 5

    PRINT i
    i += 1
    END SUB
    Ausgabe:
    5
    6
    Der Teil STATIC i = 5 wird also nur beim ersten Aufruf der Funktion ausgeführt; der Wert von i ändert sich bei jedem Aufruf
    von foo.

    Anmerkung
    Seit freeBASIC v0.16b kann STATIC auch auf Modulebene (außerhalb von SUBs/FUNCTIONs) angewandt werden.

    Siehe auch:
    DIM, SHARED

    Unterschiede
    zu QB:
  • Kann auch mit Arrays verwendet werden, genau wie bei DIM oder REDIM

    • zu früheren Versionen von freeBASIC
  • Seit freeBASIC v0.16b kann STATIC auch auf Modulebene (außerhalb von SUBs/FUNCTIONs) angewandt werden.


STATIC (Klausel)

Syntax: { SUB | FUNCTION } Bezeichner (Parameterliste) STATIC
Typ: Klausel
Kategorie: Programmorganisation

Als Klausel bei Prozeduren bewirkt STATIC, dass die Werte aller Variablen zwischengespeichert werden; das bedeutet, dass nach einem Aufruf
die Belegung der Variablen innerhalb der Prozedur erhalten bleibt.

Siehe SUB zu Details zu den weiteren Syntax-Bestandteilen.

Beispiel:
DECLARE SUB Std_Sub
DECLARE SUB Sta_Sub

PRINT "Standard-Sub:"
Std_Sub
Std_Sub
PRINT

PRINT "STATIC-Sub:"
Sta_Sub
Sta_Sub

GETKEY

SUB Std_Sub
DIM a AS INTEGER
a += 1
PRINT a
END SUB

SUB Sta_Sub STATIC
DIM a AS INTEGER
a += 1
PRINT a
END SUB
Ausgabe:
Standard-Sub:
 1
 1

STATIC-Sub:
 1
 2

Unterschiede
zu QB
  • - keine -

    • zu früheren Versionen von freeBASIC
  • Bis freeBASIC v0.17 war es auch zulässig, das STATIC-Schlüsselwort links vom Prozedur-Header zu platzieren; seit v0.17 allerdings
    ist diese Form
    STATIC SUB Name
    ungültig.

  • STATIC kann in diesem Sinne erst seit freeBASIC v0.06 eingesetzt werden.

    • Siehe auch:
    STATIC,
    DECLARE, SUB, FUNCTION,
    Prozeduren


STATIC (Metabefehl)

Syntax: '$STATIC
Typ: Metabefehl
Kategorie: Speicherverwaltung

'$STATIC bewirkt, dass alle Arrays zum Compilierzeitpunkt eine feste Speichergröße zugewiesen bekommen. Das bedeutet, sie können nicht
neu festgelegt (mit REDIM) oder gelöscht werden (mit ERASE).

'$STATIC kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist '$STATIC nicht mehr zulässig! Arrays sind in diesem Fall immer statisch, außer, wenn sie mit REDIM erstellt wurden,
oder bei der Erstellung keine Dimensionen angegeben wurden:
REDIM Dynamisch1 (200) AS INTEGER
DIM Dynamisch2 () AS INTEGER
DIM Statisch (200) AS INTEGER

Folgende Beispiele sind also nur bis v0.16 bzw. bei genannter Kommandozeilenoption gültig:
Beispiel:
'$STATIC
DIM StaticArray(5) AS INTEGER

'$DYNAMIC
DIM DynamicArray(5) AS INTEGER
REDIM DynamicArray(6) AS INTEGER

Siehe auch:
STATIC
DYNAMIC (Metabefehl),
OPTION, DYNAMIC (Schlüsselwort), STATIC (Schlüsselwort),
DIM, REDIM


STATIC (Schlüsselwort)

Syntax: OPTION STATIC
Typ: Schlüsselwort
Kategorie: Programmorganisation

Legt fest, dass Arrays standardmäßig STATIC verwaltet werden sollen.
Durch die Metabefehle DYNAMIC und STATIC wird dieser Standard
außer Kraft gesetzt.
In freeBASIC ist standardmäßig OPTION STATIC gesetzt; diese Option können wird erst nötig, wenn Sie ein zuvor eingestelltes OPTION DYNAMIC
außer Kraft setzen wollen.
Zu empfehlen ist auch die Verwendung von OPTION STATIC zu Beginn des Programms, um zu verdeutlichen, dass dieses Programm mit statischen
Arrays arbeitet.

OPTION STATIC kann nur bis freeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption
-lang deprecated
kompiliert wurden! Wird mit freeBASIC v0.17 unter der Option
-lang fb
kompiliert, so ist OPTION STATIC nicht mehr zulässig! Arrays sind in diesem Fall immer statisch, außer, wenn sie mit REDIM erstellt wurden,
oder bei der Erstellung keine Dimensionen angegeben wurden:
REDIM Dynamisch1 (200) AS INTEGER
DIM Dynamisch2 () AS INTEGER
DIM Statisch (200) AS INTEGER

(Beachten Sie dazu auch die FB-Dialektformen.)

Siehe auch:
STATIC,
DYNAMIC (Metabefehl), OPTION,
DIM,
FB-Dialektformen

Unterschiede
zu QB:
  • STATIC konnte unter QB nicht mit OPTION verwendet werden; es musste auf den Metabefehl '$STATIC zurückgegriffen werden.

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.17 kann OPTION STATIC nur noch eingesetzt werden, wenn die Kommandozeilenoption
    -lang deprecated
    eingesetzt wird. Ansonsten wird die Verwaltung eines Arrays durch die Art der Erstellung festgelegt.
  • Die Verwendung als Klausel bei Prozeduren existiert erst seit freeBASIC v0.06


STATIC

STATIC ist ein Schlüsselwort, das auf viererlei Weise eingesetzt werden kann:

Siehe:
  • STATIC (Anweisung)

  • STATIC (Metabefehl)

  • STATIC (Schlüsselwort)

  • STATIC (Klausel)

    • Siehe auch:
    OPTION, SUB, DIM


STDCALL

Typ: Schlüsselwort
Kategorie: Fremdsprachen

Siehe auch:
DECLARE, CDECL, PASCAL

Unterschiede: Neu in freeBASIC.


STEP

Typ: Schlüsselwort
Kategorie: Schleifen

Siehe:
FOR...NEXT,
PSET (Grafik), PRESET (Grafik),
LINE (Grafik), CIRCLE,
PAINT,
GET (Grafik), PUT (Grafik)


STOP

Syntax: STOP [Errorlevel]
Typ: Anweisung
Kategorie: Verschiedenes

Beendet die Ausführung eines Programms, und gibt einen Errorlevel das System
zurück. Wird 'Errorlevel' ausgelassen, nimmt freeBASIC autotmatisch 0 an.

Es wird empfohlen, END, zu verwenden, da
STOP nur aus Kompatibilitätsgründen zu älteren BASIC-Dialekten beibehalten
wurde.

Siehe auch:
END, SYSTEM

Unterschiede (zu QB):
Hat die selbe Funktion wie END oder SYSTEM.


STR

Syntax: STR[$](numerischer Ausdruck)
Typ: Funktion
Kategorie: Stringmanipulation

Verwandelt einen numerischen Ausdruck in einen STRING.
STR ist die Gegenfunktion zu VAL.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
DIM a AS INTEGER
DIM b AS STRING
a = 8421
b = STR(a)
PRINT a, b, STR("&HaB1)

Siehe auch:
VAL, WSTR, STRING (Funktion),
STRING (Datentyp)

Unterschiede (Zu QB):
Bei positiven Ganzzahlen wird kein Leerzeichen vorangestellt.


STRING (Datentyp)

Typ: Datentyp

Ein STRING ist eine Zeichenkette, die einen zusammenhängenden Text, einzelne Wörter,
Buchstaben oder sonstige Zeichen enthalten kann; auch Leerstrings (also STRINGs
ohne jeglichen Inhalt) sind möglich
"Hallo!" ist ein Beispiel für einen String.
In freeBASIC werden Strings immer von "Anführungszeichen" eingerahmt. Sollen in
ihrer Zeichenkette Anführungszeichen vorkommen, so können Sie dies auf
verschiedene Weise erreichen:
  • Durch Stringverkettung und CHR:
    Der ASCII-Code eines Anführungszeichens ist 34. Sie können also einfach CHR(34)
    an einen String anhängen, wie in diesem Beispiel:
    "Und er sagte: " + CHR(34) + "Möge die Macht mit dir sein" + CHR(34)

  • Zwei Anführungszeichen in Folge werden von freeBASIC genau so implementiert
    wie ein CHR(34). Der genannte Beispielcode lässt sich also auch bequem eingeben
    als:
    "Und er sagte: ""Möge die Macht mit dir sein"""
    Beachten Sie dabei aber, dass das abschließende Anführungszeichen, das das
    Stringende markiert, nicht fehlen darf!

    • Man unterscheidet zwei Arten von Strings:
  • var-lenght-Strings (Strings variabler Länge)

  • fixed-lenght-Strings (Strings fester Länge)

    • Var-length-Strings werden dynamisch verwaltet; ihre Größe im Speicher hängt von
    der Länge des Strings ab.
    Sie werden durch eine dieser Zeilen erstellt:
    DIM variable AS STRING
    DIM variable$
    (In der letzten Zeile legt das Dollarzeichen $ fest, dass es sich hierbei um
    einen STRING handelt. Die Markierung des Datentyps durhc Suffixe wurde
    allerdings nur zur Abwärtskompatibilität mit QB beibehalten; die Methode sollte
    vermieden werden.)

    Strings variabler Länge werden intern über einen descriptor (dt: Bezeichner)
    gehandhabt. Dieser Bezeichner enthält einen Pointer zum eigentlichen String und
    der Länge des STRINGs.
    VARPTR gibt einen Pointer auf den Bezeichner zurückgeben, während STRPTR einen
    Pointer auf den tatsächlichen String zurückgibt.
    Am einde eines STRINGs wird automatisch ein CHR(0) angehängt. Dadurch kann bei
    der Übergabe an externe Funktionen auf zeitaufwändiges Kopieren verzichtet
    werden.
    Ein String variabler Länge wird also durch drei Dinge beschrieben: Der Adresse
    seines Bezeichners, der Adresse der Zeichenkette und ihrer Länge. Deshalb gibt
    SIZEOF(STRING) immer 12 aus, da 3 Integerstellen zu je 4 Byte verwendet werden.

    Ein fixed-length-String verhält sich wie ein QB-String fester Länge. Er wird
    folgendermaßen erstellt:
    DIM variable AS STRING * Länge
    Länge ist dabei eine Konstante oder ein einfacher Ausdruck; Länge darf KEINE
    Variablen enthalten.
    Strings fester Länge haben keinen descriptor und werden nicht redimensioniert,
    wenn sich die Länge der enthaltenen Zeichenkette ändert.
    Wenn einen STRING fester Länge eine Zeichenkette zugewiesen werden soll, die
    größer ist, als die zuvor festgelegte Länge des Strings wird sie - wie in QB -
    am rechten Ende abgeschnitten, so dass sie in die STRING-Speicherstelle passt.
    Soll also
    1234567890
    in einem String mit fester Länge 5 gespeichert werden, enthält der String
    anschließend die Zeichenkette
    12345.

    Ein String - egal ob fixed oder var length - kann bis zu 2'147'483'648 Zeichen lang
    sein; dies entspricht einer Datenmenge von 2GB.

    Alle Strings können indiziert werden. Das bedeutet, man kann den ASCII-Code
    jedes beliebigen Zeichen innerhalb eines Strings über seinen Index ermitteln.
    Dazu verwendet man die Syntax
    ASCII = StringVariable[n]
    wobei 'n' die Nummer des Zeichens im String minus eins ist. Das erste Zeichen
    eines Strings wird also über StringVariable[0] indiziert.

    Beispiel:
    DIM a AS STRING, b AS STRING * 11 ' Strings erstellen
    a = "hello World" ' und befüllen
    b = a ' auf dem Bildschirm ausgeben
    ? a
    ? b
    ?

    DIM aa AS UINTEGER PTR, ab AS UBYTE PTR ' Zwei Pointer zur Analyse...
    aa = @a ' die Adresse des Bezeichners
    ab = @b ' die Adresse des ersten Zeichens
    ? aa ' Adressen ausgeben
    ? ab
    ?
    ? *ab ' 104, ASCII-Code von h, dem ersten
    ' Zeichen im String
    ? CHR(*ab) ' h, das erste Zeichen im String.
    ?
    ? PEEK(UINTEGER, aa) ' Beide Male die eigentliche Adresse
    ? STRPTR(a) ' der eigentlichen Zeichenkette
    ?
    ? PEEK(UINTEGER, aa + 4) ' Beide Male die Länge des Strings
    ? LEN(a)
    ?
    ? PEEK(UBYTE, PEEK(UINTEGER, aa)) ' Beide Male das erste Zeichen des
    ? a[0] ' var-length-Strings als ASCII...
    ?
    ? CHR(PEEK(UBYTE, PEEK(UINTEGER, aa))) ' und als Zeichen.
    ? CHR(a[0])
    SLEEP
    Anmerkung: Seit freeBASIC v0.15b wird ein ? wie ein PRINT (Anweisung) interpretiert.

    Siehe auch:
    Datentypen
    DIM,
    BYTE, UBYTE,
    SHORT, USHORT,
    INTEGER, UINTEGER, LONG,
    LONGINT, ULONGINT,
    SINGLE, DOUBLE,
    ZSTRING, WSTRING (Datentyp),
    Datentypen,
    LEN, SIZEOF,
    CAST
    Stringfunktionen
    CHR, WCHR, ASC,
    STR, WSTR, VAL,
    BIN, HEX, OCT,
    WBIN, WHEX, WOCT,
    SPACE, WSPACE
    LEFT, RIGHT, MID (Funktion),
    LTRIM, RTRIM, TRIM,
    INSTR,
    INPUT (Funktion), WINPUT (Funktion)

    Unterschiede (zu QB):
    Ein QB-String konnte maximal 32'767 Zeichen lang sein; ein FB-String darf bis zu
    2'147'483'648 Zeichen lang sein; das entspricht einer Datenmenge von 2GB.


STRING (Funktion)

Syntax A: STRING[$](n, code)
Syntax B: STRING[$](n, Charakter$)
Typ: Funktion
Kategorie: Stringmanipulation

STRING(Funktion) gibt eine Zeichenkette aus 'n' Zeichen aus; jedes Zeichen dieser
Kette ist 'Charakter$' bzw. CHR('code').
Wenn 'Charakter$' aus mehreren Zeichen besteht, wird eine Kette ausgegeben, die
nur aus dem ersten Zeichen von 'Charakter$' besteht.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel: Text unterstreichen:
msg$ = "freeBASIC ist ein BASIC Compiler"
l = LEN(msg$)
PRINT msg$
PRINT STRING(l, "-")

Siehe auch:
WSTRING (Funktion),
SPACE


STRING

Typ: Datentyp/Funktion

STRING ist ein Schlüsselwort, das als Datentyp und Funktion eingesetzt
werden kann.

Siehe:
STRING (Datentyp)
STRING (Funktion)


STRPTR

Syntax: STRPTR(StringVariable)
Typ: Funktion
Kategorie: Speicherverwaltung

STRPTR gibt einen Pointer zu einer STRING-Variablen zurück.
Achtung: STRPTR kann nicht durch die Syntax
@StringVariable
ersetzt werden!
(Siehe STRING für Erklärung)

STRPTR ist ein Alias für SADD.

Beispiel:
DIM s AS STRING
PRINT STRPTR(s)

s = "hello"
PRINT STRPTR(s)
s = "abcdefg, 1234567, 54321"
PRINT STRPTR(s), @s

POKE UBYTE, STRPTR(s), 65
PRINT s

Unterschiede:
zu QB:
  • Neu in freeBASIC

    • Siehe auch:
    STRING (Datentyp),
    VARPTR, SADD,
    PEEK, POKE,
    Pointer


SUB

Syntax A:
DECLARE SUB Name [OVERLOAD] [Konvention] [ [LIB "DLLName"] ALIAS "AliasName"] [ (Parameterliste) ] [EXPORT]

[{PRIVATE | PUBLIC }] SUB Name [Konvention] [OVERLOAD] ([Parameterliste]) [ {CONSTRUCTOR | DESTRUCTOR} ] [STATIC]
   ' Anweisungen
END SUB
Typ: Prozedur
Kategorie: Programmorganisation

Eine SUB ist ein Unterprogramm.
Ein Unterprogramm besteht aus normalen Anweisungen, und folgt den selben Regeln wie der Code auf Modulebene (dem Code außerhalb einer
SUB.)
Der SUB-Code kann aus jeder Programmsituation heraus aufgerufen werden, d.h. beim Aufruf der Sub wird ihr Code ausgeführt.
Dadurch ist es möglich, ein Programm übersichtlich zu gestalten, da routinemäßige (immer wiederkehrende) Aufgaben in einer SUB 'ausgelagert'
werden können, und mittels nur einer einzigen Programmzeile ausgeführt werden können.

  • 'Name' ist der Bezeichner, unter dem die SUB aufgerufen wird.

  • 'Parameterliste' ist die Liste der Parameter, die an die SUB übergeben werden. Sie hat das folgende Format:
    [ {BYVAL | BYREF } ] Parameter [AS Typ] [= Wert] [,[ {BYVAL | BYREF } ] Parameter [AS Typ] [= Wert] [, ...]
    Siehe weiter unten zum Prinzip Parameterübergabe.

  • 'Typ' ist dabei ein Datentyp des Parameters; siehe Datentypen.
    Durch das '= Wert' wird ein Parameter als optional deklariert; er kann beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird
    an die Sub für diesen Parameter 'Wert' übergeben.

  • BYVAL und BYREF regeln die Art der Parameterübergabe an die SUB. Siehe dazu auch
    OPTION BYVAL

  • Siehe OPTION PRIVATE für Details zu PRIVATE und PUBLIC

  • Zu 'Konvention' siehe die Schlüsselwörter zu den Aufrufkonventionen: CDECL, PASCAL, STDCALL

  • Siehe den entsprechenden Referenz-Eintrag zu OVERLOAD

  • Siehe CONSTRUCTOR (Module) und DESTRUCTOR (Module) für Details zu CONSTRUCTOR und DESTRUCTOR.
    CONSTRUCTOR/DESTRUCTOR-SUBs dürfen keine Parameter besitzen.

  • Die STATIC-Klausel bewirkt, dass alle Variablen innerhalb der SUB zwischengespeichert werden. Das bedeutet, dass die Werte von
    Variablen, die in der SUB verwendet werden, nach einem Aufruf nicht verloren gehen, sondern beim nächsten Aufruf der SUB wieder
    verfügbar sind.
    Siehe auch STATIC (Klausel)

    • Die DECLARE-Zeile (Syntax A) dient dazu, dem Compiler anzukündigen, dass im späteren Programmverlauf ein SUB auftauchen wird. Sie muss
    vorhanden sein, damit die SUB aufgerufen werden kann.
    Siehe auch DECLARE.

    Aufgerufen wird eine SUB über CALL (veraltet!), oder einfach über ihren Bezeichner. Fügen Sie in Ihrem Code
    einfach eine Zeile mit dem Bezeichner der SUB ein, so als wäre dieser Bezeichner eine Anweisung.
    Ein solcher Aufruf darf an jeder Stelle im Programm heraus erfolgen, auch, wenn sich das Programm bereits auf Prozedurebene (also innerhalb
    einer SUB, FUNCTION, PROPERTY oder einem OPERATOR) befindet.

    Die im Hauptprogramm verwendeten Variablen sind in SUBs nicht verfügbar. Um auf sie dennoch zuzugreifen, müssen sie zuerst in der Parameterliste
    übergeben werden. Man bezeichnet eine SUB (oder Prozeduren allgemein) als SCOPE-Blöcke. Das bedeutet, dass Variablen, die auf SUB-Ebene
    dimensioniert werden, auf Modulebene nicht verfügbar sind.
    Außerdem sind die Bezeichner der Modulebene in SUBs nicht verfügbar. Verwenden Sie etwa auf Modulebene eine Variable mit dem Bezeichner
    'a', so ist ihr Bezeichner in der SUB nicht verfügbar; ein Versuch, darauf zuzugreifen endet mit der Fehlermeldung 'Variable nicht
    deklariert'.
    Erstellen Sie in dieser SUB eine Variable mit dem Bezeichner 'a', so verweist er auf eine andere Speicheradresse; der Wert von 'a' auf
    Modulebene und der von 'a' auf Prozedurebene (in der SUB) stehen in keiner Relation zueinander.
    Um die verschiedenen Ebenen Ihres Programms miteinander Kommunizieren zu lassen, müssen Sie Ihren SUBs Variablen in der Parameterliste
    übergeben. Dieser Verweis in der Parameterliste kann als 'Erlaubnis' an die SUB gedeutet werden, auf eine entsprechende Variable
    zuzugreifen. Dabei kann sich während der Übergabe der Bezeichner ändern; lediglich die Position innerhalb der Liste ist von Bedeutung.
    Siehe dazu auch Parameterübergabe.

    Sofern er nicht bei der Deklaration der SUB als optional markiert wurde (die geschieht in der Parameterliste durch die Klausel '= Wert'),
    MUSS ein Parameter übergeben werden. Geschieht dies nicht, so wird die Fehlermeldung 'Argument Count mismatch' ausgegeben.
    Achten Sie bei der Verwendung von optionalen Parametern darauf, dass entsprechende Kommata gesetzt werden müssen, um die Position von
    übergebenen Variablen anzugeben!

    Besonders Praktisch sind SUBs, wenn Sie einen Codeteil haben, der mehrere Male mit verschiedenen Werten von Variablen ausgeführt werden
    muss. In diesem Fall lagern Sie den Programmteil in einer SUB aus, und übergeben Sie die Variablen. Somit ersparen Sie sich das vielfache
    Schreiben des selben Codes.

    Das Ende einer SUB wird mit END SUB markiert; diese Zeile muss angegeben werden!

    SUBs können auch als Konstruktoren/Destruktoren eingesetzt werden; siehe dazu CONSTRUCTOR (Module) und DESTRUCTOR (Module).

    Beispiel: Farbigen Text mittels einer SUB ausgeben:
    DECLARE SUB colortext (txt AS STRING, clr AS INTEGER)
    DIM i AS INTEGER

    colortext "blue" , 1
    colortext "green", 2
    colortext "red" , 4
    PRINT

    FOR i = 1 TO 15
    colortext "COLOR " + STR(i), i
    NEXT

    '------------------------------------------------------------------------------'

    SUB colortext (txt AS STRING, clr AS INTEGER)
    COLOR clr
    PRINT txt
    END SUB

    Einem Prozedurnamen können mehrere Prozeduren zugewiesen werden; siehe OVERLOAD.

    Unterschiede:
    zu QB:
  • Parameter können optional sein

  • SUBs können überladen werden

    • zu früheren Versionen von freeBASIC
  • Bis freeBASIC v0.17 war es auch zulässig, das STATIC-Schlüsselwort links vom Prozedur-Header zu platzieren; seit v0.17 allerdings
    ist diese Form
    STATIC SUB Name
    ungültig.

  • Seit freeBASIC v0.17 ist es zulässig, auf Prozedurebene (z.B. innerhalb einer SUB) TYPEs, UNIONs und ENUMs zu erstellen.

  • Seit freeBASIC v0.16 ist es zulässig, Arrays undefinierter Größe auch innerhalb von SUBs zu definieren. (z.B. DIM foo().)

  • Seit freeBASIC v0.16 wird RETURN in SUBs als Shortcut für EXIT SUB eingesetzt. Damit verbunden ist, dass GOSUB und ON...GOSUB
    nicht mehr auf Prozedurebene eingesetzt werden können.

  • SUB overloading ist erst seit freeBASIC v0.14 möglich; siehe OVERLOAD.

  • Variable Argumente sind erst seit freeBASIC v0.13 möglich; siehe VA_ARG.

  • Optionale Parameter existieren in SUBs erst seit freeBASIC v0.13.

  • Seit freeBASIC v0.12 müssen in den DECLARE-Zeilen keine Parameter-Namen mehr genannt werden; es ist jedoch immer noch zulässig.

    • Siehe auch:
    FUNCTION, PROPERTY, OPERATOR,
    DECLARE, OVERLOAD,
    EXIT, END,
    BYVAL, BYREF, SHARED,
    PRIVATE (Klausel), PUBLIC (Klausel), OPTION,
    CONSTRUCTOR (Module), DESTRUCTOR (Module),
    Prozeduren, Parameterübergabe


SWAP

Syntax: SWAP Variable1, Variable2
Typ: Anweisung
Kategorie: Verschiedenes

Tauscht die Werte zweier Variablen aus.

Beispiel:
INPUT "Geben Sie bitte eine Zahl ein"; a
INPUT "Geben Sie bitte noch eine Zahl ein"; b
IF a > b THEN SWAP a, b
PRINT "die Zahlen in aufsteigender Reihenfolge:"
PRINT a, b

LET


SYSTEM

Syntax: SYSTEM [(Errorlevel)]
Typ: Anweisung
Kategorie: Verschiedenes

Beendet die Ausführung eines Programms, und gibt einen Errorlevel an das System
zurück. Wird 'Errorlevel' ausgelassen, nimmt freeBASIC automatisch 0 an.

Es wird empfohlen, END, zu verwenden, da
SYSTEM nur aus Kompatibilitätsgründen zu älteren BASIC-Dialekten
beibehalten wurde.

Siehe auch:
END

Unterschiede (zu QB):
Hat die selbe Funktion wie END oder STOP.


Liste der Schlüsselwörter beginnend mit T

TAB
TAN
THEN
THREADCREATE
TRHEADWAIT
TIME
TIMER
TIMESERIAL
TIMEVALUE
TO
TRANS
TRIM
TYPE (UTD)
TYPE (Forward Referencing)
TYPE (Funktion)
TYPE


TAB

Syntax: TAB (Spalte)
Typ: Funktion
Kategorie: Konsole

Spezielle Funktion, die zusammen mit PRINT (Anweisung) benutzt wird, um einen Ausdruck in einer
Spalte auszugeben.

PRINT "foo"; TAB(20); "bar"
PRINT "hello"; TAB(20); "world"

Siehe auch:
SPACE, SPC, PRINT (Anweisung)


TAN

Syntax: TAN ( Zahl )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Tangens eines Winkels im Bogenmaß zurück.
Der Tangens zu einem Winkel 'w' ist die Steigung einer Geraden, die mit der
x-Achse den Winkel 'w' einschließt.

  • 'Zahl' ist eine beliebiger nummerischer Ausdruck. Variablen, Konstanten, Operatoren
    und Funktionen sind erlaubt. Der Ausdruck darf von jeden Datentyp außer STRING,
    ZSTRING oder WSTRING sein.

  • Der Rückgabewert ist ein DOUBLE-Wert, der die Steigung einer Geraden
    darstellt.

    • Die Gegenfunktionen zu TAN lauten ATN und ATAN2.

    Beispiel:
    CONST pi AS DOUBLE = 3.1415926535897932
    DIM a AS DOUBLE
    DIM r AS DOUBLE
    INPUT "Bitte geben Sie einen Winkel in Grad (DEG) ein: ", a
    r = a * PI / 180 ' Grad in Bogenmaß umrechnen
    PRINT ""
    PRINT "Der Tangens eines " ; a; " Grad-Winkels angle ist"; TAN(r)
    GETKEY
    Ausgabe:
    Bitte geben Sie einen Winkel in Grad (DEG) ein: 75

    Der Tangens eines 75 Grad-Winkels ist 3.732050807568878

    Siehe auch:
    SIN, ASIN,
    COS, ACOS,
    ATN, ATAN2
    mathematische Operatoren


THEN

Typ: Schlüsselwort
Kategorie: Bedingungen

Siehe IF...THEN.


THIS

Syntax: THIS
Typ: Schlüsselwort
Kategorie: Datentypen

Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.

THIS wird in Prozeduren verwendet, die einem UTD (User defined Type - siehe TYPE (UDT)) fest zugeordnet sind, um auf die Records des
UDTs zuzugreifen.
Dazu zählen auch Properties, nicht-statische Operatoren, sowie CONSTRUCTOR,- und DESTRUCTOR-Prozeduren.

Auf THIS kann mit WITH zugegriffen werden.

Beispiel:
Type sometype
Declare Sub MyCall()
value As Integer
End Type

Dim example As sometype

' Setze den Record 'value' auf 0
example.value = 0
Print "'value' = "; example.value

' Rufe die zugeordnete SUB auf
example.MyCall()

' jetzt ist der 'value' gleich 10
Print example.value

Sub sometype.MyCall()
This.value = 10
End Sub

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • THIS existiert seit freeBASIC v0.17

    • Siehe auch:
    OPERATOR, PROPERTY
    TYPE (UDT),
    CONSTRUCTOR, DESTRUCTOR,


THREADCREATE

Syntax: THREADCREATE ( MySub AS FUNCTION PTR, BYVAL Argument AS INTEGER) AS INTEGER
Typ: Funktion
Kategorie: Programmorganisation

THREADCREATE startet eine Prozedur Ihres Programmes als eigenständigen
Thread.

  • 'MySub' ist ein Pointer zu der SUB, die unabhängig vom Hauptprogramm arbeiten
    soll. Diese SUB muss einen einzelne INTEGER-Variable
    in ihrer Parameterliste enthalten.

  • 'Argument' ist der Integer-Parameter von MySub. Dieser Parameter kann ohne
    Funktion sein, wenn die Sub keine Parameter benötigt; wenn mehr als ein
    Parameter benötigt wird, kann er ein Pointer auf eine Array- oder UDT-Sturktur
    sein.
    Da 'Argument' BYVAL übergeben wird, kann der Parameter nicht verwendet werden,
    um ein Ergebnis zurückzuliefern.

    • THREADCREATE gibt einen Integerwert aus, der ein Handle zum erstellten Thread ist.
    Wenn der Handle null ist, konnte kein Thread erstellt werden.

    Die Prozedur, die als eigener Thread gestartet wurde, läuft parallel zum Hauptprogramm.
    Das Betriebssystem erreicht dies, indem es die Prozedur einem anderen Prozessor
    zuweist, sofern einer vorhanden ist, oder indem es die Wartezeiten des Hauptprogrammes
    ausnutzt.

    ACHTUNG:
    THREADCREATE ist in der DOS-Version von freeBASIC nicht verfügbar, da DOS
    Multitasking (also das Erstellen mehrerer Threads) nicht unterstützt.

    Bevor Sie Ihr Programm beenden, müssen Sie auf die Beendigung aller Threads
    warten, die von ihm aufgerufen wurden. Siehe THREADWAIT

    Um zu verhindern, dass verschiedene Threads gleichzeitig auf globale Ressourcen
    zugreifen, wurden in freeBASIC Mutexe implementiert, Flags, die von einem einzelnem
    Thread "besessen" werden, wenn er gerade kritische Arbeitsschritte ausführt.
    Siehe MUTEXCREATE, MUTEXLOCK, MUTEXUNLOCK, MUTEXDESTROY.

    Beispiel:
    DIM SHARED terminate = 0
    DECLARE SUB MyThread (i AS INTEGER)

    SUB MyThread (i AS INTEGER)
    DO
    b = 0
    WHILE b < 80
    PRINT "*";
    a = 0
    WHILE a < &h7ffffff
    a += 1
    WEND
    b += 1
    WEND
    IF terminate = 1 THEN EXIT SUB
    LOOP
    END SUB

    PRINT "Hauptprogramm gibt Punkte aus"
    PRINT "Thread gibt Sterne aus"

    i = THREADCREATE(@MyThread, 0)
    PRINT "Thread gestartet";
    b = 0
    WHILE b < 80
    a = 0
    WHILE a < &h3
    PRINT ".";
    a += 1
    WEND
    b += 1
    WEND
    terminate = 1
    PRINT "Beendevorgang begonnen";
    THREADWAIT (i)
    PRINT "Thread beendet"
    SLEEP

    Unterschiede: Neu in freeBASIC

    Siehe auch:
    THREADWAIT,
    MUTEXCREATE, MUTEXLOCK, MUTEXUNLOCK, MUTEXDESTROY,
    CONDCREATE, CONDSIGNAL, CONDBROADCAST, CONDWAIT, CONDDESTROY


THREADWAIT

Syntax: THREADWAIT (Handle AS INTEGER)
Typ: Anweisung
Kategorie: Programmorganisation

THREADWAIT wartet mit der Fortsetzung des Hauptprogramms, bis eine Prozedur, die
mit THREADCREATE als eigener Thread gestartet wurde, beendet ist.
THREADWAIT erzwingt nicht die Beendigung des Threads; Wenn ein Thread ein Signal
braucht, um sich selbst zu beenden, muss ein Mechanismus wie eine globale
Variable verwendet werden.

  • HANDLE ist der Wert, der von THREADCREATE zurückgegeben wird.

    • ACHTUNG:
    THREADCREATE ist in der DOS-Version von freeBASIC nicht verfügbar, da DOS
    Multitasking (also das Erstellen mehrerer Threads) nicht unterstützt.

    Threads werden von THREADCREATE gestartet.

    Um zu verhindern, dass verschiedene Threads gleichzeitig auf globale Ressourcen
    zugreifen, wurden in freeBASIC Mutexe implementiert, Flags, die von einem einzelnem
    Thread "besessen" werden, wenn er gerade kritische Arbeitsschritte ausführt.
    Siehe MUTEXCREATE, MUTEXLOCK, MUTEXUNLOCK, MUTEXDESTROY.

    Beispiel: Siehe THREADCREATE

    Unterschiede: Neu in freeBASIC

    Siehe auch:
    THREADCREATE,
    MUTEXCREATE, MUTEXLOCK, MUTEXUNLOCK, MUTEXDESTROY,
    CONDCREATE, CONDSIGNAL, CONDBROADCAST, CONDWAIT, CONDDESTROY


TIME

Syntax: TIME[$]
Typ: Funktion
Kategorie: Zeit

Gibt die aktuelle Uhrzeit im Format hh:mm:ss aus.

Das Dollarzeichen ($) als Suffix ist optional.

t$ = TIME
PRINT "Es ist jetzt "; t$; " Uhr."

Siehe auch:
DATE, SETDATE,
TIMER, SETTIME

Unterschiede (zu QB):
Die Uhrzeit kann nicht mehr auf diese Weise geändert werden: TIME$ = "12:00:00"
In freeBASIC muss dazu SETTIME verwendet werden.


TIMER

Syntax: TIMER
Typ: Funktion
Kategorie: Zeit

Gibt die Zahl der Sekunden zurück, die seit dem Systemstart vergangen sind.
Der Rückgabetyp ist DOUBLE

Wenn Ihr Prozessor einen Präzisions-Timer besitzt (wie ihn beispielsweise die
Performance Counter Intel Prozessoren von Pentium besitzten), wird die
Zeitauflösung mit der Prozessoruhr verknüpft; eine Genauigkeit von Mikrosekunden
kann angenommen werden. Ältere Prozessoren (wie 486er) haben eine Zeitauflösung
von 1/18-Sekunden, was der Genauigkeit von QB entspricht.

Beachten Sie: Wenn Ihr Programm für 0.1 oder mehr Sekunden unterbrochen werden
muss, sollten Sie SLEEP verwenden, da dieser Befehl anderen Programmen erlaubt,
während der Wartezeit weiterzuarbeiten.

PRINT "Sekunden, die seit Systemstart vergangen sind: "; TIMER

PRINT "Warte 3 Sekunden"

now = TIMER
DO
LOOP UNTIL TIMER > (now + 3)
PRINT "Abgeschlossen."

Unterschiede (zu QB):
  • Es wird nicht mehr die Zeit seit Mitternacht, sondern seit Systemstart
    zurückgegeben. Läuft der PC mehr als 24 Stunden durch, wird der Wert nicht
    zurückgesetzt. Der TIMER-Reset geschieht erst, sobald die DOUBLE-
    Speicherstelle voll ist.

  • Die Zeitauflösung ist vom Prozessor abhängig; höhere Auflösungen als 1/18sek
    sind möglich.

    • Siehe auch:
    TIME, SETTIME,
    DATE, SETDATE,
    SLEEP

    Dank hier an ytwinky, der mich auf einen Fehler in diesem Eintrag aufmerksam
    gemacht hat.


TIMESERIAL

Syntax: TIMESERIAL(Stunde, Minute, Sekunde)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Diese Funktion wandelt eine angegebene Uhrzeit in eine Serial Number um.
Der Rückgabetyp ist DOUBLE. Durch die interne Darstellung von DOUBLE-Werten kann es zu Ungenauigkeiten bei großen Werten kommen.
Diese Funktion wird vom Compiler solange ignoriert, bis die Datei vbcompat.bi in den Quellcode eingebunden wurde.

  • 'Stunde', 'Minute' und 'Sekunde' geben die Uhrzeit an.

  • Wenn Sie "unsinnige" Zeiten angeben, wie z.B. 25:60:60, werden diese Fehler
    automatisch umgerechnet; das Ergebnis wäre hier 2:00:59

    • Beispiel:
    #INCLUDE "vbcompat.bi"
    a! = TIMESERIAL(19, 3, 26)
    PRINT FORMAT(a!, "yyyy/mm/dd hh:mm:ss")
    Ausgabebeispiel:
    30.12.1899 19:03:26

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    Serial Numbers


TIMEVALUE

Syntax: TIMEVALUE(Zeit)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Verwandelt einen STRING mit einer Datumsangabe in eine Serial Number.

  • 'Zeit' ist der STRING, der in eine Serial Number verwandelt werden soll. Er muss in einem dieser Formate übergeben werden:
    - hh:mm:ss
    - h:m:s

  • Der Rückgabewert ist ein Doublewert, der das Timeserial enthält; Siehe Serial Numbers

    • Beispiel:
    Die aktuelle Zeit mit TIME ermitteln und in eine Serial Number verwandeln:
    #INCLUDE "vbcompat.bi"
    DIM ts AS DOUBLE
    ts = TIMEVALUE(TIME)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


TO

Typ: Schlüsselwort
Kategorie: Bereiche

Das TO-Schlüsselwort gibt Bereiche für andere Befehle an.

TO wird verwendet um...
  • den Zählbereich einer FOR...NEXT-Schleife festzulegen.

  • die Größe eines Arrays mit DIM festzulegen.

  • einen Bereich zu akzeptierender Werte für SELECT CASE anzugeben.


TRANS

Typ: Schlüsselwort
Kategorie: Gfx

TRANS ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING eingesetzt
wird. Ähnlich wie bei der PSET-Methode werden die Pixeldaten wiedergegeben,
ohne dabei die überzeichneten Pixel zu beachten. Allerdings werden bei der Grafikausgabe
die Teile in der Maskenfarbe ignoriert, d.h. nicht gezeichnet.
Siehe dazu auch Interne Pixelformate.

Wenn Sie bei DRAW STRING kein Aktionswort angeben, wird automatisch XOR verwendet.

Unterschiede:
zu QB:
  • neu in freeBASIC

    • Siehe auch:
    PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
    AND (Methode), OR (Methode), XOR (Methode),
    PSET (Methode), PRESET (Methode),
    ALPHA, ADD, CUSTOM


TRIM

Syntax: TRIM[$]Stringausdruck [, [ANY] Entfernen])
Typ: Funktion
Kategorie: Stringmanipulation

Gibt einen STRING aus, aus dem bestimmte führende oder angehängte Zeichen
entfernt wurden.

Das Dollarzeichen ($) als Suffix ist optional.

  • 'Stringausdruck' ist der String, der gekürzt werden soll.

  • 'Entfernen' ist ein Ausdruck, der angibt, welche Zeichen entfernt werden
    sollen. Wird dieser Parameter ausgelassen, entfernt freeBASIC automatisch
    alle Leerzeichen am Anfang und Ende des Strings.
    'Entfernen' darf aus mehreren Zeichen bestehen.

  • Wird die ANY-Klausel verwendet, entfernt freeBASIC jedes Zeichen aus
    'Entfernen' von 'Stringausdruck'

    • Beispiel:
    DIM AS STRING foobar, dadada
    foobar = " foo bar "
    dadada = "da da da"

    PRINT TRIM(foobar)
    PRINT TRIM(dadada, "da")
    PRINT TRIM(dadada, ANY "bd")
    Ausgabe:
    foo bar
     da
    a da da

    Siehe auch:
    LTRIM, RTRIM, INSTR

    Unterschiede:
    (zu QB):
  • Neu in freeBASIC

    • (zu früheren Versionen):
  • Der Parameter 'Entfernen' und die ANY-Klausel wurden in freeBASIC v0.15 hinzugefügt.


TYPE (Forward Referencing

TYPE-Anweisung (Forward Referencing)

Syntax A: TYPE ForwardName AS TypeName
Syntax B: TYPE AS TypeName ForwardName
Typ: Anweisung
Kategorie: Speicherverwaltung/Programmorganisation

In manchen Situationen ist es notwendig, einen Pointer auf einen Typ zu legen,
der erst später im Programm definiert wird. Um dies zu ermöglichen, kann ein
Forward-Typ erstellt werden.

Beispiel:
TYPE FwdUDT2 AS UDT2

TYPE UDT1
a AS INTEGER
b AS FwdUDT2 PTR
END TYPE

TYPE UDT2
c AS INTEGER
d AS INTEGER
END TYPE

Wer stattdessen diesen Code versucht, erhält die Fehlermeldung "Typ nicht
definiert":
TYPE UDT1
a AS INTEGER
b AS UDT2 PTR
END TYPE

TYPE UDT2
c AS INTEGER
d AS INTEGER
END TYPE

Siehe auch:
Type (Andere Verwendungsmöglichkeiten)


TYPE (Funktion)

TYPE-Funktion

Syntax: TYPE[<typename>]( a [, b [, ...] ] )
Typ: Funktion
Kategorie: Speicherverwaltung

TYPE() erzeugt einen temporären Typen, und stellt damit eine noch kürzere
Alternative als WITH dar, wenn alle Records geändert werden.

Beispiel:
TYPE Example
AS INTEGER field1
AS INTEGER field2
END TYPE

DIM ex AS Example

' Standard-Methode zur Befüllung der Records
ex.field1 = 1
ex.field2 = 2

' WITH-Methode
WITH ex
.field1 = 1
.field2 = 2
END WITH

' TYPE()-Methode
ex = TYPE( 1, 2 )

' Um den Code besser lesbar zu gestallten, kann auch diese Syntax verwendet werden:
ex = type<Example>( 1, 2 )

Wie bereits angesprochen, kann TYPE() nur verwendet werden, wenn alle Records
eines UDTs geändert werden.

Unterschiede
zu QB
  • Neu in freeBASIC
    zu früheren Versionen von freeBASIC
  • Die Verwendung von TYPE als Funktion ist erst seit freeBASIC v0.16 möglich.

    • Siehe auch:
    TYPE (Andere Verwendungsmöglichkeiten), WITH


TYPE (Anweisung)

Syntax A:
TYPE TypenName [FIELD = Zahl]
   var1  [AS Datentyp]
   [var2 [AS Datentyp] ]
   [...]
END TYPE

Syntax B:
TYPE TypenName [FIELD = Zahl]
   [ AS Datentyp] var1 [, var2 [, ...] ]
   [[AS Datentyp] var3 [, var4 [, ...] ]
   [...]
END TYPE
Typ: Anweisung
Kategorie: Speicherverwaltung

TYPE wird verwendet, um UDTs (user defined Types, also benutzerdefinierte Datentypen)
zu erstellen, die mehrere Variablen/Arrays enthalten.

  • 'var1', 'var2', ... sind Bezeichner von Variablen, die in diesem UDT verwendet
    werden. Sie werden als Records bezeichnet.
    Die Records können auch durch Kommata voneinander getrennt sein.
    Wie bei DIM darf der Teil AS Datentyp auch zu
    beginn einer Zeile stehen.

  • 'Datentyp' ist der Typ, den die Records besitzen sollen. Jeder Record darf
    einen anderen Datentyp besitzen, sie können jedoch auch den selben
    Datentyp besitzen. Auch Arrays, Strings fester und variabler Länge,
    Pointer und andere UDTs sind erlaubt.
    Siehe Datentypen

  • 'FIELD = Zahl' bestimmt, auf welche Größe das Feld "ausgestreckt"
    werden soll ("Padding").
    Aus Geschwindigkeitsgründen werden alle Werte Standardmäßig als
    32bit-Werte (4 Bytes) gespeichert . Sie können die Daten aber mit
    dem Parameter "FIELD = 1" auf ihre echte Größe komprimieren. Das kann
    allerdings zu Problemen führen, wenn angenommen wird, dass die Daten
    komprimiert vorliegen, obwohl sie es nicht sind. Derartige Probleme können
    beispielsweise bei externen Bibliotheken und DLLs auftreten.
    Wenn Sie ein Feld mit drei BYTE-Records also auf 4 padden, wird es dennoch
    vier Bytes lang sein.
    Wenn Sie ein Feld mit fünf BYTE-Records auf 4 padden, wird es acht
    Bytes lang sein.
    Wird dieser Parameter ausgelasen, nimmt freeBASIC automatisch 4 an.

    • Ein mit TYPE erstellter Datentyp kann einer Variable mit DIM, REDIM, COMMON oder
    STATIC (Anweisung) zugewiesen werden.
    Auf die einzelnen Records wird dann über die Syntax
    Variable.Record
    zugegriffen. (Siehe auch WITH), TYPE-Funktion (unten)

    Beispiel:
    TYPE clr
    red AS UBYTE
    green AS UBYTE
    blue AS UBYTE
    END TYPE

    TYPE AnotherUDT
    IntVal AS INTEGER
    fStrVal AS STRING * 7
    vStrVal AS STRING
    Array(5) AS clr
    UdtPtr AS clr PTR
    END TYPE

    DIM a AS clr
    DIM b AS AnotherUDT

    a.red = 255
    a.green = 128
    a.blue = 64
    PRINT a.red, a.green, a.blue
    PRINT

    b.IntVal = 10023
    b.fStrVal = "abcdefg"
    b.vStrVal = "abcdefghijklmnopqrstuvwxyz"
    b.Array(0).green = 255
    b.UdtPtr = @a

    PRINT b.IntVal
    PRINT b.fStrVal
    PRINT b.vStrVal
    PRINT b.Array(0).green
    PRINT b.UdtPtr->blue
    SLEEP

    Wollen Sie eine Reihe von Ganzzahlen in einem UDT speichern, die in einem
    relativ kleinen Wertebereich liegen, können Sie das über ein Bitfeld
    erreichen. Siehe dazu Bitfelder
    Die Syntax für ein Bitfeld ist:
    TYPE BitFeldName [FIELD = Zahl]
       Bit1Name : Bits AS INTEGER
       Bit2Name : Bits AS INTEGER
       ...
    END TYPE
  • 'Bit1Name', Bit2Name', ... sind dabei die Beizeichner, über den der Record
    angesprochen werden kann.

  • 'Bits' ist dabei eine INTEGER-Konstante, die angibt, wie viele Bits für
    diesen Record verwendet werden sollen.

  • 'AS INTEGER' ist ein fester Bestandteil dieser Syntax-Struktur.

  • Für das Padding gelten die selben Regeln wie bei normalen Feldern.

    • Beispiel: Checkbox-Verwaltung mit Bitfeldern:
    TYPE CheckBoxenType
    CB1 : 1 AS INTEGER
    CB2 : 1 AS INTEGER
    CB3 : 1 AS INTEGER
    END TYPE
    DIM CheckBoxen AS CheckBoxenType

    ' Status setzen:
    CheckBoxen.CB1 = 1 ' aktiv
    CheckBoxen.CB2 = 0 ' nicht aktiv
    CheckBoxen.CB3 = 1 ' aktiv

    ' ... Programmcode ...

    ' Status abfragen:
    IF CheckBoxen.CB1 THEN ...
    IF CheckBoxen.CB2 THEN ...
    IF CheckBoxen.CB3 THEN ...

    Unterschiede
    Zu QB:
  • Die Felder werden automatisch auf INTEGER-Größe (4 Bytes) gepaddet. FreeBASIC

  • unterstützt auch Bitfelder.

    • zu früheren Versionen von freeBASIC
  • Bitfelder existieren erst seit freeBASIC v0.13

    • Siehe auch:
    TYPE (andere Verwendungsmöglichkeiten)
    UNION, ENUM,
    DIM,
    LEN, SIZEOF
    OFFSETOF, VARPTR,
    FIELD,
    WITH, OFFSETOF
    Bitfelder


TYPE

TYPE wird als Anweisung zur erstellung von UDTs, für das Forward-Referencing und als Funktion
eingesetzt.

Siehe:
TYPE (UDT)
TYPE (Forward Referencing)
TYPE (Funktion)


Liste der Schlüsselwörter beginnend mit U

UBOUND
UBYTE
UCASE
UINTEGER
ULONGINT
UNION
UNLOCK
UNSIGNED
UNTIL
USHORT
USING
USING (Namespace)


LBOUND

UBOUND

Syntax: UBOUND(Array[, Dimension])
Typ: Funktion
Kategorie: Speicherverwaltung

UBOUND gibt den größte Index des angegebenen Arrays zurück.

  • 'Array' ist der Name des Arrays, dessen oberster Index zurückgegeben werden soll.

  • 'Dimension' ist die Nummer der Dimension, dessen oberster Index zurückgegeben werden soll.
    Wird dieser Wert ausgelassen, so nimmt freeBASIC automatisch 1 an.
    Ist 'Dimension' gleich 0, so wird die Indexgrenze für Dimension 1 abgefragt.
    Ist 'Dimension' kleiner als 0, so werden ungültige Werte erzeugt.
    Ist 'Dimension' größer als die Anzahl der Dimensionen so wird...
    ...in Versionen unter v0.16 der Wert -1 ausgegeben, um anzuzeigen, dass diese Dimension nicht existiert.
    ...in Versionen ab v0.16 0 ausgegeben.
    Ebenso arbeitet UBOUND auch bei Arrays unbekannter Größe.

    • Beispiel:
    DIM Array(-10 TO 10, 5 TO 15, 1 TO 2) AS INTEGER
    DIM unArray() AS INTEGER

    PRINT UBOUND(Array, 1)
    PRINT UBOUND(Array, 2)
    PRINT UBOUND(Array, 3)
    PRINT UBOUND(Array, 4)
    PRINT
    PRINT UBOUND(unArray)
    Ausgabe für freeBASIC-Versionen ab v0.16:
    10
     15
     2
     0

     0

    Ausgabe für freeBASIC-Versionen bis v0.16:
    10
     15
     2
    -1

    -1

    Siehe auch:
    LBOUND, DIM


UBYTE

Typ: Datentyp

Daten vom Typ UBYTE sind vorzeichenlose 8-bit-Ganzzahlen.
Der Wertebereich für Variablen vom Typ UBYTE erstreckt sich von 0 bis 255.

Siehe auch:
DIM,
BYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede: Neu in freeBASIC.


UCASE

Syntax: UCASE[$] (Stringausdruck)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt den Stringausdruck zurück, der nur noch aus Großbuchstaben besteht.
Achtung: Umlaute werden nicht beachtet!

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
PRINT UCASE("Hello World abCDefGHäÄ")
Ausgabe: "HELLO WORLD ABCDEFGHäÄ"

Achtung: Umlaute werden nicht berücksichtigt!

Siehe auch:
LCASE


UINTEGER

Typ: Datentyp

UINTEGER-Zahlen sind vorzeichenlose 32-bit-Ganzzahlen.
Sie liegen im Bereich zwischen 0 und 4294967296.
Berechnung der Bereiche: 0 => (2 ^ 32) - 1

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede: Neu in freeBASIC


ULONGINT

Typ: Datentyp

ULONGINT-Zahlen sind vorzeichenlose 64-bit-Ganzzahlen.
Sie liegen im Bereich zwischen 0 und 18446744073709551615.
Berechnung der Bereiche: 0 => (2 ^ 64) - 1

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
LONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede: Neu in freeBASIC


#UNDEF

Syntax: #UNDEF Symbol
Typ: Metabefehl
Kategorie: Präprozessoren

Löscht eine Definition, die mit #DEFINE erstellt wurde.

Siehe auch:
Präprozessoren

Unterschiede: Neu in freeBASIC.


UNION

Typ: Anweisung
Kategorie: Speicherverwaltung
Syntax_
UNION [UnionName] [FIELD = { 1 | 2 | 4 } ]
   Element1  [AS Typ]
   [Element2 [AS Typ]]
   [...]
END UNION

Definiert einen UDT (user defined Type; siehe TYPE), desen Elemente sich eine
Speicherstelle teilen. Da die Elemente denselben Speicherplatz belegen, wird
durch die Änderung eines Elements auch jedes andere Element geändert.

Eine UNION kann auch Teil eines anderen UDT's sein.

  • 'UnionName' ist der Bezeichner der UNION, für den die selben Regeln wie für
    den Bezeichner eines TYPE gelten.
    Dieser Bezeichner muss immer dann angegeben werden, wenn die UNION selbst den
    UDT darstellt. Ist die UNION Teil eines anderen UDT, so darf sie keinen eigenen
    Bezeichner besitzen.

  • FIELD legt das Padding-Verhalten fest.

  • 'Element1', 'Element2', ... sind die Namen der Records, über die auf die
    UNION-Felder zugegriffen wird.

  • 'Typ' legt den Datentyp des Elements fest. Er darf ein beliebiger freeBASIC-
    Datentyp sein, oder auch ein UDT.

    • Wie bereits erwähnt kann eine UNION auch Teil eines anderen UDTs sein; Die
    einzelnen Elemente werden einfach ineinander geschachtelt:
    TYPE TypeName
       Record1 AS Typ
       UNION
          UnionElement1 AS Typ
          UnionElement2 AS Typ
       END UNION
    END TYPE
    Solche verschachtelten UNIONs wie im obigen Beispiel dürfen keinen eigenen Namen
    besitzen. Auf 'UnionElement1' und 'UnionElement2' wird über 'TypeName'
    zugegriffen; sie zählen formal auch als Records von 'TypeName', teilen sich
    allerdings die selbe Speicherstelle.

    Beispiel:
    ' Eine UNION definieren
    UNION AUnion
    a As UBYTE
    b As INTEGER
    END UNION

    ' Ein normaler UDT, der später in einer UNION verwendet wird.
    TYPE Words
    LoWord AS SHORT
    HiWord AS SHORT
    END TYPE

    ' Einen verschachtelten UDT definieren
    TYPE CompType
    s AS STRING * 20
    uType AS BYTE ' Flag zur Anzeige, was in der Union benutzt werden soll
    UNION
    au AS UBYTE
    bu AS INTEGER
    cu AS WORDS
    END UNION
    END TYPE

    ' Flags zur Anzeige, was in der Union benutzt werden soll
    ' Es kann nur ein Element einer Union benutzt werden
    CONST IsInteger = 1
    CONST IsUByte = 2
    CONST IsUDT = 3

    DIM AS AUnion MyUnion
    DIM AS CompType MyComposite

    ' Wird ein Wert einer Union geändert...
    MyUnion.a = 128
    ' ... so ändern sich auch alle anderen Records.
    PRINT MyUnion.b
    PRINT

    MyComposite.s = "Type + Union"
    MyComposite.uType = IsInteger ' Anhand dieses Flags könnte das Programm später
    ' erkennen, dass es den UNION-Wert wie einen
    ' INTEGER behandeln soll.
    MyComposite.bu = 1500 ' Der Wert der UNION selbst.

    PRINT "Zusammengesetzter Typ: ";
    SELECT CASE MyComposite.uType
    CASE IsInteger : PRINT MyComposite.bu
    CASE IsUByte : PRINT MyComposite.au
    CASE IsUDT : PRINT MyComposite.cu.LoWord, MyComposite.cu.HiWord
    CASE ELSE : PRINT "Unbekannter Typ.."
    END SELECT
    PRINT

    PRINT "Wenn bei der Typenpruefung gemurkst wird:"
    PRINT "MyComposite.au (UBYTE) "; MyComposite.au
    PRINT "MyComposite.bu (INTEGER)"; MyComposite.bu
    PRINT "MyComposite.cu.LoWord (SHORT) "; MyComposite.cu.LoWord
    PRINT "MyComposite.cu.HiWord (SHORT) "; MyComposite.cu.HiWord

    GETKEY
    Ausgabe:
    128

    Zusammengesetzter Typ:  1500

    Wenn bei der Typenpruefung gemurkst wird:
    MyComposite.au        (UBYTE)  220
    MyComposite.bu        (INTEGER) 1500
    MyComposite.cu.LoWord (SHORT)   1500
    MyComposite.cu.HiWord (SHORT)   0

    Beachten Sie, dass Strings unbestimmter Länge schwierig zu verwalten sind;
    Sie sollten nach Möglichkeit fixed-Length-Strings in ihren UNIONs verwenden.

    UNIONs können verwendet werden, wenn eine Information oft in Form verschiedener
    Datentypen benötigt wird. Z.B. kann die Information '128', die in 'MyUnion'
    gespeichert ist bequem als INTEGER und als UBYTE behandelt werden, ohne dazu die
    CAST-Funktion verwenden zu müssen. Der vermeintlich
    zusätzliche Aufwand, der mit dem Flag 'uType' in 'MyComposite' verbunden ist,
    muss tatsächlich sowiso aufgebracht werden, da auf die eine oder andere Weise
    erkannt werden muss, wie die Information handzuhaben ist.
    Praktisch ist auch die Möglichkeit, auf einzelne Bestandteile zuzugreifen, wie
    es in diesem Beispiel mit dem UDT 'Words' geschieht.

    Unterschiede: Neu in freeBASIC

    Siehe auch:
    TYPE, FIELD


UNLOCK

Syntax: UNLOCK Dateinummer [, {Satznr. | [Start] TO Ende}]
Typ: Anweisung
Kategorie: Datei

UNLOCK entsperrt eine zuvor mit LOCK gesperrte Datei,
bzw einen Teil einer Datei.

Siehe LOCK für Details zu den Parametern.


UNSIGNED

Syntax: AS UNSIGNED {INTEGER-Basierender Datentyp}
Typ: Schlüsselwort
Kategorie: Speicherverwaltung

Erzeugt einen Integer-basierenden (also ganzzahligen) Datentyp, der vorzeichenlos
ist. Eine Variable dieses Typs kann keine negativen Zahlen enthalten, dafür ist
der Maximalwert doppelt so groß.

Beispiel:
DIM x AS UNSIGNED INTEGER, y AS UINTEGER

x = -1
y = -1
PRINT x, y
Ausgabe:
4294967295    4294967295

Dieses Schlüsselwort wurde aus Kompatibilitätsgründen beibehalten.
Verwenden Sie stattdessen die gleichbedeutenden Typen UBYTE, USHORT, UINTEGER und
ULONGINT (siehe Datentypen), und ersparen Sie sich damit ein wenig Tipparbeit.

Unterschiede: Neu in freeBASIC


UNTIL

Typ: Schlüsselwort
Kategorie: Bedingungen

UNTIL wird mit der DO...LOOP Struktur verwendet.


USHORT

Typ: Datentyp

Daten vom Typ USHORT sind vorzeichenlose 16-bit-Ganzzahlen.
Der Wertebereich für Variablen des Types USHORT erstreckt sich von 0 bis 65535.

Siehe auch:
DIM,
BYTE, UBYTE,
SHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), ZSTRING, WSTRING (Datentyp),
Datentypen,
LEN, SIZEOF,
CAST

Unterschiede: Neu in freeBASIC.


USING (Namespace)

Syntax: USING Bereichsname
Typ: Anweisung
Kategorie: Programmorganisation

Bindet die Symbole eines Namespaces in den 'Globalen Namespace' ein, sofern kein
gleichnamiger Bezeichner bereits vorhanden ist.

Vor der USING-Zeile wird der Code so behandelt, als würden die Symbole des
Namespaces noch nicht existieren; ein Zugriff auf sie sie kann bis dahin nur über
die allgemeine Syntax 'Bereichsname.Bezeichner' geschehen. Nach der USING-Zeile
werden die eingebundenen Bezeichner behandelt, als wären sie außerhalb eines
Namespaces definiert worden.

Beispiel
NAMESPACE Bsp
TYPE T
x AS INTEGER
END TYPE

TYPE nichtEingebunden
x AS INTEGER
END TYPE
END NAMESPACE

TYPE nichtEingebunden
x AS SINGLE
END TYPE

DIM a AS Bsp.T ' Ohne den 'Bsp.'-Präfix kann kein Typ 'T' gefunden werden.
USING Bsp ' Jetzt ist der komplette Namespace Bsp im globalen Space
' eingebunden. Ausnahme ist der Typ 'nichtEingebunden', da ein
' gleichnamiger Bezeichner bereits existiert.
DIM b As T ' Jetzt ist dies eine zulässige Anweisung, da Bsp eingebunden
' wurde.

Unterschiede:
  • USING existierte unter QB nur als Schlüsselwort

  • Die Verwendung als Anweisung ist erst seit freeBASIC v0.16s möglich

    • Siehe auch:
    NAMESPACE
    USING


USING

Typ: Schlüsselwort/Anweisung

USING wird als Schlüsselwort bei...
  • PRINT USING

  • PRINT USING #

  • LPRINT USING

  • PALETTE

  • PALETTE GET

    • verwendet. Außerdem hat es seit freeBASIC v0.16stable eine Bedeutung als
    Anweisung:
    USING (Namespace)


Liste der Schlüsselwörter beginnend mit V

VA_ARG
VA_FIRST
VA_NEXT
VAL
VALINT
VAL64
VARPTR
VIEW
VIEW (Grafik)
VIEW (Text)


VAL

Syntax: VAL( Zahl AS STRING ) AS DOUBLE
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen STRING zu einer Zahl. Die Zahl muss am Anfang des STRINGs sein.
VAL ist die Gegenfunktion zu STR. Der Rückgabetyp ist DOUBLE.

VAL verwandelt auch Zahlen anderer Formate ins Dezimalsystem zurück. Die
STRINGs müssen dazu mit dem entsprechenden Signum versehen sein:
&H - Hexadezimal
&O - Oktal
&B - Binär

Beispiel:
PRINT VAL("10") ' Ausgabe 10
PRINT VAL("-271.3") ' Ausgabe -271.3
PRINT VAL("&H10") ' Ausgabe 16
PRINT VAL("&O10") ' Ausgabe 8
PRINT VAL("&B10") ' Ausgabe 4
PRINT VAL(" 10") ' Ausgabe 0

Wenn der String ungültig ist, (keine Zahl enthält oder nicht mit einer Zahl beginnt)
wird als Ergebnis 0 ausgegeben.

VAL funktioniert auch mit WSTRINGs.

Siehe auch:
VALINT, VALUINT
VAL64, VALLNG, VALULNG,
BIN, HEX, OCT, STR,
WBIN, WHEX, WOCT, WSTR,


VAL64

Syntax: VAL64(Variable AS STRING)
Typ: Funktion
Kategorie: Speicherverwaltung

Arbeitet genauso wie VAL, aber kann auch einen STRINGS in einen LONGINT umwandeln,
die über den Wertebereich eines 32bit-INTEGER übersteigen.

Anmerkung:
In freeBASIC v0.15b wurde diese Funktion durch VALLNG ersetzt;
VAL64 existiert in Versionen höher als v0.14 nicht mehr.

Siehe auch:
VAL,
VALINT, VALUINT,
VALLNG, VALULNG

Unterschiede (zu QB):
neu in freeBASIC


VALINT

Syntax: VALINT(Variable AS STRING)
Typ: Funktion
Kategorie: Speicherverwaltung

Wandelt einen STRING in einen INTEGER um.
(VAL wandelt in eine DOUBLE um.)

VALINT funktioniert auch mit WSTRINGs.


VALLNG

Syntax: VALLNG(Variable AS STRING)
Typ: Funktion
Kategorie: Speicherverwaltung

Arbeitet genauso wie VAL, aber kann auch einen STRINGS in einen LONGINT umwandeln,
die über den Wertebereich eines 32bit-INTEGER übersteigen.

Anmerkung:
Diese Version existiert erst seit freeBASIC v0.15b; davor wurde VAL64 benutzt.

Siehe auch:
VAL,
VALINT, VALUINT,
VALULNG,

VALLNG funktioniert auch mit WSTRINGs.

Unterschiede (zu QB):
neu in freeBASIC


VALUINT

Syntax: VALUINT(Variable AS STRING)
Typ: Funktion
Kategorie: Speicherverwaltung

Arbeitet genauso wie VAL, gibt aber einen UINTEGER aus.

Anmerkung:
Diese Funktion steht erst seit freeBASIC v0.15b zur Verfügung.

Siehe auch:
VAL,
VALINT
VALLNG, VALULNG

VALUINT funktioniert auch mit WSTRINGs.

Unterschiede (zu QB):
neu in freeBASIC


VALULGN

VALULNG

Syntax: VALULNG(Variable AS STRING)
Typ: Funktion
Kategorie: Speicherverwaltung

Arbeitet genauso wie VAL, aber kann auch einen STRINGS in einen ULONGINT umwandeln,
die über den Wertebereich eines 32bit-INTEGER übersteigen.

Anmerkung:
Diese Funktion steht erst seit freeBASIC v0.15b zur Verfügung.

Siehe auch:
VAL,
VALINT, VALUINT,
VALLNG

VALULNG funktioniert auch mit WSTRINGs.

Unterschiede (zu QB):
neu in freeBASIC


VARPTR

Syntax: VARPTR(Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

Gibt die Adresse einer Variable im Speicher zurück. Damit wurden in älteren
BASIC-Dialekten Pointer-Funktionen erstellt.
Von Zeit zu Zeit ist diese Funktion auch in freeBASIC noch nützlich.

Beispiel:
DIM AS INTEGER a, addr
a = 10
addr = VARPTR(a)
POKE INTEGER, addr, -1000
PRINT a
POKE BYTE, addr + 1, 128
PRINT a

VARPTR kann durch '@' ersetzt werden:
DIM AS INTEGER a, addr
addr = @a

Siehe auch:
OFFSETOF, SADD,
PEEK, POKE,


VA_ARG

Syntax: VA_ARG(Startpointer, Datentyp)
Typ: Funktion
Kategorie: Programmorganisation

Gibt den Wert eines Parameters in der Parameterliste einer Prozedur zurück.

  • 'Startpointer' ist ein Pointer, der mit VA_FIRST ermittelt wurde,
    bzw. mit VA_NEXT geupdatet wurde.

  • 'Datentyp' ist der Datentyp des Parameters, dessen Wert zurückgegeben
    werden soll.
    Siehe Datentypen

    • Beispiel: Siehe VA_FIRST

    Siehe auch:
    VA_FIRST, VA_NEXT,
    DECLARE, SUB, FUNCTION,
    Datentypen, Prozeduren


VA_FIRST

Syntax: VA_FIRST()
Typ: Funktion
Kategorie: Programmorganisation

Gibt einen Pointer auf den ersten Parameter einer Prozeduren zurück.

Unter freeBASIC ist es möglich Prozeduren zu erstellen, die keine
festgelegte Parameterliste besitzen. Diesen Prozeduren darf eine beliebig Lange
Parameterliste übergeben werden, und die Parameter dürfen von jedem
Datentyp sein. Eine solche Liste wird variable Parameterliste genannt.
Um dies zu ermöglichen, verwendet man bei DECLARE und im Prozedurheader diese
Syntax:
[DECLARE] { SUB | FUNCTION } (['normaleParameter'], ...)
'normaleParameter' ist dabei eine normale Parameterliste, wie bei DECLARE
erklärt.
Das '...' leitet dabei die variable Parameterliste ein.

Bei dieser Form der Übergabe geht aber die Information verloren, um welchen
Datentyp es sich in der variablen Liste handelt, bzw. wie viele Parameter übergeben
wurden. Daher werden oft sogenannte Format-Strings in der normalen
Parameterliste übergeben, in denen beschrieben wird welche Parameter übergeben wurden.
Dieser Format-String darf jedes beliebige Format besitzen, da der Programmierer
die Parameterübergabe komplett selbst übernimmt. Der String muss ihm
lediglich die Informationen liefern, die er braucht, um die Werte aus der
beliebigen Parameterliste herauszulesen.

VA_ARG wird dazu benutzt, um den Wert eines Parameters zu ermitteln.
VA_NEXT updatet den von VA_FIRST zurückgegebenen Pointer, so dass
er auf das nächste Argument der beliebigen Parameterliste zeigt.

Beispiel (aus dem examples-Ordner ihres freeBASIC-Verzeichnisses):
OPTION EXPLICIT

DECLARE SUB myprintf CDECL (fmtstr AS STRING, ...)

DIM s AS STRING

s = "bar"

myprintf( "Integer=%i, Longint=%l Single=%f, Double=%d, String=%s, String=%s", _
1, 1LL SHL 32, 2.2!, 3.3#, "foo", s )

PRINT
SLEEP

'------------------------------------------------------------------------------'

SUB myprintf CDECL (fmtstr AS STRING, ...)
DIM AS ANY PTR arg
DIM AS ZSTRING PTR p
DIM AS INTEGER i, char

' Ermittle Pointer auf das erste Argument der variablen Parameterliste
arg = VA_FIRST()

' bearbeite jedes Zeichen des Format-Strings einzeln
p = STRPTR( fmtstr )
FOR i = 0 TO LEN( fmtstr )-1
char = *p
p += 1

' ist es ein Formatierungs-Zeichen?
IF( char = ASC( "%" ) ) THEN
' um welchen Typ handelt es sich?
char = *p
p += 1

' Das variable Argument abhängig vom Typ ausgeben
SELECT CASE char
CASE ASC( "i" )
PRINT STR( VA_ARG( arg, INTEGER ) );
' im Gegensatz zu C muss VA_NEXT benutzt werden, um den Pointer zu
' updaten, damit er nach einsatz von VA_ARG auf den nächsten
' Parameter zeigt.
arg = VA_NEXT( arg, INTEGER )

CASE ASC( "l" )
PRINT STR( VA_ARG( arg, LONGINT ) );
arg = VA_NEXT( arg, LONGINT )

CASE ASC( "f" )
PRINT STR( VA_ARG( arg, SINGLE ) );
arg = VA_NEXT( arg, SINGLE )

CASE ASC( "d" )
PRINT STR( VA_ARG( arg, DOUBLE ) );
arg = VA_NEXT( arg, DOUBLE )

CASE ASC( "s" )
' Strings werden BYVAL übergeben, daher ist ihre Länge unbekannt
PRINT *VA_ARG( arg, zstring PTR );
arg = VA_NEXT( arg, zstring PTR ) '' /
END SELECT

' normales Zeichen, also ausgeben, wie es ist.
ELSE
PRINT CHR( char );
END IF

NEXT

END SUB

Siehe auch:
VA_ARG, VA_NEXT,
DECLARE, SUB, FUNCTION,
Datentypen, Prozeduren


VA_NEXT

Syntax: VA_NEXT(Startpointer, Datentyp)
Typ: Funktion
Kategorie: Programmorganisation

Dereferenziert den Pointer auf ein Argument einer variablen Parameterliste, so
dass es auf das nächste Argument zeigt.

  • 'Startpointer' ist ein Pointer, der mit VA_FIRST ermittelt wurde,
    bzw. mit VA_NEXT geupdatet wurde.

  • 'Datentyp' ist der Datentyp des Parameters, auf den 'Startpointer' bisher
    gezeigt hat.
    Siehe Datentypen

    • Beispiel: Siehe VA_FIRST

    Siehe auch:
    VA_FIRST, VA_ARG,
    DECLARE, SUB, FUNCTION,
    Datentypen, Prozeduren


VIEW (Grafik)

Syntax: VIEW [[SCREEN] (x1, y1)-(x2, y2)[,[ Farbe][, Rand]]]
Typ: Anweisung
Kategorie: Gfx

VIEW definiert neue Gültigkeitsbereiche für physische Bildschirmkoordinaten, setzt also neue Clipping-Grenzen.

  • Wenn das 'SCREEN' Argument angegeben wird, sind die x/y-Koordinaten folgender Grafikanweisungen relativ zur linken oberen
    Bildschirmecke und nicht zur linken oberen Ecke des Darstellungsfeldes.

  • 'x1',y1','x2'und 'y2' sind die Koordinaten des linken oberen und des rechten unteren Eckpunkts des neuen Darstellungsfeldes.

  • 'Farbe' ist eine Farbnummer, mit der der angegebene Bereich ausgefüllt werden soll. Wird dieser Parameter ausgelassen, bleibt die
    alte Grafik in diesem Bereich erhalten

  • 'Rand' ist eine Farbnummer, in der ein Rahmen um den angegebenen Bereich gezeichnet werden soll. Wird dieser Parameter ausgelassen,
    wird kein Rahmen gezeichnet.

  • Wenn das SCREEN-Argument ausgelassen wird, sind alle Koordinaten zukünftiger Grafikanweisungen relativ zur linken oberen Ecke
    des Darstellungsfeldes anstelle zur linken oberen Ecke des Bildschirms.

    • VIEW wird benutzt, um neue Clipping-Regionen zu definieren, auch als Darstellungsfeld bezeichnet. Ein neu definiertes Darstellungsfeld
    wird ein bereits bestehendes ersetzen.

    Alle Drawing Primitives sind von der Größe des Darstellungsfeldes abhängig; Grafikanweisungen, die auf Koordinaten außerhalb dieser
    Grenzen verweisen, haben keine Auswirkungen.

    Eine Farbe muss auch bei VIEW im selben Format angegeben werden, wie bei COLOR (Anweisung),
    und ist abhängig von der letzten SCREEN-Anweisung.
    Wenn alle Argumente ausgelassen werden, setzt VIEW alle Grenzen auf die SCREEN-Modus-Standards zurück.

    Unterschiede
    zu QB:
  • - keine -

    • zu früheren Versionen von freeBASIC
  • In Versionen vor v0.16 hatte der Parameter 'Rand' keine Auswirkungen.

    • Siehe auch:
    SCREEN (Anweisung),
    WINDOW,
    PMAP,
    VIEW (Text)


VIEW (Text)

Syntax A: VIEW PRINT Startzeite TO Endzeile
Syntax B: VIEW PRINT()
Typ: Anweisung (A) bzw. Funktion (B)
Kategorie: Konsole

Setzt die Grenzen der Konsolen-Textbereiche, oder gibt diese Zurück.

  • Startzeile und Endzeile sind Zeilenangaben, wie sie auch bei LOCATE (Anweisung)
    verwendet werden.

  • wird VIEW PRINT als Funktion eingesetzt, ist der Rückgabewert ein INTEGER,
    der die oberste und unterste Zeile des Konsolen-Textbereichs enthält. Die
    obere Zeile ist dabei das untere Word, die untere Zeile ist das obere Word.

    • Der Textbereich eines Konsolen-Fensters hat Auswirkungen auf fast alle Textanweisungen;
    sie sind nur innerhalb der angegebenen Grenzen wirksam.

    Seit freeBASIC v0.15b funktioniert VIEW PRINT auch in Grafikmodi.

    Beispiel:
    WIDTH 80, 25
    FOR i = 1 TO 24
    PRINT i
    NEXT

    VIEW PRINT 10 TO 15
    COLOR 15, 1
    CLS
    FOR i = 1 TO 10
    PRINT i
    NEXT

    LOCATE wird von VIEW PRINT nicht beeinflusst:
    WIDTH 80, 25
    VIEW PRINT 10 TO 15
    LOCATE 1,1
    PRINT "hello world"

    VIEW PRINT als Funktion:
    PRINT LOWORD(VIEW PRINT())
    PRINT HIWORD(VIEW PRINT())
    SLEEP

    WIDTH 80, 60
    PRINT LOWORD(VIEW PRINT())
    PRINT HIWORD(VIEW PRINT())
    SLEEP

    VIEW PRINT 10 TO 50
    PRINT LOWORD(VIEW PRINT())
    PRINT HIWORD(VIEW PRINT())
    SLEEP

    Anmerkung: Diese Anweisung wird eventuell von Linux nicht unterstützt.

    Unterschiede (zu QB):
    Das Scrolling-Verhalten ist eventuell nicht exakt das selbe.
    VIEW PRINT kann auch als Funktion eingesetzt werden.


VIEW

Typ: Anweisung

VIEW ist ein Schlüsselwort, das als Konsolen- und als Grafikanweisung eingesetzt
werden kann.

Siehe:
VIEW (Grafik)
VIEW (Text)


Liste der Schlüsselwörter beginnend mit W

WAIT
WBIN
WCHR
WEEKDAY
WEND
WHEX
WHILE...WEND
WIDTH
WIDTH (Anweisung)
WIDTH (Funktion)
WINDOW
WINDOWTITLE
WINPUT
WITH
WRITE
WOCT
WRITE #
WSPACE
WSTR
WSTRING
WSRTING (Datentyp)
WSTRING (Funktion)


WAIT

Syntax: WAIT Port, AND_Ausdruck[, XOR_Ausdruck]
Typ: Anweisung
Kategorie: Hardware

ab freeBASIC v0.15b

Liest regelmäßig ein Byte von einem Port, und wartet mit der Programmausführung,
bis dieses Byte bestimmte Bedingungen erfüllt.

  • 'Portnummer' ist die Nummer des Ports, von dem gelesen werden soll.
    Zugriffe auf den VGA-Port werden emuliert.

  • Der gelesene Wert wird mit über ein logisches AND mit dem 'AND_Ausdruck'
    verknüpft. die Programmausführung wird fortgesetzt, sobald das Ergebnis
    dieses Bitweisen Vergleichs ungleich 0 ist.

  • Wird ein 'XOR_Ausdruck' angegeben, wird der eingelesene Wert über ein
    logisches XOR mit ihm verknüpft, bevor er an den
    AND_Ausdruck übergeben wird. Wenn dieses Argument ausgelassen wird, nimmt
    freeBASIC 0 an.

    • Wenn der Zugriff auf den Port fehlschlägt, wird ein Laufzeit-Fehler erzeugt.

    Siehe auch:
    INP, OUT

    für freeBASIC bis v0.14

    Emuliert das Warten auf den VSync (vertikale Bildschirmsynchronisation)

    WAIT funktioniert nur mit dem Port &H3DA (warten auf vertical sync.). Sie
    sollten WAIT nur so einsetzen:
    WAIT &h3DA, 8

    Jede andere Kompination von Port, AND_Ausdruck und XOR_Ausdruck wird keine
    Auswirkung haben.

    Diese Anweisung sollte durch SCREENSYNC ersetzt werden!

    Siehe auch:
    INP, OUT, SCREENSYNC

    Unterschiede (Zu QB):
    WAIT ist lediglich eine Emulation der QB-Wait-Anweisung am Port &H3DA. Auf
    andere Ports kann nicht zugegriffen werden, da viele andere Plattformen nicht
    direkt auf die Ports zugreifen können.


WBIN

Syntax: WBIN[$] (Ausdruck [, Stellen])
Typ: Funktion
Kategorie: Zählsysteme

WBIN gibt den binären Wert eines beliebigen Ausdrucks als WSTRING zurück.
Binärzahlen haben die Basis 2; bestehen aus den Zeichen 1 und 0.

  • 'Ausdruck' ist eine Ganzzahl (eine Zahl ohne Kommastellen), die ins
    Binärformat übersetzt werden soll

  • 'Stellen' ist die Anzahl der Stellen, die dafür aufgewandt werden soll. Ist
    'Stellen' größer als die benötigte Stellenzahl, wird der Rückgabewert mit
    führenden Nullen aufgefüllt.
    Ist 'Stellen' kleiner als die benötigte Stellenzahl, werden nur die hinteren
    Zeichen des Rückgabewerts ausgegeben.
    Wird 'Stellen' ausgelassen, besteht der Rückgabewert aus so vielen Zeichen,
    wie benötigt werden, um die Zahl korrekt darzustellen.
    Dieser Parameter steht erst seit freeBASIC v0.16b zur Verfügung!

  • Der Rückgabwert ist ein WSTRING, der den Wert von 'Ausdruck' im Binärformat
    enthält.

    • Das Dollarzeichen ($) als Suffix ist optional.

    WBIN ist das Pendant zu BIN, gibt aber einen WSTRING zurück.

    Beispiel:
    PRINT WBIN(54321)
    PRINT WBIN(3, 3)
    PRINT WBIN(255, 4)
    Ausgabe:
    1101010000110001
    011
    1111

    Um eine Binärzahl in ihre dezimale Form zurückzuverwandeln, wird VAL verwendet:
    DIM binaer AS WSTRING * 6

    binaer = "1001"
    'Kennung &b zeigt an, dass der folgende String eine Binärzahl ist.
    binaer = "&b" + binaer

    PRINT VAL(binaer)
    'Gibt 9 aus.

    Siehe auch:
    WHEX, WOCT, BIN,
    VAL, WSTRING (Datentyp),
    BIT, BITSET, BITRESET

    Unterschiede: Neu in freeBASIC


WCHR

Syntax: WCHR[$](Unicode_Wert1 [, Unicode_Wert2 [, ... ] ] )
Typ: Funktion
Kategorie: Zählsysteme

WCHR verwandelt einen Unicode-Wert in seinen Character.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
PRINT "127 ist Unicode-Zeichen: "; WCHR(127)
PRINT "Codes 65, 66 und 67: "; WCHR(65, 66, 67)
WCHR wird z.B verwendet, um Zeichen darzustellen, die nicht auf der Tastatur sind.

WCHR ist das Pendant zu CHR, gibt aber einen WSTRING zurück.

Unterschiede (zu QB):
Neu in freeBASIC

Siehe auch:
CHR,
ASC,
WSTRING


WEEKDAY

Syntax: WEEKDAY(Serial[, System])
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

WEEKDAY extrahiert den Wochentag einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Dateserial behandelt wird.

  • Der Rückgabewert ist eine Zahl zwischen 1 und 7, die den Wochentag symbolisiert. 1 steht dabei für Sonntag, 7 für Samstag.

  • 'System' wird verwendet, um festzulegen, welcher Tag der Woche der erste sein soll; dies beeinflusst das Ergebnis von WEEKDAY.
    Wird dieser Parameter ausgelassen, benutzt freeBASIC die oben genannte Nummerierung.
    Um bequem festzulegen, welcher Tag der Woche der erste sein soll, können diese Konstanten verwendet werden:
    #define fbSunday 1
    #define fbMonday 2
    #define fbTuesday 3
    #define fbWednesday 4
    #define fbThursday 5
    #define fbFriday 6
    #define fbSaturday 7

    • Beispiel:
    Die Nummer des aktuellen Wochentags aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM Tag AS INTEGER
    Tag = WEEKDAY(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY,
    HOUR, MINUTE, SECOND,
    WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    Serial Numbers


WEEKDAYNAME

Syntax: WEEKDAYNAME(Wochentag [, [Kurzform] [, System]] )
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

Gibt den Namen eines Wochentags aus.

  • 'Wochentag' ist die Nummer des Wochentags, also 1 für Sonntag, 2 für Montag und so weiter.

  • Der Rückgabewert ist ein String, der den Namen des Wochentags enthält.

  • 'System' wird verwendet, um festzulegen, welcher Tag der Woche der erste sein soll; dies beeinflusst das Ergebnis von WEEKDAYNAME.
    Wird dieser Parameter ausgelassen, benutzt freeBASIC die oben genannte Nummerierung.
    Um bequem festzulegen, welcher Tag der Woche der erste sein soll, können diese Konstanten verwendet werden:
    #define fbSunday 1
    #define fbMonday 2
    #define fbTuesday 3
    #define fbWednesday 4
    #define fbThursday 5
    #define fbFriday 6
    #define fbSaturday 7
  • 'Kurzform' ist ein Wert der entweder gleich oder ungleich null ist. Wenn er ungleich null ist, wird ein abgekürzter Wochentagsname
    ausgegeben, der aus zwei Zeichen besteht, ansonsten wird der volle Name ausgegeben.

    • Beispiel:
    Den Namen des aktuellen Wochentags mit NOW ermitteln:
    #INCLUDE "vbcompat.bi"
    DIM Wochentag AS STRING
    Wochentag = WEEKDAYNAME(WEEKDAY(NOW)))

    Alle Wochentage ausgeben, beginnend mit Montag:
    #INCLUDE "vbcompat.bi"
    DIM i AS INTEGER
    FOR i = 1 TO 7
    PRINT WEEKDAYNAME(i, fbMonday)
    NEXT

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


WEND

Typ: Schlüsselwort
Kategorie: Schleifen.

Siehe WHILE...WEND.


WHEX

Syntax: WHEX[$] (Ausdruck [, Stellen])
Typ: Funktion
Kategorie: Zählsysteme

WHEX gibt den hexadezimalen Wert eines beliebigen numerischen Ausdrucks als
WSTRING zurück.
Hexadezimale Zahlen enthalten Ziffern aus dem Bereich 0-F (0123456789ABCDEF).

  • 'Ausdruck' ist eine Ganzzahl (eine Zahl ohne Kommastellen), die ins
    Hexadezimalformat übersetzt werden soll

  • 'Stellen' ist die Anzahl der Stellen, die dafür aufgewandt werden soll. Ist
    'Stellen' größer als die benötigte Stellenzahl, wird der Rückgabewert mit
    führenden Nullen aufgefüllt.
    Ist 'Stellen' kleiner als die benötigte Stellenzahl, werden nur die hinteren
    Zeichen des Rückgabewerts ausgegeben.
    Wird 'Stellen' ausgelassen, besteht der Rückgabewert aus so vielen Zeichen,
    wie benötigt werden, um die Zahl korrekt darzustellen.
    Dieser Parameter steht erst seit freeBASIC v0.16b zur Verfügung!

  • Der Rückgabwert ist ein String, der den Wert von 'Ausdruck' im
    Hexadezimalformat enthält.

    • Das Dollarzeichen ($) als Suffix ist optional.

    WHEX ist das Pendant zu HEX, gibt aber einen WSTRING zurück.

    Beispiel
    PRINT WHEX(54321)
    PRINT WHEX(255, 4)
    PRINT WHEX(70000, 3)
    Ausgabe:
    D431
    00FF
    170

    Um einen hexadezimalen Wert in einen dezimalen zurückzuverwandeln, benutzen
    Sie VAL. Damit VAL den nachfolgenden WSTRING als
    Hexadezimalwert behandelt, muss ihm ein "&H" vorausgehen:
    PRINT VAL("&HB0")
    (gibt 192 aus.)

    Unterschiede (zu QB):
    Neu in freeBASIC

    Siehe auch:
    WBIN, WOCT, HEX,
    VAL, WSTRING


WHILE...WEND

Typ: Anweisung
Kategoirie: Schleifen
Syntax:
WHILE Bedingung
   [...Programmcode...]
WEND

Wiederholt einen Anweisungsblock solange eine Bedingung erfüllt ist.
'Bedingung' ist ein nummerischer Ausdruck, der entweder wahr/erfüllt (ungleich null) oder falsch/nicht erfüllt (gleich null) sein kann.

Der Code innerhalb der Schleife wird nur dann ausgeführt, wenn schon vor Beginn der Schleife die Bedingung erfüllt wurde; andernfalls
wird der WHILE...WEND-Block übersprungen.

Eine WHILE...WEND-Schleife kann auch 'außerplanmäßig' über die Anweisung EXIT WHILE verlassen werden. Wird diese Anweisung ausgeführt,
so fährt freeBASIC mit der Codeausführung nach der WEND-Zeile fort.
Die Anweisung CONTINUE WHILE bewirkt, dass der Schleifen-Code nicht vollständig ausgeführt wird; freeBASIC springt bei der Ausführung
einer solchen Zeile zurück zur WHILE-Anweisung, prüft, ob die Bedingung noch immer erfüllt ist, und führt, wenn dies der Fall ist, die
Schleife weiter normal aus.

WHILE...WEND-Blöcke können bis zu beliebiger ebene ineinander verschachtelt werden.

Als Block-Anweisung initialisiert WHILE...WEND seit freeBASIC v0.16 einen SCOPE-Block, der mit der WEND-Zeile
endet. Variablen, die innerhalb einer solchen Schleife deklariert werden, existieren außerhalb nicht mehr.

Bitte beachten Sie:
Das Schlüsselwort WHILE wird auch in DO...LOOP-Schleifen verwendet, um den Typ der Bedingung festzulegen. Dadurch kann eine DO...LOOP-Schleife
funktionell äquivalent zu einer WHILE...WEND-Schleife sein. Bringen Sie also die Schlüsselworter DO, LOOP, WEND und WHILE nicht
durcheinander!

Beispiel:
In diesem Beispiel wird eine WHILE-Schleife eingesetzt, um einen String umzukehren. Benutzt wird dazu String-Indizierung. Die Schleife
stoppt, wenn der Index kleiner als 0 ist, da 0 der Index des ersten Zeichens eines Strings ist.

Dim As String sentence, ecnetnes
Dim As Integer index

sentence = "The quick brown fox jumps over the lazy dog."
index = Len( sentence ) - 1

While( index >= 0 )
ecnetnes += Chr( sentence[index] )
index -= 1
Wend

Print "original: """ ; sentence ; """"
Print "reversed: """ ; ecnetnes ; """"

Unterschiede
zu QB:
  • Innerhalb einer Schleife durften keine Variablen definiert werden

    • zu früheren Versionen von freeBASIC:
  • Seit freeBASIC v0.16b wirkt eine DO-LOOP-Schleife wie ein SCOPE-Block

    • Siehe auch:
    DO...LOOP, FOR...NEXT,
    EXIT, CONTINUE,
    SCOPE,
    Schleifen,
    Bedingungen


WHILE

Typ: Anweisung

WHILE wird eingesetzt als WHILE...WEND sowie bei DO...LOOP.


WIDTH (Anweisung)

Syntax A: WIDTH [Spalten], [Zeilen]
Syntax B: WIDTH LPRINT Spalten
Syntax C: WIDTH { #Kanal | Gerätename }, Spalten
Typ: Anweisung
Kategorie: Konsole/Datei

Bestimmt und ändert die Formate für die Textausgabe.
Das bedeutet: WIDTH legt - je nach angewandter Syntax - folgende Dinge fest:
  • Höhe und Breite des Konsole-Fensters in Zeichen unter Windows und DOS (Syntax A).
    Für Windows-Konsolen-Fenster darf hier jeder Wert angegeben werden, der größer als 0
    ist. Für Vollbild-Modi sind die Dimensionen von der Hardware abhängig. Unter
    Linux ist diese Syntax unzulässig.

  • Die Höhe des Standard-Schriftsatzes in manchen Grafikmodi - siehe SCREEN (Anweisung)
    (Syntax A). Beim Aufruf von WIDTH in Grafikmodi wird ein CLS-Aufruf
    erzwungen, der Bildschirm wird also gelöscht.
    Wenn die Kombination Spalten x Zeilen unzulässig ist (z.B. da der Bildschirm
    nicht so viele Zeichen anzeigen kann), wird keine Änderung vorgenommen.

  • Die Breite der Druckerausgabe in Zeichen (Syntax B). Wird eine Zeile
    ausgegeben, die diese Breite überschreitet, wird automatisch ein Zeilenumbruch
    eingefügt; dabei kann auch das Wort unterbrochen werden.
    Siehe auch LPRINT (Anweisung)

  • Die Breite der Dateiausgabe in Zeichen (Syntax C). Wird eine Zeile
    ausgegeben, die diese Breite überschreitet, wird automatisch ein Zeilenumbruch
    eingefügt; dabei kann auch das Wort unterbrochen werden.
    Siehe auch OPEN

  • 'Spalten' ist die Anzahl der Spalten, die für das Konsole-Fenster
    bereitgestellt werden sollen, also die Breite des Fensters.

  • 'Zeilen' ist die Anzahl der Zeilen, die für das Konsole-Fenster
    bereitgestellt werden sollen, also die Höhe des Fensters.

  • Wird ein Argument ausgelassen, behält freeBASIC die vorige Einstellung
    bei

  • Das Konsole-Fenster hat standardmäßig 80 Spalten und 300 Zeilen.

  • Die Standard-Ausgabebreite des Druckers ist 80.

    • Anmerkung: Die Syntax-Varianten B und C konnten noch nicht erfolgreich
    getestet werden.

    Beispiel:
    Anmerkung: Das Fragezeichen (?) wird vom Compiler wie ein PRINT (Anweisung) behandelt.
    WIDTH 40, 25
    ? "Hallo Welt"

    Wenn das Konsole-Fenster bereits beschrieben ist, bevor seine Größe mit
    WIDTH geändert wird, bleibt dieser Text erhalten:
    WIDTH 40 , 25
    ? "ein kleines Fenster"
    SLEEP
    WIDTH 80, 60
    ? "ein großes Fenster"
    SLEEP

  • Im Vollbildmodus unterstützt freeBASIC nur die Auflösungen
    zwischen 80x25 und 80x50. Sie können durch drücken von [ALT]+[ENTER]
    zwischen Fenster-und Vollbildmodus wechseln.

  • Haben Sie eine Auflösung eingestellt, die im Vollbildmodus nicht unterstützt
    wird (z.B. wegen zu vieler Spalten), und ihr Fenster im Fenstermodus beschrieben,
    gehen diese Informationen nach zweimaligem Wechsel (in den Vollbildmodus und
    wieder zurück) nicht verloren; sie können aber im Vollbildmodus nicht
    angezeigt werden.

  • Wenn Sie eine geringe Auflösung einstellen, und durch einen Wechsel in
    den Vollbildmodus eine Erhöhung der Auflösung erzwungen, so können
    Sie an jede Position der Vollbild-Konsole schreiben. Beim zurück-Wechseln
    in den Fenstermodus gehen diese Informationen allerdings verloren.

    • Beispiel:
    WIDTH 91, 25
    DIM Zeile AS STRING
    FOR i = 32 TO 122
    Zeile += CHR(i) ' Zeile aus 90 Zeichen erzeugen, die alle ASCII-Zeichen
    NEXT ' vom '!' bis zum 'z' enthält.
    ? Zeile
    ? "Im Fenstermodus kann diese ganz Zeile angezeigt werden."
    ? "Wechseln Sie nun bitte per [ALT]+[ENTER] in den Vollbildmodus."
    ? "Druecken Sie dann bitte eine beliebige Taste, um fortzusetzen."
    SLEEP
    ? "Im Vollbildmodus können nur 80x25 Zeichen angezeigt werden."
    ? "Daher werden von der ersten Zeile nur noch die ersten 80 Zeichen werden"
    ? "angezeigt."
    ? "Wechseln Sie nun bitte wieder per [ALT]+[ENTER] in den Fenstermodus."
    ? "Druecken Sie dann bitte eine beliebige Taste, um fortzusetzen."
    SLEEP
    ? "Die ganze Zeile wird wieder angezeigt."
    ? "Druecken Sie dann bitte eine beliebige Taste, um fortzusetzen."
    SLEEP
    CLS
    WIDTH 40, 26
    ? "Das Fenster ist jetzt 40x26 Zeichen gross."
    ? "Wechseln Sie nun bitte per [ALT]+[ENTER] in den Vollbildmodus"
    ? "druecken Sie dann eine beliebige Taste, um fortzusetzen."
    SLEEP

    LOCATE 40, 41
    ? "Wie Sie sehen, bietet der Vollbild-Modus immer noch genug Platz, um 80x25 Zeichen."
    ? "Allerdings wird jede Zeile schon nach 40 Zeichen umgebrochen."
    ? "Wechseln Sie nun bitte per [ALT]+[ENTER] in den Fenstermodus"
    ? "Druecken Sie dann eine beliebige Taste, um zu beenden."
    SLEEP

    Siehe auch:
    WIDTH (Funktion),
    LOCATE (Anweisung), COLOR (Anweisung),

    Unterschiede:
    zu früheren freeBASIC-Versionen
  • Funktioniert erst seit freeBASIC v0.15 bei Dateien, Druckern oder Geräten.


WIDTH (Funktion)

Syntax: WIDTH
Typ: Funktion
Kategorie: Konsole

Die Funktion WIDTH gibt Informationen über die aktuelle Größe des Konsolefensters
zurück.

Der zurückgegebene Wert wird folgendermaßen berechnet:
(Spalten OR (Zeilen SHL 16))
Das untere Word ist also die Anzahl der Spalten, während das obere Word die Anzahl
der Zeilen Zeile angibt.

Beispiel:
DIM AS INTEGER wid, lin, row

wid = WIDTH
row = LOWORD(wid)
lin = HIWORD(wid)

PRINT "Size now:"
PRINT "Lines: "; lin
PRINT "Rows: "; row

SLEEP
PRINT

WIDTH 80, 60

wid = WIDTH
row = LOWORD(wid)
lin = HIWORD(wid)

PRINT "Size now:"
PRINT "Lines: "; lin
PRINT "Rows: "; row

SLEEP

Anmerkung:
Unter freeBASIC v0.14 wurde die Größe des Puffers ausgegeben, der für das
Konsole-Fenster reserviert wurde.
Seit freeBASIC v0.15b wird die tatsächliche Fenstergröße zurückgegeben.

Unterschiede (zu QB):
WIDTH kann auch als Funktion eingesetzt werden, nicht nur als Anweisung.

Siehe auch:
WIDTH (Anweisung),
COLOR (Funktion),
LOCATE (Funktion),
SCREEN (Funktion)


WIDTH

Typ: Anweisung/Funktion

WIDTH ist ein Schlüsselwort, das als Anweisung und als Funktion eingesetzt
werden kann.
Siehe:
WIDTH (Anweisung)
WIDTH (Funktion)


WINDOW

Syntax: WINDOW [[SCREEN] (x1, y1)-(x2, y2)]
Typ: Anweisung
Kategorie: Gfx

Bestimmt die neuen physischen Darstellungsbereich, also den Bereich, innerhalb
der Koordinaten gültig sind.

  • 'SCREEN' ist ein optionaler Parameter, der bewirken, dass die y-Koordinaten
    von oben nach unten gezählt werden.

  • 'x1','y1','x2','y2' sind die neuen Koordinaten der Eckpunkte des physischen
    Darstellungsbereichs. Alle Koordinaten können Fließkommazahlen sein.

    WINDOW wird benutzt, um ein neues Koordinatensystem zu definieren. '(x1, y1)'
    und '(x2, y2) sind dabei die einander gegenüberliegenden Koordinaten der
    Eckpunkte des grafischen Darstellungsfensters.
    Alle Koordinaten, die nach einem WINDOW-Aufruf an drawing primitives übergeben
    werden, sind abhängig von diesen Koordinaten.
    Wenn SCREEN ausgelassen wird, sind die neuen Koordinaten kartesisch, die y-Koordinaten
    steigen also von unten nach oben.
    Ein Aufruf von WINDOW ohne Parameter stellt die Standards von
    SCREEN (Anweisung) wieder her.

    Anmerkung: Die Verwendung von WINDOW wird sich negativ auf die Ausführungsgeschwindigkeit
    auswirken, da alle Koordinaten zuerst umgerechnet werden müssen, bevor eine
    Ausgabe erfolgen kann.

    Siehe auch:
    SCREEN (Anweisung), VIEW (Grafik),
    PMAP


WINDOWTITLE

Syntax: WINDOWTITLE Titel AS STRING
Typ: Anweisung
Kategorie: Gfx

WINDOWTITLE ändert die Beschriftung eines Grafikfensters.

  • 'Titel' ist Die neue Beschriftung für das Grafikfenster.

    • Der neue Titel wird sofort gültig, wenn bereits ein Grafikfenster aktiv ist, oder sobald
    ein SCREEN (Anweisung)- oder SCREENRES-Aufruf erfolgt, der ein Grafikfenster öffnet.
    Wenn Sie WINDOWTITLE nicht aufrufen, bevor Sie ein Grafikfenster via SCREEN/SCREENRES
    öffnen, erhält es den seinen Dateinamen ohne Erweiterung als Beschriftung.
    WINDOWTITLE hat keine Auswirkung auf Konsolen-Fenster.

    Beispiel:
    WINDOWTITLE "FreeBASIC example program"
    SCREEN 15
    SLEEP

    Siehe auch:
    SCREEN (Anweisung), SCREENRES

    Unterschiede: Neu in freeBASIC.


WINPUT (Funktion)

Syntax A: WINPUT(Anzahl)
Syntax B: WINPUT(Anzahl, [#]Dateinummer)

Liest 'Anzahl' Zeichen von der Tastatur oder aus einer Datei, und gibt diese als
WSTRING zurück.

WINPUT funktioniert wie INPUT (Funktion), gibt jedoch einen WSTRING zurück.

  • 'Anzahl' ist eine Zahl zwischen 0 und 255, die angibt, wie viele Zeichen
    eingelesen werden sollen.

  • 'Dateinummer' ist die Nummer einer im INPUT-Modus geöffneten Datei

    • Syntax A wartet auf die Eingabe von 'Anzahl' Zeichen von der Tastatur, und gibt
    diese als WSTRING zurück. Erweiterte Zeichen (wie z.B. die Pfeiltasten) werden
    nicht eingelesen.
    Die Zeichen werden nicht auf dem Bildschirm ausgegeben.

    Syntax B liest 'Anzahl' Zeichen aus einer Textdatei, und aktualisiert den
    Pointer.

    Beispiel:
    DIM a AS WSTRING
    PRINT "Waehlen Sie eine Farbnummer"
    PRINT "1 - blau"
    PRINT "2 - rot"
    Print "3 - gruen"
    DO
    a = WINPUT(1)
    LOOP UNTIL a <= "3" AND a >= "1"

    Unterschiede
    (zu QB):
  • QB unterstützte kein UNICODE; WINPUT existierte unter QB nicht

    • (zu früheren Versionen):
  • Diese Funktion existiert erst seit freeBASIC v0.15

    • Siehe auch:
    INPUT (Funktion), WSTRING (Datentyp)


WITH

Typ: Anweisung
Kategorie: Verschiedenes
Syntax:
WITH UDT_Name
   [Ausdruck_mit_'.Record1'
   [Ausdruck_mit_'.Record2']
   [...]
END WITH

Innerhalb eines WITH-Blocks müssen nur die Namen der Records eines UDT's
(User defined Type; siehe TYPE) angegeben werden, nicht aber der UDT-Bezeichner
selbst. Dies erspart dem Programmierer einige Tipparbeit.

  • Der UDT muss nicht durch TYPE definiert sein. UNION wird ebenfalls unterstützt.

  • 'UDT_Name' kann auch ein dereferenzierter Pointer sein.

    • Beispiel:
    TYPE AdrType
    Name AS STRING
    City AS STRING
    PLZ AS INTEGER
    END TYPE
    DIM Adressen(10) AS AdrType

    WITH Adressen(0)
    .PLZ = 98765
    .Name = "Karl Mustermann"
    END WITH
    Innerhalb eines WITH-Blocks müssen keine festen Reihenfolgen eingehalten
    werden. Es ist auch möglich, innerhalb eines WITH-Blocks andere Anweisungen
    zu benutzen. Der Zugriff auf andere UDT's als dem zuerst genannten ist ebenfalls
    möglich:
    TYPE MyType
    MyStr AS STRING
    MyInt AS INTEGER
    MyPtr AS INTEGER PTR
    END TYPE

    TYPE OtherType
    OthStr AS STRING
    OthArr(20) AS INTEGER
    END TYPE

    DIM Anything(10) AS MyType
    DIM AnythingElse AS OtherType

    WITH Anything(5)
    FOR i = 0 TO 10
    .MyStr = STR(AnythingElse.OthArr(i))
    PRINT .MyStr
    PRINT @.MyPtr
    NEXT
    END WITH

    WITH-Blöcke dürfen auch verschachtelt sein:
    TYPE MyType
    MyStr AS STRING
    MyInt AS INTEGER
    MyPtr AS INTEGER PTR
    END TYPE

    TYPE OtherType
    OthStr AS STRING
    OthArr(20) AS INTEGER
    OthUdt As MyType
    END TYPE

    DIM Anything(10) AS MyType
    DIM AnythingElse AS OtherType

    WITH AnythingElse
    .OthStr = "hello"
    .OthArr(5) = 7
    WITH .OthUdt
    .MyStr = "world"
    .MyInt = 8
    .MyPtr = @.MyInt
    END WITH
    END WITH

    Beispiel:
    Ein WITH-Block mit einem dereferenzierten Pointer als Argument:
    TYPE SubType
    d AS INTEGER
    e AS INTEGER
    f AS INTEGER
    End Type

    tYPE MainType
    a AS INTEGER
    b AS INTEGER
    c AS SubType
    End Type

    DIM x AS MainType PTR
    x = CALLOCATE(LEN(MainType))

    WITH x->c
    .d = 5
    .e = 6
    .f = 7

    PRINT .d
    PRINT .e
    PRINT .f
    END WITH

    SLEEP

    Siehe auch:
    TYPE, UNION, DIM

    Unterschiede: Neu in freeBASIC.


WOCT

Syntax: WOCT[$] (Ausdruck [, Stellen])
Typ: Funktion
Kategorie: Zählsysteme

WOCT gibt den oktalen Wert eines beliebigen Ausdrucks als WSTRING zurück.
Oktalzahlen haben die Basis 8; die Ziffern reichen von 0 bis 7.

  • 'Ausdruck' ist eine Ganzzahl (eine Zahl ohne Kommastellen), die ins
    Oktalformat übersetzt werden soll

  • 'Stellen' ist die Anzahl der Stellen, die dafür aufgewandt werden soll. Ist
    'Stellen' größer als die benötigte Stellenzahl, wird der Rückgabewert mit
    führenden Nullen aufgefüllt.
    Ist 'Stellen' kleiner als die benötigte Stellenzahl, werden nur die hinteren
    Zeichen des Rückgabewerts ausgegeben.
    Wird 'Stellen' ausgelassen, besteht der Rückgabewert aus so vielen Zeichen,
    wie benötigt werden, um die Zahl korrekt darzustellen.
    Dieser Parameter steht erst seit freeBASIC v0.16b zur Verfügung!

  • Der Rückgabwert ist ein String, der den Wert von 'Ausdruck' im Oktalformat
    enthält.

    • Das Dollarzeichen ($) als Suffix ist optional.

    WOCT ist das Pendant zu OCT, gibt aber einen WSTRING zurück.

    Beispiel:
    PRINT WOCT(8)
    PRINT WOCT(20, 4)
    PRINT WOCT(100, 2)
    Ausgabe:
    10
    0024
    44

    Um eine Oktalzahl in ihre dezimale Form zurückzuverwandeln, wird
    VAL verwendet:
    DIM oktal AS WSTRING * 5

    oktal = "100"

    'Kennung &O zeigt an, dass der folgende String eine Oktalzahl ist.
    oktal = "&O" + oktal

    PRINT VAL(oktal)
    Gibt 64 aus.

    Siehe auch:
    WHEX, WBIN, OCT,
    VAL, WSTRING (Datentyp)


WRITE

Syntax: WRITE Printausdruck
Typ: Anweisung
Kategorie: Konsole

WRITE erfüllt die selbe Funktion wie PRINT (Anweisung), formatiert
den Text jedoch anders.
STRINGs, egal ob als Variable oder Konstante gegeben, werden in "Anführungszeichen"
ausgegeben.
Kommata werden als Literale ausgegeben, und führen nicht mehr zu Tabspaces.
Die Verwendung von Semikolons ist mit WRITE unzulässig.

Beispiel:
a = 10
b = 3
WRITE "String A", "String B", 1, 2
WRITE
WRITE a * b
WRITE STR(a) + STR(b)
WRITE "a = " + STR(a)
Ausgabe:
"String A","String B",1,2

30
"103"
"a = 10"

Siehe auch:
WRITE #,
PRINT (Anweisung), PRINT #,
LOCATE (Anweisung), COLOR (Anweisung)


WRITE (Datei)

WRITE #chanel, Printausdruck
Typ: Anweisung
Kategorie: Datei

WRITE # funktioniert wie WRITE (Anweisung), leitet aber die Ausgabe in
eine zuvor mit OPEN geöffnete Datei um; die Datei muss
in einem der sequentiellen Ausgabemodus (OUTPUT, APPEND)
geöffnet sein.
Der Vorteil gegenüber PRINT # ist, dass durch die
spezielle Formatierung mehrere Datensätze pro Zeile geschrieben werden können;
einen Datensatz kann man per INPUT # wieder
auslesen.
Der Verwendbare Zeichensatz ist bei WRITE jedoch eingeschränkt, zumindest, wenn
die Datei im Anschluss wieder mit INPUT # gelesen
werden soll; ";Anführungszeichen" dürfen nicht verwendet werden.

Beispiel:
OPEN "Adressen.txt" FOR APPEND AS #1

WRITE #1, "Karl Mustermann", "12345", "Oberhausen", "Rottstraße 2"
WRITE #1, "Eva Mustermann", "12345", Oberhausen", Rottstraße 2"
WRITE #1, "Andrea Müller", "12346", "Unterhausen", "Wendeweg 17"
CLOSE #1

OPEN "Adressen.txt" FOR INPUT AS #1
DO
FOR satz = 1 TO 4
INPUT #1, tmp$
PRINT tmp$;
NEXT
PRINT
LOOP UNTIL EOF(1)

Siehe auch:
WRITE (Anweisung),
OPEN, CLOSE
PRINT #, PRINT (Anweisung)


WRITE

Typ: Anweisung
Kategorie: Konsole/Datei

WRITE ist ein Schlüsselwort, das als Konsolen- und Dateibefehl eingesetzt werden kann.

Siehe:
WRITE (Anweisung)
WRITE #


WSPACE

Syntax: WSPACE[$](n)
Typ: Funktion
Kategorie: Stringmanipulation

Gibt einen WString zurück, der aus 'n' Leerzeichen besteht.

WSPACE ist das Pendant zu SPACE, gibt aber einen WSTRING zurück.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:
DIM w AS WSTRING * 6
s = WSPACE(6)
PRINT "nicht eingerückter Text"
PRINT s + "eingerückter Text"

Unterschiede (zu QB):
Neu in freeBASIC

Siehe auch:
SPACE,
STRING (Funktion), TAB, SPC,
WSTRING (Datentyp)


WSTR

Syntax: WSTR[$](numerischer Ausdruck)
Typ: Funktion
Kategorie: Stringmanipulation

Verwandelt einen numerischen Ausdruck in einen WSTRING.
WSTR ist die Gegenfunktion zu VAL.

Das Dollarzeichen ($) als Suffix ist optional.

WSTR ist das Pendant zu STR, gibt aber einen WSTRING zurück.

Beispiel:
DIM a AS INTEGER
DIM b AS WSTRING * 4
a = 8421
b = WSTR(a)
PRINT a, b, WSTR("&HaB1)

Siehe auch:
VAL, STR,
WSTRING (Datentyp)

Unterschiede (Zu QB):
Neu in freeBASIC


WSTRING (Datentyp)

Typ: Datentyp

Ein STRING ist eine Zeichenkette, die einen zusammenhängenden Text, einzelne Wörter,
Buchstaben oder sonstige Zeichen enthalten kann; auch Leerstrings (also STRINGs
ohne jeglichen Inhalt) sind möglich.

Ein WSTRING im speziellen ist ein Array (siehe DIM) fester Größe aus wide-chars
(16bit-Zeichen), der mit einem Nullzeichen (CHR(0)) endet; er ist also wie
der ZSTRING ein Null-terminierter String.
Deshalb darf dieses Zeichen NIEMALS in einem WSTRING verwendet werden; andernfalls
wird die Zeichenkette unterbrochen.

Im allgemeinen verhält sich der WSTRING wie ein ZSTRING. Der einzige Unterschied
besteht darin, dass pro Zeichen zwei Bytes reserviert werden.

Dieser Typ wurde bereitgestellt, um nicht-latin-basierende Alphabete zu unterstützen.
Alle STRING-Operatoren und STRING-Funktionen (wie LEFT) funktionieren
bereits mit WSTRINGs.
In einigen Fällen wurde spezielle WSTRING-Routinen wie WCHR geschrieben. Siehe
unten bei 'Siehe auch'.

Der freeBASIC-Compiler selbst unterstützt inzwischen neben ASCII-Dateien mit
UNICODE-Escape-Sequenzen (\u; siehe dazu erklärend auch OPTION ESCAPE) auch in
UTF-8, UTF-16LE, UTF-16BE, UTF-32LE und in UTF-32BE codierte Quellcodes.

Beispiel:
' Bereite einen normalen STRING, einen WSTRING fester länge (statisches Array)
' und einen WSTRING PTR (dynamisches Array) vor
DIM AS STRING nst
DIM AS WSTRING * 11 wst ' später sollen 10 Zeichen gespeichert werden. Zusätzlich
' muss Platz für ein null-zeichen bereitgehalten werden.
DIM AS WSTRING PTR wstp

' Befülle jeden Stringtyp mit der Zeichenkette "hello".
nst = "hello"
wst = "hello"
wstp = CALLOCATE(12) ' Da dieser ein Pointer ist, muss zuerst der Speicherbereich
*wstp = "hello" ' für fünf Zeichen + ein Nullzeichen reserviert werden.
' für jedes Zeichen, auch für das Nullzeichen werden je
' zwei Bytes reserviert.

' Die drei Stringtypen ausgeben
PRINT "Inhalte:"
PRINT "nst :", nst
PRINT "wst :", wst
PRINT "wstp :", wstp
PRINT "*wstp:", *wstp
PRINT

' Die Länge der Stringtypen ausgeben
PRINT "LEN(x)"
PRINT "nst :", LEN(nst )
PRINT "wst :", LEN(wst )
PRINT "wstp :", LEN(wstp )
PRINT "*wstp:", LEN(*wstp)
PRINT

' Die Größe der Speicherstruktur ausgeben
PRINT "SIZEOF(x)"
PRINT "nst :", SIZEOF(nst )
PRINT "wst :", SIZEOF(wst )
PRINT "wstp :", SIZEOF(wstp )
PRINT "*wstp:", SIZEOF(*wstp)
PRINT

' die Zeichenkette " Welt" an die Stringtypen anhängen
nst += " Welt" ' freeBASIC verwaltet den Speicher für normale automatisch
wst += " Welt" ' da dieser WTRING fixed length ist, muss kein zusätzlicher Speicher
' reserviert werden. Da nur 12 * 2 Bytes reserviert wurden, ist 'wst'
' jetzt voll, eine längere Zeichenkette kann nicht gespeichert werden.
wstp = REALLOCATE(wstp, 24) ' zusätzlichen Speicher reservieren, um die Zeichenkette
' anhängen zu können, und dabei das Nullzeichen beachten.
*wstp += " Welt" ' jetzt kann auch hier ganz normal verfahren werden.

' ein einzelnes Zeichen austauschen:
nst [1] = 97 ' benutze String-Indizierung: Tausche das zweite Zeichen durch
wst [1] = 97 ' CHR(97) aus - ein kleines a.
wstp[1] = 97 ' funktioniert problemlos bei allen Typen.

' Die drei Stringtypen ausgeben
PRINT "Inhalte:"
PRINT "nst :", nst
PRINT "wst :", wst
PRINT "wstp :", wstp
PRINT "*wstp:", *wstp
PRINT

' nicht vergessen: Den Speicher wieder freigeben:
DEALLOCATE wstp

GETKEY
Ausgabe:
Inhalte:
nst  :        hello
wst  :        hello
wstp :        3291344
*wstp:        hello

LEN(x)
nst  :         5
wst  :         5
wstp :         4
*wstp:         5

SIZEOF(x)
nst  :         12
wst  :         22
wstp :         4
*wstp:         0

Inhalte:
nst  :        hallo Welt
wst  :        hallo Welt
wstp :        3291440
*wstp:        hallo Welt

Unterschiede:
(zu QB):
  • Neu in freeBASIC.

    • (zu früheren Versionen von freeBASIC):
  • Der Datentyp WSTRING existiert erst seit freeBASIC v0.15

    • Siehe auch:
    Datenypen:
    DIM,
    BYTE, UBYTE,
    SHORT, USHORT,
    INTEGER, UINTEGER, LONG,
    LONGINT, ULONGINT,
    SINGLE, DOUBLE,
    STRING (Datentyp), ZSTRING,
    Datentypen,
    LEN, SIZEOF,
    CAST
    Stringfunktionen
    CHR, WCHR, ASC,
    STR, WSTR, VAL,
    BIN, HEX, OCT,
    WBIN, WHEX, WOCT,
    SPACE, WSPACE
    LEFT, RIGHT, MID (Funktion),
    LTRIM, RTRIM, TRIM,
    INSTR,
    INPUT (Funktion), WINPUT (Funktion)


WSTRING (Funktion)

Syntax A: WSTRING[$](n, code)
Syntax B: WSTRING[$](n, Charakter$)
Typ: Funktion
Kategorie: Stringmanipulation

WSTRING (Funktion) gibt einen WSTRING aus 'n' Zeichen aus; jedes Zeichen dieser Kette
ist 'Charakter$' bzw. WCHR('code').
Wenn 'Charakter$' aus mehreren Zeichen besteht, wird eine Kette ausgegeben, die
nur aus dem ersten Zeichen von 'Charakter$' besteht.

WSTRING (Funktion) ist das Pendant zu STRING (Funktion), gibt aber einen WSTRING zurück.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel: Text unterstreichen:
msg$ = "freeBASIC ist ein BASIC Compiler"
l = LEN(msg$)
PRINT msg$
PRINT WSTRING(l, WChr(42))

Unterschiede (zu QB):
Neu in freeBASIC

Siehe auch:
STRING (Funktion),
WSPACE,
WSTRING


WSTRING

Typ: Datentyp/Funktion

WSTRING ist ein Schlüsselwort, das als Datentyp und Funktion eingesetzt werden kann.

Siehe:
WSTRING (Datentyp)
WSTRING (Funktion)


Liste der Schlüsselwörter beginnend mit X

XOR
XOR (Methode)
XOR (Operator)


XOR (Methode)

Typ: Schlüsselwort
Kategorie: Gfx

XOR ist ein Schlüsselwort, das im Zusammenhang mit PUT (Grafik) und DRAW STRING
eingesetzt wird.

Die Farbe des gezeichneten Pixels ist das Ergebnis eines logischen XOR des zu
zeichnenden Pixels mit dem zu überschreibenden Pixel.

Beispiel:
An der Position (100, 100) befindet sich ein Pixel mit dem Farbattribut 172.
Dieses soll nach der XOR-Methode mit einem Pixel des Farbattributs 47 überzeichnet
werden. Das Ergebnis ist ein Pixel des Farbattributs 131.
Dies ergibt sich folgendermaßen:
Dezimal    Binär
 172       10101100
  47       00101111
-XOR---------XOR---
 131       10000011

Die XOR-Methode kann mit allen Farbtiefen angewandt werden, also sowohl in
palettenindizierten Modi als auch in high/truecolor-Modi. Beachten Sie, dass in
palettenindizierten Modi das sichtbare Ergebnis nicht nur von den Farbattributen,
sondern auch von den zugeordneten Paletten-Einträgen abhängig ist.
Siehe dazu PALETTE und Standardpaletten.

Wenn Sie bei PUT kein Aktionswort angeben, wird automatisch XOR verwendet.

Siehe auch:
XOR (Operator),
PUT (Grafik), DRAW STRING, SCREEN (Anweisung),
OR (Methode), AND (Methode),
PSET (Methode), PRESET (Methode),
ALPHA, ADD, TRANS, CUSTOM


XOR

XOR kann als einfacher und kombinierter Operator eingesetzt werden:

logischer Operator (einfacher Operator)

Syntax: Ausdruck1 XOR Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

XOR steht für exclusives OR, bzw. "entweder das eine oder das andere".
Ähnlich wie OR setzt es im Ergebnis das Bit, wenn eines der beiden Bits in Ausdruck1
und Ausdruck2 gesetzt sind; wenn beide jedoch gesetzt sind, wird das Bit im Ergebnis
nicht gesetzt. Ebenso wird es nicht gesetzt, wenn beide Bits in den Ausdrücken nicht
gesetzt sind.

XOR wird in Bedingunen verwendet, wenn eine Aussage erfüllt sein muss, jedoch nicht
beide Erfüllt sein dürfen.

Beispiel 1: XOR in einer IF-THEN-Bedingung:
IF (a = 1) XOR (b = 7) THEN
PRINT "Entweder a = 1 oder b = 7, aber nicht beides zugleich."
ELSE
PRINT "a <> 1 und b <> 7 oder a = 1 und b = 7."
END IF

Beispiel 2: Komplement zweier Zahlen mit XOR:
DIM AS INTEGER z1, z2

z1 = 6
z2 = 10

PRINT z1, BIN(z1, 4)
PRINT z2, BIN(z2, 4)
PRINT "---", "----"
PRINT z1 XOR z2, BIN(z1 XOR z2, 4)
GETKEY
Ausgabe:
  6           0110
 10           1010
---           ----
 12           1100

Siehe auch:
kombiniertes XOR,
AND, NOT, OR, IMP, EQV,
Logische Operatoren

kombinierter Operator

Syntax: Wert XOR= Ausdruck
Typ: Operator
Kategorie: logische Operatoren

Das kombinierte XOR ist eine Kurzform von
Wert = Wert XOR Ausdruck
Ebenso wie der einfache Operator setzt das Kombinierte XOR die Bits im Ergebnis
nur, wenn im nur eines der beiden Ausgangsbits gesetzt war.

Beispiel:
DIM AS INTEGER Checkboxen

' Simuliere Anklicken von Checkbox Nr 5:

Checkboxen XOR= (1 SHL 5)
Wie Sie sehen, kann XOR benutz werden, um ein einzelnes Bit oder mehrere Bits
bequem zu invertieren. Der Ausdruck (1 SHL 5) entspricht &B10000.
Ein XOR mit 0 bewirkt, dass der Status des Bits erhalten bleibt; ein XOR mit 1
löscht ein gesetztes Bit, und setzt eines, das zuvor nicht gesetzt war.

Siehe auch:
einfaches AND,
NOT, AND (Operator), OR (Operator), IMP, EQV,
Logische Operatoren


XOR

XOR kann als Operator, als kombinierter Operator und als Methode bei PUT (Grafik) und DRAW STRING eingesetzt
werden.

Siehe:
XOR (Operator)
XOR (Methode)


Liste der Schlüsselwörter beginnend mit Y

YEAR


YEAR

Syntax: YEAR(Serial)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei vbcompat.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE.

YEAR extrahiert das Jahr einer Serial Number.

  • 'Serial' ist ein DOUBLE-Wert, der als Serial Number behandelt wird.

  • Der Rückgabewert ist der das Jahr, der in der Serial Number gespeichert ist.

    • Beispiel:
    Das aktuelle Jahr aus NOW extrahieren:
    #INCLUDE "vbcompat.bi"
    DIM jahr AS INTEGER
    jahr = YEAR(NOW)

    Unterschiede
    zu QB
  • Diese Funktion existierte nur in QBX PDS und in VBDOS.

    • zu früheren Versionen von freeBASIC
  • Existiert erst seit freeBASIC v0.15

    • Siehe auch
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    ISDATE">,
     Serial Numbers


Liste der Schlüsselwörter beginnend mit Z

ZSTRING


ZSTRING

Typ: Datentyp

Ein STRING ist eine Zeichenkette, die einen zusammenhängenden Text, einzelne Wörter,
Buchstaben oder sonstige Zeichen enthalten kann; auch Leerstrings (also STRINGs
ohne jeglichen Inhalt) sind möglich.

Im Gegensatz zum 'normalen' STRING benutzt er keinen Bezeichner; VARPTR gibt
also tatsächlich einen Pointer auf das erste Zeichen des Strings zurück. Der
User muss also selbstständig dafüf sorgen, dass genug Speicher zur Verfügung
steht, um die Zeichenkette zu speichern.
Um im Nachhinein festzustellen, wie viele Zeichen zum ZSTRING gehören, wurde er
als null-terminierter STRING festgelegt, d.h. er endet bei dem Zeichen CHR(0).
Deshalb darf dieses Zeichen NIEMALS in einem ZSTRING verwendet werden; andernfalls
wird die Zeichenkette unterbrochen.
Bei der Zuweisung eines Werts hängt freeBASIC das Nullzeichen automatisch an.

Dies muss beachtet werden, wenn Speicherplatz für einen ZSTRING reserviert wird,
da auch das abschließende Nullzeichen ein Byte belegt.

Ein ZSTRING kann auch als ein UBYTE-Array (siehe DIM) betrachtet werden. Dabei ist es
möglich, dieses Array statisch zu behandeln; der ZSTRING ist dann fixed length
(siehe zu fixed length auch STRING).
Alternativ kann er auch wie ein dynamisches Array gehandhabt werden; die
Speicherverwaltung liegt dann jedoch ganz in den Händen des Users. Im Gegensatz
zu 'klassischen' Arrays geschieht eine Redimensionierung nämlich nicht über
REDIM, sondern über REALLOCATE

Werden fixed-length-ZSTRINGs verwendet, so verhindert freeBASIC automatisch
einen Overflow, indem es Zeichenketten automatisch abschneidet, wenn sie länger
sind als der zur Verfügung stehende Speicherbereich.
Bei ZSTRING POINTERn muss allerdings selbstständig darauf geachtet werden.

ZSTRINGs werden sehr häufig bei der Übergabe von Strings an oder von externen
SUBs/FUNCTIONs benutzt.
Dieser Typ wurde bereitgestellt, um einen einfachen Umgang mit C-Bibliotheken zu
gewährleisten, und um die fixed-length-Strings zu ersetzen, die nicht als
POINTER verwendet werden können.

Beispiel:
' Bereite einen normalen STRING, einen ZSTRING fester länge (statisches Array)
' und einen ZSTRING PTR (dynamisches Array) vor
DIM AS STRING nstr
DIM AS ZSTRING * 11 zstr ' später sollen 10 Zeichen gespeichert werden. Zusätzlich
' muss Platz für ein null-zeichen bereitgehalten werden.
DIM AS ZSTRING PTR zstrp

' Befülle jeden Stringtyp mit der Zeichenkette "hello".
nstr = "hello"
zstr = "hello"
zstrp = CALLOCATE(6) ' Da dieser ein Pointer ist, muss zuerst der Speicherbereich
*zstrp = "hello" ' für fünf Zeichen + ein Nullzeichen reserviert werden.

' Die drei Stringtypen ausgeben
PRINT "Inhalte:"
PRINT "nstr :", nstr
PRINT "zstr :", zstr
PRINT "zstrp :", zstrp
PRINT "*zstrp:", *zstrp
PRINT

' Die Länge der Stringtypen ausgeben
PRINT "LEN(x)"
PRINT "nstr :", LEN(nstr )
PRINT "zstr :", LEN(zstr )
PRINT "zstrp :", LEN(zstrp )
PRINT "*zstrp:", LEN(*zstrp)
PRINT

' Die Größe der Speicherstruktur ausgeben
PRINT "SIZEOF(x)"
PRINT "nstr :", SIZEOF(nstr )
PRINT "zstr :", SIZEOF(zstr )
PRINT "zstrp :", SIZEOF(zstrp )
PRINT "*zstrp:", SIZEOF(*zstrp)
PRINT

' die Zeichenkette " Welt" an die Stringtypen anhängen
nstr += " Welt" ' freeBASIC verwaltet den Speicher für normale Strings automatisch
zstr += " Welt" ' da dieser ZString fixed length ist, muss kein zusätzlicher Speicher
' reserviert werden. Da nur 11 Bytes reserviert wurden, ist 'zstr'
' jetzt voll, eine längere Zeichenkette kann nicht gespeichert werden.
zstrp = REALLOCATE(zstrp, 12) ' zusätzlichen Speicher reservieren, um die Zeichenkette
' anhängen zu können, und dabei das Nullzeichen beachten.
*zstrp += " Welt" ' jetzt kann auch hier ganz normal verfahren werden.

' ein einzelnes Zeichen austauschen:
nstr [1] = 97 ' benutze String-Indizierung: Tausche das zweite Zeichen durch
zstr [1] = 97 ' CHR(97) aus - ein kleines a.
zstrp[1] = 97 ' funktioniert problemlos bei allen Typen.

' Die drei Stringtypen ausgeben
PRINT "Inhalte:"
PRINT "nstr :", nstr
PRINT "zstr :", zstr
PRINT "zstrp :", zstrp
PRINT "*zstrp:", *zstrp
PRINT

' nicht vergessen: Den Speicher wieder freigeben:
DEALLOCATE zstrp

GETKEY
Ausgabe:
Inhalte:
nstr  :       hello
zstr  :       hello
zstrp :       3291152
*zstrp:       hello

LEN(x)
nstr  :        5
zstr  :        5
zstrp :        4
*zstrp:        5

SIZEOF(x)
nstr  :        12
zstr  :        11
zstrp :        4
*zstrp:        0

Inhalte:
nstr  :       hallo Welt
zstr  :       hallo Welt
zstrp :       3291464
*zstrp:       hallo Welt

Siehe auch:
Datenypen:
DIM,
BYTE, UBYTE,
SHORT, USHORT,
INTEGER, UINTEGER, LONG,
LONGINT, ULONGINT,
SINGLE, DOUBLE,
STRING (Datentyp), WSTRING (Datentyp),
Datentypen
Stringfunktionen
CHR, WCHR, ASC,
STR, WSTR, VAL,
BIN, HEX, OCT,
WBIN, WHEX, WOCT,
SPACE, WSPACE
LEFT, RIGHT, MID (Funktion),
LTRIM, RTRIM, TRIM,
INSTR,
INPUT (Funktion), WINPUT (Funktion)

Unterschiede:
(zu QB):
  • Neu in freeBASIC.

    • zu früheren freeBASIC-Versionen
  • der Datentyp ZSTRING existiert erst seit freeBASIC v0.13


Liste der Metabefehle

__DATE__
__FB_ARGC__
__FB_ARGV__
__FB_BIGENDIAN__
__FB_DOS__
__FB_DEBUG__
__FB_ERR__
__FB_LANG__
__FB_LINUX__
__FB_MAIN__
__FB_MT__
__FB_MIN_VERSION__
__FB_OPTION_EXPLICIT__
__FB_OPTION_ESCAPE__
__FB_OPTION_DYNAMIC__
__FB_OPTION_PRIVATE__
__FB_OPTION_BYVAL__
__FB_OUT_EXE__
__FB_OUT_DLL__
__FB_OUT_LIB__
__FB_OUT_OBJ__
__FB_SIGNATURE__
__FB_MAJOR__
__FB_MINOR__
__FB_VER_PATCH__
__FB_WIN32__
__FILE__
__FILE_NQ__
__FUNCTION__
__FUNCTION_NQ__
__LINE__
__PATH__
__TIME__
#DEFINE
#ELSE
#ELSEIF
#ERROR
#ENDIF
#ENDMACRO
#IF
#IFDEF
#IFNDEF
#INCLIB
#INCLUDE
#LIBPATH
#LINE
#MACRO
#PRAGMA
#PRINT
#UNDEF
DYNAMIC (Metabefehl)
STATIC (Metabefehl)


__DATE__

Typ: Vordefiniertes Symbol

__DATE__ wird beim Kompilierten zu einem String umgesetzt. Dieser enthält das Kompilier-Datum im Format yyyy-mm-dd.

Beispiel:
PRINT "Dieses Programm wurde erstellt am "; __DATE__; " um "; __TIME__; "."
Ausgabe:
Dieses Programm wurde erstellt am 01-06-2007 um 15:16:22.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    #DEFINE, __TIME__,
    Präprozessoren: Vordefinierte Symbole


__FB_ARGC__

Typ: Vordefiniertes Symbol

__FB_ARGC__ wird beim Kompilierten zu einem Integer umgesetzt. Dieser gibt die Anzahl der Argumente an, die in der Kommandozeile
verwendet wurden.
Gemeint ist die Kommandozeile, die an das Programm selbst, nicht an den Compiler übergeben wurde; siehe dazu COMMAND.

Beispiel:
Dim As Integer i
For i = 0 To __FB_ARGC__ - 1
Print "arg "; i; " = '"; Command(i); "'"
Next i

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_ARGC__ existiert seit freeBASIC v0.17

    • __FB_ARGV__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_ARGV__

Typ: Vordefniertes Symbol

__FB_ARGV__ wird beim Kompilierten zu einem Pointer umgesetzt. Dieser zeigt auf einen Speicherbereich, in dem sich weitere ZSTRING PTRs
befinden, die auf die einzelnen Kommandozeilenparameter zeigen.
Gemeint ist die Kommandozeile, die an das Programm selbst, nicht an den Compiler übergeben wurde; siehe dazu COMMAND.

Beispiel:
Declare Function main _
( _
ByVal argc As Integer, _
ByVal argv As ZString Ptr Ptr _
) As Integer

End main( __FB_ARGC__, __FB_ARGV__ )

Private Function main ( _
ByVal argc As Integer, _
ByVal argv As ZString Ptr Ptr ) _
As Integer

For i As Integer = 0 To argc - 1
Print "arg "; i; " = '"; *argv[i]; "'"
Next i

End Function

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_ARGV__ existiert seit freeBASIC v0.17

    • Siehe auch:
    __FB_ARGC__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_BIGENDIAN__

Typ: Vordefiniertes Symbol

Dieses Symbol ohne Wert wird immer dann definiert, wenn für ein System kompiliert werden soll, das die big-endian-Regeln anwendet.
Es kann eingesetzt werden, um Teile des Programms nur für big-endian-Systeme auszuführen.

Beispiel:
#ifdef __FB_BIGENDIAN__
'...instructions only for big endian machines
#else
'...instructions only for little endian machines
#endif

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_BIGENDIAN__ existiert seit freeBASIC v0.17 ?

    • Siehe auch:
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_DEBUG__

Typ: Vordefiniertes Symbol

__FB_DEBUG__ ist ein Symbol, das beim Kompilieren in eine Zahl umgesetzt wird. Wurde beim Kompilieren die Kommandozeilenoption '-g'
angewandt, so hat es den Wert -1, andernfalls hat es den Wert 0.

Beispiel:
#If __FB_DEBUG__
#Print Debug mode
#Else
#Print Release mode
#EndIf

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_DEBUG__ existiert seit freeBASIC v0.17

    • Siehe auch:
    __FB_ERR__, __FB_MT__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_DOS__

Typ: Vordefiniertes Symbol

__FB_DOS__ ist ein Symbol ohne Wert. Dieses Symbol wird definiert, wenn der Code
von der DOS-Version des Compilers umgesetzt wird; durch #IF ist es möglich,
bestimmte Codeteile nur zu kompilieren, wenn der Code für Linux umgesetzt werden
soll.

Beispiel:
#IFDEF __FB_DOS__
#INCLUDE "MyProjectDOSVersion.bi"
#ELSE
#ERROR Dieses Programm ist noch nicht fuer andere Plattformen verfuegbar.
#ENDIF

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.9 (damals als FB__DOS)

  • Wurde mit freeBASIC v0.13 zu __FB_DOS__ umbenannt

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_ERR__

Typ: Vordefiniertes Symbol

__FB_ERR__ ist ein Symbol, das abhängig von den Kommandozeilenoptionen zu verschiedenen Zahlen umgesetzt wird.

Option | Wert
'-e', '-ex' oder '-exx' nicht angegeben. (Keine Fehlerprüfung) | 0
'-e' - einfache Fehlerbehandlungsroutinen aktiviert. | 1
'-ex' - QB-Fehlerbehandlungsroutinen aktiv | 3
'-exx' - Alle Fehlerbehandlungsroutinen aktiv | 7

Beispiel:

#If __FB_ERR__ = 0
#Print "No Error Checking enabled on the Command Line!"
#ElseIf __FB_ERR__ = 1
#Print "Some Error Checking enabled on the Command Line!"
#ElseIf __FB_ERR__ = 3
#Print "QBasic style Error Checking enabled on the Command Line!"
#ElseIf __FB_ERR__ = 7
#Print "Extreme Error Checking enabled on the Command Line!"
#Else
#Print "Some Unknown Error level has been set!"
#EndIf

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_ERR__ existiert seit freeBASIC v0.17

    • Siehe auch:
    __FB_MT__, __FB_DEBUG__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_LANG__

Typ: Vordefiniertes Symbol

__FB_LANG__ wird beim Kompilieren in eine Zeichenkette umgesetzt, die angibt, nach welchen FB-Dialektregeln kompiliert wird.
Die Zeichekette enthält dabei den in Anführungzeichen (") eingerahmten Parameter hinter dem '-lang'-Parameter der Kommandozeile.

Beispiel:
#IfDef __FB_LANG__
#If __FB_LANG__ <> "fb"
Option Explicit
#EndIf
#Else
Option Explicit
#Endif

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_LANG__ existiert seit freeBASIC v0.17

    • __FB_VERSION__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_LINUX__

Typ: Vordefiniertes Symbol

__FB_LINUX__ ist ein Symbol ohne Wert. Dieses Symbol wird definiert, wenn der Code
von der LINUX-Version des Compilers umgesetzt wird; durch #IF ist es möglich,
bestimmte Codeteile nur zu kompilieren, wenn der Code für Linux umgesetzt werden
soll.

Beispiel:
#IFDEF __FB_LINUX__
#INCLUDE "MyProjectLinuxVersion.bi"
#ELSE
#ERROR Dieses Programm ist noch nicht fuer andere Plattformen verfuegbar.
#ENDIF

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.9 (damals als FB__LINUX)

  • Wurde mit freeBASIC v0.13 zu __FB_LINUX__ umbenannt

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_MAIN__

Typ: Vordefiniertes Symbol

__FB_MAIN__ ist ein Symbol ohne Wert. Dieses Symbol wird definiert, sobald alle
DEFINEs (Symbole und Makros) des Hauptmoduls überstetzt werden.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.15

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_MIN_VERSION__

Syntax: __FB_MIN_VERSION__(major, minor, patch)
Typ: Vordefiniertes Makro

Dieses Makro vergleicht die Version des verwendeten Compilers mit den angegebenen Daten.
Es gibt -1 aus, wenn die Version des Kompilers größer oder gleich den Spezifikationen
ist, bzw. 0, wenn die Version kleiner ist.
Damit kann sicher gestellt werden, dass der Code mit der Compilerversion
kompatibel ist.

__FB_MIN_VERSION__ ist folgendermaßen definiert:
#DEFINE __FB_MIN_VERSION__(major, minor, patch_level) _
   ((__FB_VER_MAJOR__ > major) OR _
   ((__FB_VER_MAJOR__ = major) AND ((__FB_VER_MINOR__ > minor) OR _
   ( __FB_VER_MINOR__ = minor  AND __FB_VER_PATCH__ >= patch_level))))

Beispiel:
#IF NOT __FB_MIN_VERSION__(0, 15, 0)
#ERROR Ihre Compilerversion ist zu alt fuer diesen Code.
#ELSEIF __FB_MIN_VERSION__(0, 17, 0)
#ERROR Dieser Code ist nicht kompatibel mit Compilern ueber v0.16.
#ENDIF

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_MT__

Typ: Vordefiniertes Symbol

__FB_MT__ wird beim Kompilieren in eine Zahl umgesetzt, die angibt, ob der Code mit der FB-Multithread-Lib umgesetzt wird, oder mit der
FB-Standard-Lib.
Wird mit der Multithread-Lib umgesetzt, so hat dieses Symbol den Wert -1, andernfalls wird es mit 0 umgesetzt.

Beispiel:
#If __FB_MT__
#Print Using multi-threaded library
#Else
#Print Using Single-threaded library
#EndIf

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FB_MT__ existiert seit freeBASIC v0.17c

    • Siehe auch:
    __FB_DEBUG__, __FB_ERR__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FB_OPTION_BYVAL__

Typ: Vordefiniertes Symbol

__FB_OPTION_BYVAL__ ist ein Symbol, dessen Wert -1 ist, wenn OPTION BYVAL verwendet
wird, bzw. 0, wenn dies nicht der Fall ist.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    OPTION
    Präprozessoren: Vordefinierte Symbole


__FB_OPTION_DYNAMIC__

Typ: Vordefiniertes Symbol

__FB_OPTION_DYNAMIC__ ist ein Symbol, dessen Wert -1 ist, wenn OPTION DYNAMIC
verwendet wird, bzw. 0, wenn dies nicht der Fall ist.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    OPTION
    Präprozessoren: Vordefinierte Symbole


__FB_OPTION_ESCAPE__

Typ: Vordefiniertes Symbol

__FB_OPTION_ESCAPE__ ist ein Symbol, dessen Wert -1 ist, wenn OPTION ESCAPE
verwendet wird, bzw. 0, wenn dies nicht der Fall ist.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    OPTION
    Präprozessoren: Vordefinierte Symbole


__FB_OPTION_EXPLICIT__

Typ: Vordefiniertes Symbol

__FB_OPTION_EXPLICIT__ ist ein Symbol, dessen Wert -1 ist, wenn OPTION EXPLICIT
verwendet wird, bzw. 0, wenn dies nicht der Fall ist.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    OPTION
    Präprozessoren: Vordefinierte Symbole


__FB_OUT_DLL__

Typ: Vordefiniertes Symbol

__FB_OUT_DLL__ ist ein Symbol, dessen wert -1 ist, wenn der Code zur Dynamischen
Bibliothek (*.dll) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    Der Compiler
    Präprozessoren: Vordefinierte Symbole


__FB_OUT_EXE__

Typ: Vordefiniertes Symbol

__FB_OUT_OBJ__ ist ein Symbol, dessen wert -1 ist, wenn der Code zur Executable
(*.exe) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    Der Compiler
    Präprozessoren: Vordefinierte Symbole


__FB_OUT_LIB__

Typ: Vordefiniertes Symbol

__FB_OUT_LIB__ ist ein Symbol, dessen wert -1 ist, wenn der Code zur statischen
Bibliothek (*.lib) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    Der Compiler
    Präprozessoren: Vordefinierte Symbole


__FB_OUT_OBJ__

Typ: Vordefiniertes Symbol

__FB_OUT_OBJ__ ist ein Symbol, dessen wert -1 ist, wenn der Code zur Objekt-
Datei (*.obj) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.16

    • Siehe auch:
    #DEFINE
    Der Compiler
    Präprozessoren: Vordefinierte Symbole


__FB_SIGNATURE__

Typ: Vordefiniertes Symbol

__FB_SIGNATURE__ gibt einen String zurück, der die Signatur des Compilers enthält, z.B.:
FreeBASIC v0.17b

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.9 (Damals als FB__SIGNATURE)

  • Wurde mit freeBASIC v0.13 zu __FB_SIGNATURE__ umbenannt

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_VERSION__

Typ: Vordefiniertes Symbol

Ein String, der die Version des Compilers enthält, z.B.:
0.17

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.9 (damals als FB__VERSION)

  • Wurde mit freeBASIC v0.13 zu __FB_VERSION__ umbenannt.

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_VER_MAJOR__

Typ: Vordefiniertes Symbol

Ein Integer, der die Versionshauptnummer des Compilers enthält, z.B.:
0

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.14

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_VER_MINOR__

Typ: Vordefiniertes Symbol

Ein Integer, der die Versionsunternummer des Compilers enthält, z.B.:
15

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_VER_PATCH__

Typ: Vordefiniertes Symbol

Ein Integer, der die Patchnummer des Compilers enthält, z.B.:
0

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.14

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FB_WIN32__

Typ: Vordefiniertes Symbol

__FB_WIN32__ ist ein Symbol ohne Wert. Dieses Symbol wird definiert, wenn der Code
von der Win32-Version des Compilers umgesetzt wird; durch #IF
ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Win32
umgesetzt werden soll.

Beispiel:
#IFDEF __FB_WIN32__
#INCLUDE "windows.bi"
#ELSE
#ERROR Dieser Code ist nicht Linux-Kompatibel.
#ENDIF

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.9 (Damals als FB__WIN32)

  • Wurde erst in freeBASIC v0.13 zu __FB_WIN32__ umbenannt

    • Siehe auch:
    #DEFINE
    Präprozessoren: Vordefinierte Symbole


__FILE_NQ__

Typ: Vordefiniertes Symbol

__FILE_NQ__ wird beim Kompilierten zu einer Zeichenkette umgesetzt. Diese enthält den Dateinamen des Moduls, die gerade umgesetzt wird.
NQ steht dabei für 'non-quoted', also 'nicht in Anführungszeichen'; die Zeichenkette wird also nicht durch Anführungszeichen
eingeschlossen.

Beispiel:
#Print quoted: __FILE__
#Print unquoted: __FILE_NQ__
Ausgabe:
quoted: "test.bas"
unquoted: test.bas

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FILE_NQ__ existiert seit freeBASIC v0.17

    • Siehe auch:
    __FILE__, __FUNCITON__,
    __FUNCTION_NQ__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FILE__

Typ: Vordefiniertes Symbol

__FILE__ wird beim Kompilierten zu einem String umgesetzt. Dieser enthält den Dateinamen der Quellcode-Datei, die gerade umgesetzt wird.
Dies kann zur Fehlersuche eingesetzt werden.

Beispiel
IF a > 0 THEN PRINT "Fehler: a = "; a;" im Modul "; __FILE__
Ergebnis:
Fehler: a = 32767 im Modul test.bas

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    __PATH__, __FUNCITON__, __LINE__,
    __FILE_NQ__, __FUNCTION_NQ__,
    #DEFINE, #LINE,
    Präprozessoren: Vordefinierte Symbole
    [/endtilte]


__FUNCTION_NQ__

Typ: Vordefiniertes Symbol

__FUNCTION_NQ__ wird beim Kompilierten zu einer Zeichenkette umgesetzt. Diese enthält das Symbol der Prozedur (also auch SUBs), die gerade
umgesetzt wird.

NQ steht dabei für 'non-quoted', also 'nicht in Anführungszeichen'.

Beispiel:
Declare Sub MySub ()

Sub MySub ()
Print "Address of " + __FUNCTION__ + " is 0x";
Print Hex( @__FUNCTION_NQ__, 6 )
GetKey
End Sub

MySub
Ausgabe:
Address of MYSUB is 0x4012D0

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __FUNCTION_NQ__ existiert seit freeBASIC v0.17

    • Siehe auch:
    __FILE__, __FUNCITON__,
    __FILE_NQ__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole


__FUNCITON__

Typ: Vordefniertes Symbol

__FUNCTION__ wird beim Kompilierten zu einem String umgesetzt. Dieser enthält den Namen der Prozedur (auch SUBs), die gerade umgesetzt wird.
Dies kann zur Fehlersuche eingesetzt werden.

Wird gerade das Hauptmodul umgesetzt, so wird das Symbol zu "__FB_MAINPROC__" umgesetzt.

Beispiel:
IF a > 0 THEN PRINT "Fehler: a= "; a;" in: "; __FUNCTION__
Ergebnis:
Fehler: a = 32767 in __FB_MAINPROC__

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Erst seit freeBASIC v0.17 wird dieses Symbol zu "__FB_MAINPROC__" umgesetzt, wenn __FUNCTION__ auf Modullebene abgefragt wird; davor
    war der Wert "(main)"

  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    __FILE__, __PATH__, __LINE__,
    #DEFINE,
    Präprozessoren: Vordefinierte Symbole
    [/endtilte]


__LINE__

Typ: Vordefiniertes Symbol

__LINE__ wird beim Kompilierten zu einem Integer umgesetzt. Dieser enthält enthält die Zeile, die gerade umgesetzt wird.
Dies kann zur Fehlersuche eingesetzt werden.

Beispiel:
IF a > 0 THEN PRINT "Fehler: a= "; a;" in Zeile "; __LINE__
Ergebnis:
Fehler: a = 32767 in Zeile 42

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    __FILE__, __PATH__, __FUNCITON__,
    #DEFINE, #LINE,
    Präprozessoren: Vordefinierte Symbole
    [/endtilte]


__PATH__

Typ: Vordefiniertes Symbol

__PATH__ wird beim Kompilierten zu einem String umgesetzt. Dieser enthält den Namen des Verzeichnisses, in dem sich dieQuellcode-Datei
befindet, die gerade umgesetzt wird.

Beispiel:
Teile dem Compiler mit, wo sich die INCLUDE-Dateien befinden:
#LIBPATH __PATH__

Unterschiede:
zu QB und VB:
  • neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • __PATH__ existiert seit freeBASIC v0.17

    • Siehe auch:
    __FILE__, __FUNCITON__, __LINE__,
    , #LIBPATH,
    Präprozessoren: Vordefinierte Symbole


__TIME__

Typ: Vordefiniertes Symbol

__TIME__ wird beim Kompilierten zu einem String umgesetzt. Dieser enthält die Kompilier-Uhrzeit im Format hh:mm:ss.

Beispiel:
PRINT "Dieses Programm wurde erstellt am "; __DATE__; " um "; __TIME__; "."
Ausgabe:
Dieses Programm wurde erstellt am 01-06-2007 um 15:16:22.

Unterschiede:
zu QB und VB:
  • Neu in freeBASIC

    • zu älteren freeBASIC-Versionen
  • Existiert seit freeBASIC v0.13

    • Siehe auch:
    #DEFINE, __DATE__,
    Präprozessoren: Vordefinierte Symbole


Grundlagen der Sprachfamilie BASIC

Über die Sprachfamilie BASIC existieren folgende Artikel:
  • Datentypen
  • Ausdrücke und Operatoren
  • Bedingungsstrukturen
  • Pointer
  • Inline Assembly
  • Schleifen
  • Bitfelder
  • Präprozessoren


Datentypen

Name | Bits | Format | kleinster Wert | größter Wert | Suffix | Genauigkeit
BYTE | 8 | vorzeichenbehaftete Ganzzahl | -128 | +127 | b | keine Nachkommastellen
UBYTE | 8 | vorzeichenlose Ganzzahl | ±0 | +255 |  | keine Nachkommastellen
SHORT | 16 | vorzeichenbehaftete Ganzzahl | -32.768 | +32.767 | s | keine Nachkommastellen
USHORT | 16 | vorzeichenlose Ganzzahl | ±0 | 65.535 |  | keine Nachkommastellen
INTEGER | 32 | vorzeichenbehaftete Ganzzahl | -2.147.483.648 | +2.147.483.647 |  | keine Nachkommastellen
UINTEGER | 32 | vorzeichenlose Ganzzahl | ±0 | 4.294.967.395 |  | keine Nachkommastellen
LONG | 32 | vorzeichenbehaftete Ganzzahl | -2.147.483.648 | +2.147.483.647 | l | keine Nachkommastellen
ULONG | 32 | vorzeichenlose Ganzzahl | ±0 | 4.294.967.395 | ul | keine Nachkommastellen
LONGINT | 64 | vorzeichenbehaftete Ganzzahl | -9.223.372.036.854.775.808 | +9.223.372.036.854.775.807 | ll | keine Nachkommastellen
ULONGINT | 64 | vorzeichenlose Ganzzahl | ±0 | +18.446.744.073.709.551.615 | ull | keine Nachkommastellen
SINGLE | 32 | Fließkommazahl | ca. -10 ^ 38 | ca. +10 ^ 38 |  | 7 Nachkommastellen
DOUBLE | 64 | Fließkommazahl | ca. -10 ^ 308 | ca. +10 ^ 308 |  | 15 Nachkommastellen
STRING | var/fixed-Lenght | nullterminiert | 0 | 2GB | $ |
ZSTRING | fixed-Length | nullterminiert | 0 | 2GB |  |
WSTRING | fixed-Length | nullterminiert | 0 | 2GB |  |

Unterschiede (Zu QB):
INTEGERs sind in freeBASIC 32bit-Variablen, die von den heutigen 32bit-Prozessoren
besser verarbeitet werden können. LONGs werden nicht mehr benötigt, wurden aber aus
Kompatibilitätsgründen beibehalten.


Ausdrücke und Operatoren

Einleitung

Ausdrücke setzen sich aus Werten,und Operatoren zusammen.

Ein Wert kann eine Zahl (z.B. 4), ein STRING (z.B. "hallo") oder eine Variable (z.B. x) sein.
Ein Ausdrück kann aus einem einzelnen Wert bestehen, oder aus mehreren, durch Operatoren verknüpften Werten bestehen. (z.B. 4 * x).

Ein Operator führt mathematische oder logische Operationen an den Werten aus (z.B. 4 * x; 4 und x sind Werte, * ist der Operator für
die Multiplikation).
Operatoren werden für die meisten mathematischen Operationen (abgesehen von Funktionen, wie SIN), Vergleiche (z.B. x > 4),
logische Tests (z.B. IF x > 4 AND x < 10 THEN, wobei AND ein logischer Operator ist),
und Stringmanipulationen verwendet.

Die Operatoren lassen sich einteilen in:
  • mathematische Operatoren

  • Vergleichsoperatoren

  • logische Operatoren

  • Hierachie der Operatoren

  • Stringoperatoren

  • Kurzformen

    • mathematische Operatoren

    Zu den mathematischen Operatoren zählen:
    Negierung (-)
    Potenzierung (^)
    Division und Integerdivision (/, \)
    Multiplikation (*)
    Bitverschiebung nach links/rechts (SHL, SHR)

    Addition und Subtraktion (+, -)

    Vergleichsoperatoren

    Vergleichsoperatoren geben abhängig von der Gegebenen Bedingung true (-1) oder false (0)
    aus. Sie vergleichen zwei Ausdrücke. Geprüft kann werden, ob ein Ausdruck größer, kleiner,
    größer oder kleiner (ungleich), gleich, größer/gleich oder kleiner/gleich einem anderen ist.

    Zu den Vergleichsoperatoren zählen:

    > größer als
    < kleiner als
    = gleich
    >= größer/gleich
    <= kleiner/gleich
    <> ungleich

    Beispiel:
    DIM money AS INTEGER
    INPUT "Wie viel Geld haben Sie?", money
    IF money < 100 THEN
    PRINT "Sie haben weniger als $100, lassen Sie mich Ihnen weitere $100 geben"
    money = money + 100
    PRINT "Jetzt haben Sie $"; money
    ELSE
    PRINT "Sie haben genau oder mehr als $100. Das reicht vorerst"
    END IF

    logische Operatoren

    Logische Operatoren helfen, Entscheidungen unter Berücksichtigung mehrerer Faktoren
    zu treffen.

    Beispiel:
    Ich möchte Schuhe, die rot sind, AND (und) weniger kosten, als $100.

    Die meisten Entscheidungen können mit AND (beide Bedingungen müssen
    wahr sein), OR (mindestens eine Bedingung muss erfüllt sein), NOT (die
    Bedingung darf nicht erfüllt sein) oder XOR (eine Bedingung muss erfüllt
    sein, die andere darf es nicht sein) getroffen werden. Es gibt aber auch noch
    weitere logische Operatoren.

    Liste der Logischen Operatoren:
  • AND - Beide Bedingungen erfüllt?

  • OR - mindestens eine Bedingung erfüllt?

  • NOT - Bedingung nicht erfüllt?

  • XOR - eine Bedingung erfüllt, aber die andere nicht?

  • EQV - sind beide Bedingunen gleich?

  • IMP - a IMP b entspricht (NOT a) OR b

    • Hierachie der Operatoren

    Ein Ausdruck wird in folgender Reihenfolge bearbeitet:
    (zuerst genannte Operatoren werden zuerst umgesetzt)

  • Klammern ()

  • Potenzierung (^)

  • Negierung (-)

  • Division (/)

  • Multiplikation (*)

  • Addition, Subtraktion (+, -)

  • Vergleiche (=, <>, <, >, <=, >=)

  • logische Operatoren (NOT, AND, OR, XOR, EQV, IMP)

  • Wertzuweisung (=)

    • Stringoperatoren

    Die folgenden Operatoren können bei STRINGs angewandt werden:

    Strings verkennten (String1 + String2)
    Symbole zu Strings umwandeln und verketten (Symbol1 & Symbol2)
    Prüfen, ob ein String alphabetisch vor einem anderem steht (String1 < String2)
    Prüfen, ob ein String alphabetisch hinter einem anderem steht (String1 > String2)
    Prüfen, ob zwei Strings gleich sind (String1 = String2)

    Anmerkung: Die Beispiele in den Klammern sind unvollständig; um sie in
    einem Programm zu benutzen, müssen sie in ein IF...THEN-Konstrukt eingebaut
    werden wie z.B.
    IF String1 > String2 THEN ...
    oder als Ausdruck behandelt werden,
    der einer anderen Variable zugewiesen wird z.B.
    a = (String1 = String2)

    Kurzformen

    Bestimmte Ausdrücke müssen relativ häufig eingegeben werden. Die
    dabei anfallende Tipparbeit ist relativ lästig, außerdem wird vom Compiler
    längst nicht immer die schnellste Methode gewählt.
    Um dem entgegenzuwirken haben die Entwickler von freeBASIC zwei Techniken eingeführt:
    Zum einen die sogenannten Shorthands und die Variablen-Initiatoren

    Shorthands

    Shorthands sind Kurzformen für Ausdrücke der Form
    Variable = Variable Operator Ausdruck.
    Sie können verkürzt werden auf:
    Variable Operator= Ausdruck
    Beispiel:
    DIM a AS INTEGER

    ' Beide Zeilen bewirken das selbe:
    a = a + 1
    a += 1

    Dies funktioniert mit allen Operatoren (+, -, *, /, \, AND, OR, XOR, IMP, EQV) bei
    jedem Datentyp. Auch Arrays und UDT's (User defined Type, siehe TYPE) werden unterstützt.
    Beispiel:
    TYPE myUDT
    Int1 AS INTEGER
    Int2 AS INTEGER
    END TYPE

    DIM AS INTEGER a, b, c(4)
    DIM d AS myUDT

    a = 5
    b = 7
    c(0) = 2
    c(4) = -5
    d.Int2 = 400

    a += 5
    b -= a * c(4)
    c(0) *= a + b
    d.Int2 /= c(0)

    a OR= d.Int2 + b

    Mit STRINGs funktiontiert natürlich nur die Additions-Kurzform. Diese arbeitet
    übrigens schneller als die Form
    String1 = String1 + String2
    da kein temporärer String erstellt werden muss. Der Compiler übersetzt
    solche Stringverkettungen der Form
    String1 = String2 + String3 + String4 + ...
    allerdings automatisch in dieses Format:
    String1 = String2 : String1 += String3 : String1 += String4 : String1 += ...

    Achtung: Wenn Sie Pointer mit der Additions/Subtraktions-Kurzform benutzen, wird
    der hinzugezählte/abgezogene mit der Länge des Pointer-Datentyps
    multipliziert, bevor die Berechnung durchgeführt wird. Aus
    DIM a AS INTEGER PTR
    a += 1
    wird also beim Kompilieren zu
    DIM a AS INTEGER PTR
    a += 1 * LEN(INTEGER)
    Dies ist in den meisten Fällen von Vorteil, da die Berechnung nicht manuell
    eingegeben werden muss, und dem Programmierer Tipparbeit erspart bleibt. Wenn
    tatsächlich eine verschiebung um ein Byte nötig ist, kann dies mit CAST geschehen:
    DIM a AS INTEGER PTR
    DIM b AS BYTE PTR

    a = ALLOCATE(10)
    b = CAST(BYTE PTR, a)
    b += 1
    a = CAST(INTEGER PTR, b)

    Variablen-Initiatoren

    Variablen-Initiatoren ermöglichen es, einer Variablen bei ihrer Dimensionierung einen Wert
    zuzuweisen. Dies Funktioniert sowohl für einfache Variablen, als auch für
    Arrays.
    Die Syntax für einfache Variablen ist:
    DIM Variable AS Typ = einfacherAusdruck
    einfacherAusdruck ist dabei ein einzelner Wert (z.B. 12, 0.5), oder ein Ausdruck,
    der nur Konstanten besteht (z.B. 2 * 4, 19 / 7, -3 ^ 5), jedoch keine Variable enthält!
    Zuvor mit CONST oder #DEFINE definierte Symbole sind jedoch
    erlaubt.
    Beispiel:
    CONST drei = 3
    DIM a AS INTEGER = 5
    DIM b AS SINGLE = SIN(drei ^ 0.5)

    Für Arrays gelten die selben Regeln jedoch eine Andere Syntax:
    DIM Array(Elemente) AS Typ => { Element1, Element2, Element3, ... }
    (man beachte, dass {geschweifte} Klammern verwendet werden!)
    Beispiel:
    CONST drei = 3
    DIM Array(2) AS INTEGER => {1, drei * 7}
    Werden - wie hier - weniger Initiatoren als Feldelemente angegeben, befüllt
    freeBASIC das Feld von vorne nach hinten (hier also von Index 0 nach Index 1)
    mit den vorgegebenen Werten, und weist den "überschüssigen" Elementen
    den Wert 0 zu (bzw. einen Nullstring, falls es sich um ein String-Array handelt).
    Werden mehr Initiatoren als Elemente angegeben, wird ein Fehler erzeugt, und die
    Kompilierung wird abgebrochen.
    Bei mehrdimensionalen Arrays müssen innerhalb der Klammern noch einmal geschweifte
    Klammern gesetzt werden. Dabei zählt die Nummer der Klammer in der Liste wie
    der Index der ersten Dimension, und die Nummer des Eintrags innerhalb der Klammer
    wie der Index der zweiten Dimension.
    Beispiel:
    DIM a(1, 1) => {{1, 2}, {3, 4}}

    PRINT a(0, 0) ' 1
    PRINT a(0, 1) ' 2
    PRINT a(1, 0) ' 3
    PRINT a(1, 1) ' 4

    Variablen-Initiatoren funktionieren auch mit UDT-Arrays (user-defined Type, siehe TYPE)
    Siehe dazu die Datei var_initializers.bas in Ihrem examples-Verzeichnis.


Bedingungsstrukturen

Bedingungen sind Ausdrücke, die entweder wahr (ungleich 0) oder falsch (gleich 0)
sein können. Dabei gelten dieselben Regeln wie für Ausdrücke und Operatoren.

  • Schon eine einzelne Konstante kann eine gesamte Bedinung sein.
  • Sinnvoll sind Bedinungen jedoch erst mit Variablen.
  • Eine Bedingung darf nahezu unendliche Komplexität erreichen.
  • Sie kann auch Funktionen und Operatoren enthalten.
  • Bedingungsstrukturen werden hauptsächlich mit IF...THEN und SELECT CASE verwendet, können aber auch in Wertezuweisungen bei Variablen auftauchen; siehe dazu BIT


Pointer

Ein Pointer ist eine Zahl. Diese Zahl gibt eine Adresse (Nummer des Bytes) im Speicher an.
Auf die Speicherstelle, auf die der Pointer zeigt, kann über besondere Syntax-Regeln
zugegriffen werden.
Mit Hilfe von Pointern kann direkt auf den Speicher zugegriffen werden. Dies ermöglicht
eine einfachere, flexiblere Verwaltung des Speichers als mit PEEK und POKE.

Im Zusammenhang mit Pointern sind einige neue Syntax-Regeln entstanden:
PTR
Wird im Zusammenhang mit DIM und FUNCTION verwendet.
Gibt an, dass eine Variable ein Pointer ist.
DIM a AS BYTE PTR
Im Programm kann auf die als Pointer deklarierte Variable ganz normal zugegriffen
werden; sie verhält sich immer wie eine Variable des Typs UINTEGER.
DIM a AS BYTE PTR
DIM z AS BYTE
z = 120
a = VARPTR(z)
PRINT z, a
' Ausgabe: 120 4210692
' Also ist a mindestens 32bit

a = -1
PRINT a
' Ausgabe: 4294967295
' Also ist jeder Pointer ein UInteger-Typ. Ist auch logisch, negative Adressen gibt es nicht.

SLEEP
Wertezuweisungen (myPointer = 5), Operationen (myValue = (myPointer * 5) AND 3)
und alle sonstigen Befehle werden genauso ausgeführt, wie an jeder skalaren ('normalen') Variable auch.
Es existieren allerdings auch einiger Pointeroperatoren, die nur mit Pointern funktionieren.
Diese sind hier unten aufgeführt:

@Variable
Gibt die Adresse einer Variablen zurück, also einen Pointer, der auf die
Variable zeigt. Es ist eine Kurzform für VARPTR
Dies kann auch an nicht-Pointer-Variablen angewandt werden; zurückgegeben
wird dann einfach die Adresse als INTEGER-Wert.
Beispiel:
DIM myValue AS INTEGER
DIM myPointer AS INTEGER PTR

myPointer = @myValue

PRINT myPointer, @myPointer
(Gibt die Adresse von myValue und die Adresse des Pointers selbst aus.)

*(Pointer)
Gibt den Wert zurück, der an der Speicherstelle steht, auf den der Pointer zeigt.
Der Pointer kann auch dereferenziert werden, d.h. in der Klammer kann ein ganzer
Ausdruck stehen, der dann als Pointer behandelt wird.
Vorsicht: Wenn Sie auf Speicherstellen zugreifen, die nicht von Variablen Ihres
Programms verwendet werden, riskieren Sie einen Absturz Ihres Programmes oder sogar
des Betriebssystems!.
Beispiel:
DIM myValue
DIM myPointer AS INTEGER PTR

myValue = 5
myPointer = @myValue

PRINT *myPointer
' Gibt den Wert von myValue aus, da myPointer auf die Adresse von myValue zeigt.

PRINT *(myPointer + 1)
' Gibt einen anderen Wert aus, der i.d.R. nicht genau bestimmt werden kann,
' da auf der Speicherstelle, die ein Byte hinter myValue liegt, bereits ein
' anderer Wert gespeichert ist.

Pointer[index]
Zählt zum Pointer index hinzu, bevor weitere Operationen mit ihm
durchgeführt werden. Der Pointer wird also dereferenziert.
Pointer[index]
hat die selbe Funktion wie
*(Pointer + index)
Diese Art der Dereferenzierung wird oft mit ALLOCATE verwendet.

Beispiel:
DIM a AS BYTE PTR
a = ALLOCATE(10)
a[3] = 20
PRINT a[3]
PRINT a[4]
PRINT a
(Wenn a[4] ungleich 0 ist, liegt das daran, dass sich vor der Reservierung des Speicherbereichs noch Daten auf dieser Stelle befanden, die jetzt nicht mehr
gebraucht werden; eine Initialisierung mit CALLOCATE sollte zehn leere
Speicherstellen erzeugen.

->
Dereferenziert einen Pointer, der auf einen UDT (user defined Type; siehe TYPE)
zeigt, so dass er auf den entsprechenden Record verweist.
Beispiel:
TYPE myType
a AS INTEGER
b AS SHORT
c AS INTEGER PTR
END TYPE

DIM d AS myType PTR

PRINT d->b


Inline Assembly

Unter Inline Assembly versteht man die direkte Einbindung von Maschinenspracheprogrammen
in den Quellcode.

Während das unter QBASIC nur umständlich über Opcodes möglich war, ist es in freeBASIC
dank dem Befehl ASM kein Problem, Assembler-Codes direkt einzbinden:
ASM
mov EAX, EBX
imul EAX, ECX
END ASM

Auch der Zugriff auf Variablen ist "ohne Tricks" möglich; ihre Bezeichner sind auch
innerhalb eines ASM-Blocks verfügbar:
ASM
mov eax, [x]
imul eax, [y]
mov [res], eax
END ASM

Wird ein ASM-Block innerhalb einer FUNCTION verwendet, kann das Symbol FUNCTION
als Pointer auf die Adresse verwendet werden, an der das Ergebnis der Funktion gespeichert
werden soll.


Schleifen

Schleifen sind Programmteile, die vielfach wiederholt sind; die Anzahl der Wiederholungen
ist i.d.R. an Bedingungen geknüpft (Wiederhole, bis a den Wert 10 hat), sogenannte
Endlosschleifen sind aber ebenso möglich.

Einfache Bedingungsschleife: WHILE...WEND

Der Codeblock zwischen
WHILE und WEND wird so lange wiederholt, bis eine Bedingung hinter WHILE erfüllt ist.
Siehe WHILE...WEND in der Befehlsreferenz

Erweiterte Bedingungsschleife: DO...LOOP

DO...LOOP wiederholt ähnlich wie WHILE...WEND einen
Codeblock so lange bis, oder WÄHREND eine Bedingung erfüllt ist.
Die Abfrage dieser Bedingung kann sowohl zu Beginn als auch zu Ende der Schleife
erfolgen. Ebenso ist es möglich, überhaupt keine Bedingung zu prüfen, und somit
eine Endlosschleife zu erzeugen.

Zählschleife: FOR...NEXT

FOR...NEXT wiederholt den Codeblock zwischen FOR und NEXT, und erhöht einen Zähler
bei jedem Durchlauf des Codeblocks. Die Schleife wird verlassen, sobald der Zähler
einen Zielwert erreicht oder überschritten hat.


Bitfelder

Beim Programmieren stößt man gelegentlich auf Aufgaben, bei denen man nur den Status
mehrerer Objekte speichern muss, also z.B. aktiv oder nicht aktiv. Für jedes einzelne
Objekt eine eigene Integer-Variable zu verwenden wäre Speicherverschwendung, da nur
eines der 32bit genutzt werden. In älteren BASIC-Dialekten wurde dieses Problem dadurch
gelöst, indem man eine INTEGER-Variable benutzt, und die einzelnen Bits direkt mit den
logischen Operatoren manipuliert.

Beispiel: Der Status von drei Checkboxen soll in einer INTEGER-Variablen gespeichert
werden:
CheckBox1 = 1 ' aktiv
CheckBox2 = 0 ' nicht aktiv
CheckBox3 = 1 ' aktiv

GesamtStatus = 0 ' Variable vorbereiten: Alle nicht aktiv

IF CheckBox1 THEN GesamtStatus = GesamtStatus OR 1
IF CheckBox2 THEN GesamtStatus = GesamtStatus OR 2
IF CheckBox3 THEN GesamtStatus = GesamtStatus OR 4

' ...Programmcode...

' Status abfragen:
If GesatmStatus AND 1 THEN CheckBox1 = 1
If GesatmStatus AND 2 THEN CheckBox2 = 1
If GesatmStatus AND 4 THEN CheckBox3 = 1
Das Problem bei dieser Methode ist, dass nicht immer klar ist, welches Bit in GesamtStatus
für welche Checkbox steht. Der Programmierer müsste also entweder die Belegung auswendig
lernen, oder ständig in seinen Notitzen nachsehen, wofür welches Bit steht. Beides ist
relativ mühseelig...

Unter freeBASIC wurde dieses Problem durch die sogenannten Bitfelder (die C/C++ Programmieren
bereits bekannt sein sollten) gelöst.
Ein Bitfeld ist einem UDT (user defined Type, siehe TYPE) ähnlich,
unterscheidet sich von einem normalen UDT jedoch dadurch, dass jedem Element der Struktur nur
Werte innerhalb eines bestimmten Bereiches zugewiesen werden können.
Die Syntax für ein Bitfeld ist die folgende:
TYPE BitFeldName
   Bit1Name : Bits AS INTEGER
   Bit2Name : Bits AS INTEGER
   Bit3Name : Bits AS INTEGER
   ...
END TYPE
DIM Variable AS BitFeldName
Die Namen der Strukturelemente können dabei frei gewählt werden. Es dürfen beliebig
viele Records verwendet werden. Bits ist dabei der Anzahl der Bits, die für diesen
Record verwendet werden sollen.

Beispiel: Checkbox-Verwaltung mit Bitfeldern:
TYPE CheckBoxenType
CB1 : 1 AS INTEGER
CB2 : 1 AS INTEGER
CB3 : 1 AS INTEGER
END TYPE
DIM CheckBoxen AS CheckBoxenType

' Status setzen:
CheckBoxen.CB1 = 1 ' aktiv
CheckBoxen.CB2 = 0 ' nicht aktiv
CheckBoxen.CB3 = 1 ' aktiv

' ... Programmcode ...

' Status abfragen:
IF CheckBoxen.CB1 THEN ...
IF CheckBoxen.CB2 THEN ...
IF CheckBoxen.CB3 THEN ...
Man erspart sich hierbei die umständliche Bitmanipulation mit AND und OR, außerdem
ist sofort klar, welcher Wert gerade bearbeitet wird. Ein weiterer Vorteil ist, dass
Bits nicht 1 sein muss; so können auch drei-Status-Checkboxen realisiert werden
(aktiviert/nicht aktiviert/nicht festgelegt)

Beispiel:
TYPE a
a1 : 2 AS INTEGER
a2 : 2 AS INTEGER
END TYPE
DIM b AS a

b.a1 = 5
PRINT b.a1
Ausgabe:
1
5 ist in Binär &b101. Da für den Record a1 nur zwei Bits verwendet werden, ignoriert
freeBASIC das dritte Bit. Statt &b101 wird in a1 also nur &b01 gespeichert, was 1
entspricht.


Präprozessoren

Präprozessoren sind Symbole, die vor der Kompilation durch einen bestimmten Ausdruck ersetzt werden; siehe #DEFINE.

Themen:
  • Vordefinierte Symbole

  • Symbole ohne Wert

  • Makros

    • Vordefinierte Symbole

    Beachten Sie, dass zu jedem Symbol ein eigener Eintrag in der Referenz existiert.
    Symbolbezeichner | Übersetzung/Bedeutung
    __FB_WIN32__ | Ohne Wert; Dieses Symbol wird definiert, wenn der Code von der Win32-Version des Compilers umgesetzt wird; durch #IF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Win32 umgesetzt werden soll.
    __FB_DOS__ | Ohne Wert; Dieses Symbol wird definiert, wenn der Code von der DOS-Version des Compilers umgesetzt wird; durch #IF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für DOS umgesetzt werden sollen.
    __FB_LINUX__ | Ohne Wert; Dieses Symbol wird definiert, wenn der Code von der LINUX-Version des Compilers umgesetzt wird; durch #IF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Linux umgesetzt werden sollen.
    __FB_MAIN__ | Ohne Wert; dieses Symbol wird definiert, sobald die DEFINE-Symbole und Makros des Hauptmoduls überstetzt werden.
    __FB_SIGNATURE__ Ein String, der die Signatur des Compilers enthält, z.B.:
    "FreeBASIC v0.17b"
    __FB_VERSION__ Ein String, der die Version des Compilers enthält, z.B.:
    "0.15"
    __FB_VER_MAJOR__ Ein Integer, der die Versionshauptnummer des Compilers enthält, z.B.:
    0
    __FB_VER_MINOR__ Ein Integer, der die Versionsunternummer des Compilers enthält, z.B.:
    15
    __FB_VER_PATCH__ Ein Integer, der die Patchnummer des Compilers enthält, z.B.:
    0
    __FB_MIN_VERSION__(major, minor, patch) Dieses Makro vergleicht die Version des verwendeten Compilers mit den angegebenen Daten. Es gibt -1 aus, wenn die Version des Kompilers größer oder gleich den Spezifikationen ist, bzw. 0, wenn die Version kleiner ist.

    __FB_MIN_VERSION__ ist folgendermaßen definiert:
    #DEFINE __FB_MIN_VERSION__(major, minor, patch_level) _
    ((__FB_VER_MAJOR__ > major) OR _
    ((__FB_VER_MAJOR__ = major) AND ((__FB_VER_MINOR__ > minor) OR _
    ( __FB_VER_MINOR__ = minor AND __FB_VER_PATCH__ >= patch_level))))
    __DATE__ Ein String, der das Kompilier-Datum im Format yyyy-mm-dd enthält, z.B.:
    "2005-11-05"
    __TIME__ Ein String, der die Kompilier-Uhrzeit im Format hh:mm:ss enthält, z.B.:
    "16:05:09"
    __FILE__ Ein String, der den Dateinamen der Quellcode-Datei, die gerade umgesetzt wird, enthält.
    Dies kann zur Fehlersuche eingesetzt werden:
    IF a > 0 THEN PRINT "Fehler: a = "; a;" im Modul "; __FILE__
    Ergebnis:
    Fehler: a = 32767 im Modul test.bas
    __FILE_NQ__ | Eine Zeichenkette, die den Namen des Moduls enthält, das gerade umgesetzt wird, jedoch nicht in Anführungszeichen wie bei __FILE__.
    __FUNCTION__ Ein String, der den Namen der Prozedur, die gerade umgesetzt wird, enthält.
    Dies kann zur Fehlersuche eingesetzt werden:
    IF a > 0 THEN PRINT "Fehler: a= "; a;" in: "; __FUNCTION__
    Ergebnis:
    Fehler: a = 32767 in __FB_MAINPROC__
    __FUNCTION_NQ__ | Eine Zeichenkette, die das Symbol der Prozedur enthält, die gerade umgesetzt wird, jedoch nicht in Anführungszeichen wie bei __FUNCTION__.
    __LINE__ Ein Integer, der die Zeile angibt, die gerade umgesetzt wird.
    Dies kann zur Fehlersuche eingesetzt werden:
    IF a > 0 THEN PRINT "Fehler: a= "; a;" in Zeile "; __LINE__
    Ergebnis:
    Fehler: a = 32767 in Zeile 42
    __FB_OPTION_EXPLICIT__ | Ein Integer, dessen Wert -1 ist, wenn OPTION EXPLICIT verwendet wird, bzw. 0, wenn dies nicht der Fall ist.
    __FB_OPTION_ESCAPE__ | Ein Integer, dessen Wert -1 ist, wenn OPTION ESCAPE verwendet wird, bzw. 0, wenn dies nicht der Fall ist.
    __FB_OPTION_DYNAMIC__ | Ein Integer, dessen Wert -1 ist, wenn OPTION DYNAMIC verwendet wird, bzw. 0, wenn dies nicht der Fall ist.
    __FB_OPTION_PRIVATE__ | Est ein Integer, dessen Wert -1 ist, wenn OPTION PRIVATE verwendet wird, bzw. 0, wenn dies nicht der Fall ist.
    __FB_OPTION_BYVAL__ | Est ein Integer, dessen Wert -1 ist, wenn OPTION BYVAL verwendet wird, bzw. 0, wenn dies nicht der Fall ist.
    __FB_OUT_OBJ__ | Ein Integer, dessen wert -1 ist, wenn der Code zur Objekt-Datei (*.obj) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.
    __FB_OUT_LIB__ | Ein Integer, dessen wert -1 ist, wenn der Code zur statischen Bibliothek (*.lib) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.
    __FB_OUT_DLL__ | Ein Integer, dessen wert -1 ist, wenn der Code zur dynamischen Bibliothek (*.dll) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.
    __FB_OUT_EXE__ | Ein Integer, dessen wert -1 ist, wenn der Code zur Executable (*.exe) compilert wird, bzw. 0, wenn zu einem anderen Typ compilert wird.
    __FB_ARGC__ | Eine Zahl, die die Anzahl der Kommandozeilenparameter an das Programm enthält
    __FB_ARGV__ | Ein Pointer auf einen Speicherbereich, in dem sich ZSTRING PTR befinden. Diese zeigen auf die einzelnen Kommandozeilenparameter.
    __FB_BIGENDIAN__ | Hat den Wert -1, wenn für Big-Endian-Systeme kompiliert wird, oder 0, wenn dies nicht der Fall ist.
    __FB_DEBUG__ | Hat den Wert -1, wenn mit der Kommandozeilenoption '-g' kompiliert wird, oder 0, wenn dies nicht der Fall ist.
    __FB_ERR__ | Hat den Wert 0, 1, 3 oder 7, je nach in den der Kommandozeile aktivierten Fehlerbehandlungsroutinen (keine, '-e', '-ex' oder '-exx')
    __FB_MT__ | Hat den Wert -1, wenn mit der FB-Multithread-Lib kompiliert wird, oder 0, wenn dies nicht der Fall ist.
    __FB_LANG__ | Wird zu einem String umgesetzt, der das Argument für die Kommandozeilenoption '-lang' enthält.

    Symbole ohne Wert

    Ein Symbol muss nicht zwingend einen Wert haben, um nutzbringend eingesetzt werden zu können. Mit DEFINED kann geprüft werden, ob ein Symbol
    bereits definiert wurde. Auf diese Weise lässt sich z.B. ermitteln, ob eine Datei bereits eingebunden wurde, oder auf welcher Plattform
    das Programm gerade läuft.

    Beispiel:
    ' Code der Datei Definitions.bi
    #DEFINE Def

    TYPE xyz
    x AS INTEGER
    y AS INTEGER
    z AS INTEGER
    END TYPE

    '------------------------------------------------------------------------------'

    ' Code der Datei Test.bas

    #INCLUDE "Definitions.bi"

    #IFNDEF(Def)
    #ERROR Die Datei 'Definitions.bi' wurde nicht eingebunden
    #ENDIF

    #IFDEF __FB_WIN32__
    #PRINT Setze Code für Windows um.
    #ELSEIF DEFINED(__FB_DOS__)
    #PRINT Setze Code für DOS um.
    #ELSEIF DEFINED(__FB_LINUX__)
    #PRINT Setze Code für Linux um.
    #ENDIF

    Makros

    Makros sind wie FUNCTIONs Ausdrücke, die von einem Parameter abhängig sind. Im Gegensatz zu solchen werden
    die Symbole aber vor der Kompilation in ihre Bedeutung umgesetzt, so dass kein Sprung im Programm ausgeführt werden muss. Im Gegensatz zu
    FUNCTIONs allerdings öffnen Makros keinen SCOPE-Block.

    #DEFINE pi ( 4# * ATN(1) )
    #DEFINE deg2rad(deg) ( (deg / 180#) * pi )
    #DEFINE rad2deg(rad) ( (rad / pi) * 180# )

    PRINT "PI ="; pi ' Ausgabe: 3.141592654
    PRINT "180 im Bogenmaß"; deg2rad(180) ' Ausgabe: 3.141592654
    PRINT "3.141592654 in Neugrad" ' Ausgabe: 180

    Eine besondere Bedeutung kommt Makros dadurch zu, dass sie im Code Zeichenketten
    zu Symbolen verketten können; dies geschieht über die Zeichen ##.

    Beispiel:
    #DEFINE TmpVar(n) t##n
    OPTION EXPLICIT
    DIM TmpVar(1) AS INTEGER
    DIM TmpVar(2) AS INTEGER

    TmpVar(1) = 5
    TmpVar(2) = 7
    PRINT "Macros: "; TmpVar(1) * TmpVar(2)
    PRINT "Variables: "; t1 * t2
    Bei jedem Zugriff auf TmpVar wird also tatsächlich auf ein Symbol zugegriffen, das mit 't' beginnt, und mit dem Wert von 'n' endet.

    Seit freeBASIC v0.17 können auch mehrzeilige Macros erstellt werden; dazu bedient man sich des Metabefehls #MACRO.
    Siehe dort für Beispiele und genauere Erläuterungen.


Operatoren in freeBASIC

In freeBASIC existiert eine Reihe verschiedener Operatoren. Diese seien hier
aufgeführt:

Nach Funktion
  • mathematische Operatoren
    • + (Addition)
    • - (Subtraktion)
    • * (Mulitplikation)
    • / (Division)
    • \ (Integerdivision)
    • MOD (Modulus; Rest einer Division)
    • ^ (Potenzierung)
    • - (Negierung)
    • () (Klammern)
  • Stringoperatoren
    • + (Verkettung)
    • & (Verkettung mit Typumwandlung)
    • [ ] (String-Indizierung)
  • Vergleichsoperatoren
    • = (Gleichheit)
    • > (Größer als)
    • < (Kleiner als)
    • >= (Größer oder gleich)
    • <= (Kleiner oder gleich)
    • <> (Ungleich)
  • logische Operatoren
    • NOT
    • AND
    • OR
    • XOR
    • EQV
    • IMP
    • SHL (Bitweise Verschiebung nach links)
    • SHR (Bitweise Verschiebung nach rechts)
  • Wertezuweisung
    • = (direkte Wertezuweisung)
    • += (Kombinierte Addition)
    • -= (Kombinierte Subtraktion)
    • *= (Kombinierte Multiplikation)
    • /= (Kombinierte Division)
    • \= (Kombinierte Integerdivision)
    • MOD= (Kombinierter Modulus)
    • += (Kombinierte Stringverkettung)
    • AND= (Kombiniertes AND)
    • OR= (Kombiniertes OR)
    • XOR= (Kombiniertes XOR)
    • EQV= (Kombiniertes EQV)
    • IMP= (Kombiniertes IMP)
    • SHL= (Kombiniertes bitweises verschieben nach links)
    • SHR= (Kombiniertes bitweises verschieben nach rechts)
    • Arrayzugriff: Runde Klammern
  • Pointer-Operatoren
    • @ (Adresse von)
    • * (Wert von)
    • [ ] (Pointer-Indizierung)
    • + und - (Pointer-Arithmetik)
  • UDT-Operatoren
    • . (Record-Zugriff)
    • -> (Pointer-Dereferenzierung)
  • Präprozessoren
    • ## (Zeichenverkettung)
    • # (in String umwandeln)
 nach Zeichen
  • + (Plus)
  • - (Minus)
  • * (Stern)
  • / (Slash)
  • \ (Backslash
  • ^ (Exponent)
  • & (Und)
  • @ (At)
  • . (Punkt)
  • -> (Pfeil)
  • () (runde Klammern)
  • [ ] (eckige Klammern)
  • = (Gleichzeichen)
  • > (Größer als)
  • < (Kleiner als)
  • >= (Größer oder gleich)
  • <= (kleiner oder gleich)
  • <> (ungleich)
  • += (Kombiniertes Plus)
  • -= (Kombiniertes Minus)
  • *= (Kombinierter Stern)
  • /= (Kombinierter Slash)
  • \= (Kombinierter Backslash)
  • # (Raute)
  • NOT
  • AND
  • OR
  • XOR
  • IMP
  • EQV
  • MOD
  • SHL
  • SHR


Operatoren in freeBASIC: + (Plus)

Das Plus-Zeichen kann in freeBASIC für fünf Sprachkonstrukte eingesetzt werden:
  • Addition

  • Kombinierte Addition

  • Stringverkettung

  • Kombinierte Stringverketttung

  • Einfache und Kombinierte Addition an Pointern

    • Addition

    Syntax: Zahl1 + Zahl2

    In dieser Form eingesetzt bewirkt das Plus die Addition zweier Argumente; der
    Rückgabewert ist die Summe der beiden Argumente. Die Argumente dürfen Zahlen,
    nummerische Konstanten, nummerische Variablen, und nummerische Rückgabewerte von
    Funktionen sein.
    Addition ist die Gegenfunktion zu Subtraktion.

    Beispiel:
    DIM AS SINGLE n, m
    n = 4.54 + 5.46
    m = n + 7.5
    PRINT n, m
    SLEEP
    Ausgabe:
    10             17.5

    Unterschiede (zu QB)
  • Keine

    • Siehe auch:
    Kombinierte Addition
    Stringverkettung
    Kombinierte Stringverkettung
    Subtraktion

    Kombinierte Addition

    Syntax: Zahl1 += Zahl2

    Addiert einen Wert zu dem einer Zahlen-Variable, und speichert den neuen,
    errechneten Wert in dieser.
    'Zahl1' muss eine nummerische Variable sein.
    'Zahl2' kann eine Zahl, eine nummerische Konstante, eine nummerische Variable, oder
    ein nummerischer Rückgabewert einer Funktionen sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    Zahl1 = Zahl1 + Zahl2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM n AS DOUBLE
    n = 6
    n += n
    PRINT n
    SLEEP
    Ausgabe:
    12

    Unterschiede (zu QB und VB):
  • neu in freeBASIC

    • Siehe auch:
    Addition
    Stringverkettung
    Kombinierte Stringverkettung
    Kombinierte Subtraktion

    Stringverkettung

    Syntax: String1 + String2

    Verkettet zwei Strings zu einem, in dem auf den Inhalt von String1 der von
    String2 folgt. Dieses Konstrukt funktioniert mit Strings, ZStrings und WStrings.

    Beispiel:
    DIM AS STRING a, b, c
    a = "HELLO,"
    b = " WORLD!"
    c = A + B
    PRINT c
    SLEEP
    Ausgabe:
    HELLO, WORLD!

    Unterschiede (zu QB und VB)
  • Keine

    • Siehe auch:
    Addition
    Stringverkettung mit Typumwandlung

    Kombinierte Stringverkettung

    Syntax: String1 += String2

    Verkettet eine Stringvariable mit einem weiteren String.
    'String1' kann eine Stringvariable, eine ZStringvariabe, oder eine
    WStringvariable sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    String1 = String1 + String2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM s AS STRING
    s = "HELLO"
    s += " WORLD"
    PRINT s
    Ausgabe:
    HELLO WORLD

    Unterschiede (zu QB und VB)
  • neu in freeBASIC

    • Siehe auch:
    Addition
    Stringverkettung mit Typumwandlung

    Einfache und Kombinierte Addition an Pointern

    Syntax A: Pointer + Wert
    Syntax B: Pointer += Wert

    Addition an Pointern ermögicht, die Adresse zu ändern, auf die ein Pointer zeigt.
    Der Addierte Wert wird jedoch zuvor mit SIZEOF(Pointertyp) multipliziert. Dies
    vereinfacht dem Programmierer, sicherzustellen, dass seine Pointer auf sinnvolle
    Adressen zeigen.

    Beispiel:
    OPTION EXPLICIT ' nur Deklarierte Variablen zulassen

    DIM a(10) AS INTEGER
    DIM pa AS INTEGER PTR
    DIM i AS INTEGER

    FOR i = 0 TO 10
    a(i) = i ' Das Array mit Werten von 0 bis 10 befüllen
    NEXT i

    pa = @a(0) ' Einen Pointer auf den Beginn des Arrays setzen

    FOR i = 0 TO 10
    ? *pa; ' Den Wert ausgeben, auf den der Pointer gerade zeigt.
    pa += 1 ' den Pointer um eine INTEGER-Stelle verschieben.
    NEXT i
    Mit jeder Zeile
    pa += 1
    Wird zum Wert von 'pa' tatsächlich 4 addiert, denn 4 = 1 * SIZEOF(INTEGER).
    Würden wir hier einen SHORT-Pointer (und dazu sinnvollerweise ein SHORT-Array)
    verwenden, würde sich der Wert um 2 verschieben.

    Unterschiede
    zu QB
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • Die Automatische Multiplikation wird erst seit v0.14 durchgeführt; davor
    musste der Programmierer selbst sicherstellen, dass Pointer weit genug
    verschoben wurden.

    • Siehe auch
    Pointer-Indizierung


Operatoren in freeBASIC: @ (At)

Syntax: @ { Variable | Stringkonstante | Prozedur }

Dieser Opterator gibt die Adresse seines Operanden zurück.
@ kann anstelle jeder beliebigen FB-Eigenen xxxPTR-Funktion benutzt werden (abgesehen
von STRPTR bzw. SADD).

Wenn der @-Operator mit einem String variabler Länge benutzt wird, gibt er einen
Pointer auf den internen STRING-Bezeichner zurück. Benutzen Sie STRPTR oder SADD,
um die Adresse der eigentlichen Zeichen zu erhalten.
Siehe auch STRING (Datentyp) für Informationen zum STRING-Bezeichner bzw. dem
internen Management von Zeichenketten.

Wenn dieser Operator mit einem Array verwendet wird, gibt er einen Pointer auf
das per Index angegebene Element des Arrays zurück. Beispielsweise gibt
@myArray(7)
einen Pointer zurück auf myArray(7).
Um einen Pointer auf den Beginn eines Arrays zu erhalten, geben Sie den niedrigsten
Index an (siehe LBOUND).

Beispiel 1:
OPTION EXPLICIT ' Nur explizit deklarierte Variablen zulassen

DIM AS INTEGER a, b
DIM AS INTEGER PTR addr

a = 5
b = 10

PRINT "Der Wert von a ist ";a;"; er ist gespeichert an Adresse ";@a
PRINT "Der Wert von b ist ";b;"; er ist gespeichert an Adresse ";@b

' Die Adresse von a wird jetzt in dem INTEGER PTR gespeichert:
addr = @a

PRINT "Der Pointer addr zeigt jetzt auf a. Der Wert von a kann mit dem Pointer"
PRINT "ermittelt werden: ";*addr

Während dieser Operator mit Strings variabler Länge falsche Adressen zurückgibt,
kann er bei Stringkonstanten angewandt werden.

Beispiel 2:
DIM AS ZSTRING PTR YesNoMaybe(2) => { @"ja", @"nein", @"vielleicht" }
DIM AS INTEGER i

PRINT "Standard-Liebesbrief v7.23"
PRINT
PRINT "Willst du mit mir gehen?"
PRINT
FOR i = 0 TO 2
PRINT i; ")", *YesNoMaybe(i)
NEXT
i = VAL(INPUT(1))
PRINT
PRINT "Du hast "; *YesNoMaybe(i); " gesagt."
GETKEY
Anmerkung:
Inspiriert vom Bilder-Ownage-Thread.

Möglich ist auch die Verwendung dieses Operators mit Prozeduren:
DECLARE SUB Morgen ()
DECLARE SUB Mittag ()
DECLARE SUB Nacht ()

RANDOMIZE TIMER

SCREEN 13

DIM Tageszeit(2) AS SUB ()
DIM AS INTEGER i

Tageszeit(0) = @Morgen()
Tageszeit(1) = @Mittag()
Tageszeit(2) = @Nacht()

i = RND * 2
Tageszeit(i)()
GETKEY

SUB Morgen ()
PAINT ( 0, 0), 176

CIRCLE (100, 120), 50, 42, , , , F

CIRCLE ( 50, 199), 200, 192, , , .5, F
CIRCLE (319, 199), 100, 195, , , .3, F
END SUB

SUB Mittag ()
PAINT ( 0, 0), 53

CIRCLE (170, 60), 50, 44, , , , F

CIRCLE ( 50, 199), 200, 120, , , .5, F
CIRCLE (319, 199), 100, 123, , , .3, F
END SUB

SUB Nacht ()
PAINT ( 0, 0), 0

DIM AS INTEGER i
FOR i = 0 TO 200
PSET (RND * 320, RND * 200), 31
NEXT

CIRCLE (170, 40), 30, 27, , , , F
FOR i = 0 TO 10
CIRCLE ( COS( 6.28 * i / 5 ) * RND * 23 + 170, SIN ( 6.28 * i / 5 ) * RND * 23 + 40 ), RND * 2 + 3, 23, , , , F
NEXT

CIRCLE ( 50, 199), 200, 240, , , .5, F
CIRCLE (319, 199), 100, 243, , , .3, F
END SUB

Siehe auch:
* (Wert von), [ ] (Pointer-Indizierung),
VARPTR, PROCPTR, STRPTR, SADD,


Operatoren in freeBASIC: . (Punkt)

Syntax: UDTBezeichner.Feldname

Der Punkt (Feld-Operator) wählt für die angegebene Operation ein Feild aus einer
Variable eines benutzerdefinierten Typs (UDT; siehe TYPE (Anweisung)).

Zur Kompatibilität mit QB sind 'gefälschte' Punkt-Operatoren in den Namen
einfacher Variablen ebenfalls zulässig (wenn mit der Compileroption -lang qb
kompiliert wurde).

Beispiel:
TYPE rect
x AS INTEGER
y AS INTEGER
END TYPE

DIM r AS rect
DIM fake.dot AS INTEGER
r.x = 4
r.y = 2
fake.dot = 1

PRINT "x= " r.x, "y=" r.y
PRINT fake.dot

GETKEY

Siehe auch:
TYPE (Anweisung), TYPE (Funktion), WITH,
-> (Pointer-Dereferenzierung),
@ (Adresse von), * (Wert von)


Operatoren in freeBASIC: -> (Pfeil)

Syntax: UDT_Pointer->Feldname

Der Pfeil-Operator greift auf ein Element eines Feldes zu, zu dem ein Pointer
angegeben wurde.
Es ist als Kurzform zu sehen für:
*(UDT_Pointer + OFFSETOF(Feldname)

Beispiel:
TYPE rect
x AS INTEGER
y AS INTEGER
END TYPE

DIM r AS rect
DIM rp AS rect PTR = @r

rp->x = 4
rp->y = 2

PRINT "x = " & rp->x & ", y = " & rp->y
PRINT "x = " & r.x & ", y = " & rp.y
GETKEY
Wie man sieht, wird tatsächlich die Variable 'r' durch zugriffe über diesen
Operator verändert.

Unterschiede
zu QB:
  • neu in freeBASIC

    • zu früheren Versionen von freeBASIC:
  • Die Feld-Dereferenzierung ist erst seit freeBASIC v0.13 möglich.

    • Siehe auch:
    TYPE (Anweisung), TYPE (Funktion), WITH, OFFSETOF,
    . (Feldzugriff),
    @ (Adresse von), * (Wert von)


Operatoren in freeBASIC: - (Minus)

Das Minus-Zeichen kann in freeBASIC für vier Sprachkonstrukte eingesetzt werden:
  • Subtraktion

  • Kombinierte Subtraktion

  • Negierung

  • Einfache und Kombinierte Subtraktion an Pointern

    • Subtraktion

    Syntax: Zahl1 - Zahl2

    In dieser Form eingesetzt bewirkt das Minus die Subtraktion zweier Argumente; der
    Rückgabewert ist die Differenz der beiden Argumente. Die Argumente dürfen Zahlen,
    nummerische Konstanten, nummerische Variablen, und nummerische Rückgabewerte von
    Funktionen sein.
    Subtraktion ist die Gegenfunktion zu Addition.

    Beispiel:
    DIM AS BYTE n, m
    n = 120 - 119
    m = n - 10
    PRINT n, m
    SLEEP
    Ausgabe:
    1, -9

    Unterschiede (zu QB)
  • Keine

    • Siehe auch:
    Kombinierte Subtraktion
    Addition

    Kombinierte Subtraktion

    Syntax: Zahl1 -= Zahl2

    Subtrahiert einen Wert von dem einer Zahlen-Variable, und speichert den neuen,
    errechneten Wert in dieser.
    'Variable1' muss eine nummerische Variable sein.
    'Variable2' kann eine Zahl, eine nummerische Konstante, eine nummerische Variable, oder
    ein nummerischer Rückgabewert einer Funktionen sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    Zahl1 = Zahl1 - Zahl2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM n AS DOUBLE
    n = 6
    n -= 2.8
    PRINT n
    SLEEP
    Ausgabe:
    3.8

    Unterschiede (zu QB und VB):
  • neu in freeBASIC

    • Siehe auch:
    Subtrakton
    Kombinierte Addition

    Negation

    Syntax: -Zahl

    Dieser Operator gibt den Negativen Wert des Arguments zurück, ändert also das
    Vorzeichen.
    'Zahl' kann eine Zahl, eine nummerische Konstante, eine nummerische Variable, oder
    ein nummerischer Rückgabewert einer Funktionen sein.

    Beispiel:
    DIM n AS LONGINT
    PRINT -5
    n = 65432568459
    n = - n
    PRINT n
    SLEEP
    Ausgabe:
    -5
    -65432568459

    Unterschiede (zu QB und VB)
  • Keine

    • Siehe auch:
    Subtraktion

    Einfache und Kombinierte Subtraktion an Pointern

    Syntax A: Pointer - Wert
    Syntax B: Pointer -= Wert

    Subtraktion an Pointern ermögicht, die Adresse zu ändern, auf die ein Pointer zeigt.
    Der Subtrahierte Wert wird jedoch zuvor mit SIZEOF(Pointertyp) multipliziert. Dies
    vereinfacht dem Programmierer, sicherzustellen, dass seine Pointer auf sinnvolle
    Adressen zeigen.

    Beispiel:
    OPTION EXPLICIT ' nur Deklarierte Variablen zulassen

    DIM a(10) AS INTEGER
    DIM pa AS INTEGER PTR
    DIM i AS INTEGER

    FOR i = 0 TO 10
    a(i) = i ' Das Array mit Werten von 0 bis 10 befüllen
    NEXT i

    pa = @a(10) ' Einen Pointer auf das Ende des Arrays setzen

    FOR i = 0 TO 10
    ? *pa; ' Den Wert ausgeben, auf den der Pointer gerade zeigt.
    pa -= 1 ' den Pointer um eine INTEGER-Stelle verschieben.
    NEXT i
    Mit jeder Zeile
    pa -= 1
    Wird vom Wert von 'pa' tatsächlich 4 subtrahiert, denn 4 = 1 * SIZEOF(INTEGER).
    Würden wir hier einen SHORT-Pointer (und dazu sinnvollerweise ein SHORT-Array)
    verwenden, würde sich der Wert um 2 verschieben.

    Unterschiede
    zu QB
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • Die Automatische Multiplikation wird erst seit v0.14 durchgeführt; davor
    musste der Programmierer selbst sicherstellen, dass Pointer weit genug
    verschoben wurden.

    • Siehe auch:
    Pointer-Indizierung


Operatoren in freeBASIC: * (Stern)

Das Stern-Zeichen kann in freeBASIC für drei Sprachkonstrukte eingesetzt werden:
  • Multiplikation

  • Kombinierte Multiplikation

  • Wert von

    • Multiplikation

    Syntax: Zahl1 * Zahl2

    In dieser Form eingesetzt bewirkt der Stern die Multiplikation zweier Argumente; der
    Rückgabewert ist das Produkt der beiden Argumente. Die Argumente dürfen Zahlen,
    nummerische Konstanten, nummerische Variablen, und nummerische Rückgabewerte von
    Funktionen sein.
    Multiplikation ist die Gegenfunktion zu Division.

    Beispiel:
    DIM n AS DOUBLE
    n = 4 * 5
    PRINT n
    SLEEP
    Ausgabe:
    20

    Unterschiede (zu QB)
  • Keine

    • Siehe auch:
    Kombinierte Multiplikation
    Potenzierung
    Division

    Kombinierte Multiplikation

    Syntax: Zahl1 *= Zahl2

    Multipliziert einen Wert mit dem einer Zahlen-Variable, und speichert den neuen,
    errechneten Wert in dieser.
    'Variable1' muss eine nummerische Variable sein.
    'Variable2' kann eine Zahl, eine nummerische Konstante, eine nummerische Variable, oder
    ein nummerischer Rückgabewert einer Funktionen sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    Zahl1 = Zahl1 * Zahl2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM n AS DOUBLE
    n = 6
    n *= n
    PRINT n
    SLEEP
    Ausgabe:
    36

    Unterschiede (zu QB und VB):
  • neu in freeBASIC

    • Siehe auch:
    Multiplikation
    Kombinierte Division

    Wert von

    Syntax: *{Pointervariable | Pointerfunction} [ = expression ]

    Durch den Wert-von-Operator wird auf einen Wert im Speicher zugegriffen, auf den
    ein Pointer zeigt. Der Zugriff kann sowohl zum Lesen als auch zum Schreiben
    erfolgen.
    Wert-von wird oft benutzt, um einen Pointer zu dereferenzieren.

    Das 'Indirection-Level' kann unendlich groß sein. (Pointer auf einen Pointer auf...)

    Um sinnvoll eingesetzt werden zu können, müssen die Pointer, mit denen *
    verwendet wird, auf eine sinnvolle Adresse zeigen. Zahlenwerte sind dafür nicht
    vorhersagbar, die Adressen müssen auf anderem Wege ermittelt werden, siehe dazu
    Pointer

    Beispiel:
    ' Dieses Programm demonstriert den Zugriff auf einen Pointer mittels *
    OPTION EXPLICIT ' Dies stellt sicher, dass alle Variablen dimensioniert werden müssen.

    DIM a AS INTEGER
    DIM pa AS INTEGER PTR

    pa = @a ' @ wird benutzt, um pa auf a zeigen zu lassen.
    ' 'a' ist in diesem Fall eine normale Integer-Variable

    a = 9 ' 'a' erhält den Wert 9.

    PRINT "Der Wert von 'a' ist"; *pa ' Den Wert mittels seiner Adresse anzeigen

    *pa = 1 ' An die Adresse des Pointers einen neuen Wert schreiben
    PRINT "Der neue Wert von 'a' ist"; a ' Den neuen Wert von 'a' anzeigen
    Ausgabe:
    Der Wert von 'a' ist 9
    Der neue Wert von 'a' ist 1

    Unterschiede (zu QB und VB):
  • New to FreeBasic

    • Siehe auch
  • Adresse von (@)

  • Pointer


Operatoren in freeBASIC: / (Slash)

Das Slash-Zeichen kann in freeBASIC für zwei Sprachkonstrukte eingesetzt werden:
  • Division

  • Kombinierte Division

    • Division

    Syntax: Zahl1 / Zahl2

    In dieser Form eingesetzt bewirkt das Slash die Division zweier Argumente; der
    Rückgabewert ist der Quotient aus 'Zahl1' und 'Zahl2'. Die Argumente dürfen Zahlen,
    nummerische Konstanten, nummerische Variablen, und nummerische Rückgabewerte von
    Funktionen sein.
    Der Rückgabewert einer Division ist immer DOUBLE.
    Division ist die Gegenfunktion zu Multiplikation.

    Beispiel:
    DIM AS SINGLE n, m
    n = 24 / 6
    m = n / -8
    PRINT n, m
    SLEEP
    Ausgabe:
    4, -0.5

    Unterschiede (zu QB)
  • Keine

    • Siehe auch:
    Kombinierte Division,
    Integerdivision
    Multiplikation

    Kombinierte Division

    Syntax: Zahl1 /= Zahl2

    Dividiert den Wert einer Zahlen-Variable durch einen zweiten Wert, und speichert
    den neuen, errechneten Wert in der Variable.
    'Variable1' muss eine nummerische Variable sein.
    'Variable2' kann eine Zahl, eine nummerische Konstante, eine nummerische Variable, oder
    ein nummerischer Rückgabewert einer Funktionen sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    Zahl1 = Zahl1 / Zahl2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM n AS DOUBLE
    n = 25
    n /= 2
    PRINT n
    SLEEP
    Ausgabe:
    12.5

    Unterschiede (zu QB und VB):
  • neu in freeBASIC

    • Siehe auch:
    Division
    Kombinierte Integerdivision
    Kombinierte Multiplikation


Operatoren in freeBASIC: \ (Backslash)

Das Slash-Zeichen kann in freeBASIC für zwei Sprachkonstrukte eingesetzt werden:
  • Integerdivision

  • Kombinierte Integerdivision

    • Integerdivision

    Syntax: Zahl1 \ Zahl2

    In dieser Form eingesetzt bewirkt das Backslash die Integerdivision zweier Argumente;
    der Rückgabewert ist der kommastellenlose Quotient aus 'Zahl1' und 'Zahl2'. Die Argumente
    dürfen Zahlen, nummerische Konstanten, nummerische Variablen, und nummerische
    Rückgabewerte von Funktionen sein.
    Der Rückgabewert einer Division ist immer INTEGER,
    selbst, wenn das Ergebnis der Division Nachkommastellen hätte. Die Information
    über den Nicht-Ganzzahligen Teil geht dabei verloren. Die Integerdivision wird
    allerdings wesentlich schneller berechnet als die normale Division; sie sollte
    daher immer benutzt werden, wenn ohnehin nur mit INTEGERn gerechnet wird.
    Wird die Integerdivision mit Fließkommawerten als Argumenten benutzt, so werden
    diese zuerst zu INTEGERs gerundet.

    Beispiel:
    DIM n AS DOUBLE

    n = 7 \ 2.6 '' => 7 \ 3 => 2.33333 => 2
    PRINT n

    n = 7 \ 2.4 '' => 7 \ 2 => 3.5 => 3
    PRINT n
    SLEEP
    Ausgabe:
    2
    3
    2.6 wird hier zuerst zu 3 aufgerundet. Das Ergebnis von 7 \ 3 ist 2.33 und wird zu
    2 abgerundet.
    2.4 wird hier zuerst zu 2 abgerundet. Das Ergebnis von 7 \ 2 ist 3.5 und wird zu
    3 abgerundet.

    Unterschiede (zu QB)
  • Keine

    • Siehe auch:
    Kombinierte Division,
    Division
    Multiplikation

    Kombinierte Integerdivision

    Syntax: Zahl1 /= Zahl2

    Dividiert den Wert einer Zahlen-Variable durch einen zweiten Wert, und speichert
    den neuen, errechneten Wert in der Variable, und rundet dabei auf die selbe
    Weise wie bei der Integerdivision.
    'Variable1' muss eine nummerische Variable sein.
    'Variable2' kann eine Zahl, eine nummerische Konstante, eine nummerische Variable, oder
    ein nummerischer Rückgabewert einer Funktionen sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    Zahl1 = Zahl1 \ Zahl2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM n AS DOUBLE
    n = 6
    n \= 2.2
    PRINT n
    SLEEP
    Ausgabe:
    3

    Unterschiede (zu QB und VB):
  • neu in freeBASIC

    • Siehe auch:
    Division
    Kombinierte Division
    Kombinierte Multiplikation


Operatoren in freeBASIC: ^ (Potentierung)

Syntax: Zahl1 ^ Zahl2

Dieser Operator gibt die Potenz einer Zahl bei gegebenen Exponenten zurück.
Potenzierung bedeutet, dass die Zahl so oft mit sich selbst Multipliziert wird,
wie im Exponenten (hier 'Zahl2') angegeben ist.
2 ^ 3
entspricht also
2 * 2 * 2
Wenn der Exponent eine Fließkommazahl ist, wird eine Wurzel gezogen.
2 ^ (1 / 3)
Entspricht also der dritten Wurzel ("Kubikwurzel") aus 2.
Die Argumente dürfen Zahlen,
nummerische Konstanten, nummerische Variablen, und nummerische Rückgabewerte von
Funktionen sein.

Beispiel:
DIM n AS DOUBLE
INPUT "Bitte geben Sie eine positive Zahl ein: ", n
PRINT
PRINT n;" zum Quadrat ist gleich"; n ^ 2
PRINT "Die fünfte Wurzel von "; n;" ist "; n ^ 0.2
SLEEP
Ausgabebeispiel:
Bitte geben Sie eine positive Zahl ein: 3.4

3.4 zum Quadrat ist gleich 11.56
Die fünfte Wurzel von 3.4 ist 1.27730844458754

Unterschiede
zu QB:
  • keine

    • Siehe auch:
    Multiplikation
    LOG


Operatoren in freeBASIC: () runde Klammern

Die runden Klammern werden in freeBASIC für zwei Sprachkonstrukte verwendet:
  • Reihenfolge der Abarbeitung der Glieder einer math. Gleichung

  • Indizierung von Arrays

    • Reihenfolge der Abarbeitung der Glieder einer math. Gleichung

    Die runden Klammern werden in freeBASIC wie in jeder mathematischen Gleichung
    eingesetzt, und beeinflussen die Abarbeitung eines Ausdrucks. Dabei gilt, dass
    zuerst der Wert der Klammer berechnet wird, und anschließend alle anderen
    Operationen in der Reihenfolge ihrer Priorität abgehandelt werden.

    Dabei gilt die Folgende Hierachie der Operatoren:
  • Klammern ()

  • Potenzierung (^)

  • Negierung (-)

  • Division (/)

  • Multiplikation (*)

  • Addition, Subtraktion (+, -)

  • Vergleiche (=, <>, <, >, <=, >=)

  • logische Operatoren (NOT, AND, OR, XOR, EQV, IMP)

  • Wertzuweisung (=)

    • Dementsprechend kommen folgende Werte zustande:
    ? (3 + 4) * 5
    ? -(1 + 1) ^ 2
    ? (3 * (5 + 1)) + (-2 - (1 * 1))
    Ausgabe:
    35
    -4
    15

    Indizierung von Arrays

    Wie unter DIM beschrieben, kann man sich ein Array als eine Liste bzw. Tabelle
    vorstellen, in der Werte gespeichert werden. Der Zugriff auf diese Werte erfolgt
    mittels Indizes, die in Klammern hinter dem Bezeichner des Arrays genannt werden.

    Beispiel 1: Dimensionierung (Erstellung) eines Arrays:
    DIM AS INTEGER myArray(10)
    ' ^ ^ ^
    ' | | +-- Anzahl der Elemente
    ' | +-------- Bezeichner des Arrays
    ' +-------------------- Datentyp des Arrays

    Diese Zeile legt das Verhalten des Arrays im Wesentlichen fest. Für weitere
    Aspekte des Verhaltens siehe auch BASE und '$DYNAMIC.

    Wie bereits erwähnt, wird auf Elemente des Arrays zugegriffen, indem zuerst der
    Bezeichner genannt wird, gefolgt vom Index des Elements in Klammern. Dabei
    gelten die selben Regeln für den Lese- wie für den Schreibzugriff:

    Beispiel 2: Zugriff auf Elemente eines Arrays:
    DIM AS INTEGER myArray(10)

    myArray(5) = 17

    PRINT myArray(5)

    Wie bereits erwähnt ist es nicht nur möglich, Listen zu erstellen; auch
    mehrdimensionale Tabellen können dargestellt werden. Dabei werden sowohl bei der
    Dimensionierung als auch beim Zugriff die Indizes durch Kommata getrennt.

    Beispiel 3: Mehrdimensionale Arrays:
    OPTION EXPLICIT
    RANDOMIZE TIMER

    SCREEN 13

    DIM AS INTEGER myTable(32, 20)
    DIM AS INTEGER x, y

    FOR x = 0 TO 32
    FOR y = 0 TO 20
    myTable(x, y) = RND * 255
    NEXT
    NEXT

    FOR x = 0 TO 32
    FOR y = 0 TO 20
    LINE (x * 10, y * 10) - (x * 10 + 10, y * 10 + 10), myTable(x, y), BF
    NEXT
    NEXT

    GETKEY

    Es ist möglich, ganze Arrays an eine Prozedur zu übergeben. Dazu wir als
    Parameter der Bezeichner des Arrays übergeben, gefolgt von den rungen Klammern,
    jedoch ohne angabe von Indizes.

    Beispiel 4: Übergabe eines Arrays an eine Prozedur:
    OPTION EXPLICIT
    RANDOMIZE TIMER

    DECLARE SUB ShowTable( Table() AS INTEGER )

    DIM AS INTEGER myTable(4, 4)
    DIM AS INTEGER x, y

    FOR x = 0 TO 4
    FOR y = 0 TO 4
    myTable(x, y) = RND * 9
    NEXT
    NEXT

    ShowTable myTable()
    GETKEY

    SUB ShowTable( Table() AS INTEGER )
    DIM AS INTEGER x, y, MaxX, MaxY
    MaxX = UBOUND(Table, 1)
    MaxY = UBOUND(Table, 2)

    FOR x = 0 TO MaxX
    FOR y = 0 TO MaxY
    LOCATE y * 2 + 1, x * 3 + 1
    PRINT Table(x, y); "|"
    LOCATE y * 2 + 2, x * 3 + 1
    PRINT "--+"
    NEXT
    NEXT
    END SUB


Operatoren in freeBASIC: & (Und)

Das Und-Zeichen kann in freeBASIC für zwei Sprachkonstrukte eingesetzt werden:
  • Stringverkettung

  • Kombinierte Stringverkettung

    • Stringverkettung

    Syntax: Wert1 & Wert2

    Dieser Operator gibt einen String zurück, der aus den beiden,
    aneinandergehängten Werten besteht. Wenn einer der beiden Werte kein String ist,
    wird automatisch STR aufgerufen, um den Wert in einen
    String zu verwandeln.
    Folglich dürfen 'Wert1' und 'Wert2' (Z/W)Stringkonstanten, nummerische Konstanten,
    (Z/W)Stringvariablen und nummerische Variablen, (Z/W)String- und nummerische Rückgabewerte
    von Funktionen, jedoch keine UDTs sein.

    Beispiel:
    DIM AS STRING a,c
    DIM AS SINGLE b
    a = "Das Ergebnis ist: "
    b = 124.3
    c = a & b
    PRINT c
    SLEEP
    Ausgabe:
    Das Ergebnis ist: 124.3

    Unterschiede:
    zu QB:
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • existiert erst seit freeBASIC v0.15b

    • Siehe auch:
    Addition
    Stringverkettung mit Typumwandlung

    Kombinierte Stringverkettung

    Syntax: String1 &= Wert2

    Verkettet zwei Werte zu einem String. Ist einer der beiden Werte kein String, so
    wird für diesen automatisch STR aufgerufen, um den Wert
    in einen String zu verwandeln.
    'String1' kann eine Stringvariable, eine ZStringvariabe, oder eine
    WStringvariable sein.
    Dieser Operator stellt eine verkürzte Schreibform von
    String1 = String1 & Wert2
    dar; es wird vom Compiler auf die selbe Art umgesetzt.

    Beispiel:
    DIM s AS STRING
    s = "HELLO"
    s &= " WORLD "
    s &= 15
    PRINT s
    Ausgabe:
    HELLO WORLD 15

    Unterschiede:
    zu QB und VB
  • neu in freeBASIC

    • zu früheren freeBASIC-Versionen
  • existiert erst seit freeBASIC v0.15

    • Siehe auch:
    Addition
    Stringverkettung mit Typumwandlung


Operatoren in freeBASIC: [ ] eckige Klammern

Die eckigen Klammern können in freeBASIC für zwei Sprachkonstrukte eingesetzt
werden:
  • String-Indizierung

  • Pointer-Indizierung

    • String-Indizierung

    Syntax: String[Index]

    Der Stringindizierungs-Operator [ ] ermöglicht es dem Programmmierer, einzelne Zeichen
    eines Strings über einen Index anzusprechen; dabei ist Lese- und Schreibzugriff
    möglich.
    Für STRINGs, ZSTRINGs fester Länge und WSTRINGs fester Länge ist der
    Rückgabewert der ASCII-Code des indizierten Zeichens.
    Der Programmierer muss sicherstellen, dass die Indizes von
    0 bis LEN(StrVariable) - 1
    reichen; andernfalls können die Ergebnisse nicht vorhergesagt werden, da somit
    ein Zugriff auf Speicherbereiche auftritt, der nicht mehr zur STRING-Variable
    gehört, evtl. sogar nicht mehr zum Speicherbereich des laufenden Programms.

    Beispiel:
    DIM a AS STRING = "Hello, world!"
    DIM i AS INTEGER

    FOR i = 0 TO LEN(a) - 1
    PRINT CHR(a[i]);
    NEXT

    DIM p AS STRING PTR
    p = ALLOCATE(4)
    *p = "abc"
    ? p[2]
    Ausgabe:
    Hello, World!
    bc

    Unterschiede
    zu QB:
  • New to FreeBasic

    • Siehe auch:
    Pointerindizierung

    Pointerindizierung

    Syntax: Pointer[index]

    Die Pointerindizierung ermöglicht den Zugriff auf eine Adresse relativ zur
    Adresse, auf die ein Pointer zeigt mittels eines Index.
    Die Adresse im Speicher, auf die Tatsächlich zugegriffen wird, errechnet sich
    nach:
    Adresse = Pointer + index * SIZEOF(*Pointer)
    Der Pointer wird dabei nicht verändert.

    Der Programmierer muss dabei selbst sicherstellen, dass der Pointer auf
    sinnvolel Adressen zeigt.

    Beispiel
    DIM a(10) AS INTEGER
    DIM pa AS INTEGER PTR

    FOR i = 0 To 10
    a(i) = i ' Das Array mit den Werten von 0 bis 10 befüllen
    NEXT i
    pa = @a(0)

    FOR i = 0 TO 10
    PRINT pa[i] ' Den Inhalt des Arrays ausgeben
    NEXT i
    Ausgabe:
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    Unterschiede
    zu QB und VB:
  • Neu in freeBASIC

    • Siehe auch:
    Addition und Subtraktion bei Pointern
    Stringindizierung


Prozeduren

Über Prozeduren unter freeBASIC existieren folgende Artikel:
  • Einleitung
  • SUBs
  • Functions
  • Parameterübergabe
  • GOTO und GOSUB


Prozeduren

Unter dem Begriff "Prozedur" versteht man einen Programmteil, der vom Hauptprogramm oder einer anderen Prozedur aus aufgerufen werden kann.
Oft werden Prozeduren auch als "Unterprogramme" bezeichnet.
Eine Prozedur kann von jedem Programmpunkt aufgerufen werden. Dadurch ist es möglich, Programmteile, die häfig ausgeführt werden müssen,
durch nur einen CALL-Befehl auszuführen, anstatt den Codeteil kopieren und einfügen zu müssen. Dies wirkt sich
positiv auf die Programmgröße aus.
Es ist außerdem möglich, Prozeduren abhänig von einer oder mehreren Variablen arbeiten zu lassen. Siehe dazu weiter unten.
Man unterscheidet SUBs, FUNCTIONs und GOTO/GOSUB-Routinen. Letztere sollten aber nach Möglichkeit vermieden werden, da der Code durch sie
unübersichtlich wird ("Spaghetti-Code").

Diese Kapitel stehen zur Verfügung:
  • SUBs

  • FUNCTIONs

  • Parameterübergabe

  • GOTO und GOSUB


SUBs

SUBs sind die einfachere Version einer Prozedur. Sie bestehen aus dem Prozedurheader, dem Programmcode, und der Zeile END SUB.

Der Prozedurheader enthält die Liste der übergebenen Parameter (Siehe Parameterübergabe für Details.)
Die im Header übergebenen Variablen werden wie bereits dimensionierte Variablen behandelt; sie können nicht redimensioniert werden. Eine
Ausnahme bilden dynamische Arrays. Sie können zwar redimensioniert werden, ihr Datentyp (INTEGER, STRING, ...) bleibt aber gleich.
Siehe SUB in der Referenz für weitere Details zum Prozedurheader.

Der Programmcode folgt den selben Regeln wie im Hauptmodul. Er darf fast alle Anweisungen enthalten; ausnahmen bilden die sogenannten
'nicht ausführbaren Anweisungen, wie DECLARE, COMMON, u.s.w.
Präprozessoren sind auf Prozedurebene erlaubt, jedoch muss sichergestellt
sein, dass keine Variablen verwendet haben, die den selben Bezeichner wie die definierten Symbole haben, bevor sie in der Prozedur definiert
wurden.

Die Zeile
END SUB
markiert das Ende der Prozedur. Code, der hinter der Zeile
END SUB
steht, wird wie Modulebenecode behandelt.

Jede SUB muss mit der Zeile
DECLARE SUB Name (Paramterliste)
deklariert werden. Andernfalls kann sie nicht aufgerufen werden. Siehe DECLARE in der Referenz.
Eine Ausnahme stellen CONSTRUCTOR-SUBs und DESTRUCTOR-SUBs dar; diese müssen nicht deklariert werden, wenn sie tatsächlich nur zu Beginn
des Programms bzw. bei dessen Beendigung automatisch aufgerufen werden sollen.

Eine SUB wird mit dem Befehl CALL oder direkt über ihren Bezeichner aufgerufen.
Anmerkung:
Seit freeBASIC v0.17 ist die Anweisung CALL nur noch dann zulässig, wenn mit der Kommandozeilenoption
-lang deprecated
oder
-lang qb
kompiliert wurde. Andernfalls darf CALL nicht mehr verwendet werden. Siehe dazu auch FB-Dialektformen.

Beispiel:
DECLARE SUB colortext ( txt AS STRING, clr AS INTEGER )

CALL colortext ( "blue", 1 )

'------------------------------------------'

SUB colortext ( txt AS STRING, clr AS INTEGER )
#define a 10
COLOR clr
PRINT txt
END SUB

'------------------------------------------'

FOR i = 2 TO 15
colortext "COLOR " + STR$(i), i
NEXT
PRINT a


Functions

FUNCTIONs sind ebenso wie SUBs Prozeduren. Im Gegensatz zu einer SUB kann eine FUNCTION allerdings auch einen Wert zurückgeben.
FUNCTIONs bestehen aus dem Prozedurheader, dem Programmcode, und der Zeile END FUNCTION.

Der Prozedurheader und der Programmcode folgen den selben Regeln wie bei SUBs.
Im Programmcode können andere FUNCTIONs und SUBs aufgerufen werden. Es ist auch möglich, die FUNCTION selbst aufzurufen. Solche sogenannten
rekursiven FUNCTIONs sollten allerdings mit bedacht eingesetzt werden, da sie oft schwer zu warten sind.

FUNCTIONs werden im Programmcode wie Variablen behandelt, die abhängig von ihren Parametern verschiedene Werte haben. Sie werden durch
ihren Bezeichner aufgerufen.
Der Wert einer FUNCTION kann auf dreierlei Weise gesetzt werden:
  • Über ihren Bezeichner: FunktionsName = Ausdruck

  • Über das Symbol "FUNCTION": FUNCTION = Ausdruck

  • Über RETURN: RETURN Ausdruck
    Achtung: RETURN funktioniert wie FUNCTION = Ausdruck : EXIT FUNCTION

    • Beispiel:
    DECLARE FUNCTION twice (x)

    FUNCTION twice (x)
    twice = x * 2
    END FUNCTION

    PRINT twice (10) 'Gibt 20 aus, das Doppelte von 10

    Eine rekursive FUNCTION:
    DECLARE FUNCTION Fakultaet (BYVAL x AS INTEGER)

    PRINT Fakultaet(6)
    SLEEP

    FUNCTION Fakultaet (BYVAL x AS INTEGER) AS INTEGER
    STATIC Erg AS INTEGER

    IF Erg = 0 THEN
    Erg = x
    ELSE
    Erg *= x
    END IF

    x = x - 1
    IF x = 0 THEN
    RETURN Erg
    ELSE
    Erg = Fakultaet(x)
    END IF

    FUNCTION = Erg
    END FUNCTION
    Der Parameter x kann dabei maximal 32765 sein, danach wird die Sub ergebnislos mit dem Fehler "Stack Overflow" abgebrochen. Das Ergebnis
    dieser Berechnung wäre allerdings weit über dem Wertebereich eines ULongInt.


Parameterübergabe

Prozeduren können i.d.R. nicht auf den Speicher des Hauptprogramms zugreifen. Wird im Hauptprogramm eine Variable mit dem Bezeichner 'a'
verwendet, ist ihr Wert im Unterprogramm nicht verfügbar, selbst wenn in diesem auch eine Variable mit dem Bezeichner 'a' verwendet wird.
Um einer Prozedur Variablen zu übergeben, gibt es zwei Möglichkeiten: Direkte Übergabe in der Parameterliste der Prozedur oder Globalisierung
der Variable.

Direkte Übergabe in der Parameterliste der Prozedur

Jedes Unterprogramm muss zunächst deklariert werden; dazu verwendet man DECLARE. Die DECLARE-Anweisung enthält auch eine
Parameterliste; dies ist eine Auflistung der Variablen, die an das Unterprogramm übergeben werden sollen. Dabei ist der verwendete Bezeichner
nebensächlich; er kann in der Prozedur selbst unter einem ganz anderen Namen übergeben werden. Wichtig ist aber der Datentyp!
Beispiel:
DECLARE SUB foo (a AS BYTE b AS STRING, c AS INTEGER)
DECLARE FUNCTION bar (a AS BYTE b AS STRING, c AS INTEGER) AS INTEGER
Hier werden zwei Prozeduren definiert. Bei beiden ist der erste Parameter vom Typ BYTE, der zweite vom Typ STRING und der dritte vom Typ
INTEGER. Der Rückgabetyp der FUNCTION ist Integer.

Beim Aufruf der Prozeduren können dennoch andere Bezeichner für die Varaiblen verwendet werden:
DECLARE SUB foo (a AS BYTE b AS STRING, c AS INTEGER)
DECLARE FUNCTION bar (a AS BYTE b AS STRING, c AS INTEGER) AS INTEGER

DIM a AS STRING, b AS INTEGER, c AS BYTE, d AS INTEGER

foo c, a, b
d = bar(c, a, b)

Jede Prozedur hat einen "Header". Dieser enthält ähnlich wie die DECLARE-Anweisung die Parameterliste. Im Gegensatz zur DECLARE-Zeile sind
die Bezeichner der Parameter hier aber von Bedeutung:

DECLARE SUB foo (a AS BYTE b AS STRING, c AS INTEGER)
DECLARE FUNCTION bar (a AS BYTE b AS STRING, c AS INTEGER) AS INTEGER

DIM a AS STRING, b AS INTEGER, c AS BYTE, d AS INTEGER

foo c, a, b
d = bar(c, a, b)

'------------------------------------------------------------------------------'

SUB foo (d AS BYTE, e AS STRING, f AS INTEGER)
PRINT e, f + d
END SUB

FUNCTION bar (e AS BYTE, z AS STRING, a AS INTEGER) AS INTEGER
PRINT z
bar = e * a
END FUNCTION
Die Werte von a, b und c werden in der Reihenfolge übergeben, in der sie beim Aufruf aufgeführt sind. Innerhalb der Prozedur erhalten sie
dann einen neuen Namen.
In der SUB foo wird c als d, a als e und b als f bezeichnet.
In der FUNCTION bar wird c als e, a als z und b als a bezeichnet.

Bei dieser Art der Übergabe unterscheidet man weiter in BYVAL- und BYREF-Übergabe.
Werden die Variablen BYREF übergeben, können die Prozeduren den Wert der Variablen so verändern, dass er auch im aufrufenden Programmteil
geändert wird.
Variablen, die BYVAL übergeben werden, erhalten eine eigene Speicherstelle in der Prozedur. Wird der Wert der übergebenen Variable verändert,
bleibt ihr Wert in der aufrufenden Prozedur der selbe.
Auf welche Weise die Variablen übergeben werden sollen, steht im Prozedurheader und in der DECLARE-Zeile; vor dem jeweiligen Parameter wird
ein BYREF bzw. BYVAL angegeben.

Anmerkung:
Bis einschließlich freeBASIC v0.16 wurden Parameter an Prozeduren standardmäßig BYREF übergeben; seit freeBASIC v0.17 ist dies nur noch
der Fall, wenn mit der Kommandozeilenoption
-lang deprecated
oder
-lang qb
kompiliert wird. Andernfalls geht freeBASIC ab Version v0.17 vom Standard BYVAL aus.

Beispiel:
DECLARE SUB foobar (BYREF a, BYVAL b)

a = 10
b = 5

PRINT "Vor dem Prozeduraufruf:"
PRINT a, b
PRINT

foobar a, b
PRINT

PRINT "Nach dem Prozeduraufruf:"
PRINT a, b

SUB foobar (BYREF a, BYVAL b)
PRINT "Beginn der Prozedur:"
PRINT a, b
PRINT

a = 20
b = 40

PRINT "Ende der Prozedur:"
PRINT a, b
END SUB
Ausgabe:
Vor dem Prozeduraufruf:
10    5

Beginn der Prozedur:
10    5

Ende der Prozedur:
20    40

Nach dem Prozeduraufruf:
20    5

Beim Aufruf von Prozeduren können Parameter ausgelassen werden, wenn in der DECLARE-Anweisung für diesen Parameter eine Konstante angegeben
wird.
Die DECLARE-Anweisung enthält dann, neben der Parameterliste, die Zuweisung der Konstanten, die nur dann benutzt werden, wenn im Aufruf an
dieser Stelle, kein Wert übergeben wird.
Dabei ist wichtig, dass die verwendeten Bezeichner in der DECLARE-Anweisung und im Prozedur-Header gleich sind. Die Zuweisung der Konstanten
muss im Prozedur-Header nicht wiederholt werden.
Diese optionalen Parameter können von jedem Datentyp sein; auch STRINGs sind erlaubt. Lediglich UDTs und Arrays unterstützen diese Technik
bislang nicht.
Beispiel:
DECLARE SUB plus (BYREF a AS INTEGER, BYVAL i AS INTEGER = 1)
DECLARE FUNCTION minus (BYREF a AS INTEGER, BYVAL i AS INTEGER = 1) AS INTEGER
DIM x AS INTEGER

x = 6
'Konstante benutzen
plus x
PRINT x, minus (x)

'angegebenen Werte benutzen
plus x, 15
PRINT x, minus (x, 8)

SLEEP
END

SUB plus (BYREF a AS INTEGER, BYVAL i AS INTEGER)
a += i
END SUB

FUNCTION minus (BYREF a AS INTEGER, BYVAL i AS INTEGER) AS INTEGER
minus = a - i
END FUNCTION
Ausgabe:
7             6
 22            14

FreeBasic selbst macht von dieser Möglichkeit Gebrauch:
z.B. bei
MID(Text AS STRING, Start [, Länge] )
hier können sie eine Länge angeben, müssen dies aber nicht tun.

Oder bei GET #Dateinummer, [Position], Variable
hier können Sie z.B.
GET #1, , x
schreiben und erhalten dann, von der aktuellen Position der geöffneten Datei, einen Wert in x eingelesen.

Globalisierung

Manche Variablen werden in (fast) jedem Unterprogramm benötigt. Es wäre sehr umständlich, diese Variablen bei jedem Aufruf der Prozedur
in die Parameterliste einzugeben.
Stattdessen ist es mölich, einzelne Variablen allen Prozeduren zugänglich zu machen; sie werden dann so behandelt, als wären sie jedem Unterprogramm
BYREF übergeben worden. Möglich ist das mit dem SHARED-Schlüsselwort.

Bei ihrer ersten Definition mit DIM oder COMMON muss nur SHARED angegeben werden,


GOTO & GOSUB - was macht das?

Mit diesen beiden Befehlen wurden in älteren BASIC-Dialekten Prozeduren erstellt.
Es ist nicht möglich, einer GOTO/GOSUB-Prozedur Parameter zu übergeben, außerdem sind diese Unterprogramme recht unübersichtlich.
GOTO und GOSUB sind daher unter Programmierern nicht sonderlich gerne gesehen; der Vollständigkeit halber seien Sie jedoch dennoch hier aufgeführt.

GOTO

... "springt" an einen bestimmten Punkt innerhalb des Programms, der sowohl vor als auch hinter der GOTO-Anweisung liegen kann. Der Punkt
im Programm wird durch ein sogenanntes Label markiert. Ein Label kann eine Zahl sein, hinter der Programmcode stehen kann, oder ein beliebiger
Bezeichner, gefolgt von einem Doppelpunkt:
10 PRINT "hello World"
MyLabel:
PRINT "eine zweite Anweisung"

Nach dem Sprung muss "manuell" ein Rücksprung durchgeführt werden, d.h. eine weitere GOTO-Zeile muss das Programm wieder dorthin zurückspringen
lassen, von wo es aufgerufen wurde.
Beispiel:
1 GOTO 4
2 PRINT "Ciao"
3 GOTO ende
4 PRINT "Welcome!
5 GOTO 2

ende:
END
Wie Sie sehen, wird Ihr Code dadurch sehr unübersichtlich.

GOSUB

...springt ähnlich wie GOTO zu einem Label in ihrem Programm, führt den Rücksprung allerdings automatisch aus, sobald die RETURN-Anweisung
ausgeführt wird.
Das Programmieren wird dadurch im Vergleich zu GOTO-Prozeduren etwas komfortabler, allerdings nicht wirklich übersichtlicher.
Beispiel:
GOSUB message
END

message:
PRINT "Welcome!
RETURN

Sparsam eingesetzt können GOTO/GOSUB-Prozeduren dennoch hilfreich sein. Jedoch ist die Verwendung von echten Prozeduren (also SUBs und
FUNCTIONs) vorzuziehen.
GOSUB kann seit freeBASIC v0.15 nur noch auf Modulebene verwendet werden; der Einsatz in SUBs und FUNCTIONs ist nicht mehr zulässig.
Siehe Prozeduren.

Dennoch müssen Labels eindeutig sein; ein Label, das in einer Prozedur existiert, kann vom Hauptmodul aus nicht angesprungen werden.


Über die GfxLib

Über die GfxLib existieren folgende Artikel

  • Geschwindigkeit und Größe
  • Standardpaletten
  • DOS Keyboard Scancodes
  • Interne Treiber
  • Interne Pixelformate
  • Tipps und Tricks


Geschwindigkeit und Größe

Geschwindigkeit: Die interne GFXLib benutzt den normalen RAM als
Seitenspeicher. Alle Lese/Schreibzugriffe auf den Seitenpuffer (inclusive
Direktzugriffe via SCREENPTR) werden im
RAM ausgeführt.
Bei Win32 und Linux übernimmt ein eigener Thread die Screenupdates, und
verwendet dabei eine seperat wählbare Bildschirmwiederholrate (Wenn keine
Rate angegeben wird, ermittelt freeBASIC eine Standardrate. Siehe dazu
SCREEN). Die Farbkonversion wird, falls nötig,
ebenfalls übernommen.
Obwohl dies überflüssig für FullScreen-Modes scheint, ist es nötig für Fenstertechniken.
Um die lib klein und einfach zu halten, wurde dieselbe Methode auch für FullScreen
benutzt, auf Kosten einer kleinen 'Zeitstrafe' wegen der Speicherkopie.
MMX wird woimmer möglich in der gesamten gfxlib benutzt, also ist die lib immer noch
ganz schön schnell.

Größe: Eines der Hauptziele der GFXLib war es, unabhänig
von externen LIBs zu sein. Nun, dieses Ziel wurde erreicht: Die Lib hat ihre
eigenen Treiber (jeder 10-15 KB), und ist komplett unabhängig.
Natürlich müssen in Ihre Programme auch andere Codes eingebunden
werden, zumindest zur Grafikinitiierung, Schriftart-Dateien, Unterstützung
für alle Farbtiefen, Standardpaletten und Ähnliches.
Das bedeutet, dass die Benutzung der GFXLib Ihre Programme um 40 bis 90 KB vergrößern
wird, abhänig von den Funktionen, die Sie verwenden (FBC wird nur das
linken, das sie wirklich benutzen). Dafür sind Ihre Programme Standalones,
also von Runtime-DLLs unabhängig.

Natürlich bedeutet Standalone nicht, dass überhaupt keine Abhänigkeiten
bestehen, allerdings nur Abhänigkeiten von den Systembibliotheken, von
denen Sie annehmen können, dass sie immer vorhanden sind.

Diese Daten werden zusätzlich geladen, wenn Sie die GFXLib benutzen:
Win32: | Linux:
user32.dll (ddraw.dll und dinput.dll nur zur Laufzeit verwendet) | libX11 libXext libXxf86vm libpthread


Standardpaletten

Beim öffnen eines Ausgabefensters (eines Konsolefensters oder eines Grafikfensters)
sowie bei der Reinitialisierung eines Bildschirmmodus via SCREEN (Anweisung) werden die
folgenden Farben ihren Indizes zugeordnet. In Grafikmodi können diese später
mittels PALETTE geändert werden; im Textmodus ist dies nicht möglich.

Modus | Index | Farbe
1 | 0 1 2 3 | Schwarz Zyan Magenta Weiß
2, 10 und 11 | 0 1 | Schwarz Weiß
7, 8, 9, 12 und Konsole | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Schwarz Blau Grün Zyan Rot Magenta Braun Weiß Grau Hellblau Hellgrün Hellzyan Hellrot Pink Gelb Hellweiß

Die Modi 13 und aufwärts in ihren 8bpp-Modi haben einen besonderen Aufbau nach
"Farbbändern".
Ein Farbband ist dabei ein Bereich von Indizes, innerhalb dessen nur Farben mit
bestimmten Eigenschaften vorkommen.

Farbband | Indizes | Inhalt
Konsolenband | 0 - 15 | Selbe Farbzuordnung wie bei den Modi 7, 8, 9, 12 und im Konsolenmodus
graues Band | 16 - 31 | Verschiedene Grautöne, beginnend bei schwarz und endend bei weiß
Band hoher Sättigung und hoher Helligkeit | 32 36 40 44 48 52 | blau magenta rot gelb grün cyan
Band hoher Sättigung und mittlerer Helligkeit | 56 60 64 68 72 76 | blau magenta rot gelb grün cyan
Band hoher Sättigung und niedriger Helligkeit | 80 84 88 92 96 100 | blau magenta rot gelb grün cyan
Band mittlerer Sättigung und hoher Helligkeit | 104 108 112 116 120 124 | blau magenta rot gelb grün cyan
Band mittlerer Sättigung und mittlerer Helligkeit | 128 132 136 140 144 148 | blau magenta rot gelb grün cyan
Band mittlerer Sättigung und niedriger Helligkeit | 152 156 160 164 168 172 | blau magenta rot gelb grün cyan
Band niedriger Sättigung und hoher Helligkeit | 176 180 184 188 192 196 | blau magenta rot gelb grün cyan
Band niedriger Sättigung und mittlerer Helligkeit | 200 204 208 212 216 220 | blau magenta rot gelb grün cyan
Band niedriger Sättigung und niedriger Helligkeit | 224 228 232 236 240 244 | blau magenta rot gelb grün cyan
schwarzes Band | 248 - 255 | schwarz (Meist für Animationen genutzt - Siehe PALETTE)
Abgesehen vom ersten und zweiten Band gilt für diese Modi also:
  • Innerhalb eines Farbands sind Helligkeit und Sättigung der Farbe jeweils die
    selbe.

  • Jedes Farbband enthält dabei 24 verschiedene Farbtöne, die bei blau beginnen,
    das Spektrum durchwandern, und schließlich wieder bei blau enden.

    • Die Farbreihenfolge ist:
  • Blau, Übergang über vier Schritte nach

  • Magenta, Übergang über vier Schritte nach

  • Rot, Übergang über vier Schritte nach

  • Gelb, Übergang über vier Schritte nach

  • Grün, Übergang über vier Schritte nach

  • Cyan Übergang über vier Schritte nach Blau des nächsten Bandes.

    • Dieses Programm erstellt eine gute Ansicht der verfügbaren Farben:
    SCREENRES 820, 240

    DRAW STRING (490, 4), "Konsolenband"
    FOR i = 0 TO 15
    LINE ( i * 20, 0 )-( (i + 1) * 20 - 1, 19 ), i, BF
    NEXT

    DRAW STRING (490, 24), "Graues Band"
    FOR i = 16 TO 31
    LINE ( (i - 16) * 20, 20 )-( (i - 15) * 20 - 1, 39 ), i, BF
    NEXT

    DRAW STRING (490, 44), "hohe Helligkeit, hohe Saettigung"
    FOR i = 32 TO 55
    LINE ( (i - 32) * 20, 40 )-( (i - 31) * 20 - 1, 59 ), i, BF
    NEXT

    DRAW STRING (490, 64), "hohe Helligkeit, mittlere Saettigung"
    FOR i = 56 TO 79
    LINE ( (i - 56) * 20, 60 )-( (i - 55) * 20 - 1, 79 ), i, BF
    NEXT

    DRAW STRING (490, 84), "hohe Helligkeit, niedrige Saettigung"
    FOR i = 80 TO 103
    LINE ( (i - 80) * 20, 80 )-( (i - 79) * 20 - 1, 99 ), i, BF
    NEXT

    DRAW STRING (490, 104), "mittlere Helligkeit, hohe Saettigung"
    FOR i = 104 TO 127
    LINE ( (i - 104) * 20, 100 )-( (i - 103) * 20 - 1, 119 ), i, BF
    NEXT

    DRAW STRING (490, 124), "mittlere Helligkeit, mittlere Saettigung"
    FOR i = 128 TO 151
    LINE ( (i - 128) * 20, 120 )-( (i - 127) * 20 - 1, 139 ), i, BF
    NEXT

    DRAW STRING (490, 144), "mittlere Helligkeit, niedrige Saettigung"
    FOR i = 152 TO 175
    LINE ( (i - 152) * 20, 140 )-( (i - 151) * 20 - 1, 159 ), i, BF
    NEXT

    DRAW STRING (490, 164), "niedrige Helligkeit, hohe Saettigung"
    FOR i = 176 TO 199
    LINE ( (i - 176) * 20, 160 )-( (i - 175) * 20 - 1, 179 ), i, BF
    NEXT

    DRAW STRING (490, 184), "niedrige Helligkeit, mittlere Saettigung"
    FOR i = 200 TO 223
    LINE ( (i - 200) * 20, 180 )-( (i - 199) * 20 - 1, 199 ), i, BF
    NEXT

    DRAW STRING (490, 204), "niedrige Helligkeit, niedrige Saettigung"
    FOR i = 224 TO 247
    LINE ( (i - 224) * 20, 200 )-( (i - 223) * 20 - 1, 219 ), i, BF
    NEXT

    DRAW STRING (490, 224), "schwarzes Band"
    FOR i = 248 TO 255
    LINE ( (i - 248) * 20, 220 )-( (i - 247) * 20 - 1, 239 ), i, BF
    NEXT

    GETKEY


DOS Keyboard Scancodes

Die nachfolgende Liste enthält die Scancodes, die bei MULTIKEY verwendet werden.
Sie entsprechen den DOS-Scancodes, und funktionieren garantiert auf jeder Plattform.

Sie finden diese Liste ebenfalls in der Datei fbgfx.bi, die sich in Ihrem inc-Verzeichnis befinden sollte.

#define SC_ESCAPE &h01
#define SC_1 &h02
#define SC_2 &h03
#define SC_3 &h04
#define SC_4 &h05
#define SC_5 &h06
#define SC_6 &h07
#define SC_7 &h08
#define SC_8 &h09
#define SC_9 &h0A
#define SC_0 &h0B
#define SC_MINUS &h0C
#define SC_EQUALS &h0D
#define SC_BACKSPACE &h0E
#define SC_TAB &h0F
#define SC_Q &h10
#define SC_W &h11
#define SC_E &h12
#define SC_R &h13
#define SC_T &h14
#define SC_Y &h15
#define SC_U &h16
#define SC_I &h17
#define SC_O &h18
#define SC_P &h19
#define SC_LEFTBRACKET &h1A
#define SC_RIGHTBRACKET &h1B
#define SC_ENTER &h1C
#define SC_CONTROL &h1D
#define SC_A &h1E
#define SC_S &h1F
#define SC_D &h20
#define SC_F &h21
#define SC_G &h22
#define SC_H &h23
#define SC_J &h24
#define SC_K &h25
#define SC_L &h26
#define SC_SEMICOLON &h27
#define SC_QUOTE &h28
#define SC_TILDE &h29
#define SC_LSHIFT &h2A
#define SC_BACKSLASH &h2B
#define SC_Z &h2C
#define SC_X &h2D
#define SC_C &h2E
#define SC_V &h2F
#define SC_B &h30
#define SC_N &h31
#define SC_M &h32
#define SC_COMMA &h33
#define SC_PERIOD &h34
#define SC_SLASH &h35
#define SC_RSHIFT &h36
#define SC_MULTIPLY &h37
#define SC_ALT &h38
#define SC_SPACE &h39
#define SC_CAPSLOCK &h3A
#define SC_F1 &h3B
#define SC_F2 &h3C
#define SC_F3 &h3D
#define SC_F4 &h3E
#define SC_F5 &h3F
#define SC_F6 &h40
#define SC_F7 &h41
#define SC_F8 &h42
#define SC_F9 &h43
#define SC_F10 &h44
#define SC_NUMLOCK &h45
#define SC_SCROLLLOCK &h46
#define SC_HOME &h47
#define SC_UP &h48
#define SC_PAGEUP &h49
#define SC_LEFT &h4B
#define SC_RIGHT &h4D
#define SC_PLUS &h4E
#define SC_END &h4F
#define SC_DOWN &h50
#define SC_PAGEDOWN &h51
#define SC_INSERT &h52
#define SC_DELETE &h53
#define SC_F11 &h57
#define SC_F12 &h58

' Erweiterte Scancodes, unter DOS erst ab freeBASIC v0.15b verfügbar

#define SC_LWIN &h7D
#define SC_RWIN &h7E
#define SC_MENU &h7F


Interne Treiber

Wie bereits angesprochen benutzt die GFXLib ihre eigenen Treiber, um mit verschiedenen
Systemen arbeiten zu können.

Win32: Linux:
DirectX | Dieser Treiber basiert auf DirectDraw und DirectInput; er wird auf jedem System funktionieren, auf dem zumindest DirectX 3.0 installiert wurde. Windows 98 ist dabei die Untergrenze. Wenn Sie Windows 95 benutzen, wird nicht garantiert, dass er funktioniert. Die nötigen DirectX DLLs werden bei der Ausführung geladen, so dass Ihre EXE davon unabhängig bleibt. Ihre Programme bleiben auch auf Systemen lauffähig, die kein DX installiert haben (In diesem Fall scheitert die Initiierung des Grafikmodus mit DX). Unterstützt Fenster- und Vollbildmodi.
GDI | Der einfache Windows GDI-Treiber. Langsamer als DX, aber garantiert immer lauffähig. Wenn die Initiierung eines Modus mit DX scheiterte, wird automatisch GDI verwendet. Unterstützt nur Fenstermodi
X11 Raw Xlib basierender Treiber. Er funktioniert immer. Wenn ihr Programm läft, wird die XSHM-Erweiterung verwendet, um schnellere Framebufferzugriffe via shared memory zu ermöglichen. Um Vollbildmodi zu benutzen, wird die Xvidmode-Erweiterung verwendet; Ihr Programm muss lokal ausgeführt werden, und die entsprechenden modelines sollten von Ihrem X11-Server unterstützt werden. Ansonsten ist kein Vollbildmodus verfügbar.

Die GfxLib verwendet immer den bestgeeignetsten Treiber auf Ihrem System, wenn ein
neuer Videomodus per SCREEN (Grafik) initiiert werden soll.
Um diese Wahl zu überbrücken, können Sie die FBGFX Umgebungsvariable setzen, um den
Treiber zu benennen, den sie bevorzugt verwenden wollen.
Unter Win32 könnten Sie das so tun:

SET FBGFX=gdi
Dadurch wird die GFXLib versuchen, einen Bildschirmmodus zuerst mit dem Treiber "GDI"
zu initialisieren; wenn der angegebene Treiber nicht gefunden wird, oder die Aufgabe
nicht bewältigen kann, fährt die GFXLib in der automatischen
Reihenfolge fort.


Interne Pixelformate

Interne Pixelfomate

Die Darstellung von Grafiken im Speicher mit freeBASIC lässt sich in mehrere Kapitel untergliedern:
  • Darstellung eines einzelnen Pixels

  • Transparenz - Maskenfarben und Alpha-Wert

  • Struktur eines Bildpuffers für die Drawing Primitives

    • Darstellung eines einzelnen Pixels

    Die GFXLib verwendet immer eines von drei Pixelformaten: indizerte 1-Byte-Pixel, Direct Color 2-Bytes-Pixel (Hicolor) und Direct Color
    4-Bytes-Pixel (Truecolor).

    Diese Formate werden in den entsprechenden Modi verwendet:
    Farbtiefe in bpp: | Pixelelformat:
1 | 1 Byte pro Pixel, indiziert, Index zwischen 0 und 1.
2 | 1 Byte pro Pixel, indiziert, Index zwischen 0 und 3.
4 | 1 Byte pro Pixel, indiziert, indexed, Index zwischen 0 und 15.
8 | 1 Byte pro Pixel, indiziert, Index zwischen 0 und 255.
15, 16 | 2 Bytes pro Pixel, Direct Color, Format &bRRRRRGGGGGGBBBBB.
24, 32 | 4 Bytes pro Pixel, Direct Color, Format &bAAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB.
    Indiziert bedeutet hierbei, dass jeder Zahl eine Farbe zugeordnet ist; beispielsweise kann ein Pixel mit dem Farbattribut 4 rot sein.
    Welche Farbe welcher Zahl zugeordnet ist, hängt vom Bildschirmmodus ab; siehe dazu die Standardpaletten.
    Diese können mit PALETTE noch im Programmverlauf bearbeitet werden.
    Bei Direct-Color-Modi stellt die Zahl bereits die Farbe dar. Jeweils ein bestimmter Teil der Zahl stellt den Rot- Grün- und Blau-Anteil
    der Farbe dar.
    Bei der Angabe des Formats in obiger Tabelle steht jeweils ein Zeichen für ein Bit der Farbinformation. R symbolisiert jeweils den Rot-
    G den Grün- und B den Blauanteil. Die Stellen A, die bei 24 und 32bpp aufgeführt sind, können tatsächlich nur in 32bpp-Modi genutz
    werden. Sie stellen die Alpha- oder Transparenz-Komponente dar. In 24bpp-Modi sind diese Stellen jeweils mit null besetzt, sie werden
    lediglich zur leichteren Verwaltbarkeit beibehalten.

    Wie Sie sehen, verwenden die 15 und der 16bpp-Modi das selbe 16bpp-Format.
    Dasselbe kann man über die 24 und 32bpp-Modi sagen, beide benutzen das 32bpp-Format.
    Das Interne Format ist Plattformunabhängig.

    Der Bildschirmspeicher wird in einem der drei Formate gehalten. Denken Sie daran, wenn Sie per SCREENPTR darauf zugreifen; das
    selbe gilt für Daten, die in GET (Grafik)- und PUT (Grafik)-Feldern gespeichert sind.
    Mehr dazu unter Struktur eines Bildpuffers für die Drawing Primitives.

    In Modi mit mehr als einem Byte pro Pixel werden die Bytes in umgekehrter Reihenfolge im Speicher abgelegt; das obere Byte des
    Gesamtwertes ist also das zweite im Speicher, das untere Byte wird zuerst abgelegt.
    Befindet sich an der hypotetischen Adresse 0 also eine 32bit-Pixelinformation, so werden ihre Komponenten folgendermaßen Zerlegt:
    Byte | Komponente
0 | Blau
1 | Grün
2 | Rot
3 | Alpha

    Transparenz - Maskenfarben und Alpha-Wert

    Maskenfarbe
    Die Maskenfarbe hängt von der aktuellen Farbtiefe ab; sie ist eine von diesen Werten:
    Farbtiefe | Maskenfarbnummer
1, 2, 4, 8 | 0
15, 16 | &hF81F
24, 32 | &hFF00FF

    Indizierte Modi benutzen immer den Index 0 als Transparenzmaske, während Direct Color-Modi immer Pink verwenden.

    Alphawert
    FreeBASIC unterstützt Transparenzeffekte nach der ALPHA-Methode. Dabei wird neben dem Farb-Tripplet (Rot, Grün, Blau) auch ein
    Transparenzgrad, der Alphawert angegeben. Ebenso wie die Werte des Farbtripplets liegt auch der Alpha-Wert zwischen 0 und 255; dabei
    entspricht Alpha=0 völliger Transparenz und Alpha=255 völliger Überdeckung. Für alle Werte dazwischen werden 'durchscheinende' Bilder
    erzeugt, d.h. ein Farbwert wird berechnet, der 'zwischen' überzeichnender und überzeichneter Farbe liegt. Dabei gibt der Alphawert an,
    welcher der beiden Werte den Farbeindruck dominiert.
    Berechnet wird die neue Farbe nach dieser Funktion:
    Function custom_alpha(Byval src As Uinteger, Byval dst As Uinteger, Byval param As Any Ptr ) As Uinteger
    Dim As Ubyte ptr color_src, color_dst
    Dim As Ubyte r, g, b, a

    color_src = Cast(Ubyte ptr, @src)
    color_dst = Cast(Ubyte ptr, @dst)

    If param <> 0 Then
    a = *Cast(Ubyte ptr, param)
    'ein alpha wert für alle pixel
    Else
    a = color_src[3]
    'aus jedem Pixel den alpha wert lesen
    End If

    r = ( color_src[2] * a + color_dst[2] * (255 - a) ) \ 255
    g = ( color_src[1] * a + color_dst[1] * (255 - a) ) \ 255
    b = ( color_src[0] * a + color_dst[0] * (255 - a) ) \ 255

    Return RGBA(r, g, b, 255)
    End Function
    (Diese Funktion ist so gehalten, dass sie mit PUT (Grafik) benutzt werden kann.)
  • 'src' entspricht dabei der Farbinformation des überzeichnenden (neuen) Pixels.

  • 'dst' entspricht dabei der Farbinformation des zu überzeichnenden (bereits auf der Zeichenfläche befindlichen) Pixels.

  • 'param' ist dabei ein Pointer auf einen UBYTE-Wert zwischen 0 und 255, der den Alpha-Wert darstellt.

    • Struktur eines Bildpuffers für die Drawing Primitives

    Ein Bildpuffer ist ein Speicherbereich, in dem größere Blocks von Pixeldaten - kurz Bildausschnitte - abgelegt werden können. Dies kann
    ein Array sein (Siehe DIM, REDIM), oder ein mit ALLOCATE, CALLOCATE oder (besonders zu empfehlen) IMAGECREATE reservierter Bereich.
    In freeBASIC werden zwei verschiedene Formate für Bildpuffer verwendet; abhängig von der Version des Compilers und den Kommandozeilenoptionen
    verwendet freeBASIC Version 1 oder Version 2 der verfügbaren Formate.
    Beide Formate sind (ab freeBASIC v0.17) mit allen Drawing Primitives kompatibel; siehe PSET, IMAGECREATE, GET (Grafik).

    Version 1
    Diese Version des Bildpuffers wurde bis freeBASIC v0.16 benutzt; seit v0.17 ist er nur noch dann verfügbar, wenn die Kommandozeilenoption
    -lang deprecated
    oder
    -lang qb
    eingesetzt wird.
    Er besteht aus dem Header und den eigentlichen Pixelinformationen. Der Header ist ein Bitfeld (siehe TYPE (UDTs) und Bitfelder), das
    Angaben über Höhe, Breite und Farbtiefe des Bildes enthält; an ihn schließen sich die eigentlichen Pixeldaten im oben genannten Format an.

    Der Header besteht insgesamt aus 32bit, also vier Bytes oder einer INTEGER-Stelle. Er ist folgendermaßen aufgebaut:

    TYPE _OLD_HEADER FIELD = 1
    bpp : 3 AS USHORT
    width : 13 AS USHORT
    height AS USHORT
    END TYPE
    Die einzelnen Elemente bedeuten dabei folgendes:
  • 'bpp' gibt die Farbtiefe in Bytes pro Pixel an. Er ist entweder gleich 1 (für 1-8bit), 2 (für 15 und 16bit), oder gleich 4 (für 24 und 32bit)

  • 'width' gibt die Breite des Bildes in Pixeln an. Da 13 Bits verwendet werden, kann dieser Wert zwischen 1 und 8191 liegen; eine
    Breite von 0 ist (aus praktischen Gründen) ungültig.

  • 'height' gibt die Höhe des Bildes in Pixeln an. Da hier eine volle USHORT-Stelle (16 Bit) verwendet wird, kann dieser Wert zwischen
    1 und 65535 liegen; eine Höhe von 0 ist (aus praktischen Gründen) ungültig.

    • Dem Header schließen sich die eigentlichen Pixeldaten an; für jeden Pixel werden dabei so viele Bytes verwendet, wie in 'bpp' angegeben
    ist. Die Pixeldaten sind von links nach rechts und von oben nach unten geordnet.

    Die Größe eines Puffers nach diesem Format lässt sich also folgendermaßen berechnen:
    size = 4 + (w * h * b)
    Wobei 'w' die Breite, 'h' die Höhe und 'b' die Farbtiefe in Bytes pro Pixel ist.

    Beispiel:
    Ein Bildpuffer der Größe 2x2 Pixel in einem 32bpp-Modus, der einen roten, grünen, gelben und blauen Pixel enthält:
    Byte | Bedeutung | Wert
0 und 1 | (Breite SHL 3) OR bpp | 33
2 und 3 | Höhe | 1
4 bis 7 | Farbe des ersten Pixels (links oben) im Format ARGB | &H00FF0000
8 bis 11 | Farbe des zweiten Pixels (rechts oben) im Format ARGB | &H0000FF00
12 bis 15 | Farbe des dritten Pixels (links unten) im Format ARGB | &H00FFFF00
16 bis 19 | Farbe des vierten Pixels (rechts unten) im Format ARGB | &H000000FF

    Dies Verdeutlicht auch dieses Programm:
    Screen 15, 32

    Dim x As UByte Ptr
    Dim y As UInteger Ptr
    Dim i As Integer
    x = ImageCreate(2, 2)
    y = x

    Pset x, (0, 0), &HFF0000
    Pset x, (1, 0), &H00FF00
    Pset x, (0, 1), &H0000FF
    Pset x, (1, 1), &HFFFF00

    For i = 0 To 19
    Print i, x[i],
    If ( i Mod 4) = 0 Then Print Hex(y[i \ 4], 8) Else Print
    If ((i + 1) Mod 4) = 0 Then Print
    Next

    ImageDestroy x

    GetKey

    Version 2
    Diese Version des Bildpuffers ist seit v0.17 verfügbar; das Programm muss dazu mit der Kommandozeilenoption
    -lang fb
    kompiliert werden.
    Ebenso wie in Version 1 lässt sich dieses Bildpuffer-Format in einen Header und die eigentlichen Pixeldaten zerlegen. Der Bildpuffer ist
    dabei so angelegt:
    TYPE Image FIELD = 1
    UNION
    old AS _OLD_HEADER
    type AS UINTEGER
    END UNION
    bpp AS INTEGER
    width AS UINTEGER
    height AS UINTEGER
    pitch AS UINTEGER
    GLuint AS STRING * 12
    END TYPE
    Wie Sie sehen, enthält dieser Header noch die Informationen des alten Formates. Dadurch ist eine schnelle und Einfache Prüfung des
    Bildformates möglich, wodurch die Abwärtskompatibilität gewahrt wird. Zur Überprüfung der Pufferversion siehe später.

    Die einzelnen Elemente bedeuten dabei folgendes:
  • 'old' ist eine Speicherstruktur, die dem Header der Version 1 entspricht.

  • 'type' ist ein INTEGER-Wert, der die Version des Headers angibt. Da es sich in einem UNION mit 'old' befindet, wird es diesen Record
    überschreiben.
    Soll die neue Header-Struktur benutzt werden, so hat 'type' den Wert 7. Diesen Wert konnte der alte Header nie erreichen, wodurch
    sicher gestellt ist, dass die Version eindeutig erkennbar ist.

  • 'bpp' gibt die Farbtiefe in Bytes pro Pixel an. Dieser Wert ist entweder gleich 1 (für 1-8bit), 2 (für 15 und 16bit), oder gleich 4
    (für 24 und 32bit)

  • 'width' und 'height' geben die Breite und Höhe des Bildpuffers in Pixeln an.

  • 'pitch' gibt die Anzahl der Bytes pro Zeile an. Der Wert berechnet sich folgendermaßen:
    pitch = ( width + IIF(width MOD 4, 4 - (width MOD 4), 0) ) * 4
    Wie Sie sehen, wird also jede Bildzeile so aufbereitet, dass die Anzahl der Pixel pro Zeile ein Vielfaches von vier ist; für jeden
    Pixel werden dann pauschal vier Bytes reserviert.
    Dies wirkt sich zwar darin aus, dass in fast jedem Bildpuffer einige ungenutzte Bytes vorhanden sind; in Anbetracht der Größe des
    zur Verfügung stehenden Speichers fallen diese aber gar nicht ins Gewicht.
    Der Vorteil dieser Methode liegt darin, dass sich der Umgang mit den Bildpuffern optimieren lässt; die heutigen 32bit-Prozessoren
    bieten einige Operatoren, die nur bei Zahlen, die Vielfache von vier sind, optimal angewandt werden können.
    Einem minimal größerem Speicheraufwand steht also ein spürbar kleinerer Zeitaufwand bei Berechnungen gegenüber.

  • 'GLuint' ist eine 12 Bytes große Speicherstelle, die später möglicherweise für verschiedene OpenGL-Operationen verwendet werden kann;
    die Verwendung dieser Stellen steht im Moment noch nicht fest. Der User kann frei entscheiden, ob er diese Speicherstellen nutzen
    möchte, sollte dabei aber bedenken, dass sein Programm damit möglicherweise später nicht mehr kompatibel ist.

    • Wie bei 'pitch' bereits angesprochen, sind im neuen Datenformat die Pixel nicht mehr direkt aneinander gereiht, sondern Zeilenweise in
    Datenblocks zusammengefasst. Hinter jeder Zeile werden eine Reihe von Bytes reserviert, die nicht genutzt werden. Durch dieses 'Padding'
    können bestimmte Berechnungen schneller durchgeführt werden.
    Der Wert dieser Padding-Bytes ist abhängig von der Art der Erstellung des Puffers.
  • Bei der Verwendung eines Arrays wird hier in den meisten Fällen null eingetragen, da mit DIM und REDIM initiierte Variablen i.d.R.
    mit null initialisiert werden. Eine Ausnahme sind Arrays, die durch = ANY initialisiert wurden; da hier der Inhalt des
    Speicherbereichs nicht gelöscht wird, und nur die tatsächlich genutzen Bytes im Laufe der Bildbearbeitung überschrieben werden,
    findet man hier immer den 'Datenmüll', der sich vor der Reservierung des Speicherberichs auf den entsprechenden Stellen angesammelt
    hat.
    Durch CALLOCATE wird immer ein null-initialisierter Speicherbereich reserviert. Da die

  • Speicherbereiche, die mit IMAGECREATE reserviert wurden, werden vor Benutzung komplett mit einem Wert befüllt; dieser hängt von den
    Parametern, mit denen IMAGECREATE genutzt wird, und dem aktuellen Bildschirmmodus.
    Siehe IMAGECREATE für Details.

  • Wie schon bei Arrays, die durch = ANY initialisiert wurden, findet man auch bei der Reservierung eines Speicherbereichs
    mittels ALLOCATE Datenmüll in den Padding-Bytes.

    • Um nun bei gegebener Startadresse des Bildpuffers die Adresse eines einzelnen Pixels zu ermitteln, bedient man sich dieser Formel:
    p = buffer + 32 + (y * ( w + IIF(w MOD 4, 4 - (w MOD 4), 0) ) * 4 ) + (x * bpp)
    Dabei ist...
  • 'p' ein Pointer beliebigen Typs, der auf den gewünschten Pixel zeigt. Benutzen Sie bevorzugt einen ANY PTR oder UBYTE PTR, damit bei
    der Berechnung des Formelausdrucks keine Fehler auftreten. Wird z.B. an einem INTEGER PTR die Operation += 1 ausgeführt,
    so erhöht sich sein Wert tatsächlich um vier, da dies die Länge eines INTEGERs ist.

  • 'buffer' die Startadresse des Bildpuffers.

  • 'x' und 'y' die Koordinaten des Pixels, relativ zum linken oberen Rand des Bildpuffers.

  • 'w' die Breite des Bildes in Pixeln.

  • 'bpp' die Farbtiefe des Bildpuffers in Bytes pro Pixel.

    • Steht 'pitch' aus dem Bildheader zur Verfügung, so kann der Ausdruck auch vereinfacht werden:
    p = buffer + 32 + (y * pitch) + (x * bpp)

    Der Speicherbedarf berechnet sich also nach dieser Formel:
    size = 32 + ( h * ( w + IIF(w MOD 4, 4 - (w MOD 4), 0) ) * 4 )

    Beispiel:
    Ein Bildpuffer der Größe 2x2 Pixel in einem 32bpp-Modus, der einen roten, grünen, gelben und blauen Pixel enthält:
    Byte | Bedeutung | Wert
0 bis 3 | Version des Bildpuffers - neuer Header | 7
4 bis 7 | Farbtiefe in bpp | 4
8 bis 11 | Breite des Bildpuffers in Pixeln | 2
12 bis 15 | Höhe des Bildpuffers in Pixeln | 2
16 bis 19 | Bytes pro Zeile in diesem Puffer | 16
20 bis 31 | zwölf reservierte Bytes, die in zukünftigen OpenGL-Anwendungen eine Bestimmung finden könnten | 0
32 bis 35 | Farbe des ersten Pixels (links oben) im Format ARGB | &H00FF0000
36 bis 39 | Farbe des zweiten Pixels (rechts oben) im Format ARGB | &H0000FF00
40 bis 43 | Padding-Stelle - ohne Bedeutung | &HFFFF00FF
44 bis 47 | Padding-Stelle - ohne Bedeutung | &HFFFF00FF
48 bis 51 | Farbe des dritten Pixels (links unten) im Format ARGB | &H000000FF
52 bis 55 | Farbe des vierten Pixels (rechts unten) im Format ARGB | &H00FF00FF
56 bis 59 | Padding-Stelle - ohne Bedeutung | &HFFFF00FF
60 bis 63 | Padding-Stelle - ohne Bedeutung | &HFFFF00FF

    Beispiel 1:
    #Include "fbgfx.bi"
    Using FB

    Screen 15, 32

    Dim buffer As Any Ptr
    Dim header As Image Ptr
    Dim Pixels As UInteger Ptr
    Dim Colors As UByte Ptr
    Dim i As UInteger

    buffer = ImageCreate(2, 2)
    header = buffer
    Pixels = buffer + 32
    Colors = buffer + 32

    Pset buffer, (0, 0), &HFF0000
    Pset buffer, (1, 0), &H00FF00
    Pset buffer, (0, 1), &H0000FF
    Pset buffer, (1, 1), &HFFFF00

    With *header
    ? "Header of the Buffer:"
    ? "Version ID: "; .type
    ? "Bytes per Pixel: "; .bpp
    ? "Width: "; .width
    ? "Height: "; .height
    ? "Bytes per Row: "; .pitch
    End With

    Draw String (0, 100), "The graphic:"
    Put (100, 100), buffer, PSET

    Open Err For Output As #1
    ? #1, "Pixel Data:"
    ? #1, ""
    For i = 0 To 31
    ? #1, i, Hex(Colors[i], 2),
    If (i + 1) Mod 4 = 0 Then ? #1, ""
    If (i ) Mod 4 = 0 Then ? #1, Hex(Pixels[i \ 4], 8) Else ? #1, ""
    Next

    ImageDestroy buffer
    Close #1

    GetKey

    Beispiel 2:
    #Include "fbgfx.bi"
    Using FB

    Screen 15, 32

    Dim As Any Ptr buffer
    Dim As Image Ptr header
    Dim As UInteger Ptr Pixel
    Dim As UInteger x, y, pitch

    buffer = ImageCreate(256, 256)
    header = buffer

    pitch = header->pitch

    'Open Err For Output As #1
    'Print #1, Using "Start Adress: ##########"; Cast(Integer, buffer)
    For y = 0 To 255
    For x = 0 To 255
    Pixel = buffer + 32 + (y * pitch) + (x * 4)
    *Pixel = RGB(x, y, 0)
    Next
    'Print #1, Using "Line ### starts at: ##########"; y; Cast(Integer, Pixel)
    Next

    Put (0, 0), buffer
    'Close #1

    GetKey

    Erkennen des Puffertyps und Bearbeitung
    Je nach gewählten Ausgangsbedingungen wird freeBASIC bei der Erstellung neuer Datenpuffer immer eine bestimme Version des Puffers
    benutzen:
    Bedingungen für Version 1 | Bedingungen für Version 2
freeBASIC-Version <= 0.16 oder freeBASIC-Version >= 0.17 und Kommandozeilenoption -lang qb oder freeBASIC-Version >= 0.17 und Kommandozeilenoption -lang deprecated | freeBASIC-Version >= 0.17 und Kommandozeilenoption -lang fb

    Dennoch ist es möglich, dass ein anderes Pufferformat behandelt werden soll, als das unter gegebenen Bedingungen von freeBASIC gewählte,
    z.B. wenn mittels BLOAD Daten in den Speicher geladen werden, die ein älteres Programm erstellt hat.

    Die Drawing Primitives ab freeBASIC v0.17 können - bei jeder gewählten Kommandozeilenoption - mit beiden Pufferformaten umgehen; sie
    erkennen automatisch, welche Struktur angewandt werden muss.
    Die Drawing Primitives von freeBASIC-Versionen vor v0.17 können nur mit Version 1 des Pufferformats umgehen; der User muss selbstständig
    Daten des jüngeren Formats umwandeln.

    Bei direkten Speicherzugriffen ohne die FB-Eigenen Drawing Primitives kann anhand des ersten INTEGER-Stelle des Headers überprüft werden,
    ob es sich um das alte oder das neue Format handelt: Beim neuen Format beinhaltet diese immer den Wert 7; beim alten Format ist hier ein
    anderer Wert gespeichert, der sich aus Farbtiefe, Höhe und Breite des Bildpuffers zusammensetzt. Dieser Wert kann nie gleich sieben
    werden.
    Mit dem Headertyp ändert sich auch der Startpunkt der eigentlichen Pixeldaten. Diese Formel gibt unabhängig von Pointertyp und
    Pufferformat den richten Startpunkt aus:
    start = buffer + IIF( PEEK(INTEGER, buffer) = 7, 32, 4 ) \ SIZEOF(buffer)
    Beachten Sie hierbei, dass sie seperat prüfen müssen, ob die Zeilen gepaddet sind. Dies ist bei Version 2 IMMER der Fall, in Version 1 hingegen NIE.


Tipps und Tricks

  • Double Buffering
  • Arten der Bildpuffer
  • Bildpuffer bei Drawing Primitives
  • GfxPrint
  • LZW-Codec in der GfxLib
  • OpenGL-Textur

Double Buffering

Vermeiden Sie Double Buffering (ein Bild zuerst in einen Puffer schreiben, und
es dann in den Videor-RAM kopieren) soweit wie möglich. Die Gfx-Lib benutzt
bereits ein Double Buffering System, um den Bildschirm zu aktualisieren. Wenn
Sie Ihren eigenen Zweitpuffer verwenden, müssen nur weitere (unbenötigte)
Bildschirmkopien durchgeführt werden, wodurch Ihr Programm langsamer wird.
Stattdessen sollten Sie die bereits unterstützten Flipping-Funktionen
(Verwendung mehrerer Bildschirmseiten; siehe SCREENSET und das Beispiel von
MULTIKEY) benutzen.

Arten der Bildpuffer

GET und PUT unterstützen neben normalen Arrays auch Pointer als Bildpuffer:
TYPE FB_IMAGE FIELD = 1
width AS USHORT
height AS USHORT
imageData(64000) AS UBYTE
END TYPE

DIM udt AS FB_IMAGE
DIM udt_ptr AS FB_IMAGE PTR
DIM array(16001) AS INTEGER
DIM array_ptr AS INTEGER PTR

udt_ptr = @udt
array_ptr = @array(0)

SCREEN 13

' Diese Anweisungen haben die selbe Funktion
GET (0, 0)-(319, 199), array
GET (0, 0)-(319, 199), array(0)
GET (0, 0)-(319, 199), @array(0)
GET (0, 0)-(319, 199), array_ptr
GET (0, 0)-(319, 199), @array_ptr[0]

' Diese Anweisungen sind ebenfalls equivalent zueinander
GET (0, 0)-(319, 199), @udt
GET (0, 0)-(319, 199), udt_ptr
GET (0, 0)-(319, 199), @udt_ptr[0]
In diesem Beispiel wurde GET verwendet, es funktioniert aber ebenso mit PUT.

Bildpuffer bei Drawing Primitives

Alle Drawing Primitives (Einfachste Grafikanweisungen) können an GET/PUT-Puffer
angewandt werden. Dadurch ist es für Sie mögich, auf eine beliebige Anzahl
von nicht-Bildschirm-Oberflächen zu zeichnen, und diese später auf den
Bildschirm zu übertragen:
DIM buffer(9602) AS USHORT
DIM sprite(1028) AS UBYTE

SCREEN 13

' Da als Puffer ein GET/PUT-Puffer angenommen wird, setzen wir seine ersten vier
' Bytes so, dass sie einen normalen GET/PUT-Puffer-header bilden.
buffer(0) = 160 SHL 3 ' Breite * 8
buffer(1) = 120 ' Höhe

CIRCLE buffer, (16, 16), 15, 12, , , 1, F
GET buffer, ( 0, 0)-( 31, 31), sprite
PSET sprite, (16, 16), 15
LINE buffer, ( 0, 0)-(159, 119), 2, B
PUT buffer, (50, 50), sprite, PSET
PUT (80, 40), buffer, PSET

Einen einfacheren Weg, einen solchen GET/PUT-Puffer zu erstellen stellt die IMAGECREATE-Funktion
dar. Durch sie wird automatisch einen Puffer reserviert und initialisiert.
Das obige Beispiel könnte dadurch so aussehen:
DIM buffer AS ANY PTR
DIM sprite AS ANY PTR

SCREEN 13

buffer = IMAGECREATE(160, 120)
sprite = IMAGECREATE(32, 32)

CIRCLE buffer, (16, 16), 15, 12, , , 1, F
GET buffer, ( 0, 0)-( 31, 31), sprite
PSET sprite, (16, 16), 15
LINE buffer, ( 0, 0)-(159, 119), 2, B
PUT buffer, (50, 50), sprite, PSET
PUT (80, 40), buffer, PSET

IMAGEDESTROY buffer
IMAGEDESTROY sprite

Wenn Sie auf einen Puffer zeichnen, werden die Koordinaten durch den letzten
Aufruf von WINDOW beinflusst, jedoch nicht von VIEW.
Die Clipping-Grenzen werden auf die Gesamtgröße des Puffers gesetzt.
Natürlich kann der optionale Zielpuffer-Parameter bei allen drawing
Primitives angegeben werden, und darf sowohl ein Array als auch ein Pointer sein,
wie im Falle des GET/PUT-Bildpuffers.

GfxPrint

Sie können die Funktion der PRINT-Routine durch eine eigene Prozedur erweitern,
die vordefinierten Gfxlib-fonts verwendet. Das folgende Beispiel enthält
die SUB GfxPrint, die das Zeichnen von transparentem Text an jeder Position
sowie Clipping-Grenzen unterstützt; ebenso ist es möglich, in einen
Bildpuffer zu schreiben:

Anmerkung:
Seit v0.16s unterstützt freeBASIC den Befehl DRAW STRING, der aufgrund
erweiterter Features zu bevorzugen ist. Nach wie vor allerdings steht diese
Methode zur Verfügung, um an die Roh-Pixeldaten für den FB-eigenen Schriftsatz
zu gelangen.
DECLARE SUB GfxPrint( BYREF text AS STRING, _
BYVAL x AS INTEGER, BYVAL y AS INTEGER, _
BYVAL col AS INTEGER, BYVAL buffer AS ANY PTR = 0 )

TYPE fb_FontType
h AS INTEGER
data AS UBYTE PTR
END TYPE

' Entfernen Sie das Kommentar-Zeichen vor dem Zeichenformat, das Sie benutzen wollen
'EXTERN fb_FontData ALIAS "fb_font_8x8" AS fb_FontType
'EXTERN fb_FontData ALIAS "fb_font_8x14" AS fb_FontType
'EXTERN fb_FontData ALIAS "fb_font_8x16" AS fb_FontType

SUB GfxPrint( BYREF text AS STRING, _
BYVAL x AS INTEGER, BYVAL y AS INTEGER, _
BYVAL col AS INTEGER, BYVAL buffer AS ANY PTR = 0 )

DIM row AS INTEGER, i AS INTEGER
DIM bits AS UBYTE PTR

FOR i = 1 TO LEN(text)
bits = fb_FontData.data + (ASC(MID$(text, i, 1)) * fb_FontData.h)
FOR row = 0 TO fb_FontData.h-1
IF (buffer) THEN
LINE buffer, (x + 7, y + row)-(x, y + row), col, , *bits SHL 8
ELSE
LINE (x + 7, y + row)-(x, y + row), col, , *bits SHL 8
END IF
bits += 1
NEXT row
x += 8
NEXT i
END SUB

SCREEN 13
GfxPrint "Hello world!", 112, 96, 15
SLEEP

Achtung: Die GfxLib speichert alle Font- und Palette-Daten in einem LZW-
komprimierten format, um Ihre EXEs klein zu halten, und dekomprimiert sie erst
mit dem ersten SCREEN-Aufruf. Wenn Sie SCREEN in Ihrem Programm nie aufrufen, werden
zugriffe auf die Palette und Font-Daten unbrauchbare Daten zurückliefern.

LZW-Codec in der GfxLib

Die GfxLib speichert die Paletten- und Font-Daten in einem LZW-komprimierten
Format, und entpackt diese erst, wenn zum ersten mal SCREEN aufgerufen wird.
Der LZW-Codec ist in Ihren Programmen nicht aufrufbar; er wurde nicht als
eigener Befehl eingebaut.
Es ist dennoch möglich, auf die Kompressonsfunktionen zuzugreifen, indem
Sie die Funktionen einfach deklarieren; die Gfxlib muss jedoch durch einen
SCREEN-Aufruf aktiviert sein.
Beispiel:
DECLARE FUNCTION LZW_Encode ALIAS "fb_hEncode" ( _
BYVAL in_buffer AS ANY PTR, _
BYVAL in_size AS INTEGER, _
BYVAL out_buffer AS ANY PTR, _
BYREF out_size AS INTEGER _
) AS INTEGER

DECLARE FUNCTION LZW_Decode ALIAS "fb_hDecode" ( _
BYVAL in_buffer AS ANY PTR, _
BYVAL in_size AS INTEGER, _
BYVAL out_buffer AS ANY PTR, _
BYREF out_size AS INTEGER _
) AS INTEGER

DIM src_buffer(100000) AS UBYTE
DIM src_size AS INTEGER
DIM dest_buffer(100000) AS UBYTE
DIM dest_size AS INTEGER

'' Funktioniert nur, wenn die GfxLib verwendet wird
SCREEN 15

src_size = 0
OPEN "gfxlib.txt" FOR BINARY AS #1
WHILE NOT EOF(1)
GET #1,, src_buffer(src_size)
src_size += 1
WEND
CLOSE #1
PRINT "Data size before compression:", src_size
GOSUB ShowData

dest_size = 100000
PRINT "Compressing...";
LZW_Encode @src_buffer(0), src_size, @dest_buffer(0), dest_size
PRINT "done."

PRINT "Data size after compression:", dest_size
PRINT

src_size = 100000
PRINT "Decompressing...";
LZW_Decode @dest_buffer(0), dest_size, @src_buffer(0), src_size
PRINT "done."

PRINT "Data size before decompression:", src_size
GOSUB ShowData
SLEEP
END

ShowData:
DIM i AS INTEGER
PRINT "Contents: ";
FOR i = 3 TO 36: PRINT CHR$(src_buffer(i)); : NEXT
PRINT " [...]"
RETURN

OpenGL-Textur

Das Erstellen einer OpenGL-Textur mit einem GET/PUT-Puffer ist einfach; hier ist
ein kleiner Codeauszug, der diese Aufgabe erledigt:
#DEFINE TEX_MASKED &h1
#DEFINE TEX_MIPMAP &h2
#DEFINE TEX_NOFILTER &h4
#DEFINE TEX_HASALPHA &h8

FUNCTION CreateTexture( BYVAL buffer AS ANY PTR, BYVAL flags AS INTEGER = 0 ) AS GLuint
REDIM dat(0) AS UBYTE
DIM p AS UINTEGER PTR, s AS USHORT PTR
DIM AS INTEGER w, h, x, y, col
DIM tex AS GLuint
DIM AS GLenum format, minfilter, magfilter

CreateTexture = 0

s = buffer
w = s[0] SHR 3
h = s[1]

IF( (w < 64) OR (h < 64) ) THEN
EXIT FUNCTION
END IF
IF( (w AND (w-1)) OR (h AND (h-1)) ) THEN
'' Width/height not powers of 2
EXIT FUNCTION
END IF

REDIM dat(w * h * 4) AS UBYTE
p = @dat(0)

glGenTextures 1, @tex
glBindTexture GL_TEXTURE_2D, tex

FOR y = h-1 TO 0 STEP -1
FOR x = 0 TO w-1
col = POINT(x, y, buffer)
'' Swap R and B so we can use the GL_RGBA texture format
col = RGBA(col AND &hFF, _
(col SHR 8) AND &hFF, _
(col SHR 16) AND &hFF, _
col SHR 24)
IF( flags AND TEX_HASALPHA ) THEN
*p = col
ELSE
IF( (flags AND TEX_MASKED) AND (col = &hFF00FF) ) THEN
*p = 0
ELSE
*p = col OR &hFF000000
END IF
END IF
p += 4
NEXT x
NEXT y

IF( flags AND ( TEX_MASKED OR TEX_HASALPHA ) ) THEN
format = GL_RGBA
ELSE
format = GL_RGB
END IF

IF( flags AND TEX_NOFILTER ) THEN
magfilter = GL_NEAREST
ELSE
magfilter = GL_LINEAR
END IF

IF( flags AND TEX_MIPMAP ) THEN
gluBuild2DMipmaps GL_TEXTURE_2D, format, w, h, GL_RGBA, GL_UNSIGNED_BYTE, @dat(0)
IF( flags AND TEX_NOFILTER ) THEN
minfilter = GL_NEAREST_MIPMAP_NEAREST
ELSE
minfilter = GL_LINEAR_MIPMAP_LINEAR
END IF
ELSE
glTexImage2D GL_TEXTURE_2D, 0, format, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, @dat(0)
minfilter = magfilter
END IF
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minfilter
glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magfilter

CreateTexture = tex

END FUNCTION


Befehlsreferenz

Folgende Artikel, die sich nicht weiter einordnen lassen, stehen zur Verfügung:

  • Der Compiler
  • FB Dialektformen
  • Serial Numbers
  • ASCII-Codes
  • Liste der nicht unterstützten Schlüsselwörter


ASCII-Codes

In allen Versionen benutzt freeBASIC den selbe "ASCII extended"-Zeichensatz, das unter DOS (und damit in QB) verwendet wurde. Verwendet
wird dabei der Zeichensatz von Codepage 437, das den US-Amerikanischen Zeichensatz beinhaltet. Ein Wechsel der Codepage, wie unter QB,
ist NICHT möglich.

Jedes Zeichen wird durch ein Byte repräsentiert; in der folgenden Tabelle sind Zeichencode in Dezimal und Hexadezimal und das zugehörige
Zeichen aufgeführt:
Code | Hex | Char | Code | Hex | Char | Code | Hex | Char | Code | Hex | Char | Code | Hex | Char | Code | Hex | Char | Code | Hex | Char | Code | Hex | Char
000 | 00 |  | 032 | 20 |  | 064 | 40 | @ | 096 | 60 | ` | 128 | 80 | Ç | 160 | A0 | á | 192 | C0 | └ | 224 | E0 | α
001 | 01 | ☺ | 033 | 21 | ! | 065 | 41 | A | 097 | 61 | a | 129 | 81 | ü | 161 | A1 | í | 193 | C1 | ┴ | 225 | E1 | ß
002 | 02 | ☻ | 034 | 22 | " | 066 | 42 | B | 098 | 62 | b | 130 | 82 | é | 162 | A2 | ó | 194 | C2 | ┬ | 226 | E2 | Γ
003 | 03 | ♥ | 035 | 23 | # | 067 | 43 | C | 099 | 63 | c | 131 | 83 | â | 163 | A3 | ú | 195 | C3 | ├ | 227 | E3 | π
004 | 04 | ♦ | 036 | 24 | $ | 068 | 44 | D | 100 | 64 | d | 132 | 84 | ä | 164 | A4 | ñ | 196 | C4 | ─ | 228 | E4 | Σ
005 | 05 | ♣ | 037 | 25 | % | 069 | 45 | E | 101 | 65 | e | 133 | 85 | à | 165 | A5 | Ñ | 197 | C5 | ┼ | 229 | E5 | σ
006 | 06 | ♠ | 038 | 26 | & | 070 | 46 | F | 102 | 66 | f | 134 | 86 | å | 166 | A6 | ª | 198 | C6 | ╞ | 230 | E6 | µ
007 | 07 | • | 039 | 27 | ' | 071 | 47 | G | 103 | 67 | g | 135 | 87 | ç | 167 | A7 | º | 199 | C7 | ╟ | 231 | E7 | τ
008 | 08 | ◘ | 040 | 28 | ( | 072 | 48 | H | 104 | 68 | h | 136 | 88 | ê | 168 | A8 | ¿ | 200 | C8 | ╚ | 232 | E8 | Φ
009 | 09 | ○ | 041 | 29 | ) | 073 | 49 | I | 105 | 69 | i | 137 | 89 | ë | 169 | A9 | ⌐ | 201 | C9 | ╔ | 233 | E9 | Θ
010 | 0A | ◙ | 042 | 2A | * | 074 | 4A | J | 106 | 6A | j | 138 | 8A | è | 170 | AA | ¬ | 202 | CA | ╩ | 234 | EA | Ω
011 | 0B | ♂ | 043 | 2B | + | 075 | 4B | K | 107 | 6B | k | 139 | 8B | ï | 171 | AB | ½ | 203 | CB | ╦ | 235 | EB | δ
012 | 0C | ♀ | 044 | 2C | , | 076 | 4C | L | 108 | 6C | l | 140 | 8C | î | 172 | AC | ¼ | 204 | CC | ╠ | 236 | EC | ∞
013 | 0D | ♪ | 045 | 2D | - | 077 | 4D | M | 109 | 6D | m | 141 | 8D | ì | 173 | AD | ¡ | 205 | CD | ═ | 237 | ED | φ
014 | 0E | ♫ | 046 | 2E | . | 078 | 4E | N | 110 | 6E | n | 142 | 8E | Ä | 174 | AE | « | 206 | CE | ╬ | 238 | EE | ε
015 | 0F | ☼ | 047 | 2F | / | 079 | 4F | O | 111 | 6F | o | 143 | 8F | Å | 175 | AF | » | 207 | CF | ╧ | 239 | EF | ∩
016 | 10 | ► | 048 | 30 | 0 | 080 | 50 | P | 112 | 70 | p | 144 | 90 | É | 176 | B0 | ░ | 208 | D0 | ╨ | 240 | F0 | ≡
017 | 11 | ◄ | 049 | 31 | 1 | 081 | 51 | Q | 113 | 71 | q | 145 | 91 | æ | 177 | B1 | ▒ | 209 | D1 | ╤ | 241 | F1 | ±
018 | 12 | ↕ | 050 | 32 | 2 | 082 | 52 | R | 114 | 72 | r | 146 | 92 | Æ | 178 | B2 | ▓ | 210 | D2 | ╥ | 242 | F2 | ≥
019 | 13 | ‼ | 051 | 33 | 3 | 083 | 53 | S | 115 | 73 | s | 147 | 93 | ô | 179 | B3 | │ | 211 | D3 | ╙ | 243 | F3 | ≤
020 | 14 | ¶ | 052 | 34 | 4 | 084 | 54 | T | 116 | 74 | t | 148 | 94 | ö | 180 | B4 | ┤ | 212 | D4 | ╘ | 244 | F4 | ⌠
021 | 15 | § | 053 | 35 | 5 | 085 | 55 | U | 117 | 75 | u | 149 | 95 | ò | 181 | B5 | ╡ | 213 | D5 | ╒ | 245 | F5 | ⌡
022 | 16 | ▬ | 054 | 36 | 6 | 086 | 56 | V | 118 | 76 | v | 150 | 96 | û | 182 | B6 | ╢ | 214 | D6 | ╓ | 246 | F6 | ÷
023 | 17 | ↨ | 055 | 37 | 7 | 087 | 57 | W | 119 | 77 | w | 151 | 97 | ù | 183 | B7 | ╖ | 215 | D7 | ╫ | 247 | F7 | ≈
024 | 18 | ↑ | 056 | 38 | 8 | 088 | 58 | X | 120 | 78 | x | 152 | 98 | ÿ | 184 | B8 | ╕ | 216 | D8 | ╪ | 248 | F8 | °
025 | 19 | ↓ | 057 | 39 | 9 | 089 | 59 | Y | 121 | 79 | y | 153 | 99 | Ö | 185 | B9 | ╣ | 217 | D9 | ┘ | 249 | F9 | ∙
026 | 1A | → | 058 | 3A | : | 090 | 5A | Z | 122 | 7A | z | 154 | 9A | Ü | 186 | BA | ║ | 218 | DA | ┌ | 250 | FA | •
027 | 1B | ← | 059 | 3B | ; | 091 | 5B | [ | 123 | 7B | { | 155 | 9B | ¢ | 187 | BB | ╗ | 219 | DB | █ | 251 | FB | √
028 | 1C | ∟ | 060 | 3C | < | 092 | 5C | \ | 124 | 7C | | | 156 | 9C | £ | 188 | BC | ╝ | 220 | DC | ▄ | 252 | FC | ⁿ
029 | 1D | ↔ | 061 | 3D | = | 093 | 5D | ] | 125 | 7D | } | 157 | 9D | ¥ | 189 | BD | ╜ | 221 | DD | ▌ | 253 | FD | ²
030 | 1E | ▲ | 062 | 3E | > | 094 | 5E | ^ | 126 | 7E | ~ | 158 | 9E | ₧ | 190 | BE | ╛ | 222 | DE | ▐ | 254 | FE | ■
031 | 1F | ▼ | 063 | 3F | ? | 095 | 5F | _ | 127 | 7F | ⌂ | 159 | 9F | ƒ | 191 | BF | ┐ | 223 | DF | ▀ | 255 | FF |
Viele der Standard-ASCII-Zeichen können nicht mit PRINT ausgegeben werden, da die Konsole diese Zeichen als Anweisungen interpretiert;
CHR(7) z.B. ist das Kommando bell, CHR(8) ist Backspace, CHR(9) ist Tabulator, CHR(10) ist line feed, CHR(13) carriage return, u.s.w.
Erst ab CHR(32) - Space - wird garantiert, dass die Zeichen mit PRINT ausgegeben werden können.
Für weitere Informationen siehe den Wikipedia-Eintrag zu ASCII.
Die Ausgabe von Sonderzeichen in Grafikmodi mit DRAW STRING ist immer möglich. Auf der Konsole
allerdings können diese 'Kontrollzeichen' nicht ausgegeben werden.

Die Symbole CHR(32) bis CHR(127) sind bekannt als der Standard Latin ISO-8859-1 Zeichensatz, den die meisten Windows-Fonts benutzen.

UNICODE ist ein neuerer Standard für Zeichensätze, der zwei oder mehr Bytes pro Zeichen verwendet. UNICODE-Zeichen können auf eine
UNICODE-aktivierte Konsole ausgegeben werden.

Für einige Tasten der Tastatur werden sogenannte erweiterte Tastencodes benutzt. Diese setzen sich aus dem Steuerzeichen CHR(255) und
einem zweiten Zeichen zusammen, das die gedrückte Taste identifiziert. Auf diese Weise können weitere 255 Tasten dargestellt werden.
Nachfolgender Code enthält einige der wichtigsten erweiterten Tastencodes als #DEFINE-Symbole:
#Define kc_Back Chr( 8)
#Define kc_Tab Chr( 9)
#Define kc_Lf Chr(10)
#Define kc_Cr Chr(13)
#Define kc_Esc Chr(27)
#Define kc_Spc Chr(32)
#Define kc_QM Chr(34)
#Define kc_CrLf Chr(13, 10)
#Define kc_Return kc_Cr
#Define kc_Enter kc_Cr

#Define FKey Chr(255)

#Define kc_Left FKey + "K"
#Define kc_Right FKey + "M"
#Define kc_Up FKey + "H"
#Define kc_Down FKey + "P"
#Define kc_Pos1 FKey + "G"
#Define kc_End FKey + "O"
#Define kc_Ins FKey + "R"
#Define kc_Del FKey + "S"

#Define kc_GAE Chr(142) ' Ä / Ž
#Define kc_KAE Chr(132) ' ä / „
#Define kc_GOE Chr(153) ' Ö / ™
#Define kc_KOE Chr(148) ' ö / ”
#Define kc_GUE Chr(154) ' Ü / š
#Define kc_KUE Chr(129) ' ü / 
#Define kc_S Chr(225) ' ß / á

#Define kc_F1 FKey + Chr( 59) ' ;
#Define kc_F2 FKey + Chr( 60) ' <
#Define kc_F3 FKey + Chr( 61) ' =
#Define kc_F4 FKey + Chr( 62) ' >
#Define kc_F5 FKey + Chr( 63) ' ?
#Define kc_F6 FKey + Chr( 64) ' @
#Define kc_F7 FKey + Chr( 65) ' A
#Define kc_F8 FKey + Chr( 66) ' B
#Define kc_F9 FKey + Chr( 67) ' C
#Define kc_F10 FKey + Chr( 68) ' D
#Define kc_F11 FKey + Chr(133) ' à
#Define kc_F12 FKey + Chr(134) ' å

#Define kc_ShiftF1 FKey + Chr( 84) ' T
#Define kc_ShiftF2 FKey + Chr( 85) ' U
#Define kc_ShiftF3 FKey + Chr( 86) ' V
#Define kc_ShiftF4 FKey + Chr( 87) ' W
#Define kc_ShiftF5 FKey + Chr( 88) ' X
#Define kc_ShiftF6 FKey + Chr( 89) ' Y
#Define kc_ShiftF7 FKey + Chr( 90) ' Z
#Define kc_ShiftF8 FKey + Chr( 91) ' [
#Define kc_ShiftF9 FKey + Chr( 92) ' \
#Define kc_ShiftF10 FKey + Chr( 93) ' ]
#Define kc_ShiftF11 FKey + Chr(135) ' ç
#Define kc_ShiftF12 FKey + Chr(136) ' ê

#Define kc_CtrlF1 FKey + Chr( 94) ' ^
#Define kc_CtrlF2 FKey + Chr( 95) ' _
#Define kc_CtrlF3 FKey + Chr( 96) ' ´
#Define kc_CtrlF4 FKey + Chr( 97) ' a
#Define kc_CtrlF5 FKey + Chr( 98) ' b
#Define kc_CtrlF6 FKey + Chr( 99) ' c
#Define kc_CtrlF7 FKey + Chr(100) ' d
#Define kc_CtrlF8 FKey + Chr(101) ' e
#Define kc_CtrlF9 FKey + Chr(102) ' f
#Define kc_CtrlF10 FKey + Chr(103) ' g
#Define kc_CtrlF11 FKey + Chr(137) ' ë
#Define kc_CtrlF12 FKey + Chr(138) ' è

#Define kc_AltF1 FKey + Chr(104) ' h
#Define kc_AltF2 FKey + Chr(105) ' i
#Define kc_AltF3 FKey + Chr(106) ' j
#Define kc_AltF4 FKey + Chr(107) ' k
#Define kc_AltF5 FKey + Chr(108) ' l
#Define kc_AltF6 FKey + Chr(109) ' m
#Define kc_AltF7 FKey + Chr(110) ' n
#Define kc_AltF8 FKey + Chr(111) ' o
#Define kc_AltF9 FKey + Chr(112) ' p
#Define kc_AltF10 FKey + Chr(113) ' q
#Define kc_AltF11 FKey + Chr(139) ' ï
#Define kc_AltF12 FKey + Chr(140) ' î

Siehe auch:
ASC, CHR, INKEY,
MULTIKEY,
DOS-Keybord-Scancodes


Der Kommandozeilenoptionen

Der Compiler wird in der Kommandozeile folgendermaßen aufgerufen:
Aufruf: fbc [option] [option] ... Eingabedatei [Eingabedatei] [Eingabedatei]

  • 'Option' entspricht dabei einer Liste an Parametern, die unten aufgeführt sind.
  • 'Eingabeliste' ist die Liste der Dateien, die beim Compilern eingebunden werden
    sollen.

    • Der Compiler entscheidet abhängig von der Erweiterung, wie eine Datei
    behandelt werden soll:

    *.o
    Objektdatei (Einzelnes vorkompiliertes Modul)

    *.a
    Statische Sammlung von vorkompilierten SUBs / FUNCTIONs

    *.bas
    Zu kompilierende Programmdatei

    *.rc
    Ressourcen-Beschreibung (Dialoge, Menüs, Icons, Tastaturkürzel)

    *.res
    Kompilierte Ressourcendatei

    Die folgenden Parameter können an den freeBASIC compiler übergeben
    werden:

    Erzeugung von Bibliotheken mit privaten/öffentlichen SUBs / FUNCTIONs.

    -export [Name]
    Der Name einer SUB/FUNCTION wird explizit für andere Module öffentlich gemacht.
    Ein anderes Modul kann mit Hilfe der DECLARE SUB/FUNCTION Anweisung solche öffentlich
    deklarierten SUBs / FUNCTIONs benutzen.

    -dll
    Erzeugt eine Sammlung von kompilierten öffentlichen SUBs / FUNCTIONs, die zum Programmstart
    automatisch dem Programm an festen Adressen Hinzugefügt werden. Auf diese Weise
    erzeugte Module müssen dem fertigen Programm separat mitgegeben werden. Die Dateien
    haben unter Windows die Endung (*.dll) und unter Linux (*.so.). Dies nennt man dynamisches
    Linken.

    -dylib
    Es werden ebenfalls separate vorkompilierte Module erzeugt, die aber erst während
    des Programmlaufes an nicht festen Adressen dynamisch hinzugefügt werden, also nicht
    wie bei der Option -dll schon bereits zum Programmstart. Auch diese Module müssen
    dem Programm separat mitgegeben werden. Dieses nennt man ebenfalls dynamisches Linken.

    -lib
    Es wird eine Sammlung von SUBs / FUNCTIONs vorkompiliert, die aber nicht wie bei
    den Optionen -dll und -dylib einem Programm separat mitgegeben, sondern direkt in
    das fertige Programm eingefügt wird. Dies nennt man daher statisches Linken.

    -a [Name]
    Eine vorkompilierte Objektdatei ohne feste Adressen mit der Endung (*.o) wird der
    zu erzeugenden Datei hinzugefügt.

    -c
    Es werden Sammlungen von SUBs / FUNCTIONs vorkompiliert, aber nicht zu einem ausführbaren
    Programm verbunden.

    -l [Name]
    Eine fertige vorkompilierte statische Sammlung von SUBs/FUNCTIONs, den sogenannten
    Librarys mit dem Namen lib [Name].a wird statisch dem Programm hinzugefügt. Die ausführbare
    Programmdatei und das Mitgeben von Dll's (*.dll) oder Shared-Librarys (*.so) kann entfallen.

    Behandlung von Programmdateien (*.bas und *.bi)
    -b [Name]
    Eine Programmdatei mit der Endung (*.bas) wird dem Kompiliervorgang hinzugefügt.
    So lassen sich mehrere Dateien hintereinander kompilieren.

    -i [Name]
    Gibt an, in welchen Verzeichnissen der Kompiler nach Include-Dateien mit der Endung
    (*.bi) suchen soll.

    -include [Name]
    Bewirkt, dass die mit 'Name' angegebenen Dateien an den Anfang des Hauptmoduls
    eingefügt werden, als wäre dort eine entsprechende INCLUDE-Anweisung.

    -p [Name]
    Gibt an, in welchen Verzeichnissen der Kompiler nach statischen SUBs / FUNCTIONs
    Sammlungen mit der Endung (*.a) suchen soll. Siehe auch Option -lib.

    -m [Name]
    Die Datei [Name].bas wird als Startdatei angenommen. Sie enthält den Programmstart
    Main. Als Standard wird ohne diese Option die erste angegebene Datei als Startdatei
    angesehen.

    -o [Name]
    Unabhängig vom Namen der Programmdateien mit der Endung (*.bas) wird ein Programm mit
    dem [Namen] bzw. [Namen.exe] erzeugt.

    Bedingtes Kompilieren und Preprozessor
    -d [Name=Wert]
    Für bedingtes Kompilieren kann man einen Wert definieren z.B.DEBUG=1, der dann mit
    #IF oder #IFDEF,#IFNDEF abgefragt werden kann.

    Fehlerbehandlung
    -e
    Einfache Fehlerunterstützung einschalten. Es werden Fehlererkennungs - Funktionen
    in das fertige Programm eingefügt, die zum Programmabbruch führen können, wenn ein
    schwerer Fehler auftrat.

    -ex
    Erweiterte Fehlerunterstützung einschalten, wie die Option -e aber mit der Möglichkeit,
    eigene Fehlerbehandlung zu implementieren. Mit Hilfe der RESUME Anweisung kann man
    auf einen Fehler reagieren und das Programm muss nicht zwangsläufig beendet werden.

    -exx
    Wie -e und -ex, aber mit zusätzlicher Prüfung auf gültige Arrray-Grenzen und korrekte
    Verwendung von Zeigeradressen.

    -g
    Informationen zur Fehlersuche werden in das Programm integriert. Aufgrund der
    zusätzlichen Informationen ist es möglich, zur Laufzeit das Programmm Schritt für
    Schritt auf seine Funktionsweise hin zu überprüfen. Das schrittweise Ausführen von
    Programmen wird mit Hilfe von Debuggerprogrammen realisiert, FreeBASIC liegt der
    GNU Debuger gdb bzw. gdb.exe bei. Es gibt aber auch frei erhältliche grafische
    Oberflächen, die das Debuggen erheblich vereinfachen und die Debug-Information
    visuell aufbereiten.

    -noerrline
    Die Zeilennummer, in der ein z.B. ein Fehler auftrat, wird nicht berechnet.

    Programmerstellung
    -arch [Typ]
    Setzt die Mindestanforderung an den Prozessor(CPU), für den das Programm erzeugt
    werden soll. Als Standardwert wird für einen Prozessor der 486 Klasse kompiliert.
    Ob die anderen Werte wie 368, 586, 686, PI, PII, MMX, SSE, 3DNOW AMD usw. unterstützt
    werden, kann im Moment nicht gesagt werden.

    -r
    Während des Kompilierens werden Assemblerdateien mit der Endung (*.asm) erzeugt und
    am Ende wieder gelöscht. Mit der Option -r [retain=behalten] werden die Assemblerdateien
    nicht gelöscht und können mit einem Editor eingesehen werden. Dies kann unter anderem
    dann nützlich sein, wenn man mit der Option -g Debug - Informationen erzeugt und
    sehen will, welche Programmanweisungen der Preprozessor generiert hat. Diese werden
    in den Assembler-Kommentaren abgelegt.

    -s [gui / console]
    Gibt an, ob ein Programm im Fenster oder in der Konsole ausgeführt werden soll.

    -t [Wert]
    Gibt die Größe des verwendeten Stackspeichers in KByte (1024 Byte-Einheiten) an.
    Ohne diese Option wird eine Standardgröße von 1MB benutzt und sollte in der Regel
    auch völlig ausreichen. Ausnahmen können umfangreiche Programme sein, die reichlich
    Gebrauch von rekursiven Funktionsaufrufen machen, wie z.B. Raytracer oder Fraktalgenerator.

    -target [Name]
    Mit [Name] wird das Zielbetriebssystem angegeben, für das ein Programm erzeugt werden
    soll. Diese Option steht nur unter Windows zur Verfügung und als [Name] sind daher
    dos, linux, und xbox erlaubt. (Um auf Windows für andere Betriebssysteme kompilieren
    zu können, müssen weitere Voraussetzungen erfüllt sein.)

    -mt
    Den Code mit der 'Thread-Safe-Lib' übersetzen, d.h. den Compiler dazu zwingen,
    den Code so zu übersetzen, dass Thread-Befehle unterstützt werden.

    -nodeflibs
    Bindet Standard-Bibliotheken nicht ein; alle Lib's müssen manuell mit INCLIB
    geladen werden, und die Prozeduren darin mit DECLARE deklariert werden.

    -x [Name]
    Legt den Namen der Enddatei fest, also den der EXE, LIB oder DLL.

    Informationen
    -v
    Mit diese Option gibt der Kompiler erweiterte Informationen während des Kompilierens
    auf der Konsole aus.

    -version
    Zeigt die aktuelle Programmversion des Kompilers.

    -w [Wert]
    Setze minimale Warnungstufe (Vermutlich 1-3?)

    -profile
    Das Programm wird nach Beendigung die Datei profile.txt erstellen, die alle Timing-Ergebnisse
    für Funktionsaufrufe enthält.
    Diese Technik nennt man auch Profiling.

    -maxerr [Anzahl]
    Übersetzung des Codes beenden, wenn [Anzahl] Fehler aufgetreten sind

    -map [Name]
    Link-Map als Datei [Name] speichern

    Unterschiede (zu QB)

    Erstellt 32-Bit Anwendungen anstelle von 16-Bit-Anwendungen oder nur interpretierten
    Programmen.
    Der Compiler ist für mehrere Plattformen verfügbar wie z.B. Linux, DOS und Windows.
    Auch auf der X-Box sind spezielle FB-Programme ausführbar.

    FreeBASIC ist 100% OpenSource und verwendet ausschließlich OpenSource-Software.
    Siehe auch


freeBASIC Dialektformen

Seit freeBASIC v0.17 existiert die Kommandozeilenoption -lang.
Diese wird verwendet, um den Kompatibilitätsmodus auf verschiedene Versionen von freeBASIC einzustellen.

Das Kommando -lang benötigt einen Parameter, der angibt, mit welchem Kompatibilitätsmodus kompiliert werden soll:
Option | Beschreibung
"fb" | Freebasic Kompatibilität (Standard)
"deprecated" | Kompatibilität zu früheren Versionen von freeBASIC
"qb" | QBASIC Kompatibilität
Die "-lang"-Option wurde nötig, um Objektorientierung und andere Features in freeBASIC zu ermöglichen, ohne die Abwärtskompatibilität zu QB oder zu Quellcodes für ältere Versionen von freeBASIC aufgeben zu müssen, ohne dabei viele Verschiedene Versionen entwickeln zu müssen.

Um alte GW-BASIC und QB(ASIC) Quellcodes ohne größere Änderungen kompilieren zu können, geben Sie die Kommandozeile
-lang qb
an.

Um Codes zu kompilieren, die für freeBASIC v0.16 oder älter geschrieben wurden, geben Sie die Kommandozeile
-lang deprecated
an.

Der Modus
-lang fb
ist der Standard-Modus. Diese Zeile muss (noch) nicht explizit angegeben werden. Sie unterscheidet sich von der 'deprecated'-Variante durch diese Dinge:

-lang fb

Nicht mehr unterstützt
  1. Implizite Variablen
    Alle Variablen müssen explizit deklariert werden, d.h. eine Variable kann nur benutzt werden, wenn sie zuvor mit DIM, COMMON, STATIC oder EXTERN deklariert wurde.
  2. Suffixe (! # $ % &)
    Suffixe sind nur noch in nummerischen Konstanten erlaubt, allerdings wird empfohlen, stattdessen die Type-Casting-Funktionen (siehe CAST) oder die Suffixe f (single), d (double), ll (longint), ul (uinteger), ull (ulongint) zu verwenden.
  3. DEFxxx
    Da keine impliziten Variablen mehr existieren, sind auch diese Schlüsselwörter obsolet; sie wurden entfernt.
    AS Typ muss also immer angegeben werden (mit Ausnahme von Konstanten, bei denen der Datentyp automatisch gewählt wird; siehe dazu CONST.
  4. BYREF
    Alle Variablen werden standardmäßig BYVAL übergeben.
    Geben Sie die Kommandozeilenoption
    -w pedantic
    an, um Warnungen für jede Deklaration zu bekommen, bei der nicht explizit festgelegt wurde, ob eine Variable ByVal oder ByRef übergeben wird.
  5. OPTION
    • Benutzen Sie #UNDEF anstelle von NOKEYWORD
    • Der ESCAPE-Standard wurde wieder entfernt. Um einen String mit ESCAPE- Sequenzen zu behandeln, stellen Sie einem String ein '!' voran, und benutzen Sie die -w pedantic Option, um auf mögliche Escape-Sequenzen zu prüfen. Beispiel: !"eine Escape-Sequenz \n\r"
    • EXPLICIT wird nicht mehr benötigt; Siehe 1).
    • BYVAL wird nicht mehr benötigt; Siehe 4).
    • Benutzen Sie REDIM anstelle von DYNAMIC, um dynamische Arrays zu erstellen, oder geben Sie bei der Dimensionierung keine Indizes an:
      DIM array() AS SomeType
    • Geben Sie explizit die untere Arraygrenze an, und verzichten Sie auf BASE.
    • Deklarieren Sie jede Prozedur explizit als PRIVATE und verzichten Sie auf die Option.
  6. Punkte in Symbolnamen
    Punkte in Symbolnamen sind nicht mehr zulässig. Benutzen Sie stattdessen NAMESPACE.
  7. GOSUB/RETURN
    Verschachtelte Prozeduren könnten in Zukunft möglich sein.
  8. ON...GOSUB, ON...GOTO
    Benutzen Sie SELECT CASE AS CONST anstelle dieser Anweisungen
  9. ON ERROR, RESUME
    Alle Anweisungen können als Funktionen genutzt werden, um Laufzeitfehler abzufragen.
    Beispiel:
    IF OPEN( "text" FOR INPUT AS #1 ) <> 0 THEN ...
  10. In Kommentare eingebundene Meta-Befehle
    Die Metabefehle '$DYNAMIC, '$STATIC, '$INCLUDE, '$INCLIB existieren nicht mehr.
    Benutzen Sie #INCLUDE bzw. #INCLIB, um diese Befehle zu ersetzen.
    Zu '$DYNAMIC und '$STATIC siehe Punkt 5.
  11. CALL und LET
    Entfernen Sie diese Anweisungen
  12. nummerische Labels
    Labels, die nur aus einer Zahl bestehen, werden nicht mehr unterstützt.

-lang deprecated

Unterstützt
Alles, das bereits in freeBASIC v0.16 unterstützt wurde, mit ausnahem von ON...GOSUB, ON...GOTO und ON...GOSUB (sogar auf dem Modullevel)

nicht mehr Unterstützt
  1. Klassen
    Da Punkte in Symbolnamen erlaubt sind, ist es zu schwierig, dieses Feature zu implementieren.
  2. Operator overloading
    Da Punkte in Symbolnamen erlaubt sind, ist es zu schwierig, dieses Feature zu implementieren.
Die Option
-lang deprecated
wurde bereitgestellt, um Code einfach von einer Entwicklungs-Version in die nächste zu upgraden. Sie wird möglicherweise in einem Major-Release wie FreeBasic 1.0 entfernt werden.

-lang qb

Unterstützt
Alles, das im fb-Modus nicht erlaubt ist. Außerdem:
  1. CALL kann verwendet werden, um Forward- Referencing bei Funktionen zu realisieren.
    (Feature in Arbeit...)
  2. SHARED kann innerhalb von Prozeduren eingesetzt werden.
    (Feature in Arbeit...)
  3. Variable Scope
    Alle Variablen, ob implizit oder explizit deklariert werden im Scope der Prozedur alloziert, wie in QB.

Nicht unterstützt
  1. Multi-Threading
    Die THREADxxx, MUTEXxxx und CONDxxx-Anweisungen können nicht eingesetzt werden.
    Siehe THREADCREATE.
  2. Klassen und Namespaces
  3. Prozedur- und Operator-Overloading (Siehe OVERLOAD)
  4. SCOPE-Blöcke (siehe SCOPE)
  5. EXTERN-Blöcke
  6. Variablen-Initiatoren
    Alle Variablen werden auf den Scope der Prozedur verschoben (wie in QB), so dass lokale Initiatoren schwierig zu implementieren sind.
Die Option
-lang qb
wird in allen Folgeversionen von freeBASIC erhalten bleiben.


Liste der nicht unterstützten Schlüsselwörter

Diese Befehle werden nicht unterstützt, weil sie spezifisch für QuickBASIC waren;
sie werden als bisher unwichtig eingestuft, da es effizientere Programmiermöglichkeiten
gibt, oder sie ihre Umsetzung nicht wert sind. Einige Befehle haben extra angegebene
Gründe, warum sie nicht unterstützt werden.

CALL ABSOLUTE
CALL INTERRUPT
CALLS
COM
CVDMBF
CVSMBF
DEF FN
DEF SEG
ERDEV
ERDEV$
ERL
FIELD
FILEATTR
FILES
IOCTL
IOCTL$
KEY
KEY(n)
LIST
LPOS
LPRINT
MKDMBF$
MKSMBF$
OFF
ON
ON COM(n)
ON EVENT
ON KEY(n)
ON PEN
ON PLAY(n)
ON STRIG(n)
ON TIMER(n)
ON UEVENT
OPEN COM
PEN
PLAY (Ereignisverfolgung)
PLAY (Musik)
PLAY(n)
SEG
SETMEM
SIGNAL
SOUND
STICK
STRIG
TROFF
TRON
UEVENT
VARPTR$
VARSEG

  • CALL ABSOLUTE:

    Unsupported. Type: statement

    Reason: This functions is redundant due to inline assembly.

  • CALL INTERRUPT:

    Unsupported. Type: statement

    Reason: This functions is platform dependant on DOS and intel x86 platforms giving no reason for it to be supported on other platforms.

  • COM:

    Unsupported. Type: statement

    Reason: user mode apps can't access IO ports directly.

  • CVDMBF:

    Unsupported. Type: function

  • CVSMBF:

    Unsupported. Type: function

  • DEF FN:

    Unsupported. Type: statement

  • DEF SEG:

    Unsupported. Type: statement

  • ERDEV:

    Unsupported. Type: function

  • ERDEV$:

    Unsupported. Type: function

  • ERL:

    Unsupported. Type: function

    Reason: Probably because this returns the line number after an error where this is more of an interprer feature and FreeBasic is a compiler only. This would need more debugging symbols to be inserted mostly causing bloat for little gain.

  • FIELD:

    Unsupported. Type: statement Category: File

    reason: most hacked statement ever, use records instead. See GET #, PUT #.

  • FILEATTR:

    Unsupported. Type: function Category: File

    reason: depends on internal tables

  • FILES:

    Unsupported. Type: statement Category: File

    reason: use DIR$ instead.

  • IOCTL:

    Unsupported. Type: statement

  • IOCTL$:

    Unsupported. Type: function

  • KEY:

    Unsupported. Type: statement

  • KEY(n):

    Unsupported. Type: statement

  • LIST:

    Unsupported.

  • LPOS:

    Unsupported. Type: function

  • LPRINT:

    Unsupported. Type: statement Category: Misc

    reason: no direct printing, use proper API's instead.

  • MKDMBF$:

    Unsupported. Type: function

  • MKSMBF$:

    Unsupported. Type: function

  • OFF:

    Unsupported. Type: keyword

  • ON:

    Unsupported. Type: keyword

  • ON COM(n):

    Unsupported. Type: statement

  • ON event:

    Unsupported. Type: statement

  • ON KEY(n):

    Unsupported. Type: statement

  • ON PEN:

    Unsupported. Type: statement

  • ON PLAY(n):

    Unsupported. Type: statement

  • ON STRIG(n):

    Unsupported. Type: statement

  • ON TIMER(n):

    Unsupported. Type: statement

  • ON UEVENT:

    Unsupported. Type: statement

  • OPEN COM:

    Unsupported. Type: statement

  • PEN:

    Unsupported. Type: function

  • PEN:

    Unsupported. Type: statement

  • PLAY (Event Trapping):

    Unsupported. Type: statement

  • PLAY (Music):

    Unsupported. Type: statement

    Too specific and not needed by most. If anybody wants this functionality a music library would be more practical. This was barely practical in the 80's with the pc speaker. Anyone who wants this feature should rethink motives, or be shot.

  • PLAY(n):

    Unsupported. Type: function

  • SETMEM:

    Unsupported. Type: function

  • SIGNAL:

    Unsupported. Type: keyword

    Reason: This functions is platform dependant on DOS and intel x86 platforms, and redundant due to more efficient network models.

  • SOUND:

    Unsupported. Type: statement Category: Misc

    Reason: Uses the pc speaker, not very useful.

  • STICK:

    Unsupported. Type: function

  • STRIG:

    Unsupported. Type: function

  • STRIG:

    Unsupported. Type: statement

  • TROFF:

    Unsupported. Type: statement

  • TRON:

    Unsupported. Type: statement

  • UEVENT:

    Unsupported. Type: statement

  • VARPTR$:

    Unsupported. Type: function

  • VARSEG:

    Unsupported. Type: function


Serial Numbers

Eine Serial Number ist eine Zahl, die ein Datum und eine Zeit in dem selben Format
enthält, das schon bei QBX PDS und VBDOS verwendet wurde.
Diese Zahl setzt sich aus zwei Teilen zusammen. Der erste Teil ist der
ganzzahlige Teil, der die Anzahl der Tage, die seit dem 30.12.1899 um 00:00
vergangen sind, angibt.
Der zweite Teil, der Nachkommateil, gibt die Uhrzeit an. Sie ist dabei so zu
behandeln, als gäbe sie an, wie viele Prozent des Tages bereits vergangen sind;
0.5 bedeutet also, die Hälfte des Tages ist vergangen, es ist also 12:00 Uhr.

Da diese Serials also auf sehr genaue Nachkommawerte angewiesen werden, werden
sie in DOUBLE-Variablen ausgegeben. Würde man eine Serial Number also in einer
INTEGER-Variablen speichern, ginge die Information über die Uhrzeit
verloren.

FB-Serial Numbers sind nicht, wie in VBDOS, auf Daten zwischen 1753 und 2078 begrenzt.

Um FB's Serial-Funktionen nutzen zu können, müssen Sie die Datei vbcompat.bi in
Ihren Quellcode einbinden, z.B. mit INCLUDE.

Eine Serial Number kann erstellt werden mit:
  • NOW

  • TIMESERIAL - DATESERIAL

  • DATEVALUE - TIMEVALUE

    • Die Funktionen YEAR, MONTH, WEEKDAY, DAY, HOUR, MINUTE und SECOND ermöglichen es,
    die einzelnen Komponenten der Serial Number wiederherzustellen.
    Die FORMAT-Funktion unterstützt Formatierungsausdrücke, die es ermöglichen, eine
    Serial Number in einem Format ausgeben, das für einen Menschen lesbar ist.
    FORMAT

    Unterschiede
    Zu QB:
  • Time Serials existieren erst seit QBX 7.1

  • FB-Serial Numbers sind nicht, wie in VBDOS, auf Daten zwischen 1753 und 2078 begrenzt.

    • zu früheren Versionen von freeBASIC
  • Time Serials werden erst seit freeBASIC v0.15 unterstützt

    • Siehe auch:
    NOW,
    DATESERIAL, DATEVALUE,
    TIMESERIAL, TIMEVALUE,
    YEAR, MONTH, DAY, WEEKDAY,
    HOUR, MINUTE, SECOND,
    MONTHNAME, WEEKDAYNAME,
    DATEDIFF, DATEPART, DATEADD,
    FORMAT,
    Serial Numbers