Themengebiete

Arrays

Arrays

- DIM: statisches Array anlegen

- REDIM: dynamisches Array anlegen oder seine Größe ändern

- REDIM PRESERVE: Array redimensionieren, ohne seine Elemente zu löschen

- ERASE: Array löschen

- LBOUND / UBOUND: untere / obere Grenze des Arrays

Tutorial: Variablen, Datentypen und Arrays

Hinweis: Werden Arrays an Unterprogramme übergeben, geschieht dies immer BYREF. Wird versucht mit der Klausel BYVAL die Übergabeart zu verändern, führt das zu einem Compilerfehler.

Beispiele im 'Freebasicverzeichnis'\examples\manual\array

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

Benutzereingaben

Tastatureingabe:

- INPUT (Anweisung), INPUT (Funktion): Zeicheneingabe

- WINPUT: Zeicheneingabe mit Unterstützung von wide characters

- LINE INPUT: Einlesen einer kompletten Zeile

- INKEY: Taste aus dem Tastaturpuffer holen

- MULTIKEY: Status einer Taste überprüfen

- GETKEY: auf Tastendruck warten

Maus:

- GETMOUSE: Maus abfragen

- SETMOUSE: Maus setzen

Joystick:

- GETJOYSTICK: Joystick abfragen

- STICK, STRIG: Joystickabfrage in QB

Code-Beispiele

- Geheime Passworteingabe

- Passworteingabe Konsole

- Graphical User Interface für die Konsole

- inputUsing: erweiterte INPUT-Maske

- mehr Code-Beispiele im Forum: Maus und Tastatur

weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\input

Letzte Bearbeitung: 19.05.12
Zur Onlinefassung des Eintrags

Betriebssystem-Anweisungen

Programm starten / beenden

- END , SYSTEM , STOP: Programm beenden

- CHAIN , EXEC , RUN: externes Programm starten

aktuellen Ordnerpfad anzeigen und ändern

- CURDIR: aktuelles Arbeitsverzeichnis anzeigen

- EXEPATH: Verzeichnis des Programms anzeigen

- CHDIR: Arbeitsverzeichnis wechseln

Dateiinformationen

- FILEATTR: Dateiattribute abfragen

- FILEDATETIME: Datum der letzten Änderung ermitteln

- FILELEN: Dateilänge ermitteln

- FILEEXISTS: Datei auf Existenz prüfen

- DIR: Ordner nach Dateien durchsuchen

Dateien / Ordner erstellen und löschen

- FILECOPY: Datei kopieren

- NAME: Datei umbenennen

- KILL: Datei löschen

- MKDIR: Ordner erstellen

- RMDIR: Ordner löschen

Verschiedenes:

- SETENVIRON: Umgebungsvariable setzen

- ENVIRON: Umgebungsvariable abfragen

- COMMAND: Kommandozeilenparameter abfragen

- SHELL: Systemkommando ausführen

- WINDOWTITLE: Fenstertitel ändern

weitere Funktionen: siehe Dateien (Files)

Code-Beispiele: System

weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\system

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

Bit-Operatoren

Bit-Operatoren

Schlüsselwort

Bedeutung

Ausdruck1

Ausdruck2

Ergebnis

AND

Sind beide Bits gesetzt?

0

0

0

0

1

0

1

0

0

1

1

1

OR

Ist mind. ein Bit gesetzt?

0

0

0

0

1

1

1

0

1

1

1

1

XOR

Ist genau ein Bit gesetzt?

0

0

0

0

1

1

1

0

1

1

1

0

EQV

Sind beide Bits gleich?

0

0

1

0

1

0

1

0

0

1

1

1

IMP

Folgt Ausdruck2 auf Ausdruck1?

0

0

1

0

1

1

1

0

0

1

1

1

NOT

Ist das Bit nicht gesetzt?

0

1

1

0

ANDALSO

Sind beide Ausdrücke wahr?

false

-

false

true

false

false

true

true

true

ORELSE

Ist mind. ein Ausdruck wahr?

false

false

false

false

true

true

true

-

true

Im Fall von ANDALSO und ORELSE bedeutet false = 0 und true <> 0; im Rückgabewert ist true = -1. Die mit - gekennzeichneten Stellen bedeuten, dass dieser Teilausdruck nicht ausgewertet wird.

Ausdrücke und Operatoren
siehe logische Operatoren

Bit-Manipulationen

- BIT , BITSET , BITRESET

- LOBYTE , HIBYTE

- LOWORD , HIWORD

Beispiele im 'Freebasicverzeichnis'\examples\manual\bits
sowie in 'Freebasicverzeichnis'\examples\manual\operator

Letzte Bearbeitung: 27.06.10
Zur Onlinefassung des Eintrags

Dateien (Files)

Dateibehandlung

- BLOAD

- BSAVE

- OPEN (Datei)

- CLOSE # , RESET

Dateimodus

- INPUT

- OUTPUT

- APPEND

- RANDOM

- BINARY

Weitere Parameter beim Öffnen einer Datei

- Zugriffsrechte: ACCESS { READ | WRITE | READ WRITE }

- Zugriffssperre: LOCK { READ | WRITE | READ WRITE }; siehe auch LOCK , UNLOCK

- Datei(text)format: ENCODING { "ASCII"|"UTF-8" | "UTF-16" | "UTF-32" }

Daten lesen

- GET #

- INPUT #

- LINE INPUT #

Daten schreiben

- PUT #

- PRINT #, PRINT USING

- WRITE #

Lese- / Schreibposition

- SEEK (Funktion) , SEEK (Anweisung)

- LOC

Sonstiges

- FREEFILE: nächste freie Dateinummer finden

- EOF: überprüfen, ob das Ende der Datei erreicht wurde

- LOF: Länge einer geöffneten Datei zurückgeben

weitere Funktionen: siehe Betriebssystem-Anweisungen

Code-Beispiele: Dateien und Laufwerke

Weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\fileio

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

Datentypen umwandeln

Datentypen umwandeln

- CAST , CPTR

- CBYTE , CUBYTE

- CSHORT , CUSHORT

- CINT , CUINT

- CLNG , CULNG

- CLNGINT , CULNGINT

- CSIGN , CUNSG

- CSNG , CDBL

Umwandlung zwischen Zahlen und Strings

- Text in Zahl umwandeln: VAL , VALINT , VALUINT , VALLNG , VALULNG

- Zahl in Text umwandeln: STR , WSTR

Andere Zahlensysteme

- BIN, WBIN

- OCT, WOCT

- HEX, WHEX

Erstellen einer binären Kopie

- Text in Zahl umwandeln: CVSHORT , CVI , CVL , CVLONGINT , CVS , CVD

- Zahl in Text umwandeln: MKSHORT , MKI , MKL , MKLONGINT , MKS , MKD

ASCII-Code umwandeln

- ASC

- CHR , WCHR

- Tutorial: Die ASCII-Steuerzeichen in FreeBASIC

- Code-Beispiel: ASCII-Tabelle anzeigen lassen

Formatierte Ausgabe

- FORMAT

- siehe auch: PRINT USING

Beispiele im 'Freebasicverzeichnis'\examples\manual\casting

Letzte Bearbeitung: 17.08.10
Zur Onlinefassung des Eintrags

Datentypen und Deklarationen

Numerische Datentypen:

- BYTE , UBYTE

- SHORT , USHORT

- INTEGER , UINTEGER

- LONG , ULONG

- LONGINT , ULONGINT

- SINGLE , DOUBLE

Zeichenketten:

- STRING

- WSTRING

- ZSTRING

Siehe auch:
Tabellarische Übersicht der Standard-Datentypen

Konstanten:

- CONST

- Tutorial: CONST vs. #DEFINE

Aufzählung:
ENUM

Benutzerdefinierte Datentypen:

- TYPE (UDT) , TYPE (Funktion) , TYPE (Forward Referencing)

- UNION

- siehe auch Bitfelder

Variablen dimensionieren:

- DIM , AS

- SHARED , STATIC , UNSIGNED

- VAR

- SCOPE

- siehe auch Kapitel Variablen-Initiatoren in 'Ausdrücke und Operatoren'

Tutorials:
Variablen, Datentypen und Arrays
Variablen initialisieren

Beispiele im 'Freebasicverzeichnis'\examples\manual\datatype

Letzte Bearbeitung: 15.07.10
Zur Onlinefassung des Eintrags

Datum und Zeit

Systemzeit und -datum des PCs

- Systemzeit lesen und setzen: TIME , SETTIME

- Systemdatum lesen und setzen: DATE , SETDATE

Zeitmessung

- TIMER

- CPU-Takte: Code-Beispiel Counter.Bas von MichaelW

Zeitverzögerung: SLEEP

Spezielle Berechnungen von Datum und Uhrzeit

- TIMESERIAL , DATESERIAL

- ISDATE , DATEVALUE , TIMEVALUE

- DATEADD , DATEDIFF

- NOW , DATEPART

- siehe auch: Date Serials

Datums- und Zeitformat

- SECOND , MINUTE , HOUR

- DAY , WEEKDAY , WEEKDAYNAME

- MONTH MONTHNAME

- YEAR

Ausgabeformat: FORMAT

Code-Beispiele:
Windows-Uptime ermitteln
Wochentagsausgabe in verschiedenen Sprachen
UNIX-Timestamp

weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\dates
sowie in 'Freebasicverzeichnis'\examples\manual\proguide\dates.bas

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

Fehlerbehandlung, Debugging

Fehlerbehandlung

- ERR (Funktion) , ERR (Anweisung)

- ERFN , ERMN

- ERROR (Anweisung) , #ERROR

- deprecated: ON ERROR , LOCAL , RESUME , ERL

- siehe auch: Fehler-Behandlung in FreeBASIC

Debugging
Die folgenden Debugging-Befehle funktionieren nur, wenn mit der Kommandozeilenoption -g compiliert wird.

- ASSERT

- ASSERTWARN

Code-Beispiele:

- Debug-Info anzeigen

- Log-Funktion für Debugging

Weitere Beispiele
zur Fehlerbehandlung: im 'Freebasicverzeichnis'\examples\manual\error
zum Debugging: im 'Freebasicverzeichnis'\examples\manual\debug

Letzte Bearbeitung: 25.08.10
Zur Onlinefassung des Eintrags

Grafik

Grafikbildschirm

- SCREENRES, SCREEN: Grafikbidschirm initialisieren

- SCREENINFO: Informationen über den aktuellen Videomodus

- SCREENLIST: Liste der verfügbaren Auflösungen

- SCREENCONTROL: Einstellungen der gfxlib

- SCREENSET: aktive und sichtbare Bildschirmseite setzen

- SCREENCOPY, FLIP, PCOPY: Bildschirmseite kopieren

- SCREENLOCK, SCREENUNLOCK: Zugriff auf Bildschirmseite (ent)sperren

- SCREENSYNC: auf Bildschirmaktualisierung warten

- SCREENPTR: Pointer auf den Datenbereich der Bildschirmseite

- SCREENEVENT: Informationen über ein Systemereignis

- SCREENGLPROC: Adresse einer OpenGL-Prozedur

Farbe

- COLOR (Anweisung), COLOR (Funktion): Farbe setzen / auslesen

- PALETTE: Farbpalette bearbeiten

- RGB , RGBA: RGB(A)-Farbton umrechnen

zeichnen

- PSET (Grafik), PRESET (Grafik): einzelnen Punkt setzen

- LINE (Grafik): Strecke oder Rechteck zeichnen

- CIRCLE: Kreis oder Ellipse zeichnen

- PAINT: Bildausschnitt füllen

- DRAW (Grafik): Zeichnen mittels Grafikcursorbefehlen

- DRAW STRING: Text ausgeben

- POINT: Pixelinformationen abrufen

Methoden (für PUT und DRAW STRING)

- PSET

- PRESET

- AND

- OR

- XOR

- ADD

- TRANS

- ALPHA

- CUSTOM

Image

- IMAGECREATE, IMAGEDESTROY: Grafikpuffer erstellen bzw. zerstören

- IMAGECONVERTROW: Pixel kopieren und konvertieren

- IMAGEINFO: Informationen über einen Grafikpuffer

- GET (Grafik), PUT (Grafik): Grafik speichern und setzen

Sonstiges

- CLS: Bildschirm löschen

- VIEW (Grafik): Clipping-Grenzen setzen

- WINDOW: physischen Darstellungsbereich festlegen

- PMAP: Bildschirmkoordinaten umrechnen

Weitere Informationen:

- Interne Pixelformate

- Standard-Paletten

- Interne Treiber

- Geschwindigkeit und Größe

Code-Beispiele:
Grafik und Fonts

Tutorials:
Grafikprogrammierung mit FreeBasic

weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\gfx

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

Hardware-Zugriffe

Gerät zum Datenzugriff öffnen

- OPEN COM

- OPEN LPT

Port-Zugriff

- INP

- OUT

- WAIT

Zugriff auf den Drucker

- LPOS

- LPRINT

- siehe auch PRINT # in Zusammenhang mit OPEN LPT

Code-Beispiele:

- Statusleitungen der seriellen Schnittstelle über WIN-API steuern

- Schnittstellen ermitteln

Weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\hardware

Letzte Bearbeitung: 09.08.10
Zur Onlinefassung des Eintrags

Kommentare

einzeiliger Kommentar

- REM

- Hochkomma '

mehrzeilige Kommentare

/'
Kommentare, mehrzeilig
'/

Nähere Informationen finden Sie im Referenzeintrag zu REM.

Sonstiges
Bei Verwendung eines Zeilenfortsetzungszeichens _ behandelt der Compiler alle Inhalte nach dem Unterstrich als Kommentar. Da es sich hierbei um ein ungewolltes Verhalten handelt, wird es sich vermutlich in zukünftigen Versionen ändern.

Letzte Bearbeitung: 29.07.11
Zur Onlinefassung des Eintrags

Konsole

- Screen 0 , Screen (Funktion)

- Width (Funktion) , Width (Anweisung)

- View (Text)

- Cls

- Color (Funktion) , Color (Anweisung)

- Print , Print Using

- Write

- Locate (Funktion) , Locate (Anweisung)

- Csrlin , Pos

- Tab , Spc

- Beep

- Open Cons

- Open Err

- Open Pipe

- Open Scrn

Anhang: Titel eines Konsole-Fensters ändern (WinAPI)

Beispiele im Unterverzeichnis \examples\manual\console der FreeBASIC-Installation.

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

Mathematik

Rechenoperationen: + , - , * , / , \
Ausdrücke und Operatoren siehe mathematische Operatoren

Schreibweise: Dezimaltrennzeichen . ; Exponent ^ ; Klammern: ( )

Zahlenformate: siehe Datentypen

Algebraische Funktionen:

- ABS (Absolutbetrag), SGN (Vorzeichen)

- EXP (Potenz zur Basis e), LOG (natürlicher Logarithmus)

- SQR (Quadratwurzel)

- Rundung, Nachkommateil, Rest: INT , CINT , FIX , FRAC , MOD

- Tutorial: Runden in FreeBASIC

Trigonometrie:

- SIN , COS , TAN

- ASIN , ACOS , ATN , ATAN2

- Tutorial: Winkelmodus und Winkelfunktionen

Zufallszahlen: RND , RANDOMIZE

Datum und Uhrzeit: Serial Numbers

Code-Beispiele:
Mathematik
Die Zahl Pi aus der CPU?

Tutorial:
Rechnen mit Vergleichen

weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\math
sowie in 'Freebasicverzeichnis'\examples\real10

Letzte Bearbeitung: 06.07.10
Zur Onlinefassung des Eintrags

Module (Library / DLL)

- Dylibfree

- Dylibload

- Dylibsymbol

- Import, Export

- EXTERN ... END EXTERN

- Namespace, Using

- Public, Private

Tutorial: Erstellen einer DLL mit FreeBASIC

Beispiele im 'Freebasicverzeichnis'\examples\manual\module

Letzte Bearbeitung: 12.05.12
Zur Onlinefassung des Eintrags

Multithreading

Threads organisieren

- THREADCREATE

- THREADWAIT

- THREADCALL

Mutexe

- MUTEXCREATE

- MUTEXDESTROY

- MUTEXLOCK

- MUTEXUNLOCK

conditional variables

- CONDCREATE

- CONDDESTROY

- CONDSIGNAL

- CONDWAIT

- CONDBROADCAST

Tutorial: Arbeiten mit Threads

Beispiele im 'Freebasicverzeichnis'\examples\manual\threads

Letzte Bearbeitung: 18.01.12
Zur Onlinefassung des Eintrags

Pointer (Zeiger)

- POINTER , PTR

- @ (Pointer-Referenzierung) , * (Pointer-Dereferenzierung)

- [ ] (Pointerindizierung)

- -> (Record-Zugriff bei UDTs)

- PEEK , POKE

- STRPTR , SADD

- VARPTR

- PROCPTR

Weitere Informationen: Grundlagen zu Pointern

Letzte Bearbeitung: 13.01.12
Zur Onlinefassung des Eintrags

Präprozessor-Anweisungen

Einbindung anderer Dateien:

- #INCLUDE [ ONCE ]: externen Quellcode einbinden

- #INCLIB: Bibliothek einbinden

- #LIBPATH: Pfad für Bibliotheken hinzufügen

Symbole und Makros:

- #DEFINE: Symbol definieren

- #UNDEF: Symbol löschen

- #MACRO, #ENDMACRO: Makro definieren

- DEFINED: Überprüfen, ob ein Symbol definiert wurde

- Präprozessoren: vordefinierte Symbole

Bedingungen:

- #IF, #ELSEIF, #ELSE, #ENDIF: Bedingung abprüfen

- #IFDEF , #IFNDEF: Definition eines Symbols testen

Debugging:

- #ERROR: Fehlermeldung ausgeben

- #LINE: Zeilennummer und Modulnamen festlegen

- #PRINT: Compilermeldung ausgeben

Sonstiges:

- #LANG: Dialektform festlegen

- #PRAGMA: Compiler-Optionen ändern

Letzte Bearbeitung: 20.08.11
Zur Onlinefassung des Eintrags

Programmablauf

Schleifen:

- FOR ... NEXT, STEP

- WHILE ... WEND

- DO ... LOOP, UNTIL, WHILE

Bedingungsstrukturen:

- IF ... THEN , ELSE, ELSEIF , END IF

- SELECT CASE, CASE, IS, CASE ELSE

- IIF

Kontrollbefehle:

- CONTINUE (Fortsetzung)

- EXIT (Abbruch)

Tutorial: Kontrollstrukturen: Bedingungen, Schleifen usw.

GOTO und GOSUB

- GOTO, GOSUB, RETURN

- ON ... GOTO , ON ... GOSUB

- Tutorial: Guter Programmierstil

Programm anhalten / verzögern: SLEEP

weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\control

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

Prozeduren

Einleitung zu den Prozeduren

Deklaration und Definition

- SUB, FUNCTION

- DECLARE: Deklaration

- OVERLOAD: Prozeduren mit unterschiedlicher Parameterliste

- LIB , ALIAS: Prozedur aus einer Bibliothek

- PUBLIC , PRIVATE: öffentliche und private Prozeduren

- STATIC: Erhaltung der Variablenwerte

- NAKED: speziell für Prozeduren in (Inline-)Assembler

Aufrufkonventionen

- STDCALL: Standard-Aufrufkonvention für FreeBASIC und die Microsoft Win32-API

- CDECL: Konvention vieler C/C++ -Compilern (von rechts nach links)

- PASCAL: PASCAL-Aufrufkonvention (von links nach rechts)

Parameterübergabe:

- Informationen zur Parameterübergabe

- BYVAL (by value), BYREF (by reference)

- ...(Auslassung): variable Argumentenzahl

- VA_ARG, VA_FIRST, VA_NEXT

Aufruf einer Prozedur in älteren BASIC-Dialekten: CALL

Tutorial: Unterprogramme

Prozeduren in UDTs und CLASSes

- CONSTRUCTOR, DESTRUCTOR

- PRIVATE, PROTECTED

- PROPERTY

- THIS

- OPERATOR

Beispiele im 'Freebasicverzeichnis'\examples\manual\procs

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

Speicher

Speicher reservieren:

- ALLOCATE

- CALLOCATE

- DEALLOCATE

- REALLOCATE

Objekte erstellen:

- NEW

- DELETE

Speicheradressen bearbeiten:

- PEEK

- POKE

- CLEAR

Verfügbaren Speicher ermitteln:

- FRE

Beispiele im 'Freebasicverzeichnis'\examples\manual\memory

Code-Beispiel: Informationen über Speicherauslastung (WinAPI)

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

String-Funktionen

Teilstring ausgeben

- LEFT , RIGHT: erste bzw. letzte Zeichen ausgeben

- MID (Funktion): Teilstring ausgeben

String verändern

- MID (Anweisung): Teilstring ändern

- LCASE , UCASE: String in Klein- bzw. Großbuchstaben umwandeln

- TRIM , LTRIM , RTRIM: Zeichen am Anfang bzw. Ende entfernen

- LSET , RSET: String links- bzw. rechtsbündig setzen

String erzeugen

- SPACE , WSPACE: String aus Leerzeichen erzeugen

- STRING (Funktion) , WSTRING (Funktion): String aus vorgegebenen Zeichen erzeugen

Weiteres:

- LEN: Länge des Strings ausgeben

- INSTR , INSTRREV: Teilstring suchen

Tutorial:
Stringmanipulationen

Code-Beispiele:

- StringEx

- StrReplace

- SubStr - Fast ein SplitString

- StringSplit - Fast ein bisschen SubStr

- Sehr schnelle Replace-Funktion

Weitere Beispiele im 'Freebasicverzeichnis'\examples\manual\strings

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

Verschiedenes

Verschiedenes

Verwaltung konstanter Daten

- DATA (Daten festlegen)

- READ (Daten einlesen)

- RESTORE (Datenzeiger setzen)

Programmsteuerung

- LET (Wertzuweisung)

- END (Programmende oder Ende eines Blockes)

- TO (Festlegung eines Bereichs)

- SWAP (Werte zweier Variablen vertauschen)

- ASM (Verwendung des Inline-Assemblers)

Variablenorganisation

- SIZEOF (Speichergröße einer Variablen oder eines Datentyps)

- OFFSETOF (Offset eines Records innerhalb eines UDTs)

- TYPEOF (Datentyp einer Variablen)

Beispiele im 'Freebasicverzeichnis'\examples\manual\misc

Letzte Bearbeitung: 21.04.11
Zur Onlinefassung des Eintrags

Vordefinierte Symbole

__DATE__

Typ: Vordefiniertes Symbol

__DATE__ wird in der ausführbaren Datei zu einem String umgesetzt. Dieser enthält das Kompilier-Datum im Format mm-dd-yyyy.

Beispiel:

PRINT "Dieses Programm wurde erstellt am "; __DATE__; " um "; __TIME__; "."

Ausgabe:

Dieses Programm wurde erstellt am 01-16-2007 um 15:16:22.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.13

Siehe auch:
__DATE_ISO__, __TIME__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

__DATE_ISO__

Typ: Vordefiniertes Symbol

__DATE_ISO__ wird in der ausführbaren Datei zu einem String umgesetzt. Dieser enthält das Kompilier-Datum im Format yyyy-mm-dd. Damit entspricht es der ISO 8601 für Datumsangaben und kann für Datumsvergleiche verwendet werden.

Beispiel:

PRINT "Kompiliert am: " & __DATE_ISO__

IF __DATE_ISO__ < "2011-12-25" THEN
PRINT "Vor Weihnachten 2011 kompiliert."
ELSE
PRINT "Nach Weihnachten 2011 kompiliert."
END IF

Ausgabe:

Kompiliert am: 2011-09-29
Vor Weihnachten 2011 kompiliert.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.24

Siehe auch:
__DATE__, __TIME__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_ARGC__

Typ: Vordefiniertes Symbol

__FB_ARGC__ wird in der ausführbaren Datei 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

Hinweis:
__FB_ARGC__ ist nur auf Hauptmodulebene bekannt und funktioniert nicht in Unterprogrammen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FB_ARGV__, COMMAND, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 11.06.11
Zur Onlinefassung des Eintrags

__FB_ARGV__

Typ: Vordefiniertes Symbol

__FB_ARGV__ wird in der ausführbaren Datei 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__ )

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

SLEEP
RETURN 0
END FUNCTION

Beispiel 2:

DECLARE SUB mySub(argc AS INTEGER = 0, argv AS ZSTRING PTR PTR = 0)

PRINT "Hauptprogramm:"
PRINT "ARGC: " & __FB_ARGC__
PRINT "ARGV: " & *__FB_ARGV__[0]
PRINT

mySub(__FB_ARGC__, __FB_ARGV__)   'mit Übergabeparametern aufrufen
PRINT

mySub                                                 'ohne Übergabeparameter aufrufen
PRINT

SLEEP

'#################################################
SUB mySub(argc AS INTEGER = 0, argv AS ZSTRING PTR PTR = 0)
IF argc <> 0 AND argv <> 0 THEN
PRINT WSTR("Unterprogramm mit Übergabe:")
PRINT "ARGC: " & argc
PRINT "ARGV: " & *argv[0]
ELSE
PRINT WSTR("Unterprogramm ohne Übergabe:")
'Print "ARGC: " & __FB_ARGC__         '__FB_ARGC__ und __FB_ARGV__ sind
'Print "ARGV: " & *__FB_ARGV__[0]    'nur im Hauptprogramm zugänglich
END IF
END SUB

Hinweis:
__FB_ARGV__ ist nur auf Hauptmodulebene bekannt und funktioniert nicht in Unterprogrammen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FB_ARGC__, COMMAND, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_BACKEND__

Typ: Vordefiniertes Symbol

__FB_BACKEND__ gibt an, ob Maschinencode ('gas') oder C-Emitter-Code ('gcc') erzeugt wurde. Dies lässt sich mit dem Compilerflag '-gen' ausgewählt.

Beispiel:

IF __FB_BACKEND__ = "gcc" THEN
PRINT "Der Code wurde mit Hilfe des C-Emitters umgesetzt."
ELSEIF __FB_BACKEND__ = "gas"
PRINT "Der Code wurde direkt zu Maschinencode umgesetzt."
END IF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.22.0

Siehe auch:
DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_BIGENDIAN__

Typ: Vordefiniertes Symbol

Dieses Symbol ohne Wert wird immer dann definiert, wenn für ein System compiliert 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__
'... Anweisungen nur für big-endian-Systeme
#ELSE
'... Anweisungen nur für little-endian-Systeme
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_BUILD_DATE__

Typ: Vordefiniertes Symbol

__FB_BUILD_DATE__ gibt das Datum (mm-dd-yyyy) aus, an dem der FB-Compiler erstellt wurde.

Beispiel:

PRINT "Der FB-Compiler wurde erstellt am:" & __FB_BUILD_DATE__

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
__FB_SIGNATURE__, __DATE__, Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_CYGWIN__

Typ: Vordefiniertes Symbol

__FB_CYGWIN__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Code in der Cygwin-Umgebung umgesetzt werden soll.

Beispiel:

#IFDEF __FB_CYGWIN__
... Anweisungen nur für Cygwin ...
#ELSE
... Anweisungen nicht für Cygwin ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_DARWIN__

Typ: Vordefiniertes Symbol

__FB_DARWIN__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Code in der Version für den Darwin-Compiler umgesetzt werden soll.

Beispiel:

#IFDEF __FB_DARWIN__
... Anweisungen nur für Darwin ...
#ELSE
... Anweisungen nicht für Darwin ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.21

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_OPENBSD__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FB_ERR__, __FB_MT__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__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 #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für DOS 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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- existiert seit FreeBASIC v0.9 (damals als FB__DOS).

- wurde in FreeBASIC v0.13 zu __FB_DOS__ umbenannt.

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__, , __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__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 "Fehlerüberprüfung wurde deaktiviert!"
#ELSEIF __FB_ERR__ = 1
#PRINT "Die Überprüfung einfacher Fehler wurde aktiviert!"
#ELSEIF __FB_ERR__ = 3
#PRINT "Eine QBasic-artige Fehlerüberprüfung wurde aktiviert!"
#ELSEIF __FB_ERR__ = 7
#PRINT "Alle Fehlerbehandlungsroutinen wurden aktiviert!"
#ELSE
#PRINT "Es wurde ein unbekanntes Fehler-Level gesetzt!"
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FB_MT__, __FB_DEBUG__, DEFINE, Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_FPMODE__

Typ: Vordefiniertes Symbol

__FB_FPMODE__ ist ein Symbol mit vordefiniertem Wert "fast". Dieses Symbol wird definiert, wenn der Compiler 'SSE floating point arithmetics' kompiliert. Dazu ist die Compiler-Option -fpu SSE nötig.

Beispiel:

#IFDEF __FB_FPMODE__ = "fast"
'... Anweisungen für "fast" floating point instructions
#ELSE
'... Anweisungen für "normal" floating point instructions
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht __FB_FPMODE__ nicht zur Verfügung.

Siehe auch:
Compileroption -fmode [FAST | PRECISE], __FB_SSE__, __FB_FPU__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_FPU__

Typ: Vordefiniertes Symbol

__FB_FPU__ ist ein Symbol, das als "sse" definiert ist, wenn mit 'SSE floating point arithmetics' kompiliert wurde. Ansonsten hat es den Wert "x87".

Beispiel:

#IFDEF __FB_FPU__ = "sse"
' ... Anweisungen für SSE
#ELSE
' ... Anweisungen für andere
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.20

Siehe auch:
Compileroption -fpu [FPU|SSE], __FB_SSE__, __FB_FPMODE__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_FREEBSD__

Typ: Vordefiniertes Symbol

__FB_FREEBSD__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Code für FreeBSD umgesetzt werden soll.

Beispiel:

#IFDEF __FB_FREEBSD__
... Anweisungen nur für FreeBSD ...
#ELSE
... Anweisungen nicht für FreeBSD ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

__FB_LANG__

Typ: Vordefiniertes Symbol

__FB_LANG__ wird beim Kompilieren in eine Zeichenkette umgesetzt, die angibt, nach welchen FB-Dialektregeln kompiliert wird. Standardmäßig wird __FB_LANG__ auf "fb" gesetzt. Der Wert kann durch folgende Methoden geändert werden:

- die Compileroption -lang

- die Compileroption -forcelang

- die Anweisung #lang

- der Metabefehl '$lang

Der Rückgabewert ist einen String mit einem der folgenden Werte:

Wert

Beschreibung

fb

kompatibel zu FreeBASIC ab Version 0.17

qb

kompatibel zu QBASIC

fblite

kompatibel zu FreeBASIC, mit erhöhter QBASIC-Kompatibilität

deprecated

kompatibel zu FreeBASIC bis Version 0.16

Beispiel:

#IFDEF __FB_LANG__
#IF __FB_LANG__ <> "fb"
OPTION EXPLICIT
#ENDIF
#ELSE
OPTION EXPLICIT
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
LANG (Meta), __FB_VERSION__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.06.11
Zur Onlinefassung des Eintrags

__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 #IFDEF 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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- existiert seit FreeBASIC v0.9 (damals als FB__LINUX)

- wurde in FreeBASIC v0.13 zu __FB_LINUX__ umbenannt

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_MAIN__

Typ: Vordefiniertes Symbol

__FB_MAIN__ ist ein Symbol ohne Wert. Dieses Symbol wird definiert, sobald die Symbole und Makros des Hauptmoduls übersetzt werden. Es ist eine vom Compiler verwaltete Variable.

__FB_MAIN__ ist im Hauptmodul definiert und in anderen Modulen NICHT definiert.

Das Hauptmodul wird vom Compiler bestimmt. Es ist entweder die erste in der Befehlszeile aufgeführte Quelldatei oder ausdrücklich per Compileroption '-m' in der Befehlszeile angegeben.

Beispiel:

#IFDEF __FB_MAIN__
#PRINT Das Hauptmodul wird kompiliert
#ELSE
#PRINT Ein Zusatzmodul wird kompiliert
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.15

Siehe auch:
DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_MIN_VERSION__

Syntax: __FB_MIN_VERSION__(major, minor, patch)
Typ: Vordefiniertes Symbol

Dieses Makro vergleicht die Version des verwendeten Compilers mit den angegebenen Daten. Es gibt -1 aus, wenn die Version des Compilers größer oder gleich den Spezifikationen ist, bzw. 0, wenn die Version kleiner ist. Damit kann sichergestellt 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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- existiert seit FreeBASIC v0.13

- existiert in der Dialektform -lang qb seit FreeBASIC v0.24

Siehe auch:
__FB_VERSION__, __FB_VER_MAJOR__, __FB_VER_MINOR__, __FB_VER_PATCH__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__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 multi-threaded library verwendet
#ELSE
#PRINT SINGLE-threaded library verwendet
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FB_DEBUG__, __FB_ERR__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_NETBSD__

Typ: Vordefiniertes Symbol

__FB_NETBSD__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Code in der Version für den NetBSD-Compiler umgesetzt werden soll.

Beispiel:

#IFDEF __FB_NETBSD__
... Anweisungen nur für NetBSD ...
#ELSE
... Anweisungen nicht für NetBSD ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.21

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

__FB_OPENBSD__

Typ: Vordefiniertes Symbol

__FB_OPENBSD__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Code in der Version für den OpenBSD-Compiler umgesetzt werden soll.

Beispiel:

#IFDEF __FB_OPENBSD__
... Anweisungen nur für OpenBSD ...
#ELSE
... Anweisungen nicht für OpenBSD ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.21

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

__FB_OPTION_BYVAL__

Typ: Vordefiniertes Symbol

__FB_OPTION_BYVAL__ ist ein Symbol, dessen Wert -1 ist, wenn die Variablenübergabe standardmäßig BYVAL geschieht, bzw. 0, wenn dies nicht der Fall ist. Der Wert hängt von der Dialektform ab, mit der das Programm compiliert wurde.

Beispiel:

#IF ( __FB_OPTION_BYVAL__  <> 0 )
#ERROR OPTION BYVAL darf mit diesem Quelltext nicht verwendet werden!
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
BYVAL (Schlüsselwort), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

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

Beispiel:

#IF __FB_OPTION_DYNAMIC__ <> 0
#ERROR Dieses Modul darf OPTION DYNAMIC nicht verwenden!
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
DYNAMIC (Meta), DYNAMIC (Schlüsselwort), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__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. Der Wert hängt von der Dialektform ab, mit der das Programm compiliert wurde.

Beispiel:

#IF( __FB_OPTION_ESCAPE__  <> 0 )
#ERROR OPTION ESCAPE darf mit diesem Quellcode nicht verwendet werden!
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
ESCAPE, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

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

Beispiel:

#IF( __FB_OPTION_EXPLICIT__  = 0 )
#ERROR Dieses Modul muss mit OPTION EXPLICIT verwendet werden!
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
EXPLICIT, DIM, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_OPTION_GOSUB__

Typ: Vordefiniertes Symbol

__FB_OPTION_GOSUB__ ist ein Symbol, das angibt, ob OPTION GOSUB verwendet wird oder nicht. Ist der Wert -1, dann kann GOSUB verwendet werden, und RETURN wird ausschließlich als "return-from-gosub" verwendet. Ist der Wert 0, dann kann GOSUB nicht verwendet werden, und RETURN wird ausschließlich als "return-from-procedure" verwendet.

Beispiel:

#IF ( __FB_OPTION_GOSUB__ <> 0 )
' Unterstützung von GOSUB ausschalten
OPTION NOGOSUB
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb ist der Standardwert -1, in allen anderen Dialektformen 0.

Siehe auch:
GOSUB (Schlüsselwort), NOGOSUB (Schlüsselwort), GOSUB, RETURN, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_OPTION_PRIVATE__

Typ: Vordefiniertes Symbol

__FB_OPTION_PRIVATE__ ist ein Symbol, dessen Wert -1 ist, wenn SUBs und FUNCTIONs standardmäßig nur innerhalb des Moduls gültig sind. Es hat den Wert 0, wenn SUBs und FUNCTIONs standardmäßig global gültig sind. Der Wert hängt von der Dialektform ab, mit der das Programm compiliert wurde, bzw. von der Verwendung von OPTION PRIVATE.

Beispiel:

#IF( __FB_OPTION_PRIVATE__  <> 0 )
#ERROR OPTION PRIVATE darf mit diesem Modul nicht verwendet werden!
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
PRIVATE (Schlüsselwort), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_OUT_DLL__

Typ: Vordefiniertes Symbol

__FB_OUT_DLL__ ist ein Symbol, dessen Wert -1 ist, wenn der Code zu einer dynamischen Bibliothek (*.dll) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird. Nur eines der Symbole __FB_OUT_DLL__, __FB_OUT_EXE__, __FB_OUT_LIB__ und __FB_OUT_OBJ__ besitzt den Wert -1, alle anderen besitzen den Wert 0.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_OUT_EXE__

Typ: Vordefiniertes Symbol

__FB_OUT_EXE__ ist ein Symbol, dessen Wert -1 ist, wenn der Code zu einer ausführbaren Datei (*.exe) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird. Nur eines der Symbole __FB_OUT_DLL__, __FB_OUT_EXE__, __FB_OUT_LIB__ und __FB_OUT_OBJ__ besitzt den Wert -1, alle anderen besitzen den Wert 0.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
DEFINE (Meta), Präprozessoren, Der Compiler

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_OUT_LIB__

Typ: Vordefiniertes Symbol

__FB_OUT_LIB__ ist ein Symbol, dessen Wert -1 ist, wenn der Code zur statischen Bibliothek (*.lib) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird. Nur eines der Symbole __FB_OUT_DLL__, __FB_OUT_EXE__, __FB_OUT_LIB__ und __FB_OUT_OBJ__ besitzt den Wert -1, alle anderen besitzen den Wert 0.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
DEFINE (Meta), Präprozessoren, Der Compiler

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_OUT_OBJ__

Typ: Vordefiniertes Symbol

__FB_OUT_OBJ__ ist ein Symbol, dessen Wert -1 ist, wenn der Code zu einer Objekt-Datei (*.obj) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird. Nur eines der Symbole __FB_OUT_DLL__, __FB_OUT_EXE__, __FB_OUT_LIB__ und __FB_OUT_OBJ__ besitzt den Wert -1, alle anderen besitzen den Wert 0.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
DEFINE (Meta), Präprozessoren, Der Compiler

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_PCOS__

Typ: Vordefiniertes Symbol

__FB_PCOS__ ist ein Symbol mit dem Wert -1, wenn der Code in einem Betriebssystem compiliert wurde, dessen Dateisystem PC-artig aufgebaut ist (Laufwerksbuchstaben, Backslashes usw.). Dies sind z. B. DOS, Windows, OS/2 und Symbian OS. Durch #IF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für ein entsprechendes Betriebssystem umgesetzt werden soll.

Beispiel:

#IF __FB_PCOS__
'... Anweisungen für PC-artige Betriebssysteme ...
#ELSE
'... Anweisungen für andere Betriebssysteme ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- __FB_PCOS__ existiert seit FreeBASIC v0.21

- In FreeBASIC v0.21 war das Symbol immer definiert und hatte für nicht-PC-artige Betriebssysteme den Wert 0. Seit FreeBASIC v0.22 ist es nur noch in PC-artigen Systemen definiert und kann daher auch mit #IFDEF abgefragt werden.

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_UNIX__, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_SIGNATURE__

Typ: Vordefiniertes Symbol

__FB_SIGNATURE__ gibt einen String zurück, der die Signatur des Compilers enthält, z.B.:

FreeBASIC 0.21.1

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
DEFINE (Meta), __FB_VERSION__, Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_SSE__

Typ: Vordefiniertes Symbol

__FB_SSE__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Compiler 'SSE floating point arithmetics' kompiliert. Dazu ist die Compiler-Option -fpu SSE nötig.

Beispiel:

#IFDEF __FB_SSE__
' ... Anweisungen aus den SSE / SSE2 floating point instructions
#ELSE
' ... Anweisungen für die FPU 387
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.20

Siehe auch:
Compileroption -fpu [FPU|SSE], __FB_FPU__, __FB_VECTORIZE__, __FB_FPMODE__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_UNIX__

Typ: Vordefiniertes Symbol

__FB_UNIX__ ist ein Symbol mit dem Wert -1, wenn der Code in einem UNIX-artigen Betriebssystem compiliert wurde. Durch #IF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für ein entsprechendes Betriebssystem umgesetzt werden soll.

Beispiel:

#IF __FB_UNIX__
'... Anweisungen für UNIX-artige Betriebssysteme ...
#ELSE
'... Anweisungen für andere Betriebssysteme ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- __FB_UNIX__ existiert seit FreeBASIC v0.21

- In FreeBASIC v0.21 war das Symbol immer definiert und hatte für nicht-UNIX-artige Betriebssysteme den Wert 0. Seit FreeBASIC v0.22 ist es nur noch in UNIX-artigen Systemen definiert und kann daher auch mit #IFDEF abgefragt werden.

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_PCOS__, __FB_WIN32__, __FB_DOS__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_VECTORIZE__

Typ: Vordefiniertes Symbol

__FB_VECTORIZE__ ist ein Symbol, welches das durch die Compiler-Option -vec eingestellte Level (0, 1 oder 2) enthält. Dazu ist die Compiler-Option -fpu SSE nötig.

Beispiel:

#IF __FB_VECTORIZE__ = 2
' ... Anweisungen für Vektorialisierungslevel 2.
#ELSE
' ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.21

Siehe auch:
Compileroption -vec [0|1|2], __FB_SSE__, __FB_FPU__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FB_VER_MAJOR__

Typ: Vordefiniertes Symbol

Ein Integer, der die Versionshauptnummer des Compilers enthält, z.B.:

0

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
__FB_VERSION__, __FB_VER_MINOR__, __FB_VER_PATCH__, __FB_MIN_VERSION__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_VER_MINOR__

Typ: Vordefiniertes Symbol

Ein Integer, der die Versionsunternummer des Compilers enthält, z.B.:

20

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.13

Siehe auch:
__FB_VERSION__, __FB_VER_MAJOR__, __FB_MIN_VERSION__, __FB_VER_PATCH__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_VER_PATCH__

Typ: Vordefiniertes Symbol

Ein Integer, der die Patchnummer des Compilers enthält, z.B.:

0

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
__FB_VERSION__, __FB_VER_MAJOR__, __FB_VER_MINOR__, __FB_MIN_VERSION__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FB_VERSION__

Typ: Vordefiniertes Symbol

Ein String, der die Version des Compilers enthält, z.B.:

0.17

Beispiel:

#IF __FB_VERSION__ < "0.18"
#ERROR Compilieren Sie dieses Programm bitte mit FB v0.18 oder höher.
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- existiert seit FreeBASIC v0.9 (damals als FB__VERSION)

- wurde mit FreeBASIC v0.13 zu __FB_VERSION__ umbenannt

Siehe auch:
__FB_VER_MAJOR__, __FB_VER_MINOR__, __FB_VER_PATCH__, __FB_MIN_VERSION__, __FB_SIGNATURE__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__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 #IFDEF 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 nur kompatibel zu Win32!
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- existiert seit FreeBASIC v0.9 (damals als FB__WIN32).

- wurde erst in FreeBASIC v0.13 zu __FB_WIN32__ umbenannt.

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_LINUX__, __FB_XBOX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

__FB_XBOX__

Typ: Vordefiniertes Symbol

__FB_XBOX__ ist ein Symbol ohne einen Wert. Dieses Symbol wird definiert, wenn der Code für die Xbox umgesetzt werden soll.

Beispiel:

#IFDEF __FB_XBOX__
... Anweisungen nur für Xbox ...
#ELSE
... Anweisungen nicht für Xbox ...
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
DEFINE (Meta), Präprozessoren, __FB_DOS__, __FB_WIN32__, __FB_LINUX__, __FB_CYGWIN__, __FB_FREEBSD__, __FB_DARWIN__, __FB_OPENBSD__, __FB_NETBSD__, __FB_PCOS__, __FB_UNIX__

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

__FILE__

Typ: Vordefiniertes Symbol

__FILE__ wird in der kompilierten Datei 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__

Ausgabe:

Fehler: a = 32767 im Modul test.bas

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.13

Siehe auch:
__FILE_NQ__, __PATH__, __FUNCTION__, __FUNCTION_NQ__, __LINE__, LINE (Meta), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FILE_NQ__

Typ: Vordefiniertes Symbol

__FILE_NQ__ wird in der kompilierten Datei zu einer Zeichenkette umgesetzt. Diese enthält den Dateinamen des Moduls, das 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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FILE__, __PATH__, __FUNCTION__, __FUNCTION_NQ__, __LINE__, LINE (Meta), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__FUNCTION__

Typ: Vordefniertes Symbol

__FUNCTION__ wird in der kompilierten Datei zu einem String umgesetzt. Dieser enthält den Namen der Prozedur (FUNCTION oder SUB), die gerade umgesetzt wird. Dies kann zur Fehlersuche eingesetzt werden.

Wird gerade Code auf der Modulebene umgesetzt, so wird das Symbol zu "__FB_MAINPROC__" umgesetzt.

Beispiel:

IF a > 0 THEN PRINT "Fehler: a= "; a;" in "; __FUNCTION__

Ausgabe:

Fehler: a = 32767 in __FB_MAINPROC__

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- __FUNCTION__ existiert seit FreeBASIC v0.13.

- Seit FreeBASIC v0.17 wird dieses Symbol zu "__FB_MAINPROC__" umgesetzt, wenn __FUNCTION__ auf Modullebene abgefragt wird; davor war der Wert "(main)"

Siehe auch:
__FUNCTION_NQ__, __FILE__, __FILE_NQ__, __PATH__, __LINE__, LINE (Meta), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__FUNCTION_NQ__

Typ: Vordefiniertes Symbol

__FUNCTION_NQ__ wird in der kompilierten Datei zu einer Zeichenkette umgesetzt. Diese enthält das Symbol der Prozedur (FUNCTION oder SUB), die gerade umgesetzt wird. NQ steht dabei für 'non-quoted', also 'nicht in Anführungszeichen'.

Beispiel:

DECLARE SUB MySub ()

SUB MySub ()
PRINT "Die Addresse von " & __FUNCTION__ & " ist 0x";
PRINT HEX( @__FUNCTION_NQ__, 6 )
GETKEY
END SUB

MySub

Ausgabebeispiel:

Die Addresse of MYSUB ist 0x4012D0

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__FUNCTION__, __FILE__, __FILE_NQ__, __PATH__, __LINE__, LINE (Meta), DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 17.05.12
Zur Onlinefassung des Eintrags

__LINE__

Typ: Vordefiniertes Symbol

__LINE__ wird in der kompilierten Datei zu einem Integer umgesetzt. Dieser 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__

Ausgabe:

Fehler: a = 32767 in Zeile 42

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.13

Siehe auch:
LINE (Meta), __FILE__, __FILE_NQ__, __PATH__, __FUNCTION__, __FUNCTION_NQ__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__PATH__

Typ: Vordefiniertes Symbol

__PATH__ wird in der kompilierten Datei zu einem String umgesetzt. Dieser enthält den Namen des Verzeichnisses, in dem sich die Quellcode-Datei befindet, die gerade umgesetzt wird.

Beispiel: Teile dem Compiler mit, wo sich die INCLUDE-Dateien befinden:

#LIBPATH __PATH__

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
LIBPATH (Meta), __FILE__, __FILE_NQ__, __FUNCTION__, __FUNCTION_NQ__, __LINE__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

__TIME__

Typ: Vordefiniertes Symbol

__TIME__ wird in der kompilierten Datei 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-16-2007 um 15:16:22.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.13

Siehe auch:
__DATE__, __DATE_ISO__, DEFINE (Meta), Präprozessoren

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

Startbuchstabe A

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 ein beliebiger numerischer Ausdruck. Variablen, Konstanten, Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jedem Datentyp außer STRING, ZSTRING oder WSTRING sein.

Der Rückgabewert ist vom selben Typ wie 'Zahl'.

ABS kann mithilfe von OPERATOR überladen werden.

Beispiel:

PRINT ABS(-1), ABS(-3.1415), ABS(42)

Ausgabe:

1     3.1415     42

Unterschiede zu QB: keine

Siehe auch:
SGN, mathematische Funktionen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

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 Lesezugriff auf die Datei.

- WRITE ermöglicht Schreibzugriff auf die Datei.

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

Wird ACCESS nicht angegeben, dann wird die Datei mit Lese- und Schreibzugriff geöffnet.

Beispiel:

OPEN "data.raw" FOR BINARY ACCESS READ AS #1

Unterschiede zu QB: keine

Siehe auch:
OPEN (Anweisung), CLOSE

Letzte Bearbeitung: 07.08.10
Zur Onlinefassung des Eintrags

ACOS

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

Gibt den Arcuskosinus (oder auch Inverskosinus) einer Zahl zurück. ACOS bildet also die Umkehrfunktion zu COS.

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

Der Rückgabewert ist ein DOUBLE-Wert, der eine Winkelangabe im Bogenmaß darstellt. Er liegt im Bereich von 0 bis Pi.

Beispiel:

CONST PI = ACOS(0)*2
DIM AS DOUBLE h, a
INPUT "Bitte gib die Länge der Hypotenuse ein: ", h
INPUT "Bitte gib die Länge der Ankathete ein:  ", a
PRINT ""
PRINT "Der Winkel zwischen den beiden Seiten beträgt " & ACOS(a/h) / PI * 180 & "°"
SLEEP

Ausgabebeispiel:

Bitte gib die Länge der Hypotenuse ein: 7
Bitte gib die Länge der Ankathete ein:  3.5

Der Winkel zwischen den beiden Seiten beträgt 60°

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ACOS nicht zur Verfügung und kann nur über __ACOS aufgerufen werden.

Siehe auch:
mathematische Funktionen, SIN, ASIN, COS, TAN, ATN, ATAN2

Letzte Bearbeitung: 07.07.10
Zur Onlinefassung des Eintrags

ADD

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], 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 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).

Beispiel: Zeichnen von drei sich überlappenden Kreisen

SCREENRES 320, 200, 16

' Sprite mit einem Kreis erzeugen
CONST radius = 32
DIM AS ANY PTR img = IMAGECREATE(radius*2 + 1, radius*2 + 1, 0)
CIRCLE img, (radius, radius), radius, RGB(192, 192, 63), , , 1, f

' Kreis mit drei verschiedenen Faktoren zeichnen
PUT (146 - radius, 108 - radius), img, ADD, 64
PUT (174 - radius, 108 - radius), img, ADD, 128
PUT (160 - radius,  84 - radius), img, ADD, 192

' Speicher freigeben und auf Tastendruck warten
IMAGEDESTROY img
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.17

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

Letzte Bearbeitung: 16.08.11
Zur Onlinefassung des Eintrags

ALIAS

Syntax: [ DECLARE ] { SUB | FUNCTION } Procname ALIAS "Aliasname" ...
Typ: Klausel
Kategorie: Speicherverwaltung

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 Prozedur innerhalb des Programms trägt.

'Aliasname' kann im Programm nicht zum Aufruf der Prozedur verwendet werden. Er ist aber für den Linker sichtbar, wenn der Code zusammen mit Code in anderen Sprachen gelinkt wird.

ALIAS wird üblicherweise für Prozeduren verwendet, die in anderen Sprachen geschrieben sind und deren Name in FreeBASIC nicht erlaubt ist. Wird ALIAS mit DECLARE verwendet, dann wird nur 'Aliasname' vom Linker verwendet.

Beispiel:

DECLARE SUB xClearScreen ALIAS "ClearVideoScreen" ()

SUB xClearScreen ALIAS "ClearVideoScreen" ()
' Inhalt der Prozedur
END SUB

xClearScreen

Unterschiede zu QB:
In QB funktionierte ALIAS nur zusammen mit DECLARE.

Siehe auch:
DECLARE, SUB, FUNCTION, EXPORT, EXTERN (Module)

Letzte Bearbeitung: 07.04.11
Zur Onlinefassung des Eintrags

ALLOCATE

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

ALLOCATE reserviert ("alloziert") eine beliebige Anzahl von Bytes im Speicher (Heap) 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 Allozieren ein Fehler auftritt, ist der Rückgabewert 0 (Null-Pointer).

- Die reservierten Bytes werden nicht auf 0 gesetzt, dazu siehe CALLOCATE

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.
Achtung: Es kann nicht garantiert werden, dass diese Funktion auf allen Plattformen Multithreading unterstützt, d.h. thread-safe ist.

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

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

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

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

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

' Speicher wieder freigeben
DEALLOCATE( buffer )

' auf Tastendruck warten und beenden
SLEEP
END 0

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 reserviert bleibt. Sehen Sie sich dieses Beispiel an:

SUB AllocateExample2()
DIM AS INTEGER PTR IntegerPtr = 0

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

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

AllocateExample2()
SLEEP : END 0

In diesem Beispiel geht bei jedem Funktionsaufruf Speicherplatz verloren, da der von der ersten Reservierung bereitgestellte Speicherbereich nicht mehr dealloziert wird. Daher sollten Sie, wenn Sie einen größeren Speicherbereich benötigen, die Funktion REALLOCATE verwenden, oder zumindest den alten Speicherbereich IMMER mit DEALLOCATE freigeben.

Hinweis:
ALLOCATE überschreibt im Gegensatz zu CALLOCATE nicht den bisherigen Inhalt des reservierten Speichers, weswegen zufällige Werte enthalten sein können. In Verbindung mit Strings sollte aufgrund der internen Verarbeitung unbedingt mit CALLOCATE reserviert werden.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Es kann nicht garantiert werden, dass die Prozedur auf allen Plattformen thread-safe ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ALLOCATE nicht zur Verfügung und kann nur über __ALLOCATE aufgerufen werden.

Siehe auch:
CALLOCATE, REALLOCATE, DEALLOCATE, Pointer, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

ALPHA

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], 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 High-/Truecolor-Modi verfügbar, also in Modi ab 15bpp.

'alphawert' stellt 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 ADD 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 jedes Pixel einzeln angegeben wurde. Dies ist nur in 32bpp-Modi möglich, da nur hier ein eingebetteter Alphawert für jedes Pixel möglich ist; siehe dazu auch Interne Pixelformate.

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

Beispiel:

' 32-bit-Bildschirm erstellen
SCREENRES 320, 200, 32

' schachbrettartigen Hintergrund zeichnen
FOR y AS INTEGER = 0 TO 199
FOR x AS INTEGER = 0 TO 319
PSET (x, y), IIF((x SHR 2 XOR y SHR 2) AND 1, RGB(160, 160, 160), RGB(128, 128, 128))
NEXT x
NEXT y

' Sprite erstellen
DIM img AS ANY PTR = IMAGECREATE(32, 32, RGBA(0, 0, 0, 0))
FOR y AS SINGLE = -15.5 TO 15.5
FOR x AS SINGLE = -15.5 TO 15.5
DIM AS INTEGER r, g, b, a
IF y <= 0 THEN
IF x <= 0 THEN
r = 255: g = 0: b = 0   ' rot
ELSE
r = 0: g = 0: b = 255   ' blau
END IF
ELSE
IF x <= 0 THEN
r = 0: g = 255: b = 0   ' gruen
ELSE
r = 255: g = 0: b = 255 ' magenta (transparente Maskenfarbe)
END IF
END IF
a = 255 - (x ^ 2 + y ^ 2)
IF a < 0 THEN a = 0': r = 255: g = 0: b = 255
PSET img, (15.5 + x, 15.5 - y), RGBA(r, g, b, a)
NEXT x
NEXT y

' mit verschiedenen Alphawerten zeichnen; TRANS dient zum Vergleich
DRAW STRING (32, 10), "Single alpha"
PUT (80 - 16,  50 - 16), img, ALPHA, 64
PUT (80 - 16, 100 - 16), img, ALPHA, 192
PUT (80 - 16, 150 - 16), img, TRANS

' mit vollem Alphakanal zeichnen
DRAW STRING (200, 10), "Full alpha"
PUT (240 - 16, 100 - 16), img, ALPHA

' Speicher freigeben und auf Tastendruck warten
IMAGEDESTROY img
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.14

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

AND (Methode)

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], AND
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.

Berechnungsbeispiel: 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.

Beispiel:

' 32-bit-Bildschirm erstellen
SCREENRES 320, 200, 32
LINE (0, 0)-(319, 199), RGB(255, 255, 255), bf

' drei Sprites mit Kreisen in zyan, magenta und gelb zeichnen
CONST AS INTEGER radius = 32
DIM AS ANY PTR cc, cm, cy
cc = IMAGECREATE(radius * 2 + 1, radius * 2 + 1, RGBA(255, 255, 255, 255))
cm = IMAGECREATE(radius * 2 + 1, radius * 2 + 1, RGBA(255, 255, 255, 255))
cy = IMAGECREATE(radius * 2 + 1, radius * 2 + 1, RGBA(255, 255, 255, 255))
CIRCLE cc, (radius, radius), radius, RGB(0, 255, 255), , , 1, f
CIRCLE cm, (radius, radius), radius, RGB(255, 0, 255), , , 1, f
CIRCLE cy, (radius, radius), radius, RGB(255, 255, 0), , , 1, f

' Kreise überlappend zeichnen
PUT (146 - radius, 108 - radius), cc, AND
PUT (174 - radius, 108 - radius), cm, AND
PUT (160 - radius,  84 - radius), cy, AND

' Speicher freigeben und auf Tastendruck warten
IMAGEDESTROY cc
IMAGEDESTROY cm
IMAGEDESTROY cy
SLEEP

Unterschiede zu QB: keine

Siehe auch:
PUT (Grafik), DRAW STRING, SCREENRES, ALPHA, OR (Methode), XOR (Methode), PSET (Methode), PRESET (Methode), ADD, TRANS, CUSTOM, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

AND (Operator)

Syntax A: Ergebnis = Ausdruck1 AND Ausdruck2
Syntax B: Ausdruck1 AND= Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

AND kann als einfacher (Syntax A) und kombinierter (Syntax B) Operator eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 AND Ausdruck2

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.

AND kann mithilfe von OPERATOR überladen werden.

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."
END IF

Beispiel 2: Konjunktion 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

Beispiel 3: AND als kombinierter Operator

DIM AS INTEGER w, bnr

INPUT "Bitte geben Sie eine Zahl ein.", w
PRINT "Bitte geben Sie die Nummer des Bits ein,"
INPUT " 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."
END IF
GETKEY

Ausgabebeispiel:

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

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
AND (Methode), NOT, OR (Operator), XOR (Operator), IMP, EQV, ANDALSO, Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

ANDALSO

Syntax: Ausdruck1 ANDALSO Ausdruck2
Typ: Operator
Kategorie: Kurzform

ANDALSO prüft zwei Ausdrücke auf ihren Wahrheitsgehalt und gibt -1 zurück, wenn beide Ausdrücke wahr sind. Ansonsten wird 0 zurückgegeben.

Zunächst wird 'Ausdruck1' geprüft. Wenn dieser 0 (false) ergibt, wird mit diesem Ergebnis abgebrochen. Ansonsten wird 'Ausdruck2' ausgewertet. Ist dieser 0 (false), dann wird dies zurückgegeben; ansonsten lautet der Rückgabewert -1 (true). ANDALSO liefert also nur -1, wenn keiner der beiden Ausdrücke 0 ergibt; allerdings wird 'Ausdruck2' nur dann ausgewertet, wenn bereits 'Ausdruck1' nicht 0 war.

Beispiel: ANDALSO in einer IF-THEN-Bedingung:

DIM AS UBYTE PTR img = IMAGECREATE(breit, hoch)
IF img ANDALSO img[0] = 7 THEN
PRINT "Image mit neuem Header"
END IF

Erläuterung: Falls das Erstellen des Speicherbereichs fehlschlägt - img ist in diesem Fall 0 - dann wird die Auswertung img[0] = 7 erst gar nicht durchgeführt, womit es auch nicht zu einem fehlerhaften Speicherzugriff kommt.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.20 CVS

Siehe auch:
ORELSE, AND (Operator), Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

ANY

Syntax: ... AS ANY [ PTR ]
Typ: Datentyp
Kategorie: Speicherverwaltung

Dieser Eintrag behandelt den Datentyp ANY. Für Informationen zu ANY als Klausel siehe INSTR, TRIM,LTRIM,RTRIM und 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:

DECLARE SUB printFirstByte (BYREF 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
SLEEP

SUB printFirstByte (BYREF x AS UBYTE)
PRINT 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 32 Bit 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 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.

ANY als Startwert:
Bei der Deklaration von Variablen wird dessen Startwert automatisch auf 0 bzw. "" (Leer) gesetzt. Dies lässt sich mit ANY verhindern. Die Variable enthält dann den Wert, der sich bereits zuvor an der zugewiesenen Stelle im Speicher befunden hat.

DIM AS INTEGER x1, x2 = 5, x3 = ANY

PRINT "x1 wird    0     zugewiesen: ", x1
PRINT "x2 wird    5     zugewiesen: ", x2
PRINT "x3 wird  nichts  zugewiesen: ", x3
SLEEP

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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen: steht unter -lang qb nicht zur Verfügung

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

Letzte Bearbeitung: 11.11.10
Zur Onlinefassung des Eintrags

APPEND

Syntax: OPEN Dateiname FOR 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:
OPEN (Anweisung), PRINT #, WRITE #, INPUT #, LINE INPUT #

Weitere Informationen:
QB Express Issue #4: File Manipulation In QuickBasic: Sequential Files

Letzte Bearbeitung: 07.08.10
Zur Onlinefassung des Eintrags

AS

Syntax A: ... Parameter AS [ CONST ] Datentyp ...
Syntax B: OPEN Dateiname FOR Zugriffsart AS [#]Dateinummer
Syntax C: SELECT CASE Ausdruck AS CONST
Typ: Klausel
Kategorie: Verschiedenes

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

- In DECLARE, SUB und FUNCTION wird damit der Variablentyp in der Parameterliste angegeben.

- In DIM, REDIM, COMMON, STATIC und CONST wird der Datentyp der dimensionierten Variablen festgelegt.

- In TYPE und UNION wird AS verwendet, um den Variablentyp der Records innerhalb von UDTs anzugeben.

- Zusammen mit OPEN wird die Nummer des Dateipuffers beim Öffnen einer Datei angegeben.

- In SELECT CASE wird die '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.

Unterschiede zu früheren Versionen von FreeBASIC:
Die Verwendung von AS mit SELECT CASE existiert erst seit FreeBASIC v0.13.

Letzte Bearbeitung: 08.07.10
Zur Onlinefassung des Eintrags

ASC

Syntax: ASC(Ausdruck [,Stelle])
Typ: Funktion
Kategorie: Zählsysteme

ASC liefert den ASCII-Code des Zeichens in einem Strings zurück.

- 'Ausdruck' ist ein STRING, ein WSTRING oder ein ZSTRING.

- 'Stelle' ist ein numerischer 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 Umkehrung von CHR.

ASC kann durch die folgende Syntax ersetzt werden:

AsciiCode = Ausdruck[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)

Plattformbedingte Unterschiede: DOS unterstützt nicht die WSTRING-Version von ASC.

Unterschiede zu QB:

- Da unter QB ZSTRINGs und WSTRINGs nicht existieren, kann ASC auf solche natürlich nicht angewandt werden.

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

Siehe auch:
CHR, WCHR

Weitere Informationen:
ASCII-Tabelle anzeigen lassen

Letzte Bearbeitung: 20.11.10
Zur Onlinefassung des Eintrags

ASIN

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

Gibt den Arcussinus (oder auch Inverssinus) einer Zahl zurück. ASIN bildet also die Umkehrfunktion zu SIN.

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

Der Rückgabewert ist ein DOUBLE-Wert, der eine Winkelangabe im Bogenmaß darstellt. Er liegt im Bereich von -Pi/2 bis +Pi/2

Beispiel:

DIM AS DOUBLE h, o

INPUT "Länge der Hypotenuse des Dreiecks: ", h
INPUT "Länge der Gegenkathete des Dreiecks: ", o
PRINT
PRINT "Der Winkel zwischen den Seiten ist"; ASIN (o/h)
SLEEP

Ausgabebeispiel:

Länge der Hypotenuse des Dreiecks: 5
Länge der Gegenkathete des Dreiecks: 3

Der Winkel zwischen den Seiten ist 0.6435011087932844

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ASIN nicht zur Verfügung und kann nur über __ASIN aufgerufen werden.

Siehe auch:
mathematische Funktionen, SIN, COS, ACOS, TAN, ATN, ATAN2

Letzte Bearbeitung: 07.07.10
Zur Onlinefassung des Eintrags

ASM

Syntax A: ASM <ASSEMBLER-Code>
Syntax B:

ASM
<ASSEMBLER-Code>
END ASM

Typ: Befehl
Kategorie: Fremdsprachen

ASM bindet Maschinensprache-Code ins Programm ein. Es wird der gesamte IA32-Befehlssatz unterstützt.

Der Assembler-Code unterliegt der INTEL-Syntax. Da es nicht ausgeschlossen werden kann, dass zukünftige Versionen des FreeBASIC-Compilers auch Plattformen unterstützen, die einen anderen ASM-Befehlssatz verwenden, sollten ASM-Blöcke nur dann verwendet werden, wenn notwendig. Eine reine FreeBASIC-Lösung sollte, wenn möglich, bevorzugt werden.

Kommentare in ASM-Blöcken verwenden dieselbe Syntax wie FreeBASIC-Kommentare. Verwenden Sie als Kommentarzeichen das Hochkomma " ' " und nicht das in ASM übliche Semikolon " ; "

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
DIM AS INTEGER 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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ASM nicht zur Verfügung und kann nur über __ASM aufgerufen werden.

Siehe auch:
Inline-Assembler, NAKED

Letzte Bearbeitung: 02.10.10
Zur Onlinefassung des Eintrags

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 der Dateiname des gerade aktiven Codes inklusive 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()
DIM a AS INTEGER = 10

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

foo()

SUB Quit DESTRUCTOR
SLEEP
END SUB

Wenn -g an den Compiler übergeben wird, wird das Programm mit dieser Meldung beendet:

test.bas(8): assertion failed at FOO: a <> 0

Die DESTRUCTOR-Sub bewirkt, dass auf einen Tastendruck gewartet wird; so kann die Meldung gelesen werden und verschwindet nicht sofort. Das Beispiel schlägt unter Umständen fehl, wenn Sie es z.B. mit der "Quick Run"-Option in FbEdit aufrufen. Eine fertig kompilierte Debug-EXE wird aber wie erwartet bei 0 anhalten.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ASSERT nicht zur Verfügung und kann nur über __ASSERT aufgerufen werden.

Siehe auch:
ASSERTWARN, Der Compiler, Fehlerbehandlung, Debugging

Letzte Bearbeitung: 25.08.10
Zur Onlinefassung des Eintrags

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.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ASSERTWARN nicht zur Verfügung und kann nur über __ASSERTWARN aufgerufen werden.

Siehe auch:
ASSERT, Der Compiler, Fehlerbehandlung, Debugging

Letzte Bearbeitung: 25.08.10
Zur Onlinefassung des Eintrags

ATAN2

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

ATAN2 gibt den Arcustangens (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 numerische Ausdrücke. Variablen, Konstanten, Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jedem 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 eine Winkelangabe im Bogenmaß darstellt. Er liegt im Bereich von -Pi bis +Pi.

ATAN2 liefert den Arcustangens 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
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ATAN2 nicht zur Verfügung und kann nur über __ATAN2 aufgerufen werden.

Siehe auch:
mathematische Funktionen, SIN, ASIN, COS, ACOS, TAN, ATN

Letzte Bearbeitung: 31.08.10
Zur Onlinefassung des Eintrags

ATN

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

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

'Zahl' ist ein beliebiger numerischer Ausdruck. Variablen, Konstanten, Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jedem Datentyp außer STRING, ZSTRING oder WSTRING sein.

Der Rückgabewert ist ein DOUBLE-Wert, der eine Winkelangabe im Bogenmaß darstellt. Er liegt im Bereich zwischen -Pi/2 und +Pi/2

Die Umkehrfunktion 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 )
SLEEP

Ausgabe:

Pi = 3.141592653589793
0.6747409422235527

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 07.07.10
Zur Onlinefassung des Eintrags

Startbuchstabe B

BASE

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

OPTION BASE setzt den standardmäßig kleinsten Index für Arrays. Die Option 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. Standardmäßig wird als untere Grenze 0 verwendet. 'Startindex' muss eine Zahl sein, es darf kein Ausdruck sein. Auch Variablen und 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)

PRINT LBOUND(a)
PRINT LBOUND(b)
PRINT LBOUND(c)
PRINT LBOUND(d)

SLEEP

Ausgabe:

0
4
2
0

Unterschiede zu QB:

- 'Startindex' darf in FreeBASIC auch andere Werte als 0 und 1 annehmen.

- Arrays müssen in FreeBASIC immer explizit erzeugt werden. QBASIC erzeugt implizit ein Array vom kleinsten Index bis 10, wenn es verwendet wird, ohne vorher definiert worden zu sein.

- BASE ist in QB ein Schlüsselwort.

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
DIM, OPTION

Letzte Bearbeitung: 09.07.10
Zur Onlinefassung des Eintrags

BASE (Vererbung)

Syntax: BASE
Typ: Datentyp
Kategorie: OOP

BASE wird in Verbindung mit Vererbung verwendet. Dabei gibt BASE die Möglichkeit, auf ein Record der Eltern-Klasse zuzugreifen, selbst wenn die eigene Klasse ein Record mit gleichem Namen besitzt.

Auch auf die Methoden der Elternklasse kann zugegriffen werden; diese sprechen über THIS allerdings auch die Records und Methoden der Elternklasse an.

Beispiel:

TYPE ElternKlasse
AS INTEGER variable = 1
DECLARE SUB ausgabe
END TYPE

SUB ElternKlasse.ausgabe
PRINT "Variable der Klasse: " & THIS.variable
END SUB

TYPE KindKlasse EXTENDS ElternKlasse
AS INTEGER variable = 2
DECLARE SUB ausgabe
END TYPE

SUB KindKlasse.ausgabe
PRINT "Variable der Eltern-Klasse: " & BASE.variable
PRINT "Variable der Kind-Klasse:   " & THIS.variable
PRINT "================================="
PRINT "Ausgabe-Methode der Elternklasse:"
BASE.ausgabe
END SUB

DIM AS KindKlasse testKlasse

testKlasse.ausgabe
SLEEP

Ausgabe:

Variable der Eltern-Klasse: 1
Variable der Kind-Klasse:   2
=================================
Ausgabe-Methode der Elternklasse:
Variable der Klasse: 1

Hinweis: Mit der Syntax 'BASE()' lässt sich innerhalb des CONSTRUCTORs einer Kind-Klasse der Constructor der Eltern-Klasse aufrufen. Um den Constructor auch aus anderen Methoden der Klasse aufzurufen, ist die Syntax 'BASE.CONSTRUCTOR()' zu verwenden.

Unterschiede zu QB: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC:
BASE in Verbindung mit Vererbung existiert seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
BASE in Verbindung mit Vererbung ist nur in -lang fb zulässig.

Siehe auch:
TYPE (UDT), OBJECT, EXTENDS, THIS, IS (Vererbung)

Letzte Bearbeitung: 19.05.12
Zur Onlinefassung des Eintrags

BEEP

Syntax: BEEP
Typ: Anweisung
Kategorie: Verschiedenes

BEEP weist das System an, ein Tonsignal auszugeben (ein Signalton aus dem internen PC-Speaker, über die Soundkarte oder auch teilweise als Standard-Signal, das auch beim Auftauchen eines Dialogfeldes ertönt). Das ausgegebene akustische Signal variiert je nach Ausführungsplattform.
Wenn keine Soundkarte vorhanden ist, wird (sofern vorhanden) ein Signal über den PC-Speaker ausgegeben.
Der ausgegebene Ton lässt sich weder in der Dauer, noch in der Frequenz beeinflussen.

Beispiel:

BEEP

Unterschiede zu QB:
BEEP erzeugte einen einzelnen Ton über den PC-Speaker. Unter FreeBASIC variiert die Ausgabeform.

Siehe auch:
OUT, Konsole

Letzte Bearbeitung: 01.02.12
Zur Onlinefassung des Eintrags

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 0 und 1.

- '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; der zurückgegebene Wert ist jedoch nie länger, als maximal für den Datentyp von 'Ausdruck' benötigt wird.
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)  ' Ausgabe: 1101010000110001
PRINT BIN(3, 3)   ' Ausgabe: 011
PRINT BIN(255, 4) ' Ausgabe: 1111

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

DIM binaer AS STRING

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

PRINT VAL(binaer)
SLEEP

gibt 9 aus.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht BIN nicht zur Verfügung und kann nur über __BIN aufgerufen werden.

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

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

BINARY

Syntax: OPEN Dateiname FOR BINARY [ ... ]
Typ: Schlüsselwort
Kategorie: Datei

Das Schlüsselwort BINARY wird mit der OPEN-Anweisung verwendet und öffnet die Datei im BINARY-Modus. 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.

Im Modus BINARY können auch die sequentiellen Lese- und Schreibzugriffe INPUT #, PRINT # und WRITE # verwendet werden.

Siehe auch:
OPEN (Anweisung), PUT #, GET #

Letzte Bearbeitung: 09.08.10
Zur Onlinefassung des Eintrags

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 dieselbe Funktion wie

(Ausdruck AND (1 SHL BitNr)) <> 0

Beispiel:

DIM AS INTEGER foo = 1024
PRINT BIT( foo, 10 )
PRINT (foo AND (1 SHL 10)) <> 0
SLEEP

Ausgabe:

-1
-1

BIT wird intern folgendermaßen behandelt:

#Define BIT(x,y) (((x) And (Cast(TypeOf(x), 1) Shl (y))) <> 0)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __BIT in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht BIT nicht zur Verfügung und kann nur über __BIT aufgerufen werden.

Siehe auch:
BITSET, BITRESET, BIN

Letzte Bearbeitung: 23.01.12
Zur Onlinefassung des Eintrags

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 dieselbe Funktion wie

Ausdruck AND NOT (1 SHL BitNr)

Beispiel:

DIM AS INTEGER foo = 192
PRINT BITRESET( foo, 6 )
PRINT foo AND NOT (1 SHL 6)
PRINT
PRINT BITRESET(33, 2)  ' keine Änderung
SLEEP

Ausgabe:

128
128

33

Beachten Sie, dass die Nummerierung der Bits bei 0 beginnt.

BITRESET wird intern folgendermaßen behandelt:

#Define BITRESET(x,y) ((x) And Not (Cast(TypeOf(x), 1) Shl (y)))

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __BITRESET in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht BITRESET nicht zur Verfügung und kann nur über __BITRESET aufgerufen werden.

Siehe auch:
BIT, BITSET, BIN

Letzte Bearbeitung: 23.01.12
Zur Onlinefassung des Eintrags

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 dieselbe Funktion wie

Ausdruck OR (1 SHL BitNr)

Beispiel:

DIM AS INTEGER foo = 128
PRINT BITSET( foo, 6 )
PRINT foo OR (1 SHL 6)
PRINT
PRINT BITSET(33, 5)  ' keine Änderung
SLEEP

Ausgabe:

192
192

33

Beachten Sie, dass die Nummerierung der Bits bei 0 beginnt.

BITSET wird intern folgendermaßen behandelt:

#Define BITSET(x,y) ((x) Or (Cast(TypeOf(x), 1) Shl (y)))

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __BITSET in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht BITSET nicht zur Verfügung und kann nur über __BITSET aufgerufen werden.

Siehe auch:
BIT, BITRESET, BIN

Letzte Bearbeitung: 23.01.12
Zur Onlinefassung des Eintrags

BLOAD

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

BLOAD lädt einen Block binärer Daten aus einer Datei. Der Befehl wird typischerweise benutzt, um Bilder aus externen Dateien (etwa BMPs) zu laden.

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

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

- (erst ab FB 0.20.0): 'pal' ist die Adresse, auf welche die Farbpalette geladen werden soll. Wenn 'Adresse' ausgelassen oder mit 0 (null) angegeben wird, schreibt BLOAD die Daten in die aktuelle Farbpalette.

- Der Rückgabewert ist ein INTEGER mit einer der FreeBASIC-Fehlernummern. Mögliche Fehlermeldungen sind

- 1 (Illegal function call): Die geladenen Daten können nicht verarbeitet werden.

- 2 (File not found): Die Datei konnte nicht gefunden werden.

- 3 (File I/O error): Die Datei besitzt keinen unterstützten Typ oder ein allgemeiner Lesefehler ist aufgetreten.

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.

BLOAD unterstützt folgende Dateiformate:

- Altes QB BSAVE-Format (Dateien, die mit QBs BSAVE gespeichert wurden), beginnend mit &hFD

- Neues FreeBASIC BSAVE-Format (Dateien, die mit FreeBASICs BSAVE gespeichert wurden), beginnend mit &hFE

- Diverse (Windows-)Bitmaps (.BMP), beginnend mit "BM", s.u.

Bilder werden beim Laden in ein FreeBASIC-kompatibles Bildformat konvertiert.

Das BSAVE-Format von QB erlaubt bis zu 64KB große Binärdaten. Es besitzt einen 7-Byte großen Header, dem die Rohdaten folgen:

Offset

Länge

Daten

1

1 Byte

ID (= &hFD)

2

2 Bytes

Datensegment (DS) zum Speicherzeitpunkt (von FreeBASIC ignoriert)

4

2 Bytes

Offset im Datensegment zum Speicherzeitpunkt (von FreeBASIC ignoriert)

6

2 Bytes

Länge der Binärdaten

Das BSAVE-Format von FreeBASIC erlaubt bis zu 4GB große Binärdaten. Es besitzt einen 5-Byte großen Header, dem die Rohdaten folgen:

Offset

Länge

Daten

1

1 Byte

ID (= &hFE)

2

4 Bytes

Länge der Binärdaten

Seit FreeBASIC-Version 0.12b ist es auch möglich, mit BLOAD Bitmaps zu laden. Dazu muss lediglich als Dateiname eine Bitmapdatei (z. B. "MeinBild.bmp") angegeben werden. BLOAD erkennt an der Endung, dass es sich um eine Bitmap-Grafik handelt. Es werden palette-indizierte BMPs (8 Bit und weniger) und Truecolor-BMPs (15, 16, 24 oder 32 Bit) unterstützt. Die Palette von BMPs mit 8Bit oder weniger wird entweder an die durch den Parameter 'pal' festgelegte Adresse geladen oder, wenn dieser 0 oder unspezifiziert ist, als aktuelle Farbpalette eingesetzt.

Achten Sie beim Laden von Bildern darauf, dass diese die gleiche Farbtiefe aufweisen wie der gewählte Bildschirmmodus (siehe SCREENRES). Laden Sie beispielsweise kein 24-Bit-BMP in ein Grafikfenster mit Farbtiefe 4 Bit. Wenn Bilder in einem der BSAVE-Formate geladen werden sollen, müssen diese im selben Bildschirmmodus mittels BSAVE erstellt worden sein.

Wird die zu ladende Datei nicht gefunden oder ihr Format nicht unterstützt (dies ist z. B. bei RLE-komprimierten Bitmaps der Fall), verursacht BLOAD einen Laufzeitfehler. Ebenso wird ein Fehler verursacht, wenn versucht wird, eine Truecolor-BMP in einem palette-indizierten Bildschirmmodus zu laden.

Beispiel:
Ein 48x48 Pixel großes Bild in einen Puffer laden und auf dem Bildschirm ausgeben. Das Beispiel benötigt zur korrekten Ausführung ein 48x48 Pixel großes Bild namens "picture.bmp".

SCREENRES 640, 480, 32
DIM AS ANY PTR bild
bild = IMAGECREATE(48, 48)  'Bildpuffer der Groesse 48x48 anlegen
BLOAD "picture.bmp", bild   'Bilddatei in den Puffer laden
PUT (10, 10), bild          'Bildpuffer auf den Bildschirm zeichnen
IMAGEDESTROY (bild)         'Bildpuffer wieder loeschen
SLEEP                       'Auf Tastendruck warten
END

Um Speicherlücken zu vermeiden, sollte man erstellte Bildpuffer nach der Nutzung stets wieder löschen. Dies geschieht mit IMAGEDESTROY. Es empfiehlt sich weiterhin, den Pointer bild auf Null zu setzen, um Zugriffsfehler zu vermeiden. Dies ist aber nicht zwingend nötig.

Die Methode, ein Bild in ein selbst erstelltes Byte-Array zu laden, ist veraltet und wird hier nur noch zu Dokumentationszwecken aufgeführt:

SCREENRES 640, 480, 32
DIM garray(4 * (48 * 48) + 4) AS BYTE
BLOAD "picture.bmp", @garray(0)
PUT (10, 10), garray(0)
SLEEP

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.

Unterschiede zu früheren Versionen von FreeBASIC:

- Die Möglichkeit, Bitmaps zu laden, existiert erst seit FreeBASIC v0.12.

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

Siehe auch:
BSAVE, PUT (Grafik), GET (Grafik), IMAGECREATE, IMAGEDESTROY, Dateien (Files)

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

BSAVE

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

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

- 'Dateiname ist der Name der Datei, in welche 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 gespeichert wird.

- erst ab FB 0.20.0: 'pal' die Adresse auf einen Speicherbereich, der die Werte der Farbpalette enthält, oder 0 (Null), wenn die Standard-Farbpalette gespeichert werden soll.

- Der Rückgabewert ist eine der FreeBASIC Fehlernummern. Mögliche Fehlermeldungen sind

- 2 (File not found): Die Datei konnte nicht erstellt werden, oder die Dateigröße ist kleiner 0, oder die Dateigröße ist 0 und 'Adresse' ist nicht 0.

- 3 (File I/O error): Die Datei konnte nicht beschrieben werden.

Wie bei allen Funktionen kann der Rückgabewert verworfen werden; BSAVE wird dann wie eine Anweisung eingesetzt.

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.

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:

' Grafikmodus initialisieren
SCREENRES 320, 200, 32

' 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

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

Siehe auch:
BLOAD, GET (Grafik), PUT (Grafik), VARPTR, Dateien (Files)

Letzte Bearbeitung: 02.08.11
Zur Onlinefassung des Eintrags

BYREF

Syntax: [DECLARE] { SUB | FUNCTION } Name (BYREF parameter AS Typ, ...) [AS Typ]
Typ: Klausel
Kategorie: Programmorganisation

BYVAL legt in einer Parameterliste fest, dass ein Parameter 'by reference', also als direkte Referenz statt nur als Wert übergeben werden soll. Die Klausel kann bei der Deklaration bzw. Definition einer Prozedur angegeben werden; siehe dazu der Referenzeintrag Parameterübergabe. Zur Syntax siehe auch DECLARE, SUB und FUNCTION

Bei einer BYREF übergebenen Variable wird beim Prozeduraufruf intern ein Zeiger auf den Speicherbereich der Variablen übergeben. Das hat zur Folge, dass (im Gegensatz zu BYVAL) alle Änderungen dieser Variablen in der bearbeitenden Prozedur direkt auf die ursprüngliche Variable einwirken, da ja direkt auf sie verwiesen wird.

In der aktuellen Version von FreeBASIC werden bei Zahlendatentypen (z. B. INTEGER, SINGLE) standardmäßig lediglich die Werte übergeben (by value). Um eine Variable als Referenz zu übergeben, muss die Klausel BYREF explizit angegeben werden.

STRINGs und UDTs werden standardmäßig BYREF übergeben; die Verwendung des Schlüsselwortes ist in diesem Fall überflüssig.

Arrays werden immer BYREF übergeben; die Verwendung des Schlüsselwortes BYREF oder BYVAL führt bei Arrays zu einer Fehlermeldung.

Beachten Sie aber auch die Unterschiede unter den Dialektformen und zu früheren Compiler-Versionen!

Beispiel:

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

DIM AS INTEGER a, b

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

MySub a, b

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

SUB MySub (BYREF a AS INTEGER, BYVAL b AS INTEGER)
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

Unterschiede zu QB:
In QB werden Variablen standardmäßig BYREF übergeben.

Unterschiede zu früheren Versionen von FreeBASIC:
Bis einschließlich FreeBASIC v0.16 wurden Variablen standardmäßig BYREF übergeben.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb, -lang deprecated und -lang fblite werden Variablen standardmäßig BYREF übergeben.

Siehe auch:
BYVAL, Parameterübergabe

Letzte Bearbeitung: 02.09.11
Zur Onlinefassung des Eintrags

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.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht BYTE nicht zur Verfügung und kann nur über __BYTE aufgerufen werden.

Siehe auch:
DIM, CAST, CBYTE, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

BYVAL (Klausel)

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

BYVAL legt in einer Parameterliste fest, dass ein Parameter 'by value', also als Wert statt als direkte Referenz übergeben werden soll. Die Klausel kann bei der Deklaration bzw. Definition einer Prozedur angegeben werden; siehe dazu der Referenzeintrag Parameterübergabe. Zur Syntax siehe auch DECLARE, SUB und FUNCTION

Bei einer BYVAL übergebenen Variable wird beim Prozeduraufruf eine Kopie der Variablen erstellt und nur diese an die Prozedur weitergegeben. Wird innerhalb der Prozedur der Wert geändert, hat das keine rückwirkenden Auswirkungen auf die ursprünglich übergebene Variable. Im Gegensatz dazu übergibt BYREF die Variable als Referenz; eine Änderung der übergebenen Variablen innerhalb der Prozedur bleibt dann auch nach Ende der Prozedur erhalten.

In der aktuellen Version von FreeBASIC werden Zahlendatentypen (z. B. INTEGER, SINGLE) standardmäßig BYVAL übergeben; die Verwendung des Schlüsselwortes ist in diesem Fall überflüssig.

STRINGs und UDTs werden BYREF übergeben. BYVAL hat bei Strings eine andere Bedeutung: statt einer Kopie des Strings wird ein ZSTRING PTR auf den Stringinhalt übergeben. Der String sollte innerhalb der Prozedur nicht verändert werden, da die Adresse des Strings nicht aktualisiert wird. Das Verhalten von BYVAL bei String-Variablen kann sich in zukünftigen Versionen ändern; deshalb sollte man die Verwendung vermeiden und lieber ZSTRING einsetzen..

Arrays werden immer BYREF übergeben; eine Verwendung des Schlüsselwortes BYVAL führt bei Arrays zu einer Fehlermeldung.

Beachten Sie aber auch die Unterschiede unter den Dialektformen und zu früheren Compiler-Versionen!

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
SLEEP

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

PRINT "In der Sub:"
PRINT "a = "; a
PRINT "b = "; b
PRINT
END SUB

Ausgabe:

Vor Subaufruf:
a = 1
b = 1

In der Sub:
a = 2
b = 2

Nach Subaufruf:
a = 1
b = 2

Beispiel mit ZStrings:

DECLARE SUB MySub (BYVAL a AS ZSTRING PTR)

DIM AS ZSTRING PTR a = @"normal"

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

MySub a

PRINT "Nach Subaufruf:"
PRINT "a = "; *a
SLEEP

SUB MySub (BYVAL a AS ZSTRING PTR)
a = @"veraendert"

PRINT "In der Sub:"
PRINT "a = "; *a
PRINT
END SUB

Ausgabe:

Vor Subaufruf:
a = normal

In der Sub:
a = veraendert

Nach Subaufruf:
a = normal

Unterschiede zu QB:
In QB werden Variablen standardmäßig BYREF übergeben.

Unterschiede zu früheren Versionen von FreeBASIC:
Bis einschließlich FreeBASIC v0.16 wurden Variablen standardmäßig BYREF übergeben.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb, -lang deprecated und -lang fblite werden Variablen standardmäßig BYREF übergeben.

Siehe auch:
BYREF, Parameterübergabe

Letzte Bearbeitung: 31.08.11
Zur Onlinefassung des Eintrags

BYVAL (Schlüsselwort)

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. Die Option 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 BYVAL nicht mehr zulässig!

Ist OPTION BYVAL 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. In diesem Fall werden Variablen außer Arrays und UDTs standardmäßig BYVAL übergeben; benutzen Sie explizit die BYREF-Klausel, um dem entgegen zu wirken.

Achtung: Die Verwendung von BYVAL mit variablen STRINGs kann zu Problemen führen, wenn dieser String das ASCII-Zeichen '0' enthält! Bei der Übergabe des Strings an einen BYVAL-deklarierten String-Parameter wird der String ab dem ASCII-Zeichen '0' abgeschnitten! Für die Übergabe von variablen Strings an Funktionen sollten daher BYREF oder Strings fester Länge verwendet werden.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
BYVAL (Klausel), BYREF, OPTION, __FB_OPTION_BYVAL__, DECLARE, SUB, FUNCTION, Prozeduren, Parameterübergabe

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

Startbuchstabe C

CALL

Syntax: CALL Prozedurname ([Parameterliste])
Typ: Anweisung
Kategorie: Programmorganisation

CALL ruft eine Prozedur (SUB oder FUNCTION) auf. Bei einer FUNCTION wird der Rückgabewert ignoriert.

Achtung: CALL existiert nur noch aus Gründen der Rückwärtskompatibilität. Der Befehl kann nur in den Dialektformen -lang fblite, -lang deprecated und -lang qb verwendet werden. Es ist besser, CALL wegzulassen und die Prozedur direkt aufzurufen.

Die folgenden Beispiele funktionieren nicht in der Dialektform -lang fb

Beispiel 1:

#LANG "fblite"

DECLARE SUB foobar(BYVAL x AS INTEGER, BYVAL y AS INTEGER)
DECLARE FUNCTION wert AS INTEGER
CALL foobar(35, 42)
CALL wert   ' Funktion aufrufen, aber Rückgabewert ignorieren
SLEEP

SUB foobar(BYVAL x AS INTEGER, BYVAL y AS INTEGER)
PRINT x; y
END SUB

FUNCTION wert AS INTEGER
wert = 42
END FUNCTION

Beide Male hätte CALL weggelassen werden können; die 5. und 6. Zeile des Programms lauteten dann:

foobar(35, 42)
wert

Damit wäre das Programm auch mit -lang fb compilierbar.

Beispiel 2: Prozeduraufruf vor der Deklaration

#LANG "qb"

CALL mysub(15, 16)  ' "mysub" ist im Code zuvor noch nicht aufgetreten

SUB mysub(BYREF a AS INTEGER, BYREF b AS INTEGER)
PRINT a, b
END SUB

Hinweis: Dieser Code funktioniert nur in -lang qb. Solange die Prozedur nicht deklariert wurde, findet außerdem keine Typ-Überprüfung der übergebenen Parameter statt. Der Programmierer muss selbst sicherstellen, dass es sich um die korrekten Typen handelt.

Unterschiede zu QB:
CALL erstellt in QB eine Kopie aller Parameter. Wenn die Parameter innerhalb der aufgerufenen Prozedur verändert werden, hat dies keine Auswirkung auf den Wert der Parameter außerhalb der Prozedur.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang fb (Standard) existiert CALL nicht.

- Der Aufruf noch nicht deklarierter SUBs ist nur in der Dialektform -lang qb möglich.

Siehe auch:
DECLARE, SUB, FUNCTION, Prozeduren

Letzte Bearbeitung: 16.01.12
Zur Onlinefassung des Eintrags

CALLOCATE

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

CALLOCATE reserviert einen Bereich im Speicher (Heap), setzt alle seine Bytes auf 0 (im Gegensatz zu ALLOCATE!)

- 'Anzahl' ist die Anzahl der zu reservierenden Speicherstellen.

- 'Größe' ist die Größe der Speicherstelle in Bytes. 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.

- Der Rückgabewert ist ein Pointer auf den Anfang des reservierten Bereichs. Wenn beim Allozieren ein Fehler auftritt, ist der Rückgabewert 0 (Null-Pointer).

CALLOCATE ist kein Teil der FreeBASIC Runtime Library, sondern ein Alias von calloc der C-Lib.
Achtung: Es kann nicht garantiert werden, dass diese Funktion auf allen Plattformen Multithreading unterstützt, d.h. thread-safe ist.

Beispiel:

' Einen INTEGER Pointer erstellen
DIM p AS INTEGER PTR

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

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

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

' Variable wieder freigeben
DEALLOCATE p

' auf Tastendruck warten und beenden
SLEEP
END

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Es kann nicht garantiert werden, dass die Prozedur auf allen Plattformen thread-safe ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CALLOCATE nicht zur Verfügung und kann nur über __CALLOCATE aufgerufen werden.

Siehe auch:
ALLOCATE, REALLOCATE, DEALLOCATE, POINTER, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

CASE

Siehe SELECT CASE

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

CAST

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

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

'Datentyp' ist ein beliebiger Datentyp, inklusive Pointern. Auch ZSTRING- und WSTRING-Pointer sind erlaubt. STRINGs variabler oder fester Länge, ZSTRINGs fester Länge oder WSTRINGs fester Länge als Datentyp führen jedoch zu ungültigen Ergebnissen.

'Ausdruck' ist ein beliebiger Ausdruck. Jeder Datentyp, also auch STRING, ZSTRING oder WSTRING, führt zu einem gültigen Ergebnis, jedoch ist der Rückgabetyp bei diesen Typen immer null.

CAST kann mithilfe von OPERATOR für verschiedene Datentypen überladen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CBYTE

Syntax: CBYTE(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CBYTE konvertiert einen beliebigen numerischen Ausdruck in ein BYTE.

CBYTE rundet den Ausdruck und gibt die untersten 8 Bit als BYTE-Wert zurück. Ist der Ausdruck ein STRING, dann wird dieser zuerst durch VALINT umgewandelt.

Beispiel:

PRINT CBYTE(260)

Ausgabe:

4

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CBYTE nicht zur Verfügung und kann nur über __CBYTE aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CDBL

Syntax: CDBL(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CDBL konvertiert einen beliebigen numerischen Ausdruck in eine DOUBLE-Zahl (64 Bit).

Unterschiede zu QB: In QB durfte 'Ausdruck' kein String sein.

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

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

CDECL

Syntax: [DECLARE] {SUB | FUNCTION} prozedurname CDECL [OVERLOAD] [ALIAS "externerName"] [(parameterliste) ...] {AS rueckgabetyp} {CONSTRUCTOR [priorität]} [STATIC] [EXPORT]
Typ: Schlüsselwort
Kategorie: Fremdsprachen

Der Name der CDECL-Aufrufkonvention steht für C-DECLARE. Die Konvention wird von vielen C/C++ -Compilern verwendet, die auf der x86-Architektur laufen. Hierbei werden die Parameter nacheinander von rechts nach links ( <- ) auf den Stack gelegt.

Die aufgerufende Prozedur baut den Stack nicht selbst ab, sodass Prozeduren mit variabler Argumenten-Anzahl und -Länge realisiert werden können (siehe ... ). Der Stack muss nach dem Aufruf von der aufrufenden Prozedur bereinigt werden.

CDECL ist die Aufrufkonvention, die standarmäßig unter Linux, BSD und DOS verwendet wird, sofern keine andere Konvention explizit festgelegt oder durch einen der EXTERN-Blöcke impliziert wird.

Beispiel: Vergleich der verschiedenen Aufrufmöglichkeiten

SUB s STDCALL (s1 AS INTEGER, s2 AS INTEGER)
PRINT "StdCall ", s1, s2
END SUB
SUB c CDECL (c1 AS INTEGER, c2 AS INTEGER)
PRINT "Cdecl ", c1, c2
END SUB
SUB p PASCAL (p1 AS INTEGER, p2 AS INTEGER)
PRINT "Pascal ", p1, p2
END SUB

ASM
push 2 '2. Parameter - s2
push 1 '1. Parameter - s1
CALL s 'rechts nach links

push 2 '2. Parameter - c2
push 1 '1. Parameter - c1
CALL c 'rechts nach links
ADD esp, 8 'der Stack muss durch die aufrufende Funktion aufgeräumt werden

push 1 '1. Parameter - p1
push 2 '2. Parameter - p2
CALL p 'links nach rechts

END ASM

SLEEP

Unterschiede zu QB: neu in FreeBASIC.

Siehe auch: DECLARE, STDCALL, PASCAL

Letzte Bearbeitung: 11.09.11
Zur Onlinefassung des Eintrags

CHAIN

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

CHAIN ü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). Konnte kein Programm aufgerufen werden (z. B. weil die angegebene Datei nicht existiert), so wird -1 zurückgegeben. Beachten Sie, dass auch der vom Programm zurückgegebene Wert -1 sein könnte!

Beispiel:
Um dieses Beispiel zu starten, muss im aktuellen Arbeitsverzeichnis die Datei "program" bzw. "program.exe" vorhanden sein. Wenn sie nicht vorhanden ist, wird nichts aufgerufen, und CHAIN gibt -1 zurück.

#IF __FB_UNIX__
DIM AS STRING program = "./program"
#ELSEIF __FB_PCOS__
DIM AS STRING program = "program.exe"
#ENDIF

PRINT "Starte " & program & " ..."
IF (CHAIN(program) = -1) THEN
PRINT program & " nicht gefunden!"
END IF

SLEEP

Unterschiede zu QB:
CHAIN kann als Funktion eingesetzt werden.

Plattformbedingte Unterschiede:

- Unter Linux muss der Dateiname 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch:
RUN, EXEC, SHELL, END, COMMAND, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

CHDIR

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

CHDIR ändert das aktuelle Arbeitsverzeichnis oder -laufwerk.

- 'Pfadangabe' ist ein String, der das Verzeichnis identifiziert, in das gewechselt werden soll. Die Pfadangabe kann absolut oder relativ zum aktuellen Arbeitsverzeichnis sein (siehe CURDIR).

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

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

' Wechsel in das übergeordnete Verzeichnis
CHDIR ".."
PRINT CURDIR

' Wechsel mit absoluter Pfadangabe
#IF __FB_WIN32__
CHDIR "C:\WINDOWS"
#ELSEIF __FB_UNIX__
CHDIR "/usr/share"
#ENDIF
PRINT CURDIR

' zum Diskettenlaufwerk wechseln
' (Laufwerksbuchstaben existieren nicht in unixartigen Betriebssystemen)
#IF __FB_PCOS__
IF CHDIR("A:\") THEN
PRINT "Laufwerk A: nicht bereit"
ELSE
PRINT CURDIR
END IF
#ENDIF

SLEEP

mögliche Ausgabe:

C:\BASIC\FreeBASIC
C:\BASIC
C:\WINDOWS
Laufwerk A: nicht bereit

Unterschiede zu QB:

- In QB kann CHDIR nicht zwischen zwei Laufwerken wechseln.

- In FreeBASIC kann CHDIR als Funktion eingesetzt werden.

Plattformbedingte Unterschiede:

- Unter Linux muss der Dateiname 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch: RMDIR, MKDIR, CURDIR, SHELL, Betriebssystem-Anweisungen.

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

CHR

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

CHR verwandelt einen ASCII-Code in seinen Character. Das Dollarzeichen ($) als Suffix ist optional.

CHR wird z.B. verwendet, um Zeichen darzustellen, die nicht auf der Tastatur sind. Möchten Sie dasselbe Zeichen mehrmals hintereinander ausgeben, sollten Sie stattdessen STRING (Funktion) benutzen.

Beispiel:

PRINT "ASCII-Character 127: "; CHR(127)
PRINT "Codes 65, 66 und 67: "; CHR(65, 66, 67)

Liste interessanter CHR-Codes:
Die Funktionstasten werden meist über zwei Byte angesprochen, von denen das erste den Wert 255 hat (im Gegensatz zu QBASIC, wo es der Wert 0 ist; vergleiche dazu INKEY)

F-Tasten:
CHR(255, 56)  = F1
CHR(255, 60)  = F2
CHR(255, 61)  = F3
CHR(255, 62)  = F4
CHR(255, 63)  = F5
CHR(255, 64)  = F6
CHR(255, 65)  = F7
CHR(255, 66)  = F8
CHR(255, 67)  = F9
CHR(255, 68)  = F10
CHR(255, 133) = F11
CHR(255, 134) = F12

Pfeiltasten:
CHR(255, 72)  = Rauf
CHR(255, 75)  = Links
CHR(255, 77)  = Rechts
CHR(255, 80)  = Runter

Weitere:
CHR(255, 71)  = Pos1 (oder auch Home)
CHR(255, 73)  = Bild auf
CHR(255, 79)  = Ende
CHR(255, 81)  = Bild ab
CHR(255, 82)  = Einfügen
CHR(255, 83)  = Entfernen
CHR(13,  10)  = Zeilenumbruch

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

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
WCHR, ASC, STRING (Funktion)

Weitere Informationen zu CHR-Codes:
ASCII-Tabelle anzeigen lassen

Letzte Bearbeitung: 10.02.11
Zur Onlinefassung des Eintrags

CINT

Syntax: CINT(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CINT verwandelt einen beliebigen numerischen Ausdruck in eine INTEGER-Zahl, indem es die Zahl mathematisch rundet: Ist der Nachkommawert größer als .5, dann wird aufgerundet; ist er kleiner als .5, dann wird abgerundet. Ist der Nachkommawert genau .5, dann wird zur nächstliegenden geraden Zahl gerundet.

Handelt es sich bei dem Ausdruck um einen STRING, dann wird dieser mit der Funktion VALINT umgewandelt.

Beispiel:

PRINT CINT(123.45)  ' gibt 123 aus
PRINT CINT(-56.78)  ' gibt -57 aus
PRINT CINT(457.5)   ' gibt 458 aus
PRINT CINT(456.5)   ' gibt 456 aus
PRINT CINT("457.5") ' gibt 457 aus
SLEEP

Unterschiede zu QB:

- INTEGER sind in FreeBASIC 32bit-Ganzzahlen, keine 16bit-Ganzzahlen wie in QB.

- Die Übergabe eines STRINGs ist in QB nicht erlaubt.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb gibt CINT eine 16-Bit-Zahl zurück.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

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 (Grafik) 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 Radius der Ellipse.

- 'Farbe' ist die Farbnummer. Sie ist modusspezifisch. Siehe dazu COLOR (Anweisung) und SCREENRES.

- '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 bzw. 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.

Achtung: Bei der Verwendung von SCREEN und ohne Angabe von 'Aspekt=1.0' wird bei einigen Bildschirmmodi statt eines Kreises eine Ellipse angezeigt. Unter SCREENRES tritt dieses Problem nicht auf.

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:

SCREENRES 640, 480                        ' Grafikfenster initialisieren
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
SLEEP

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.

Siehe auch:
SCREENRES, Grafik

Letzte Bearbeitung: 12.01.12
Zur Onlinefassung des Eintrags

CLASS

Syntax: CLASS Klassenname
Typ: Anweisung
Kategorie: OOP

Aktuell (Versionsstand: 0.21.1) gibt es CLASS noch nicht, befindet sich aber in Planung.
Die Verwendung wird grob der eines UDTs entsprechen, mit dem Unterschied, dass alle Records standardmäßig PRIVATE statt PUBLIC sein werden.

Beispiel:

'kein Beispiel möglich, da noch nicht implementiert

Letzte Bearbeitung: 04.09.10
Zur Onlinefassung des Eintrags

CLEAR

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

CLEAR setzt eine Anzahl an Bytes ab einer bestimmten Adresse auf einen angegebenen Wert. Der Befehl kann z. B. dazu verwendet werden, um alle Elemente eines Arrays auf einen bestimmten Wert zu setzen.

- 'Bezeichner' ist der Bezeichner einer Variablen, 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)

Hinweis: Wird als 'Bezeichner' ein Pointer angegeben, so muss dieser zuerst dereferenziert werden. Ansonsten wird CLEAR versuchen, den Zeiger selbst zu überschreiben anstelle des Speichers, auf den der Zeiger zeigt.
Auch Strings fester Länge können übergeben werden. Bei Strings variabler Länge kann CLEAR nicht eingesetzt werden, da auch in diesem Fall der interne Zeiger auf die Daten überschrieben werden würde.

Beispiel:

DIM array(1 TO 100) AS INTEGER
DIM AllocArea AS BYTE PTR
DIM IntVar AS INTEGER
DIM text AS STRING*5 = "12345"

AllocArea = ALLOCATE(100)
IntVar = 5

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

PRINT array(1)
PRINT AllocArea[0]
PRINT IntVar
PRINT text
PRINT
SLEEP

Ausgabe:

0
1
-1
!!!45

Erläuterung: Alle vier Bytes der INTEGER-Stelle 'IntVar' werden einzeln mit dem Wert 255 befüllt; deshalb hat die Variable nach dem CLEAR-Aufruf den Wert -1. Beim String werden die ersten drei Zeichen auf den ASCII-Wert 33 (Ausrufezeichen) gesetzt.

Unterschiede zu QB:
CLEAR hat in QB eine andere Bedeutung. Es wird dazu verwendet, alle Variablen auf null zu setzen und die Stack-Größe zu setzen.

Siehe auch:
DIM, ERASE, RESET, Speicher

Letzte Bearbeitung: 27.01.12
Zur Onlinefassung des Eintrags

CLNG

Syntax: CLNG(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CLNG verwandelt einen beliebigen numerischen Ausdruck in eine LONG-Zahl, indem es die Zahl mathematisch rundet: Ist der Nachkommawert größer als .5, dann wird aufgerundet; ist er kleiner als .5, dann wird abgerundet. Ist der Nachkommawert genau .5, dann wird zur nächstliegenden geraden Zahl gerundet.

Handelt es sich bei dem Ausdruck um einen STRING, dann wird dieser mit der Funktion VALLNG umgewandelt.

Beispiel:

PRINT CLNG(123.45)  ' gibt 123 aus
PRINT CLNG(-56.78)  ' gibt -57 aus
PRINT CLNG(457.5)   ' gibt 458 aus
PRINT CLNG(456.5)   ' gibt 456 aus
PRINT CLNG("457.5") ' gibt 457 aus

Unterschiede zu QB:

- LONG ist in QB immer eine 32bit-Ganzzahl.

- Die Übergabe eines STRINGs ist in QB nicht erlaubt.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CLNGINT

Syntax: CLNGINT (Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CLNGINT verwandelt einen beliebigen numerischen Ausdruck zu einer LONGINT-Zahl, indem es die Zahl mathematisch rundet: Ist der Nachkommawert größer als .5, dann wird aufgerundet; ist er kleiner als .5, dann wird abgerundet. Ist der Nachkommawert genau .5, dann wird zur nächstliegenden geraden Zahl gerundet.

Handelt es sich bei dem Ausdruck um einen STRING, dann wird dieser mit der Funktion VALLNG umgewandelt.

Beispiel:

PRINT CLNGINT(12345678.45)   ' gibt 12345678 aus
PRINT CLNGINT(-12345678.901) ' gibt -12345679 aus
PRINT CLNGINT(123457.5)      ' gibt 123458 aus
PRINT CLNGINT(123456.5)      ' gibt 123456 aus
PRINT CLNGINT("123457.5")    ' gibt 123457 aus

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CLNGINT nicht zur Verfügung und kann nur über __CLNGINT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CLOSE

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

CLOSE schließt eine, mehrere oder alle Dateien, die zuvor mit OPEN geöffnet wurden. Bei Programmende werden automatisch alle noch geöffneten Dateien geschlossen; dennoch gehört es zum guten Programmierstil, geöffnete Dateien wieder zu schließen.

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

- CLOSE kann als Funktion genutzt werden. Diese gibt bei Erfolg 0 und ansonsten die Fehlernummer zurück.

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

Unterschiede zu früheren Versionen von FreeBASIC:
Bis einschließlich Version 0.22 konnte auch 0 als Dateinummer verwendet werden, um alle geöffneten Dateien zu schließen. Der Versuch erzeugt nun eine Fehlermeldung.

Siehe auch:
OPEN (Anweisung), Dateien (Files)

Letzte Bearbeitung: 07.08.11
Zur Onlinefassung des Eintrags

CLS

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

CLS löscht den Konsolen- bzw. Grafik-Bildschirm. Der gelöschte Bereich wird mit der Hintergrundfarbe aufgefüllt (siehe COLOR)

'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 das durch VIEW (Grafik) festgelegte Darstellungsfeld, oder nichts im Konsolenmodus.

- 2 löscht den durch VIEW (Text) festgelegten Textanzeigebereich, sowohl im Grafik- als auch im Konsolenmodus.

- Wird der Parameter ausgelassen, dann wird das grafische Darstellungsfeld gelöscht, sofern zuvor VIEW (Grafik) verwendet wurde, ansonsten wird der durch VIEW (Text) festgelegte Textanzeigebereich gelöscht. Wurde keiner der beiden Bereiche festgelegt, dann löscht CLS den gesamten Bildschirm.

Beispiel 1:

COLOR 7, 1      ' hellgrau auf blau
CLS             ' Bildschirm löschen und auf die Hintergrundfarbe setzen
LOCATE 12, 30
PRINT "Hallo FreeBASIC-Welt!"

Beispiel 2:
Um im Grafikmodus den gesamten Bildschirm auf einen Farbwert zu setzen, kann es schneller sein, statt der Verwendung von CLS den Bildschirmspeicher mit CLEAR auf den gewünschten Farbwert zu setzen.

DIM scrbuf AS BYTE PTR, scrsize AS INTEGER
DIM AS INTEGER scrhei, scrpitch
DIM AS INTEGER radius = 0, richtung = 1

SCREENRES 640, 480, 8

scrbuf = SCREENPTR: ASSERT( scrbuf <> 0 )
SCREENINFO( , scrhei, , , scrpitch )
scrsize = scrpitch * scrhei

DO
SCREENLOCK                 ' Bildschirm sperren (nötig für Direktzugriff)
CLEAR *scrbuf, 0, scrsize  ' Bildschirm löschen
CIRCLE (320, 240), radius  ' Kreis zeichnen
SCREENUNLOCK
radius += richtung         ' Radius vergrößern oder verkleinern
IF radius <= 0 THEN
richtung = 1
ELSEIF radius >= 100 THEN
richtung = -1
END IF
SLEEP 1                    ' kleine Pause für den Prozessor
LOOP UNTIL LEN(INKEY) > 0    ' läuft solange, bis eine Taste gedrückt wird

Siehe auch:
VIEW (Grafik), VIEW (Text), Grafik

Letzte Bearbeitung: 04.08.11
Zur Onlinefassung des Eintrags

COLOR (Anweisung)

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

COLOR setzt die Vorder- und 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 Tabelle unten).

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

- 'Hintergrundfarbe' wird von PRESET (Grafik) 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 (helles grau) 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:

- PSET (Grafik)

- PRESET (Grafik)

- LINE (Grafik)

- CIRCLE

- DRAW (Grafik)

- PAINT

- CLS

Text-Anweisungen:

- PRINT (Anweisung)

- INPUT (Anweisung)

Wurde das Grafikfenster mit SCREEN (Anweisung) initialisiert, dann sind die Farbnummern und die zugehörige Farbe abhängig vom gewählten Bildschirmmodus (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, 10 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

SCREENRES ohne Angabe der Farbtiefe initialisiert ein Grafikfenster mit 256 Farben (8bbp).
Bei höheren Farbtiefen als 8bpp werden die Farben als RGB-Farbwerte behandelt. 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:

SCREENRES 800, 600, 32       ' Bildschirmmodus 800x600 bei 32bpp
COLOR &hFF8000, &h000040  ' Vordergrund orange, Hintergrund dunkelblau

' Hello World! ausgeben
CLS
LOCATE 19, 44: PRINT "Hello World!"
SLEEP

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

Unterschiede zu QB:

- Im Textmodus können sowohl Vordergrund- als auch Hintergrundfarben zwischen 0 und 15 liegen.

- Es gibt kein Rahmen-Argument mehr.

- Die FreeBASIC-Version akzeptiert auch RGB-Farben in High-/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).

Siehe auch:
COLOR (Funktion), SCREENRES, PALETTE, PRINT (Anweisung), INPUT (Anweisung), Grafik.

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

COLOR (Funktion)

Syntax: COLOR
Typ: Funktion
Kategorie: Konsole / Gfx

Die Funktion COLOR gibt Informationen über die verwendeten Textfarben zurück.
In allen 32/24-Bit Farbmodi wird ab der FreeBASIC 0.18.2 nur noch die Vordergrundfarbe (RGBA; &hAARRGGBB) zurückgegeben.
Für die 16-Bit (und kleineren) Farbmodi wird der zurückgegebene Wert folgendermaßen berechnet:

(Vordergrund OR (Hintergrund SHL 16))

Das obere Word ist also die Hintergrundfarbe, während das untere Word die Vordergrundfarbe angibt.

Beispiel:

SCREEN 0
DIM c AS UINTEGER
COLOR 14, 1
CLS' erst nach cls wird der Hintergrund gefärbt

c = COLOR()'Abfragen der benutzten Farben

'mit LoWord und HiWord werden die Werte getrennt
PRINT "Console Farben:"
PRINT "Schreibfarbe: " & LOWORD(c)
PRINT "Hintergrund : " & HIWORD(c)

SLEEP

SCREEN 18, 32
' Setze orangene Schreibfarbe und blauer Hintergrund
COLOR RGB(255, 128, 0), RGB(0, 0, 164)
CLS ' erst nach cls wird der Hintergrund gefärbt

' Color() als Funktion gibt bei 32Bit nur die Schreibfarbe an
PRINT "&h" & HEX( COLOR(), 6)
PRINT "&h" & HEX( RGB(255, 128, 0), 6)

SLEEP

Unterschiede zu QB:
In QB kann COLOR nicht als Funktion eingesetzt werden.

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

Letzte Bearbeitung: 18.04.12
Zur Onlinefassung des Eintrags

COM

Siehe OPEN COM

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

COMMAND

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

COMMAND enthält die Kommandozeilenparameter an das Programm.

Der optionale Parameter 'index' gibt an, dass nur der n-te Kommandozeilenparameter zurückgegeben werden soll. Wird 'index' ausgelassen oder ist kleiner als 0, so gibt FreeBASIC alle Kommandozeilenparameter zurück. Ist 'index' = 0, so gibt FreeBASIC Pfad und Dateiname des aufgerufenen Programms zurück. Ist der angegebene Index größer als die Anzahl der Parameter, so wird ein leerer String ("") zurückgegeben.

Beim Lesen der Parameter wird alles innerhalb von Anführungszeichen als ein Parameter betrachtet. So lassen sich mehrere Begriffe als ein Parameter an ein Programm übergeben.

Das Dollarzeichen ($) als Suffix ist optional.

COMMAND sollte nicht in einem globalen Konstruktor aufgerufen werden. Aufgrund der Art, wie FreeBASIC arbeitet, erhält man in diesem Fall immer eine leere Liste. Dies könnte sich in Zukunft ändern.

Beispiel:

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

'Prog2.bas, liegt auch als kompilierte Datei Prog2.EXE vor:
PRINT COMMAND
PRINT COMMAND(2)
PRINT COMMAND(0)

Ausgabe:

/PARAMETER1 /PARAMETER2
/PARAMETER2
C:\BASIC\freeBASIC\Prog2.EXE

Wildcards (siehe DIR) werden standardmäßig aufgefüllt. So entsteht eine vollständige Liste aller passenden Treffer, die als Parameter übergeben werden. Wenn es keine passenden Treffer gibt oder der Parameter in Anführungszeichen gesetzt wird, dann werden die Wildcards nicht aufgefüllt. Es gibt weitere, plattformspezifische Möglichkeiten, das Auffüllen zu unterdrücken.

Unter Windows fügt man folgendes an den Anfang des Codes:

EXTERN _CRT_glob ALIAS "_CRT_glob" AS INTEGER
DIM SHARED _CRT_glob AS INTEGER = 0

Unter DOS kann man folgenden Code verwenden:

PUBLIC FUNCTION __crt0_glob_function ALIAS "__crt0_glob_function" ( BYVAL arg AS UBYTE PTR ) AS UBYTE PTR PTR
RETURN 0
END FUNCTION

Unter Linux ist die Shell selbst dafür zuständig. Hier kann man das Auffüllen etwa mit dem Befehl set -f ausschalten.

Unterschiede zu QB:

- Command hatte keinen Index-Parameter.

- Alle Buchstaben der Parameterliste wurden großgeschrieben zurückgegeben.

- Wildcards wurden nicht aufgelöst.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
SHELL, EXEC, EXEPATH, RUN, __FB_ARGC__, __FB_ARGV__, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

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ür 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 derselbe Bezeichner für die Variable verwendet werden; die Reihenfolge der COMMON-Anweisungen ist damit gleichgültig.

Eine ähnliche Funktion bietet EXTERN, doch während COMMON die Variable in jedem Modul deklariert und Speicher reserviert, verweist EXTERN nur auf den Speicherbereich eines anderen Moduls und definiert den Variablennamen im eigenen Modul.

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 AS INTEGER
COMMON SHARED b AS INTEGER

DECLARE SUB PublicSub ()

a = 1
b = 2

PublicSub

GETKEY

'========================
' Modul2.bas
COMMON SHARED b AS INTEGER
COMMON SHARED a AS INTEGER

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 (Meta), SHARED, PUBLIC (Klausel), EXTERN (Module).

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.

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

CONDBROADCAST

Syntax: CONDBROADCAST(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.

'handle' ist der Handle zu einem COND, also der Wert, der von CONDCREATE zur Identifizierung des COND zurückgegeben wird. Es ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war 'handle' vom Typ INTEGER.

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

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC steht CONDBROADCAST nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- CONDBROADCAST existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt CONDBROADCAST einen ANY PTR als Parameter 'handle'.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CONDBROADCAST nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

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 zum COND zurück. Sobald CONDs erstellt und die Threads gestartet wurden, kann ein Thread 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 Rückgabetyp ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war der Rückgabetyp INTEGER.

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 der Stelle CONDWAIT ist. Es empfiehlt sich daher, vor dem CONDSIGNAL oder CONDBROADCAST ein

SLEEP 1

einzubauen, um sicherzustellen, dass die Threads bereit sind, das Signal aufzunehmen.

Beispiel 1:

DIM SHARED AS ANY PTR hThread1, hThread2, mWait, hCond
DIM SHARED AS INTEGER q

SUB Thread (BYVAL z AS ZSTRING PTR)
DIM AS INTEGER j

MUTEXLOCK mWait
CONDWAIT(hCond, mWait)
MUTEXUNLOCK mWait
PRINT *z & " gestartet"

FOR j = 0 TO 9
MUTEXLOCK mWait
CONDWAIT(hCond, mWait)
MUTEXUNLOCK mWait
PRINT *z & " sendet:"; j
NEXT

q += 1
END SUB

hCond = CONDCREATE()

hThread1 = THREADCREATE(CAST(ANY PTR,@Thread), @"Thread 1")
hThread2 = THREADCREATE(CAST(ANY PTR,@Thread), @"Thread 2")
mWait = MUTEXCREATE

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

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

CONDDESTROY hCond
THREADWAIT(hThread1)
THREADWAIT(hThread2)
MUTEXDESTROY mWait

SLEEP

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.

Beispiel 2:

DIM SHARED hcondstart AS ANY PTR
DIM SHARED hmutexstart AS ANY PTR
DIM SHARED start AS INTEGER = 0

DIM SHARED threadcount AS INTEGER
DIM SHARED hmutexready AS ANY PTR
DIM SHARED hcondready AS ANY PTR

SUB mythread(BYVAL id_ptr AS ANY PTR)
DIM id AS INTEGER = CAST(INTEGER, id_ptr)

PRINT "Thread #" & id & " is waiting..."

' Sende Signal, dass dieser Thread bereit ist
MUTEXLOCK hmutexready
threadcount += 1
CONDSIGNAL hcondready
MUTEXUNLOCK hmutexready

' Warte auf das Start-Signal
MUTEXLOCK hmutexstart
DO WHILE start = 0
CONDWAIT hcondstart, hmutexstart
LOOP

' nun hält dieser Thread den Lock von hmutexstart

MUTEXUNLOCK hmutexstart

' Die Nummer dieses Threads ausgeben
FOR i AS INTEGER = 1 TO 40
PRINT id;
SLEEP 1  ' Pause, um andere Threads arbeiten zu lassen
NEXT i
END SUB

DIM threads(1 TO 9) AS ANY PTR

' Erstelle die CONDs
hcondstart = CONDCREATE()
hmutexstart = MUTEXCREATE()

hcondready = CONDCREATE()
hmutexready = MUTEXCREATE()

threadcount = 0

FOR i AS INTEGER = 1 TO 9
threads(i) = THREADCREATE(@mythread, CAST(ANY PTR, i))
IF threads(i) = 0 THEN
PRINT "CONDs konnten nicht erstellt werden!"
END IF
NEXT i

PRINT "Warte, bis alle Threads bereit sind ..."

MUTEXLOCK(hmutexready)
DO UNTIL threadcount = 9
' Warten auf das Signal des Threads, dass er bereit ist
CONDWAIT(hcondready, hmutexready)
LOOP
MUTEXUNLOCK(hmutexready)

PRINT "Los!"

' Alle Threads gleichzeitig starten
MUTEXLOCK hmutexstart
start = 1
CONDBROADCAST hcondstart
MUTEXUNLOCK hmutexstart

' Warten, bis alle Threads abgeschlossen wurden
FOR i AS INTEGER = 1 TO 9
IF threads(i) <> 0 THEN
THREADWAIT threads(i)
END IF
NEXT i

' Speicher freigeben
MUTEXDESTROY hmutexready
CONDDESTROY hcondready

MUTEXDESTROY hmutexstart
CONDDESTROY hcondstart
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC steht CONDCREATE nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- CONDCREATE existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 gibt CONDCREATE einen ANY PTR zurück.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CONDCREATE nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

CONDDESTROY

Syntax: CONDDESTROY 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.

CONDDESTROY löscht ein COND. 'handle' ist der Handle zum zu löschenden COND, also der Wert, der von CONDCREATE zur Identifizierung des COND zurückgegeben wurde. Es ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war 'handle' vom Typ INTEGER.

Beispiel: siehe CONDCREATE

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC steht CONDDESTROY nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- CONDDESTROY existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt CONDDESTROY einen ANY PTR als Parameter.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CONDCREATE nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

CONDSIGNAL

Syntax: CONDSIGNAL (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.

'handle' ist der Handle zu einem COND, also der Wert, der von CONDCREATE zurückgegeben wird und den Thread identifiziert. Es ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war 'handle' vom Typ INTEGER.

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.
Achtung: Abhängig vom Betriebssystem werden Threads nicht unbedingt in der Reihenfolge gestartet, in der sie erstellt wurden.

Beispiel: siehe CONDCREATE

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC steht CONDSIGNAL nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- CONDSIGNAL existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt CONDSIGNAL einen ANY PTR als Parameter.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CONDSIGNAL nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

CONDWAIT

Syntax: CONDWAIT(handle, mutex)
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.

- 'handle' ist der Handle zu einem COND, also der Wert, der von CONDCREATE zur Identifizierung des COND zurückgegeben wird. Es ist ein ANY PTR. In früheren Versionen von FreeBASIC (vor v0.17) war 'handle' vom Typ INTEGER.

- 'mutex' ist der Mutex, der mit diesem COND verknüpft ist und der während der Überprüfung des COND und während des Aufrufs von CONDWAIT gesperrt werden muss.

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

Das mit CONDWAIT verwendete Mutex sollte vor dem Befehl mit MUTEXLOCK gesperrt, und gleich danach mit MUTEXUNLOCK entsperrt werden.

Beispiel: Siehe CONDCREATE

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC steht CONDWAIT nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- CONDWAIT existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt CONDWAIT einen ANY PTR als Parameter 'handle'.

- Seit FreeBASIC v0.18.3 verlangt CONDWAIT den zweiten Parameter 'mutex'.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CONDWAIT nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 02.09.11
Zur Onlinefassung des Eintrags

CONS

Siehe OPEN CONS

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

CONST

Syntax A: CONST Symbol [AS Typ] = Ausdruck [, Symbol [AS Typ] = Ausdruck [, ...]]
Syntax B: CONST AS Typ Symbol = Ausdruck [, Symbol = Ausdruck [, ...]]
Typ: Anweisung
Kategorie: Programmorganisation

Dieser Eintrag behandelt die Anweisung CONST. Für die Klausel CONST bei der Parameterübergabe und der Deklaration von Memberfunktionen siehe CONST (Klausel); für die Klausel CONST in SELECT-Anweisungen siehe SELECT CASE.

CONST erzeugt ein Symbol, das als Konstante behandelt wird. Dieses Symbol kann von einem beliebigen Zahlendatentyp oder ein STRING sein. ZSTRING, WSTRING und selbstdefinierte Datentypen sind nicht möglich. 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.16 kann über die Klausel 'AS Typ' tatsächlich festgelegt werden, welchen Datentyp ein Symbol besitzen soll. Ansonsten verwendet FreeBASIC automatisch einen passenden Datentyp (in der Regel INTEGER für Ganzzahlen und DOUBLE für Gleitkommazahlen). Vor FreeBASIC v0.16 wurde automatisch der Datentyp gewählt, der am besten dazu geeignet ist, um die Konstante zu speichern. 'AS TYP' hatte bis zu dieser Version keine Auswirkungen auf den Datentyp des Symbols.

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:

CONST blau = 1, rot = CAST(SHORT, 4)
CONST DoubleValue1 = 1#, DoubleValue2 = 3.0
CONST SingleValue AS SINGLE = 3.0
CONST msg = "Hallo Welt!"

PRINT LEN(blau), LEN(rot)
PRINT LEN(DoubleValue1), LEN(DoubleValue2)
PRINT LEN(SingleValue)
PRINT msg
SLEEP

Ausgabe:

4     2
8     8
4
Hallo Welt!

Da der Konstanten 'blau' eine Ganzzahl zugewiesen wurde, wird sie als INTEGER behandelt. Dieses Verhalten wurde bei 'rot' geändert, indem die zugewiesene Zahl zu einer SHORT-Variablen gecastet wurde.
'DoubleValue1' wird durch das Suffix als DOUBLE definiert, während bei 'DoubleValue2' die Schreibweise mit Dezimalpunkt ausschlaggebend ist. 'SingleValue' schließlich wurde explizit als SINGLE deklariert.

Unterschiede zu QB:
Unter QB konnte der Datentyp von Konstanten nicht festgelegt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.16 ist es möglich, den Datentyp einer Konstante explizit festzulegen.

- Die alternative Syntax CONST AS Typ Symbol (Syntax B) existiert seit FreeBASIC v0.16

- Seit FreeBASIC v0.13 können Strings als Konstanten definiert werden.

Siehe auch:
CONST (Klausel), DIM, VAR, DEFINE (Meta), SUB, FUNCTION, SELECT CASE, Datentypen

Letzte Bearbeitung: 18.01.12
Zur Onlinefassung des Eintrags

CONST (Klausel)

Syntax A:

[DECLARE] {SUB | FUNCTION} _
( [BYVAL | BYREF] [Parameter] AS [CONST] Typ [= Wert]
[, ...] )

Syntax B:

TYPE typename
DECLARE CONST {SUB | FUNCTION} Prozedurname ...
END TYPE

Typ: Klausel
Kategorie: Programmorganisation

Dieser Eintrag behandelt die Klausel CONST bei der Parameterübergabe bzw. der Deklaration von Memberfunktionen. Für die Definition von Konstanten siehe CONST; für die Klausel CONST in SELECT-Anweisungen siehe SELECT CASE.

CONST bewirkt, dass auf die damit bezeichnete Variable (Syntax A) bzw. auf die Prozedur innerhalb eines UDTs (Syntax B) nur lesend, aber nicht schreibend zugegriffen werden kann.

Als Klausel bei der Parameterübergabe in Syntax A garantiert CONST, dass die damit bezeichnete Variable innerhalb der Prozedur nicht verändert werden kann. Wird beim Compiliervorgang eine Operation entdeckt, welche den Wert des Parameters möglicherweise ändert, so wird der Compiliervorgang mit einem Fehler abgebrochen. Da die Überprüfung bereits zu dieser Zeit stattfindet, kommt es während der Programmausführung zu keinen Geschwindigkeitsnachteilen.

Beispiel:

SUB foo (x AS INTEGER, y AS CONST INTEGER)
PRINT x, y

x = 5
' y = 7 ' wird versucht y zu ändern, gibt der Compiler einen Fehler aus

PRINT x, y
END SUB

foo(1, 2)
SLEEP

Als Klausel bei Memberfunktionen (Syntax B) bezieht sich der Schreibschutz auf die Instanz des UDTs, auf die mit THIS zugegriffen werden kann. Damit ist es der Prozedur nicht erlaubt, schreibend auf die Records des UDTs zuzugreifen oder eine nicht-konstante Memberfunktion aufzurufen. Wird beim Compiliervorgang eine solche nicht erlaubte Operation entdeckt, so wird der Compiliervorgang mit einem Fehler abgebrochen.
Memberfunktionen können nicht gleichzeitig mit CONST und STATIC deklariert werden, da statische Memberfunktionen keinen THIS-Parameter besitzen.

Beispiel:

TYPE foo
x AS INTEGER
c AS CONST INTEGER = 0
DECLARE CONST SUB Lesen1()
DECLARE CONST SUB Lesen2()
DECLARE SUB Schreiben1()
DECLARE SUB Schreiben2()
END TYPE

SUB foo.Schreiben1
x = 1         ' ein nicht konstantes Record ändern
' c = 1       ' Compiler-Fehler: c ist konstant
END SUB

SUB foo.Schreiben2
Lesen1        ' sowohl konstante Memberfunktionen als auch
Schreiben1    ' nicht konstante können aufgerufen werden
END SUB

SUB foo.Lesen1
' auf Records kann lesend zugegriffen werden ...
DIM y AS INTEGER
y = c + x

' ... sie können aber nicht verändert werden
' x = 10      ' Compiler-Fehler: Lesen1 ist konstant
END SUB

SUB foo.Lesen2
' konstante Memberfunktionen können aufgerufen werden ...
Lesen1
' ... nicht konstante jedoch nicht
' Schreiben1  ' Compiler-Fehler
END SUB

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.18.3

Siehe auch:
CONST, DECLARE, SUB, FUNCTION, TYPE (UDT), SELECT CASE, DIM

Letzte Bearbeitung: 18.01.12
Zur Onlinefassung des Eintrags

CONSTRUCTOR (Klassen)

Syntax A:

TYPE TypeName
' Feld-Deklarationen
DECLARE CONSTRUCTOR ( )
DECLARE CONSTRUCTOR ( [ Parameterliste ] )
END TYPE

Syntax 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 defined Type - siehe TYPE (UDT)) erstellt wird. Für einen alternativen Verwendungszusammenhang siehe CONSTRUCTOR (Module).

Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption -lang fb kompiliert 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 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.)

CONSTRUCTOR überschreibt den Standard-Konstruktor einer Klasse, somit sind manche Deklarationsformen bei Variablen nur noch möglich, wenn der entsprechende Konstruktor auch definiert wurde.

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

Das Constructor-Schlüsselwort leitet einen eigenen SCOPE-Block ein. Siehe dazu auch SCOPE.

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
SLEEP

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: Neu in FreeBASIC

Unterschiede zu älteren FreeBASIC-Versionen: CONSTRUCTOR für Klassen existiert seit FreeBASIC v0.17

Unterschiede unter den FB-Dialektformen: CONSTRUCTOR ist nur in -lang fb zulässig

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

Letzte Bearbeitung: 27.08.11
Zur Onlinefassung des Eintrags

CONSTRUCTOR (Module)

Syntax:

[Public | Private] Sub name [Alias "externer_name"] [()] Constructor [priorität] [Static]

Typ: Klausel
Kategorie: Programmorganisation

Die CONSTRUCTOR-Klausel bewirkt, dass eine SUB aufgerufen wird, bevor das Programm gestartet wird.

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 CONSTRUCTOR-SUB darf keine Parameterliste besitzen, da kein Weg existiert, festzulegen, welche Parameter übergeben werden.

- Die 'CONSTRUCTOR'-Klausel markiert die SUB als Constructor.

- '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 Constructoren abgearbeitet werden sollen. 101 ist dabei die höchste Priorität; dieser Constructor 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 Constructor, die ohne eine Priorität festgelegt wurden, werden nach denen ausgeführt, die mit Priorität festgelegt wurden.

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

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 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 Constructoren verwendet werden. Innerhalb mehrerer Module können ebenfalls zusätzliche Constructoren eingefügt werden, unter der Voraussetzung, dass keine zwei PUBLIC-Constructoren mit demselben Bezeichner existieren.

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

Das Constructor-Schlüsselwort leitet einen eigenen SCOPE-Block ein. Siehe dazu auch SCOPE.

Beispiel:
Dieses Beispielprogramm enthält ein Set aus vier Constructoren und Destruktoren. Es wird gezeigt, in welcher Reihenfolge diese abgearbeitet werden.

SUB Constructor1 CONSTRUCTOR 101
PRINT "Constructor1 aufgerufen - hoechste Prioritaet"
END SUB
SUB Constructor2 CONSTRUCTOR 201
PRINT "Constructor2 aufgerufen - niedrigere Prioritaet"
END SUB
SUB Constructor3 CONSTRUCTOR
PRINT "Constructor3 aufgerufen - ohne Prioritaet"
END SUB
SUB Constructor4 CONSTRUCTOR
PRINT "Constructor4 aufgerufen - ohne Prioritaet"
END SUB

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

SUB Destructor1 DESTRUCTOR 101
PRINT "Destructor1 aufgerufen - niedrigeste Prioritaet"
SLEEP 'Auf Tastendruck warten
END SUB
SUB Destructor2 DESTRUCTOR 201
PRINT "Destructor2 aufgerufen - hoehere Prioritaet"
END SUB
SUB Destructor3 DESTRUCTOR
PRINT "Destructor3 aufgerufen - ohne Prioritaet"
END SUB
SUB Destructor4 DESTRUCTOR
PRINT "Destructor4 aufgerufen - ohne Prioritaet"
END SUB

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

PRINT "Modul-Level Code"

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede 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 (Klassen)

Letzte Bearbeitung: 26.07.11
Zur Onlinefassung des Eintrags

CONTINUE

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

CONTINUE springt in einer DO-, FOR- oder WHILE-Schleife an das Schleifen-Ende, wo dann die Abbruchbedingung geprüft wird. Bei einer FOR-Schleife wird der Schleifenzähler entsprechend der STEP-Anweisung erhöht (falls sie vorhanden ist; ansonsten findet regulär eine Erhöhung um 1 statt).

Beispiel 1:

DO
PRINT "Diese Zeile wird immer angezeigt."
SLEEP 100
IF INKEY <> "" THEN EXIT DO
CONTINUE DO
PRINT "Diese Zeile wird NIE angezeigt."
LOOP

PRINT "Schleife verlassen"
SLEEP

Wenn mehrere Schleifen ineinander verschachtelt sind, dann wird die innerste Schleife der angegebenen Art fortgesetzt. Durch die mehrfache Angabe von Schleifentypen, durch Komma getrennt, kann auch eine weiter außen liegende Schleife angesprochen werden.

Beispiel 2:

' einfache Primzahlensuche

PRINT "Die Primzahlen zwischen 1 und 20 lauten:"
PRINT

FOR n AS INTEGER = 2 TO 20
FOR t AS INTEGER = 2 TO INT(SQR(n))
IF (n MOD t) = 0 THEN  ' n ist durch t teilbar
CONTINUE FOR, FOR    ' n ist keine Primzahl; nächstes n versuchen
END IF
NEXT t
PRINT n
NEXT n
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Möglichkeit, eine Schleife höherer Ebene anzusprechen (z. B. CONTINUE DO, DO) existiert erst seit FreeBASIC v0.17

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CONTINUE nicht zur Verfügung und kann nur über __CONTINUE aufgerufen werden.

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

Letzte Bearbeitung: 23.08.11
Zur Onlinefassung des Eintrags

COS

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

Gibt den Kosinus eines Winkels w im Bogenmaß zurück. Der Kosinus zu einem Winkel w ist die relative horizontale Entfernung innerhalb des Normkreises zu seinem Mittelpunkt (Wikipedia-Artikel zum Thema).

'w' ist eine beliebiger numerischer Ausdruck. Variablen, Konstanten, Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jedem Datentyp außer STRING, ZSTRING oder WSTRING sein. Der Rückgabewert ist ein DOUBLE-Wert, der den Kosinus-Wert zum Winkel enthält.

Die Umkehrfunktion zu COS lautet ACOS.

Beispiel:

CONST pi AS DOUBLE = ACOS(0)*2
DIM a AS DOUBLE
DIM r AS DOUBLE

INPUT "Bitte geben Sie einen Winkel in Grad (DEG) ein: ", a
' Grad in Bogenmaß umrechnen:
r = a * PI / 180
PRINT ""
PRINT "Der Kosinus eines" ; a; "°-Winkels ist ";
PRINT USING "#.##"; COS(r)
SLEEP

Ausgabebeispiel:

Bitte geben Sie einen Winkel in Grad (DEG) ein: 60

Der Sinus eines 60 Grad-Winkels ist 0.50

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 07.07.10
Zur Onlinefassung des Eintrags

CPTR

Syntax: CPTR(Datentyp Ptr, 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
DIM 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.

Hinweis:
- Momentan gibt der Compiler keinen Fehler aus, wenn als 'Datentyp Ptr' ein normaler Datentyp und kein Pointer angegeben wird. Dies kann zu Fehlern führen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede in den Dialektformen:
In der Dialektform -lang qb steht CPTR nicht zur Verfügung und kann nur über __CPTR aufgerufen werden.

Siehe auch:
CAST

Letzte Bearbeitung: 15.06.10
Zur Onlinefassung des Eintrags

CSHORT

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

CSHORT konvertiert einen beliebige numerischen Ausdruck in einen SHORT (16-bit).

Beispiel:

DIM a AS INTEGER = 10
DIM b AS SHORT = CSHORT(a)
PRINT a, b
SLEEP

Ausgabe:

10            10

Unterschiede zu QB: neu in FreeBASIC

Unterschiede in den Dialektformen:
In der Dialektform -lang qb steht CSHORT nicht zur Verfügung und kann nur über __CSHORT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CSIGN

Syntax: CSIGN(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CSIGN verwandelt eine vorzeichenlose Zahl in eine vorzeichenbehaftete Zahl desselben Datentyps.

Die Funktion wird dazu benutzt, bei Multiplikationen und Divisionen das Verhalten vorzeichenbehafteter Zahlen zu erzwingen (im Zusammenspiel mit SHL und SHR). CSIGN ist die Gegenfunktion zu CUNSG.

Beispiel:

DIM a AS USHORT
a = 65000
PRINT CSIGN(a)
SLEEP

Ausgabe:

-536

Unterschiede zu QB: Neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CSIGN nicht zur Verfügung und kann nur über __CSIGN aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CSNG

Syntax: CSNG(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CSNG konvertiert einen beliebigen numerischen Ausdruck in eine SINGLE-Zahl (32-bit).

Beispiel:

DIM AS DOUBLE a
DIM AS SINGLE b
a = 0.123456789999
b = CSNG(a)

PRINT a; b
SLEEP

Ausgabe:

0.123456789999              0.1234568

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CSRLIN

Syntax: CSRLIN
Typ: Funktion
Kategorie: Konsole

CSRLIN (CurSoR LINe) gibt die aktuelle Zeile (vertikale Position) des Cursors zurück. Die oberste Zeile besitzt den Wert 1.

Beispiel:

LOCATE 3, 10
PRINT CSRLIN
PRINT CSRLIN
SLEEP

Ausgabe:

3
4

Siehe auch:
POS, LOCATE (Anweisung), LOCATE (Funktion), Konsole

Letzte Bearbeitung: 01.02.12
Zur Onlinefassung des Eintrags

CUBYTE

Syntax: CUBYTE(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CUBYTE konvertiert einen beliebigen numerischen Ausdruck zu einemUBYTE.

CUBYTE rundet den Ausdruck und gibt die untersten 8 Bit als UBYTE-Wert zurück. Ist der Ausdruck ein STRING, dann wird dieser zuerst durch VALINT umgewandelt.

Beispiel:

PRINT CUBYTE(460)

Ausgabe:

204

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CUBYTE nicht zur Verfügung und kann nur über __CUBYTE aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CUINT

Syntax: CUINT(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CUINT konvertiert einen beliebigen numerischen Ausdruck zu einem UINTEGER-Zahl, indem es die Zahl mathematisch rundet: Ist der Nachkommawert größer als .5, dann wird aufgerundet; ist er kleiner als .5, dann wird abgerundet. Ist der Nachkommawert genau .5, dann wird zur nächstliegenden geraden Zahl gerundet.

Handelt es sich bei dem Ausdruck um einen STRING, dann wird dieser mit der Funktion VALUINT umgewandelt.

Beispiel:

PRINT CUINT(123.45)  ' gibt 123 aus
PRINT CUINT(457.5)   ' gibt 458 aus
PRINT CUINT(456.5)   ' gibt 456 aus
PRINT CUINT("457.5") ' gibt 457 aus
SLEEP

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CUINT nicht zur Verfügung und kann nur über __CUINT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CULNG

Syntax: CULNG(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

Konvertiert einen beliebigen numerischen Ausdruck zu einem ULONG-Zahl, indem es die Zahl mathematisch rundet: Ist der Nachkommawert größer als .5, dann wird aufgerundet; ist er kleiner als .5, dann wird abgerundet. Ist der Nachkommawert genau .5, dann wird zur nächstliegenden geraden Zahl gerundet.

Handelt es sich bei dem Ausdruck um einen STRING, dann wird dieser mit der Funktion VALULNG umgewandelt.

Beispiel:

PRINT CULNG(123.45)  ' gibt 123 aus
PRINT CULNG(457.5)   ' gibt 458 aus
PRINT CULNG(456.5)   ' gibt 456 aus
PRINT CULNG("457.5") ' gibt 457 aus
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CULNG nicht zur Verfügung und kann nur über __CULNG aufgerufen werden.

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

Letzte Bearbeitung: 13.06.10
Zur Onlinefassung des Eintrags

CULNGINT

Syntax: CULNGINT(Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CULNGINT konvertiert einen beliebigen numerischen Ausdruck zu einem ULONGINT-Zahl, indem es die Zahl mathematisch rundet: Ist der Nachkommawert größer als .5, dann wird aufgerundet; ist er kleiner als .5, dann wird abgerundet. Ist der Nachkommawert genau .5, dann wird zur nächstliegenden geraden Zahl gerundet..

Handelt es sich bei dem Ausdruck um einen STRING, dann wird dieser mit der Funktion VALULNG umgewandelt.

Beispiel:

PRINT CULNGINT(12345678.45)   ' gibt 12345678 aus
PRINT CULNGINT(123457.5)      ' gibt 123458 aus
PRINT CULNGINT(123456.5)      ' gibt 123456 aus
PRINT CULNGINT("123457.5")    ' gibt 123457 aus
SLEEP

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CULNGINT nicht zur Verfügung und kann nur über __CULNGINT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CUNSG

Syntax: CUNSG (Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

CUNSG konvertiert eine vorzeichenbehaftete Zahl in eine vorzeichenlose Zahl desselben Datentyps.

Die Funktion wird benutzt, um bei Multiplikationen und Divisionen das Verhalten vorzeichenloser Zahlen zu erzwingen (im Zusammenspiel mit SHL und SHR). CUNSG ist die Gegenfunktion zu CSIGN.

Beispiel:

DIM a AS SHORT
a = -200
PRINT CUNSG(a)
SLEEP

Ausgabe:

65336

CUNSG ist die Gegenfunktion zu CSIGN.

Unterschiede zu QB: Neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CUNSG nicht zur Verfügung und kann nur über __CUNSG aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CURDIR

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

CURDIR gibt das aktuelle Arbeitsverzeichnis aus. Beim Programmstart handelt es sich dabei um das Verzeichnis, von dem aus das Programm gestartet wurde (dies ist nicht unbedingt identisch mit dem Verzeichnis, in dem das Programm liegt; siehe EXEPATH). Das Arbeitsverzeichnis kann mit CHDIR gewechselt werden.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT CURDIR
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CURDIR nicht zur Verfügung und kann nur über __CURDIR aufgerufen werden.

Siehe auch:
EXEPATH, CHDIR, MKDIR, RMDIR, SHELL, OPEN, DIR, Betriebssystem-Anweisungen

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

CUSHORT

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

CUSHORT konvertiert einen beliebigen numerischen Ausdruck zu einem USHORT.

Beispiel:

DIM a AS INTEGER = -10
DIM b AS USHORT = CUSHORT(a)
PRINT a, b
SLEEP

Ausgabe:

-10           65526

Unterschiede zu QB: neu in FreeBASIC

Unterschiede in den Dialektformen:
In der Dialektform -lang qb steht CUSHORT nicht zur Verfügung und kann nur über __CUSHORT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CUSTOM

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], CUSTOM, blender [, parameter]
Typ: Schlüsselwort
Kategorie: Gfx

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

- 'blender' ist ein Pointer auf eine Funktion (siehe Tutorial zum Thema Callback-Funktionen) der Form
FUNCTION blender(BYVAL src AS UINTEGER, BYVAL dst AS UINTEGER, BYVAL parameter AS ANY PTR) AS UINTEGER
Die Parameter der Funktion 'blender' haben folgende Bedeutung:

- 'src' ist die Farbe des auszugebenden Pixels (Bildquelle).

- 'dst' ist die Farbe des Pixels, das überschrieben werden soll (Hintergrund).

- Der Rückgabewert ist die Farbe des neuen Pixels.

- 'parameter' ist ein Pointer, der als drittes Argument an die Funktion 'blender' übergeben wird. Wird er ausgelassen, nimmt FreeBASIC automatisch parameter = 0 an.

Durch CUSTOM wird vor Ausgabe jedes einzelnen Pixels die Function 'blender' aufgerufen, um zu errechnen, in welcher Farbe das Pixel ausgegeben werden soll.
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!

Beispiel:

FUNCTION dither(BYVAL quellpixel AS UINTEGER, BYVAL zielpixel AS UINTEGER, BYVAL parameter AS ANY PTR) AS UINTEGER
' gibt zufallsbedingt entweder das Pixel der Bildquelle oder des Hintergrunds zurück
DIM grenzwert AS SINGLE = 0.5
IF parameter <> 0 THEN grenzwert = *CPTR(SINGLE PTR, parameter)

IF RND() < grenzwert THEN
RETURN quellpixel
ELSE
RETURN zielpixel
END IF
END FUNCTION

DIM img AS ANY PTR, grenzwert AS SINGLE

' Bildschirm setzen
SCREENRES 320, 200, 16, 2
SCREENSET 0, 1

' Bild erzeugen
img = IMAGECREATE(32, 32)
LINE img, ( 0,  0)-(15,  15), RGB(255,   0,   0), bf
LINE img, (16,  0)-(31,  15), RGB(  0,   0, 255), bf
LINE img, ( 0, 16)-(15,  31), RGB(  0, 255,   0), bf
LINE img, (16, 16)-(31,  31), RGB(255,   0, 255), bf

' Bild mit verschiedenen Dither-Werten ausgeben
DO UNTIL LEN(INKEY)
CLS

grenzwert = 0.2
PUT ( 80 - 16, 100 - 16), img, CUSTOM, @dither, @grenzwert

' Standardwert = 0.5
PUT (160 - 16, 100 - 16), img, CUSTOM, @dither

grenzwert = 0.8
PUT (240 - 16, 100 - 16), img, CUSTOM, @dither, @grenzwert

SCREENCOPY
SLEEP 25
LOOP

' Speicher freigeben
IMAGEDESTROY img

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:

- CUSTOM existiert erst seit FreeBASIC v0.14.

- 'parameter' existiert erst seit FreeBASIC v0.17. In älteren Versionen konnte dieser Parameter nicht übergeben werden.

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

Letzte Bearbeitung: 02.04.12
Zur Onlinefassung des Eintrags

CVD

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

CVD konvertiert einen 8-Byte-String (ein String aus 8 Zeichen) in eine DOUBLE-Zahl. CVD ist die Umkehrung von MKD.

Beispiel:

DIM a AS DOUBLE, b AS STRING
a = 4534.42186
b = MKD(a)
PRINT a, CVD(b)
SLEEP

Ausgabe:

4534.42186    4534.42186

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CVI

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

CVI konvertiert einen 4-Byte-String (ein STRING aus 4 Zeichen) in eine INTEGER-Zahl.

Beispiel:

DIM a AS INTEGER
a = CVI("RIFF")
PRINT a, MKI(a)
SLEEP

Ausgabe:

1179011410  RIFF

Unterschiede zu QB:
In FreeBASIC sind INTEGER 4 Byte lang, in QB nur 2 Byte.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb werden nur die ersten beiden Zeichen des Strings verwendet, da ein INTEGER hier nur 2 Byte lang ist.

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

Letzte Bearbeitung: 01.02.12
Zur Onlinefassung des Eintrags

CVL

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

CVL konvertiert einen 4-Byte-String (ein String aus 4 Zeichen) in eine LONG-Zahl. CVL ist die Umkehrung von MKI.

Beispiel:

DIM a AS INTEGER, b AS STRING
a = 4534
b = MKI(a)
PRINT a; CVI(b)
SLEEP

Ausgabe:

4534 4534

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CVLONGINT

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

CVLONGINT konvertiert einen 8-Byte-String (einen STRING aus 8 Zeichen) in eine LONGINT-Zahl. CVLONGINT ist die Umkehrung von MKLONGINT.

Beispiel:

DIM a AS  LONGINT, b AS STRING
a = 4534
b = MKLONGINT(a)
PRINT a, CVLONGINT(b)
SLEEP

Ausgabe:

4534          4534

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CVLONGINT nicht zur Verfügung und kann nur über __CVLONGINT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CVS

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

CVS konvertiert einen 4-Byte-String (ein STRING aus 4 Zeichen) in eine SINGLE-Zahl.

Beispiel:

DIM a AS  SINGLE, b AS STRING
a = 4534.4243
b = MKS(a)
PRINT a, CVS(b)
SLEEP

Ausgabe:

4534.424      4534.424

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

CVSHORT

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

CVSHORT konvertiert einen 2-Byte-String (einen STRING aus 2 Zeichen) in eine SHORT-Zahl. CVSHORT ist die Umkehrung zu MKSHORT.

Beispiel:

DIM a AS SHORT, b AS STRING
a = 4534
b = MKSHORT(a)
PRINT a, CVSHORT(b)
SLEEP

Ausgabe:

4534          4534

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht CVSHORT nicht zur Verfügung und kann nur über __CVSHORT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

Startbuchstabe D

DATA

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

DATA speichert Konstanten im Programm, die mit READ eingelesen werden können. Als Werte lassen sich Strings und Zahlen, aber auch Konstanten-Namen und einfache Rechenausdrücke. verwenden. Variablen-Namen können in DATA-Anweisungen nicht verwendet werden.
DATA-Anweisungen sind keine ausführbaren Anweisungen und stehen normalerweise am Ende vom Programm.

Beispiel 1: Werte in DATA-Zeilen speichern:

DATA 1, 2, 3, 4, 17, 21, 42, "Hello", "World"
DATA 3.1412, 4*ATN(1), ATAN2(0, -1), (17+4)*2, "Hello, " & " World!"

Der Zugriff auf die mit DATA gespeicherten Daten erfolgt über READ.
Dabei muss der Programmierer darauf achten, dass die Werte auch Variablen mit entsprechendem Datentyp zugewiesen werden. Werden Werte in nicht dazu passende Variablen eingelesen, so werden sie zuvor mittels STR, VALINT bzw. der passenden Entsprechung umgewandelt.

Beispiel 2: 9 gespeicherte Daten einlesen:

DIM height(1 TO 7) AS INTEGER
DIM AS STRING s1, s2
FOR a AS INTEGER = 1 TO 7
READ height(a)
NEXT
READ s1, s2
PRINT s1 & s2
DATA 1, 2, 3, 4, 17, 21, 42, "Hello,", " World"
SLEEP

Beispiel 3:

DIM AS INTEGER h(4)
DIM AS STRING hs
DIM AS INTEGER readindex

' Daten in das Array einlesen
FOR readindex = 0 TO 4
READ h(readindex)  ' Integer einlesen
PRINT "Number" ; readindex ; " = " ; h(readindex)
NEXT readindex
PRINT

READ hs              ' String einlesen
PRINT  "String = " & hs
SLEEP

' Datenblock.
DATA 3, 234, 435/4, 23+433, 87643, "Good" & "Bye!"

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. Durch RESTORE können Daten mehrfach eingelesen werden. Nach einem RESTORE-Aufruf liest die nächste READ-Anweisung wieder von der ersten DATA-Konstante, bzw. nach dem angegeben Label. Siehe Beispiel zu RESTORE.

DATA ist eine früher häufig verwendete Methode, um Konstanten im Programm zu speichern, heutzutage sind einfache Arrays allerdings viel üblicher.

Unterschiede zu QB:

- Strings müssen (außer in -lang qb) in "Anführungszeichen" stehen; sie werden sonst als Werte von Funktionen behandelt.

- Leere DATA-Elemente werden in QB als 0 bzw. als leerer String "" behandelt, in FreeBASIC führen sie zu einem Compilerfehler.

Unterschiede zu früheren FreeBASIC-Versionen:

- In den FreeBASIC-Versionen 0.15 und 0.16 war es möglich, DATA-Blöcke in Prozeduren zu verwenden. In den Versionen zuvor und danach ist dies nicht möglich.

Unterschiede unter den FB-Dialektformen:

- In den Dialektformen -lang fb und -lang fblite werden DATA-Zeilen wie Konstanten behandelt, die zur Compilezeit aufgelöst werden.

- In der Dialektform -lang qb wird jede Buchstaben- und Zeichenfolge als String behandelt, auch wenn keine Anführungszeichen gesetzt sind.

Siehe auch:
READ, RESTORE, Verschiedenes

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

DATE

Syntax: DATE[$]
Typ: Funktion
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

Unterschiede zu QB:
Um in FreeBASIC ein neues Datum einzustellen, müssen Sie SETDATE verwenden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
TIMER, SETDATE, TIME, SETTIME, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DATEADD

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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 der folgenden Werte:

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: existiert nur in QBX PDS und in VBWIN.

Unterschiede 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, DATEDIFF, DATEPART, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DATEDIFF

Syntax: 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 datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

'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-Tage-Einheiten (Wochen)

"ww"

Kalenderwochen (beginnen und 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: existiert nur in QBX PDS und in VBDOS

Unterschiede 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, DATEPART, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DATEPART

Syntax: 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 datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

'Intervall' ist ein String, der angibt, welcher Teil der Serial Number ausgegeben werden soll.

Wert

Bedeutung

"yyyy"

Jahre

"q"

Quartale (drei Monate)

"m"

Monate

"ww"

Wochen innerhalb des Jahres

"w"

Tage innerhalb der Woche

"d"

Tage innerhalb des Monats

"y"

Tage innerhalb des Jahres

"h"

Stunden

"n"

Minuten

"s"

Sekunden

'erster_Tag_der_Woche' wirkt sich auf das Ergebnis aus, wenn als Intervall "w" 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"

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

Unterschiede zu QB: existiert nur in QBX PDS und in VBWIN.

Unterschiede 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, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DATESERIAL

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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 datetime.bi (oder 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"
DIM a AS DOUBLE
a = DATESERIAL(2005, 11, 28) + TIMESERIAL(19, 3, 26)
PRINT FORMAT(a, "dd.mm.yyyy hh:mm:ss")
SLEEP

Ausgabe:

28.11.2005 19:03:26

Unterschiede zu QB: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATEDIFF, DATEVALUE, TIMESERIAL, YEAR, MONTH, DAY, WEEKDAY, MONTHNAME, WEEKDAYNAME, DATEADD, DATEPART, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DATEVALUE

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

DATEVALUE verwandelt einen STRING mit einer Datumsangabe in eine Serial Number.

'Datum' ist der String, der in eine Serial Number verwandelt werden soll. Er muss in einem dieser Formate übergeben 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 INTEGER, der die Serial Number enthält.

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: existiert nur in QBX PDS und in VBDOS.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEDIFF, TIMEVALUE, YEAR, MONTH, DAY, WEEKDAY, MONTHNAME, WEEKDAYNAME, DATEADD, DATEPART, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DAY

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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: existiert nur in QBX PDS und in VBDOS.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, YEAR, MONTH, DATEDIFF, WEEKDAY, HOUR, MINUTE, SECOND, MONTHNAME, WEEKDAYNAME, DATEADD, DATEPART, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

DEALLOCATE

Syntax: DEALLOCATE Pointer
Typ: Anweisung
Kategorie: Speicherverwaltung

DEALLOCATE 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 alloziert 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.
Achtung: Es kann nicht garantiert werden, dass diese Funktion auf allen Plattformen Multithreading unterstützt, d.h. thread-safe ist.

Beispiel:

DIM AS INTEGER PTR p1, p2

' 4 Bytes reservieren
p1 = ALLOCATE(4)

' p2 soll auf denselben Speicherbereich zeigen
p2 = p1

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

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

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Es kann nicht garantiert werden, dass die Prozedur auf allen Plattformen thread-safe ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht DEALLOCATE nicht zur Verfügung und kann nur über __DEALLOCATE aufgerufen werden.

Siehe auch:
ALLOCATE, CALLOCATE, REALLOCATE, Pointer, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

DECLARE

Syntax A:

DECLARE SUB Name [Aufrufkonvention] [OVERLOAD] [[LIB "DLLName"] _
ALIAS "AliasName"] [ (  _
[{BYVAL | BYREF } ] [Parameter1] AS Typ [= Wert]   [, _
[{BYVAL | BYREF } ] [Parameter2] AS Typ [= Wert] ] [, ...] ) ]

Syntax B:

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

Typ: Anweisung
Kategorie: Programmorganisation

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.

DECLARE deklariert eine neue Prozedur. Dies ist notwendig, wenn die Prozedur aufgerufen werden soll, bevor sie im Quellcode definiert wird.

- 'Name' ist der Bezeichner, unter dem die SUB bzw. FUNCTION aufgerufen wird.

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

- 'OVERLOAD' erlaubt, Prozeduren mit unterschiedlicher Parameterliste, aber gleichem Prozedurnamen deklarieren. Siehe dazu den Referenzeintrag OVERLOAD.

- '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 FreeBASIC nicht erlaubt sind, ist es möglich, ihnen "einen anderen Namen zu geben".

- 'Parameter1', 'Parameter2', '...' stehen für Parameter, die an die Prozedur übergeben werden sollen (siehe auch 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 Prozedur für diesen Parameter 'Wert' übergeben. 'Wert' darf ein einfacher Ausdruck sein, der Konstanten, Operatoren und Funktionen, jedoch keine Variablen enthält.

- 'BYVAL' bzw. 'BYREF' gibt an, ob der Parameter by value oder by reference übergeben wird. Näheres dazu finden Sie unter BYVAL.

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

DECLARE wird auch bei UDTs verwendet, um einen CONSTRUCTOR bzw. DESTRUCTOR, eine PROPERTY oder die Überladung von OPERATORen zu deklarieren.

Werden Prozeduren vor ihrem ersten Aufruf definiert, dann ist keine vorherige Deklaration nötig. Jedoch kann eine kompakt zusammenstehende Deklaration aller im Programm auftretenden Prozeduren zur Lesbarkeit des Quellcodes beitragen.

Beispiel:

DECLARE FUNCTION twice (AS INTEGER) AS INTEGER
DECLARE SUB PrintTimes (AS STRING, BYVAL AS INTEGER = 1)

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

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

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

DECLARE-Anweisungen können direkt an den Beginn eines BAS-Moduls gesetzt werden. Häufig werden sie jedoch in eine eigene Datei ausgelagert und dann über #INCLUDE eingebunden. Für gewöhnlich erhält eine solche Datei die Dateiendung .bi

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.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb und -lang deprecated werden Parameter standardmäßig BYREF übergeben.

- Deklarationen innerhalb eines TYPE-Blocks sind nur in der Dialektform -lang fb erlaubt.

Unterschiede zu QB:
In FreeBASIC ist die Angabe der Parameternamen optional.

Siehe auch:
SUB, FUNCTION, STATIC (Klausel), PASCAL, CDECL, STDCALL, BYVAL, BYREF, SHARED, LIB, ALIAS, OVERLOAD, OPERATOR, EXPORT, Prozeduren, Parameterübergabe

Letzte Bearbeitung: 03.09.11
Zur Onlinefassung des Eintrags

DEFBYTE

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem BYTE, da ihre Anfangsbuchstaben b sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFDBL

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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

Beispiel:

DEFDBL d
DEFDBL e-g
DIM dNumber
DIM fNumber

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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFINE (Meta)

Syntax A: #DEFINE Symbol [ Ausdruck ]
Syntax B: #DEFINE Symbol( Parameter ) Makro
Syntax C: #DEFINE Symbol( Parameter, weitereParameter... ) Makro
Typ: Metabefehl
Kategorie: Präprozessoren

#DEFINE definiert ein Symbol mit benutzerdefinierter Bedeutung oder ein Makro.

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

- Das Symbol ist nur in dem SCOPE-Block (auch SUB, FOR...NEXT, WHILE...WEND, DO...LOOP usw.) sichtbar, in dem es definiert wurde. Wenn es auf Modulebene definiert wurde, ist es im gesamten Modul sichtbar.

- NAMESPACEs haben keinen Effekt auf die Sichtbarkeit des Symbols.

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 u. a., 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.

Seit der SVN-Version 0.22 können Makros mit einer variablen Anzahl von Parametern erstellt werden, indem man "..." (Ellipsis) angibt.

Beispiel:
Makros erstellen, die zwischen Altgrad(DEG, Kreis mit 360°), Neugrad(GON, Kreis mit 400gon) und Bogenmaß umrechnen

#DEFINE pi 4# * ATN(1)
#DEFINE deg2rad(deg) ( (deg / 45#) * ATN(1#))
#DEFINE rad2deg(rad) ( (rad / ATN(1#)) * 45# )
'Hinweis: 180/Pi=(4*45)/(4*ATN(1))=45/ATN(1)
#DEFINE gon2rad(gon) ( (gon / 50#) * ATN(1#))
#DEFINE rad2gon(rad) ( (rad / ATN(1#)) * 50# )
'Hinweis: 200/Pi=(4*50)/(4*ATN(1))=50/ATN(1)

PRINT "PI ="; pi
' Ausgabe: 3.141592654
PRINT "180 im Bogenmaß: " & deg2rad(180)
' Ausgabe: 3.141592654
PRINT "3.141592654 in Altgrad°(DEG): " & rad2deg(pi)
' Ausgabe: 180
PRINT "200gon im Bogenmaß: " & gon2rad(200)
' Ausgabe: 3.141592654
PRINT "3.141592654 in Neugrad(GON): " & rad2gon(pi)
' Ausgabe: 200

Beispiel mit variabler Anzahl von Parametern:

#INCLUDE "crt.bi"
#DEFINE eprintf(FORMAT, args...) fprintf(stderr, FORMAT, args)
eprintf(!"Hello from printf: %i %s %i\n", 5, "test", 123)

#DEFINE car(a, b...) a
#DEFINE cdr(a, b...) b

Unterschiede zu QuickBASIC:
- neu in FreeBASIC

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

Siehe auch:
DEFINED, UNDEF (Meta), MACRO (Meta), IF (Meta), IFDEF (Meta), IFNDEF (Meta), Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 17.10.10
Zur Onlinefassung des Eintrags

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. Das Symbol kann mit #DEFINE oder CONST definiert worden sein.

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

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

Beispiel:

#IF DEFINED(LogX)
' ... Anweisungen
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
DEFINE (Meta), IFDEF (Meta), IFNDEF (Meta), UNDEF (Metabefehl), CONST, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 04.08.10
Zur Onlinefassung des Eintrags

DEFINT

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem INTEGER, da ihre Anfangsbuchstaben i sind bzw. im Bereich von a bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFLNG

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem LONG, da ihre Anfangsbuchstaben l sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFLONGINT

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem LONGINT, da ihre Anfangsbuchstaben l sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFSHORT

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem SHORT, da ihre Anfangsbuchstaben s sind bzw. im Bereich von a bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFSNG

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem SINGLE, da ihre Anfangsbuchstaben s sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFSTR

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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 s ist.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFUBYTE

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem UBYTE, da ihre Anfangsbuchstaben u sind bzw. im Bereich von a bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFUINT

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem UINTEGER, da ihre Anfangsbuchstaben u sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFULONGINT

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem ULONGINT, da ihre Anfangsbuchstaben u sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DEFUSHORT

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

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

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

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' und 'eNumber' zu einem USHORT, da ihre Anfangsbuchstaben u sind bzw. im Bereich von d bis f liegen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:
Seit FreeBASIC v0.17 können Standardtypen nur noch dann definiert werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, müssen alle Datentypen explizit deklariert werden.

Siehe auch:
DEFxxx

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

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.

Diese Anweisung kann nur bis FreeBASIC v0.16 verwendet werden oder in entsprechend höheren Versionen, die mit der Kommandozeile -lang deprecated kompiliert wurden. Wird unter FreeBASIC ab v0.17 mit -lang fb compiliert, dann müssen alle Datentypen explizit deklariert werden.

Letzte Bearbeitung: 04.07.10
Zur Onlinefassung des Eintrags

DELETE

Syntax A: DELETE Zeiger
Syntax B: DELETE [ ] Zeiger
Typ: Operator
Kategorie: Speicherverwaltung

DELETE löscht Daten, die mit dem Operator NEW zugewiesen wurden.
'Zeiger' gibt den Pointer auf den freizugebenden Speicherplatz an.

DELETE wird benutzt, um den Speicher eines Objektes, das mit NEW erzeugt wurde, freizugeben und zu löschen. Wenn ein TYPE gelöscht wird, dann wird sein DESTRUCTOR aufgerufen. DELETE sollte nur mit den Adressen benutzt werden, die von NEW zurückgegeben wurden.

DELETE [ ] ist die Array-Version von DELETE und wird benutzt, um ein Array von Objekten, die vorher mit NEW [ ] erzeugt wurden, freizugeben und zu löschen. Destruktoren werden hier ebenfalls aufgerufen. DELETE muss mit den Adressen benutzt werden, die NEW zurückgibt, und DELETE [ ] mit denjenigen von NEW [ ]. Die verschiedenen Versionen der Operatoren dürfen nicht vermischt werden und 'passen' auch nicht zueinander.

DELETE kann mithilfe von OPERATOR überladen werden.

Beispiel:
Siehe NEW für ein Beispiel zu DELETE.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen: nur in der Dialektform -lang fb verfügbar

Siehe auch:
NEW, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

DESTRUCTOR (Klassen)

Syntax A:

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 definded type - siehe TYPE (UDT)) zerstört wird.

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

Das Destructor-Schlüsselwort leitet einen eigenen SCOPE-Block ein. Siehe dazu auch SCOPE.

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
SLEEP

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
SLEEP
END SUB

Ausgabe:

Erstelle:  main.x
Erstelle:  main.scope.x
Zerstoere: main.scope.x
Erstelle:  MySub.x
Zerstoere: MySub.x
Zerstoere: main.x

Hinweis: Klassen-Destruktoren werden beim Benutzen des Befehls End nicht aufgerufen, wohl aber Modul-Destruktoren.

Unterschiede zu QB: Neu in FreeBASIC

Unterschiede zu älteren FreeBASIC-Versionen: DESTRUCTOR für Klassen existiert seit FreeBASIC v0.17.

Unterschiede unter den FB-Dialektformen: DESTRUCTOR ist nur in -lang fb zulässig

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

Letzte Bearbeitung: 26.07.11
Zur Onlinefassung des Eintrags

DESTRUCTOR (Module)

Syntax:

[Public | Private] Sub name [Alias "externer_name"] [()] Destructor [priorität] [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 niedrigste Priorität; dieser Destruktor wird zuletzt 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 ohne eine Priorität festgelegt wurden, werden vor denen ausgeführt, die mit Priorität festgelegt wurden.

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

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 demselben Bezeichner existieren.

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 die Destruktoren eines Moduls eine Prozedur eines anderen Moduls aufrufen, das ebenfalls einen Destruktor besitzt. Es wird empfohlen, einen einzigen Destruktor zu definieren, der die Prozeduren in den einzelnen Modulen manuell aufruft.

Das Destructor-Schlüsselwort leitet einen eigenen SCOPE-Block ein. Siehe dazu auch SCOPE.

Beispiel:
Dieses Beispielprogramm enthält ein Set aus vier Constructoren und Destruktoren. Es wird gezeigt, in welcher Reihenfolge diese abgearbeitet werden.

SUB Constructor1 CONSTRUCTOR 101
PRINT "Constructor1 aufgerufen - hoechste Prioritaet"
END SUB
SUB Constructor2 CONSTRUCTOR 201
PRINT "Constructor2 aufgerufen - niedrigere Prioritaet"
END SUB
SUB Constructor3 CONSTRUCTOR
PRINT "Constructor3 aufgerufen - ohne Prioritaet"
END SUB
SUB Constructor4 CONSTRUCTOR
PRINT "Constructor4 aufgerufen - ohne Prioritaet"
END SUB

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

SUB Destructor1 DESTRUCTOR 101
PRINT "Destructor1 aufgerufen - niedrigeste Prioritaet"
SLEEP 'Auf Tastendruck warten
END SUB
SUB Destructor2 DESTRUCTOR 201
PRINT "Destructor2 aufgerufen - hoehere Prioritaet"
END SUB
SUB Destructor3 DESTRUCTOR
PRINT "Destructor3 aufgerufen - ohne Prioritaet"
END SUB
SUB Destructor4 DESTRUCTOR
PRINT "Destructor4 aufgerufen - ohne Prioritaet"
END SUB

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

PRINT "Modul-Level Code"

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede 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 (Klassen)

Letzte Bearbeitung: 26.07.11
Zur Onlinefassung des Eintrags

DIM

Syntax A:

DIM [SHARED] Variable1 AS Typ [= Ausdruck] [, _
Variable2 AS Typ [= einfacherAusdruck] [, _
...] ]

Syntax B:

DIM [SHARED] AS Typ Variable1 [= Ausdruck] [, _
Variable2 [= Ausdruck] [, _
...] ]

Syntax C:

DIM [SHARED] Array( [ [Startindex TO] Endindex  [, _
[Startindex TO] Endindex] [, ...] ] ] ) AS Typ [ _
=> {Ausdruck [, Ausdruck [, _ ... ] ] } ]

Typ: Anweisung
Kategorie: Speicherverwaltung

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.

DIM dimensioniert Variablen und Arrays einer angegebenen Größe und eines angegebenen Typs. Ein Array ist eine Gruppe aus mehreren Variablen desselben 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. Auch FUNCTION oder SUB kann hier als Typ angegeben werden; siehe dazu DYLIBLOAD.

- 'Ausdruck' ist ein Ausdruck, der aus Konstanten, Variablen, Operatoren, Funktionen und Symbolen bestehen darf. Der Wert von 'Ausdruck' 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 Beispiel 2 unten). 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.

Seit FreeBASIC v.0.17 muss jeder Variablen mittels 'AS Typ' explizit ein Datentyp zugewiesen werden. Standarddatentypen (vgl. DEFxxx) stehen nur noch in Dialektformen wie -lang deprecated oder -lang qb zur Verfügung.

Einfache Variablen werden folgendermaßen dimensioniert:

DIM i AS INTEGER, s AS SINGLE

Sollen sehr viele Variablen desselben Typs gleichzeitig dimensioniert werden, dann bietet sich die Verwendung eines Arrays an. Mit folgendem Code wird der Speicherbereich für 1000 INTEGER-Werte zur Verfügung:

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.
Wird bei der DIM-Anweisung der Startindex ausgelassen, so wird automatisch angenommen, dass der Startindex 0 ist (dieser Wert konnte bis FreeBASIC v0.16 durch OPTION BASE geändert werden). Zur Reservierung von 1000 INTEGER-Werten kann daher auch folgendermaßen vorgegangen werden:

DIM height(999) AS INTEGER

Hier reichen die Indizes von 0 bis 999.

Um mehrdimensionale Arrays anzulegen, werden die Grenzen der einzelnen Dimensionen nacheinander angegeben. Folgender Code legt ein zweidimensionales Array mit 100 Zeilen und 51 Spalten an:

DIM zweidimensional (1 TO 100, 50)

Bis FreeBASIC v0.16 wurden Felder mit bis zu vier Dimensionen unterstützt, seit v0.16 sind achtdimensionale Felder zulässig.

Um nun auf die Einträge im Feld zuzugreifen, verwenden Sie die Syntax:

FeldName(Index [, Index [, ...] ])

Achtung: Die Verwendung eines Index, der außerhalb der mit DIM angegebenen Grenzen liegt, kann möglicherweise andere Programmdaten beeinflussen oder sogar zu einem Programmabsturz führen. Dieser Fehler tritt häufig nicht sofort auf, was eine Fehleranalyse erschwert. Der FreeBASIC-Compiler stellt den Optionsschalter -exx zur Verfügung, um während des laufenden Programms die Gültigkeit der Array-Grenzen zu überprüfen.

Beispiel 1:

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(2), tabelle(0, 0)
SLEEP

Soll bei der Dimensionierung der Variable sofort ein Wert zugewiesen werden, kann dies über die sogenannten Variablen-Initiatoren geschehen:

Beispiel 2: Variablen-Initiatoren

DIM a AS INTEGER = 5, b AS USHORT = 123
DIM AS STRING c = "hello world", d = "FreeBASIC" & CHR(13) & "free 32bit Compiler"

DIM AS INTEGER Array(1 TO 3, 2) => { {1, 2, 3}, _
{4, 5, 6}, _
{7, 8, 9} }
PRINT Array (3, 0)
SLEEP

Wird beim Anlegen eines Arrays die Werte sofort zugewiesen, dann kann der Endindex auch durch drei Punkte ... (Auslassung bzw. Ellipsis) ersetzt werden. Die obere Grenze des Arrays wird dann anhand der angegebenen Werte ermittelt.

Beispiel 3: Array-Dimensionierung mit Ellipsis

DIM AS INTEGER wert(3 TO ...) = {1, 2, 3, 4, 5, 6, 7, 8, 9}
PRINT LBOUND(wert), UBOUND(wert)  ' untere und obere Grenze anzeigen
SLEEP

Es können auch Felder unbekannter Größe erzeugt 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. Ein dynamisches Array kann mit DIM ohne Angabe der Grenzen oder über REDIM angelegt werden.

Beispiel 4: Dynamisches Array

DECLARE SUB FileList(Path AS STRING, Array() AS STRING)
DIM AS STRING Files()  ' dynamisch

FileList ENVIRON("TMP"), Files()

SUB FileList(Path AS STRING, Array() AS STRING)
DIM AS STRING filename
DIM AS INTEGER i
#IF __FB_PCOS__
filename = DIR(Path & "\*.*")  ' Windows-Pfadangabe
#ELSE
filename = DIR(Path & "/*")    ' Linux-Pfadangabe
#ENDIF
IF LEN(filename) THEN
REDIM Array(0) AS STRING  ' neu dimensionieren
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

PRINT UBOUND(Files)
FOR i AS INTEGER = 0 TO UBOUND(Files)
PRINT Files(i)
NEXT

SLEEP

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.

- Die alternative Syntax DIM AS Typ Variable (Syntax 2) ist neu in FreeBASIC.

- Bei der Speicherung mehrdimensionaler Arrays folgen in FreeBASIC die Werte aufeinander, deren erster Index gleich ist. In QB folgen die Werte aufeinander, deren letzter Index gleich ist.

- Die Auslassung (...; Ellipsis) des Endindex eines Arrays ist neu in FreeBASIC.

Unterschiede zu früheren FreeBASIC-Versionen:

- Seit FreeBASIC v0.21 kann bei einem Arrays mit Initiatoren der Endindex durch eine Auslassung ersetzt werden.

- Seit FreeBASIC v0.17 muss der Typ explizit deklariert werden, außer das Programm wird mit der Option -lang deprecated compiliert.

- Seit FreeBASIC v0.16 dürfen Felder unbekannter Größe an jedem Programmpunkt, auch in Prozeduren, erstellt werden.

- Variablen-Initiatoren existieren seit FreeBASIC v0.13

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb und -lang fblite sind Variablen, die in einer Prozedur dimensioniert wurden, in der ganzen Prozedur sichtbar. Variablen, die mit 'SHARED' dimensioniert wurden, sind im ganzen Modul sichtbar.

- In der Dialektform -lang fb und -lang deprecated sind Variablen, die in einem Block dimensioniert wurden (FOR ... NEXT, WHILE ... WEND, DO ... LOOP, SCOPE ... END SCOPE) nur in diesem Block sichtbar.

- In der Dialektform -lang fb sind OPTION-Anweisungen (z. B. OPTION BASE, OPTION DYNAMIC) nicht erlaubt.

Siehe auch:
REDIM, SHARED, SCOPE, STATIC (Anweisung), COMMON, DYNAMIC (Meta), STATIC (Meta), OPTION, DYNAMIC (Schlüsselwort), STATIC (Schlüsselwort), ERASE, CLEAR, Datentypen, Pointer, Gültigkeitsbereich von Variablen

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

DIR

Syntax: DIR[$] ( [Dateiangabe] [, Attributnummer [, Rückgabeattribut]] )
Typ: Funktion
Kategorie: Datei

DIR gibt die Dateien im aktuellen Arbeitsverzeichnis oder im angegebenen Pfad zurück.

- 'Dateiangabe' ist ein String, der das Muster (Pattern) zu den aufzulistenden Dateien oder Verzeichnissen enthält.

- 'Attributnummer' ist eine Zahl, die angibt, welche Attribute die zurückzugebenden Dateien haben sollen. Die Atrributnummern werden weiter unten erläutert.

- '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 tatsächlich zutreffen.

- Der Rückgabewert ist der Name der ersten Datei (bzw. Verzeichnis), die passend zu 'Dateiangabe' gefunden wurde. Wird 'Dateiangabe' ausgelassen oder ein Leerstring übergeben, so wird die nächste Datei (bzw. Verzeichnis) zurückgegeben, die auf das zuletzt angegebene Pattern passt.

'Dateiangabe' darf auch Pfadangaben und Wildcards enthalten. Die Dateinamen bzw. Verzeichnisse werden mit dem angegebenen Muster verglichen. Durch Wildcards, also Platzhalter, kann es auf mehrere Dateien und/oder Verzeichnisse passen. Folgende Wildcards sind möglich:

- * - eine beliebige Zeichenfolge

- ? - ein beliebiges Zeichen, jedoch nur eines.

Beispielsweise passt die Angabe "a*.b??" auf alle Daten oder Verzeichnisse, die mit einem a beginnen und deren Endung mit einem b beginnt und 3 Zeichen lang ist. Mögliche Ergebnisse wären also z. B. allocate.bas und a.bin

Das Dollarzeichen ($) als Suffix ist optional.

Dateiattribute
'Attributnummer' ist eine Zahl, die angibt, welche Attribute die zurückzugebenden Dateien haben sollen. Sie ist eine Kombination aus folgenden Werten:

Wert

Bedeutung

Konstante in der dir.bi

&h00

Normal

- keines -

&h01

Schreibgeschützt
Windows: Das Attribut 'Schreibgeschützt' ist gesetzt.
Linux: Die Schreibberechtigung des aktuellen Benutzers und seiner Gruppenzugehörigkeit sowie die globale Schreibberechtigung wird geprüft; root-Berechtigungen des Benutzers werden ignoriert.

fbReadOnly

&h02

Versteckt
Windows: Das Attribut 'Versteckt' ist gesetzt.
Linux: Der Datei-/Verzeichnisname beginnt mit einem Punkt.

fbHidden

&h04

System
Windows: Das Attribut 'System' ist gesetzt.
Linux: Es handelt sich um ein zeichenorientiertes Gerät (character device), ein blockorientiertes Gerät (block device), ein Named Pipe (FIFO) oder ein Unix-Socket.

fbSystem

&h10

Verzeichnis

fbDirectory

&h20

Archivierbar
Windows: Das Attribut 'Archiv' ist gesetzt.
Die unter Linux üblichen Dateisysteme unterstützen dies nicht.

fbArchive

&h21

Dateien, die archivierbar oder schreibgeschützt sind

fbNormal

Um die angegebenen Konstanten zu nutzen, müssen Sie mittels #INCLUDE die Datei dir.bi einbinden.
Die oben genannten Eigenschaften können durch eine OR-Verknüpfung kombiniert werden. Der Befehl gibt dann 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 die Attributnummer fbReadOnly OR 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 fbNormal an; dies entspricht einer Liste aller normalen Dateien, inklusive schreibgeschützter und archivierter Dateien.

Wird 'Rückgabeattribut' angegeben, schreibt FreeBASIC an die Speicherstelle, auf die 'Rückgabeattribut' verweist, welche Attribute auf die gefundene Datei oder Ordner tatsächlich zutreffen. Dadurch kann die Ausgabe selektiver gestaltet werden. Wollen Sie beispielsweise eine Liste aller Dateien in einem Verzeichnis erstellen, die schreibgeschützt sind und entweder archiviert sind oder als versteckt markiert wurden, so können Sie zunächst mit 'Attributnummer' fbReadOnly OR fbArchive OR fbHidden eine Ausgabe von Dateien erreichen, bei denen mindestens eines der Kriterien erfüllt ist. Mit 'Rückgabeattribut' kann dann geprüft werden, ob die Datei tatsächlich mehrere Kriterien erfüllt; die entsprechende Zeile könnte so aussehen:

IF (rAttr AND fbReadOnly) ANDALSO _
((rAttr AND fbHidden) ORELSE (rAttr AND fbArchive)) THEN ...

Beispiel 1: Zwei Dateien anzeigen, die mit "a" beginnen

PRINT DIR("a*", 0)
PRINT DIR()
SLEEP

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)
' alle Dateien mit den angegebenen Attributen auflisten
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 OR fbSystem
SLEEP

Beispiel 3: Alle Dateien und Ordner, die nicht versteckt sind, in einem Array speichern und ausgeben:

#INCLUDE "dir.bi"

SUB GetFiles( Array() AS STRING )
DIM AS STRING  s
DIM AS INTEGER attr, i
REDIM Array(0)

s = DIR("*",, @attr)
DO UNTIL s = ""
IF (attr AND fbHidden) = 0 THEN
i += 1
REDIM PRESERVE Array(i)
Array(i) = s
END IF
' Da hier geprüft wird, ob das gewünschte Dateiattibut zu jeder
' Datei gesetzt ist, muss @attr bei jedem Aufruf übergeben werden.
s = DIR("",, @attr)
LOOP
END SUB

DIM dateien() AS STRING
GetFiles dateien()

FOR i AS INTEGER = 1 TO UBOUND(dateien)
PRINT i, dateien(i)
NEXT
SLEEP

Unterschiede zu QB:

- DIR existiert nicht in QB, sondern nur in Visual Basic.

- 'Rückgabeattribut existiert nur in FreeBASIC.

Plattformbedingte Unterschiede:

- Die Bedeutung der Dateiattribute ist unter Linux und Windows/DOS zum Teil verschieden (siehe Tabelle).

- Unter Linux muss der Dateiname 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

- Unter DOS gibt die Attributsmaske &h37 alle Dateien und Ordner, einschließlich "." und "..", zurück, jedoch keine Datenträger. Der Wert 8 gibt den Datenträger zurück, auch wenn das aktuelle Arbeitsverzeichnis nicht das Hauptverzeichnis ist.

Unterschiede zu früheren Versionen von FreeBASIC:

- Der optionale Parameter 'Rückgabeattribut' existiert seit v0.20.

- Seit FreeBASIC v0.13 ist der erste Parameter 'Dateiangabe' optional

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht DIR nicht zur Verfügung und kann nur über __DIR aufgerufen werden.

Siehe auch:
FILEEXISTS, OPEN, CURDIR, MKDIR, RMDIR, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

DO ... LOOP

Syntax A:

DO [{UNTIL | WHILE} Bedingung]
' Programmcode
LOOP

Syntax B:

DO
' Programmcode
LOOP [{UNTIL | WHILE} Bedingung]

Typ: Anweisung
Kategorie: Schleifen

Die DO-Schleife wiederholt einen Anweisungsblock, während bzw. bis eine Bedingung erfüllt ist. Wird keine Bedingung angegeben, so wird eine Endlosschleife erzeugt. Der Programmierer muss dann über Anweisungen wie EXIT selbst dafür sorgen, dass die Schleife wieder verlassen wird.

Bedingung ist ein numerischer 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.
Achtung: Eine innerhalb der DO-Schleife deklarierte Variable kann auch nicht in 'Bedingung' zur Überprüfung des Schleifenendes verwendet werden werden, da sie an dieser Stelle bereits nicht mehr existiert!

Taucht innerhalb des Schleifen-Codes die Anweisung CONTINUE DO auf, so ignoriert FreeBASIC den Code bis zum nächsten LOOP, prüft dort, ob die Bedingung (sofern angegeben) erfüllt wurde, und springt gegebenenfalls zurück zur DO-Zeile.

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. Die Schleife wird also auf jeden Fall mindestens einmal durchlaufen.

DO...LOOP-Blöcke können bis zu beliebiger Ebene ineinander und mit anderen Schleifen verschachtelt werden.

Beispiel 1: Endlosschleife mit CONTINUE und EXIT

DIM AS INTEGER n = 1
DIM AS INTEGER gerade = 0

DO
n += 1
IF n > 10 THEN EXIT DO
IF n MOD 2 THEN CONTINUE DO
gerade += 1
LOOP
PRINT "Anzahl gerader Zahlen: "; gerade
SLEEP

Beispiel 2: Datei zeilenweise auslesen

DIM f AS INTEGER = FREEFILE, zeile AS STRING
IF OPEN("datei.ext" FOR INPUT AS #f) = 0 THEN
' Datei existiert und wird ausgelesen
DO UNTIL EOF(f)  ' bis Dateiende erreicht wurde
LINE INPUT #f, zeile
PRINT zeile
LOOP
CLOSE #f
ELSE
PRINT "Datei konnte nicht geöffnet werden!"
END IF
SLEEP

Unterschiede zu QB:
Innerhalb einer Schleife dürfen in QB keine Variablen definiert werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.16b wirkt eine DO-LOOP-Schleife wie ein SCOPE-Block.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb und -lang fblite sind Variablen, die in einer DO-Schleife dimensioniert werden, in der ganzen Funktion sichtbar.

- In der Dialektform -lang fb und -lang deprecated sind Variablen, die in einer DO-Schleife dimensioniert wurden, nur innerhalb dieser Schleife gültig.

Siehe auch:
WHILE ... WEND, FOR ... NEXT, EXIT, CONTINUE, SCOPE, Schleifen

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

DOUBLE

Typ: Datentyp

DOUBLE bedeutet doppelte Genauigkeit. Variablen vom Typ DOUBLE sind vorzeichenbehaftete 64-bit-Gleitkommazahlen.
Damit lassen sich Zahlen mit bis zu 15 Stellen darstellen, der Wertebereich für DOUBLE-Zahlen liegt bei positiven Zahlen zwischen 4.940656458412465e-324 und 1.797693134862316e+308, bei negativen zwischen -4.940656458412465e-324 und -1.797693134862316e+308.

DOUBLE werden benutzt, um sehr genaue Dezimalzahlen zu speichern. Sie verhalten sich ähnlich zu SINGLE-Variablen, sind aber genauer. Dafür benötigt das Rechnen mit DOUBLE-Zahlen auch mehr Zeit.

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

SLEEP

Unterschiede zu QB: keine

Siehe auch:
DIM, CAST, CDBL, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 11.03.11
Zur Onlinefassung des Eintrags

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. Die möglichen Befehle werden unten aufgelistet.

Grafikcursorbefehle

- B - Vor einem eigentlichen Befehl angehängt bewirkt es, dass der Grafikcursor zwar bewegt, 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 Strecke 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 Strecke n Pixel nach oben (up) und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- D[n] - Zeichnet eine Strecke n Pixel nach unten (down) und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- L[n] - Zeichnet eine Strecke n Pixel nach links (left) und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- R[n] - Zeichnet eine Strecke n Pixel nach rechts (right) und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- E[n] - Zeichnet eine Strecke n Pixel nach oben rechts und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- F[n] - Zeichnet eine Strecke n Pixel nach unten rechts und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- G[n] - Zeichnet eine Strecke n Pixel nach unten links und bewegt den Grafikcursor. Wenn n ausgelassen wird, nimmt FreeBASIC 1 an.

- H[n] - Zeichnet eine Strecke 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:

DIM AS STRING down10 = "D10"
DRAW "U10R5X" & VARPTR(down10) & "L5"

Beispiel:

DIM Stern AS STRING, buffer AS ANY PTR

SCREENRES 640, 480

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.

- QB verwendet mit dem Kommando "Xp" das spezielle Schlüsselwort VARPTR$.

- FreeBASIC erlaubt zur Zeit keine Bewegung in Teil-Pixeln: alle Bewegungen werden zu den nächsten INTEGER-Koordinatenwerte gerundet. In Zusammenhang mit einer Skalierung ist daher die Ausgabe in FreeBASIC möglicherweise nicht pixelgenau gleich wie in QB.

Siehe auch:
DRAW STRING, SCREENRES, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

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. Der Text kann transparent ausgegeben werden, der Hintergrund bleibt dabei erhalten.
DRAW STRING beeinflusst den Grafikcursor (nicht den Textcursor).

- Wird für 'Puffer' ein Pointer auf einen Speicherbereich angegeben, z.B. ein mit IMAGECREATE erstellter Puffer oder ein Array, wird der Text in diesen Bereich gezeichnet. Wird 'Puffer' ausgelassen, zeichnet FreeBASIC direkt auf den Bildschirm.

- 'STEP' gibt an, dass die folgenden Koordinaten (x, y) relativ zur aktuellen Position des Grafikcursors sein sollen.

- 'x' und 'y' sind die Koordinaten der linken oberen Position, an der die Textausgabe beginnen soll.

- 'Text' ist ein beliebiger STRING oder eine Zeichenkette, 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 Schriftfarbe, in welcher der Text ausgegeben werden soll. Wird dieses Argument ausgelassen, verwendet FreeBASIC die Vordergrundfarbe (siehe COLOR,).

- 'Font' ist ein Pointer auf einen Fontpuffer, der einen benutzerdefinierten Font enthält. Mehr zum Format dieses Puffers siehe unten.

- 'Methode' ist ein Aktionswort (evtl. mit Parameter), wie es bei PUT (Grafik) verwendet wird. Wird das Aktionswort ausgelassen, verwendet FreeBASIC automatisch TRANS. Aktionswörter können nur mit benutzerdefinierten Fonts verwendet werden, nicht mit dem Standard-Schriftsatz.

Beispiel 1: DRAW STRING

SCREENRES 320, 240, 32
WIDTH 320/8, 240/16 ' Einstellen des großen Fonts
PAINT (0, 0), &H0000FF ' blauer Hintergrund

' "Hello World" auf dem Bildschirm ausgeben; Standardfarbe ist weiß
DRAW STRING ( 10, 2), "Hello World "

' Standardfarbe auf grün setzen und "Hello World" in dieser Farbe ausgeben.
' Die Hintergrundfarbe hat keine Auswirkungen auf die Textausgabe.
COLOR &h00FF00, &hFFFFFF
DRAW STRING (20, 20), "Hello World"

' Umleitung der Ausgabe in einen Puffer
DIM TextPuffer AS ANY PTR
TextPuffer = IMAGECREATE(100, 16)
DRAW STRING TextPuffer, (0, 0), "Hello World", &hFFFFFF
' Die Hintergrundfarbe des Puffer wird gezeichnet!
PUT (100, 100), TextPuffer, PSET

' 'STEP' Schreibposition relativ zum letzten PUT (100, 100)
' hier Schriftfarbe gelb; Methode bleibt wirkungslos beim Standard-Schriftsatz
DRAW STRING STEP ( -40, +40), "Hello World", &HFFFF00, , PSET

Benutzerdefinierte Schriftarten
Benutzerdefinierte Schriftarten werden Zeichen für Zeichen nebeneinander in einem Puffer (Image) angelegt. Die Farbtiefe des Puffers muss mit der mittels SCREENRES eingestellten Farbtiefe des Grafikfensters übereinstimmen. Andernfalls erzeugt DRAW STRING den Fehler "Unzulässiger Funktionsaufruf" (siehe Fehler-Behandlung in FreeBASIC). Der Puffer muss also so breit sein, wie alle Zeichen nebeneinander sind. Die erste Zeile des Puffers enthält den 'FontHeader' der Schriftart. Darin ist angegeben, welche Zeichen im Font dargestellt sind und wie breit diese sind. Folglich ist die Höhe des Puffers gleich der Höhe der Zeichen plus eins. Insgesamt ergibt sich dieser Speicheraufbau:

Anzahl Type

ImageHeader

UINTEGER

Version des ImageHeaders =7

INTEGER

Byte pro Pixel

UINTEGER

Breite des Image in Pixel

UINTEGER

Höhe des Image in Pixel

UINTEGER

Byte pro Zeile des Image (Pitch)

12 x UBYTE

reserviert

Anzahl Type

FontHeader (1. Zeile des Image)

BYTE

Version des FontHeaders =0

UBYTE

ASCII-Code des ersten Zeichens im Puffer

UBYTE

ASCII-Code des letzten Zeichens im Puffer

UBYTE

Breite des 1. Zeichens

UBYTE

Breite des 2. Zeichens

je 1 UBYTE

Breite nächstes Zeichen

"

"

UBYTE

Breite des letzten Zeichens

XX UBYTE

unbenutzt, bis Ende der 1. Zeile

Image

XX

2. Zeile bis letzte Zeile

Beispiel 2: Erstellen und Speichern eines benutzerdefinierte Fonts

' CHR-Bereich festlegen
CONST Erster = 32, Letzter = 127, Anzahl = (Letzter - Erster) + 1

DIM AS UBYTE PTR p, myFont
DIM AS INTEGER farbe
' Einen 256 Farbgrafik-Screen (320*200) erzeugen
SCREENRES 320, 200, 8

' Erstellen eines Benutzerfonts in einem Image
' (Anzahl Zeichen * Zeichenbreite , Zeichenhöhe + 1(für Fontheader))
myFont = IMAGECREATE(Anzahl * 8, 8 +1)
' p = Zeiger auf den FontHeader
p = myFont + IIF(myFont[0] = 7, 32, 4)
p[0] = 0       'Fontversion bisher immer 0
p[1] = Erster  'erster Buchstabe im Font
p[2] = Letzter 'letzter Buchstabe im Font

FOR i AS INTEGER = Erster TO Letzter
p[3 + i - Erster] = 8   'Zeichenbreite
farbe = 60 + (i MOD 24) 'Zeichenfarbe
'Zeichen in Font-Puffer kopieren (aus kleinem Standard Font)
DRAW STRING myFont, ((i - Erster) * 8, 1), CHR(i),farbe
NEXT i

' Den Font-Puffer können wir mit BSAVE abspeichern.
' Die Anzahl zu speichernde Byte berechnet sich aus
' (Anzahl * Zeichenbreite * (Zeichenhöhe + 1) * Byte_per_Pixel) + ImageHeader
BSAVE "myfont.fbf", myFont, (Anzahl * 8 * 9 * 1)+32

' Als Bitmap können wir den Font so speichern:
BSAVE "myfont.bmp", myFont

' Hier zeichnen wir einen String mit unserem Font
DRAW STRING (10, 10), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont
DRAW STRING (10, 26), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont
DRAW STRING (66, 58), "Hello world!",, myFont

IMAGEDESTROY myFont 'Speicherbereich freigeben

SLEEP

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

' Einen 256 Farbgrafik-Screen (320*200) erzeugen
SCREENRES 320, 200, 8

' Für dieses Beispiel brauchen wir den zuvor
' erstellten Font 'myfont.fbf', siehe Beispiel 2

' Dies brauche ich nur wenn Breite und Hoehe unbekannt sind
' sonst breit = Anzahl * 8 : hoch = 9
DIM AS INTEGER breit, hoch, ff = FREEFILE
IF OPEN("myfont.fbf",FOR BINARY ACCESS READ,AS #ff)<>0 THEN
CLOSE #ff
PRINT "keine Fontdatei gefunden!"
SLEEP
END
END IF
GET #ff,14, breit
GET #ff,18 , hoch
CLOSE #ff

' Erstellen eines Benutzerfonts im Image
DIM AS UBYTE PTR myFont = IMAGECREATE(breit, hoch)

' Jetzt können wir den Font mit BLoad laden
BLOAD "myfont.fbf", myFont

' Ein blauer Hintergrund
PAINT (0, 0), 1
' Hier zeichnen wir einen String mit unserem Font und 'Methode'
DRAW STRING (10, 10), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont, PSET
DRAW STRING (10, 26), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont, PRESET
DRAW STRING (10, 42), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont, AND
DRAW STRING (10, 58), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont, OR
DRAW STRING (10, 74), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont, XOR
DRAW STRING (10, 90), "ABCDEFGHIJKLMNOPQRSTUVWXYZ",, myFont
DRAW STRING (66, 106), "Hello world!",, myFont
IMAGEDESTROY myFont 'Speicherbereich freigeben

SLEEP

Für die Verwendung des Aktionswortes CUSTOM siehe PUT (Grafik).

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:

- DRAW STRING existiert erst seit FreeBASIC v0.16.

- Das Aktionswort ADD existiert erst seit FreeBASIC v0.17.

Siehe auch:
DRAW (Grafik), PRINT (Anweisung), LOCATE (Anweisung), WIDTH (Anweisung), Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

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 (als Pointer), die durch DYLIBLOAD zurückgegeben wurde.

Beispiel: Siehe DYLIBLOAD

Siehe auch:
DYLIBLOAD, DYLIBSYMBOL

Letzte Bearbeitung: 11.09.08
Zur Onlinefassung des Eintrags

DYLIBLOAD

Syntax: DYLIBLOAD(LibName AS STRING) AS ANY PTR
Typ: Funktion
Kategorie: Speicherorganisation

Versucht, eine Dynamic Link Library (DLL) zu laden, und gibt in einem Pointer 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 (0), 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 ANY PTR
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, ";
PRINT "aborting program..."
END 1
END IF

addnumbers = DYLIBSYMBOL( library, "AddNumbers" )
IF( addnumbers = 0 ) THEN
PRINT "Cannot get AddNumbers function address ";
PRINT "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

Letzte Bearbeitung: 11.09.08
Zur Onlinefassung des Eintrags

DYLIBSYMBOL

Syntax: DYLIBSYMBOL (Handle AS ANY PTR, FunktionsName AS STRING) AS ANY 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. FunktionsName ist der Name, den die Funktion innerhalb der DLL trägt.

Beachten Sie, dass Sie die Funktion nicht mit DECLARE, sondern mit

DIM name AS FUNCTION(Parameterliste) AS Type
'oder
DIM name AS SUB(Parameterliste)

deklarieren müssen.

Beispiel: Siehe DYLIBLOAD

Siehe auch:
DYLIBLOAD, DYLIBFREE

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

DYNAMIC (Meta)

Syntax: '$DYNAMIC
Typ: Metabefehl
Kategorie: Programmorganisation

'$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 redimensioniert werden können. Der Metabefehl hat dieselbe Wirkung wie OPTION DYNAMIC. Der Metabefehl STATIC und OPTION STATIC setzen diesen Standard außer Kraft. Wird keiner von beiden Standards explizit gesetzt, geht FreeBASIC von OPTION STATIC aus.

'$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)

(gleiche Verwendung wie in QuickBASIC)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Der Metabefehl ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist der Befehl nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
DYNAMIC (Schlüsselwort), STATIC (Meta), DIM, REDIM, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

DYNAMIC (Schlüsselwort)

Syntax: OPTION DYNAMIC
Typ: Schlüsselwort
Kategorie: Programmorganisation

OPTION DYNAMIC legt fest, dass Arrays standardmäßig DYNAMIC verwaltet werden sollen. Der Metabefehl DYNAMIC hat dieselbe Wirkung wie OPTION DYNAMIC. Der Metabefehl STATIC und OPTION STATIC setzen diesen Standard außer Kraft. Wird keiner von beiden Standards explizit gesetzt, geht 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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
DYNAMIC (Metabefehl), STATIC (Schlüsselwort), __FB_OPTION_DYNAMIC__, OPTION, DIM, REDIM

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

Startbuchstabe E

ELSE

Typ: Schlüsselwort
Kategorie: Bedingungen

ELSE wird im Zusammenhang mit IF ... THEN verwendet. Es beschreibt den Fall, wenn alle anderen definierten Fälle nicht zutreffen.

Beispiel:

#DEFINE FALSE 0
#DEFINE TRUE (NOT FALSE)

DIM AS INTEGER Ausdruck = TRUE

IF Ausdruck = TRUE THEN
PRINT "Die Pruefung ob Ausdruck gleich TRUE ist, ist wahr."
ELSEIF Ausdruck = FALSE THEN
PRINT "Die Pruefung ob Ausdruck gleich FALSE ist, ist wahr."
ELSE
PRINT "Diesen Fall kann es nicht geben."
ENDIF

SLEEP

Verwendung als Metabefehl:

Typ: Metabefehl
Kategorie: Präprozessoren

#ELSE wird im Zusammenhang mit IF (Meta), IFDEF (Meta) und IFNDEF (Meta) verwendet.

Beispiel:

#IF DEFINED(FALSE)
'nichts
#ELSE
#DEFINE FALSE 0
#ENDIF

Unterschiede zu QB: als Metabefehl neu in FreeBASIC

Siehe auch:
IF ... THEN, IF (Meta), IFDEF (Meta), IFNDEF (Meta)

Letzte Bearbeitung: 04.08.11
Zur Onlinefassung des Eintrags

ELSEIF

Typ: Schlüsselwort
Kategorie: Bedingungen

ELSEIF wird im Zusammenhang mit IF ... THEN verwendet. Es beschreibt einen vom ersten Prüffall unterschiedlichen Fall.

Beispiel:

#DEFINE FALSE 0
#DEFINE TRUE (NOT FALSE)

DIM AS INTEGER Ausdruck = TRUE

IF Ausdruck = TRUE THEN
PRINT "Die Pruefung ob Ausdruck gleich TRUE ist, ist wahr."
ELSEIF Ausdruck = FALSE THEN
PRINT "Die Pruefung ob Ausdruck gleich FALSE ist, ist wahr."
ELSE
PRINT "Diesen Fall kann es nicht geben."
ENDIF

SLEEP

Verwendung als Metabefehl:

Typ: Metabefehl
Kategorie: Präprozessoren

#ELSEIF wird im Zusammenhang mit IF (Meta), IFDEF (Meta) und IFNDEF (Meta) verwendet.

Beispiel:

#IF DEFINED(FALSE)
'nichts
#ELSEIF NOT DEFINED(FALSE)
#DEFINE FALSE 0
#ENDIF

Unterschiede zu QB: als Metabefehl neu in FreeBASIC

Siehe auch:
IF ... THEN, IF (Meta), IFDEF (Meta), IFNDEF (Meta)

Letzte Bearbeitung: 04.08.11
Zur Onlinefassung des Eintrags

ENCODING

Syntax: ... ENCODING { "ASCII"|"UTF-8" | "UTF-16" | "UTF-32" }
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).

Achtung: ENCODING kann zusammen mit UTF-codierten Dateien nur dann erfolgreich eingesetzt werden, wenn das Byte Order Mark (BOM) gesetzt ist und mit der angegebenen Codierug übereinstimmt. Ansonsten wird der Laufzeitfehler 2 (File not found) zurückgegeben.

Unterschiede zu QB: Unicode wurde unter QB nicht unterstützt.

Plattformbedingte Unterschiede: Unicode wird unter DOS nicht unterstützt.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ENCODING nicht zur Verfügung.

Siehe auch:
OPEN (Anweisung), PRINT (Datei), INPUT (Datei), WSTRING (Datentyp)

Letzte Bearbeitung: 06.04.12
Zur Onlinefassung des Eintrags

END

Syntax A: END Block-Bezeichnung
Syntax B: END [ Rückgabewert ]
Typ: Anweisung
Kategorie: Programmorganisation

END beendet eine Blockstruktur (Syntax A) oder das Programm (Syntax B).

Mit Syntax A kann einer der folgenden Code-Blöcke abgeschlossen werden:

- SUB

- FUNCTION

- IF

- SELECT

- TYPE

- ENUM

- SCOPE

- WITH

- NAMESPACE

- EXTERN

- CONSTRUCTOR

- DESTRUCTOR

- OPERATOR

- PROPERTY

Syntax B beendet das laufende Programm und kehrt zum Betriebssystem zurück. 'Rückgabewert' ist ein INTEGER, das als sogenannter Errorlevel zurückgegeben wird und beispielsweise in BATCH-Programmen abgefragt werden kann. Eine 0 oder keine Angabe sind gleichbedeutend mit "Kein Fehler". Alles andere wird als Fehler interpretiert.

Wenn das Programm mit END beendet wird, dann werden Variablen und Speicher nicht automatisch zerstört. Die Destruktoren von Objekten werden nicht aufgerufen. Benötigte Objekt-Destruktoren müssen daher vor der END-Anweisung explizit aufgerufen werden.

Beispiel:

DIM AS INTEGER a
IF a = 2 THEN
' ...
ELSE
' ...
END IF             ' IF-Block beenden

SELECT CASE ERR
CASE 0
END            ' Programm normal beenden
CASE 1, 2, 7
END 1          ' Programm-Ende mit Errorlevel 1
CASE 5, 23, 70
END 2          ' Programm-Ende mit Errorlevel 2
CASE ELSE
END -1         ' Programm-Ende mit Errorlevel -1
END SELECT         ' SELECT-Block beenden

Unterschiede zu QB:
Die Rückgabe eines Errorlevels an das Betriebssystem ist neu in FreeBASIC.

Plattformbedingte Unterschiede:
Unter Linux wird für den Errorlevel eines Programmes nur ein Wert von -1 bis 254 verwendet. Zwar kann an END ein INTEGER-Wert übergeben werden, es wird vom System jedoch nur ein UBYTE weitergereicht (wobei 255 als -1 interpretiert wird).

Siehe auch:
SYSTEM, STOP, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

ENDIF

Typ: Schlüsselwort
Kategorie: Bedingungen

ENDIF wird im Zusammenhang mit IF ... THEN verwendet. Es schließt eine Bedingungsstruktur ab. Die Form "END IF" mit Leerzeichen kann ebenfalls verwendet werden.

Beispiel:

#DEFINE FALSE 0
#DEFINE TRUE (NOT FALSE)

DIM AS INTEGER Ausdruck = TRUE

IF Ausdruck = TRUE THEN
PRINT "Die Pruefung ob Ausdruck gleich TRUE ist, ist wahr."
ELSEIF Ausdruck = FALSE THEN
PRINT "Die Pruefung ob Ausdruck gleich FALSE ist, ist wahr."
ELSE
PRINT "Diesen Fall kann es nicht geben."
ENDIF

SLEEP

Verwendung als Metabefehl:

Typ: Metabefehl
Kategorie: Präprozessoren

#ENDIF wird im Zusammenhang mit IF (Meta), IFDEF (Meta) und IFNDEF (Meta) verwendet.

Beispiel:

#IF DEFINED(FALSE)
'nichts
#ELSE
#DEFINE FALSE 0
#ENDIF

Unterschiede zu QB: als Metabefehl neu in FreeBASIC

Siehe auch:
IF ... THEN, IF (Meta), IFDEF (Meta), IFNDEF (Meta)

Letzte Bearbeitung: 04.08.11
Zur Onlinefassung des Eintrags

ENDMACRO (Meta)

Syntax:

#MACRO Bezeichner [(Parameterliste)]
' Makro-Code
#ENDMACRO

Typ: Metabefehl
Kategorie: Präprozessor

#ENDMACRO wird zusammen mit #MACRO benutzt und beendet einen Makro-Block.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
#MACRO, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

ENUM

Typ: Anweisung
Kategorie: Programmorganisation
Syntax A:

ENUM [Listenname] [EXPLICIT]
Element1 [= INTEGER Wert]
Element2 [= INTEGER Wert]
Element3 [= INTEGER Wert]
...
END ENUM

Syntax B:

ENUM [Listenname] [EXPLICIT]
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 entsprechen, begonnen wird dabei mit dem Wert 0.

- 'Listenname' ist eine Bezeichnung des ENUMs, mit der das ENUM im Zusammenhang mit DIM wie ein Datentyp verwendet werden kann.

- 'EXPLICIT' gibt an, dass der Listenname zwangsweise in der Form 'Listenname.Element' verwendet werden muss.

- 'Element1', 'Element2', ... sind die Namen der Records, über die auf die UNION-Felder zugegriffen wird.

- 'INTEGER Wert ist eine Zahl im Zahlenbereich eines INTEGERs.

Soll ein Element einen von der Reihenfolge abweichenden 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

Unterschiede zu QB: Neu in FreeBASIC

Unterschiede unter den FB-Dialektformen: In der Dialektform -lang qb steht EXPLICIT nicht zur Verfügung und kann nur über __EXPLICIT aufgerufen werden.

Letzte Bearbeitung: 23.02.12
Zur Onlinefassung des Eintrags

ENVIRON

Syntax: ENVIRON[$] (Systemumgebungsvariable)
Typ: Funktion
Kategorie: Verschiedenes

ENVIRON gibt den Wert einer Systemumgebungsvariablen zurück. Ist die Variable nicht belegt, so wird ein Leerstring "" zurückgegeben.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel: den Wert der Systemvariable PATH ausgeben:

PRINT ENVIRON("PATH")

Unterschiede zu QB:
In FreeBASIC kann ENVIRON nicht verwendet werden, um den Wert einer Variablen zu setzen; diese Funktion wurde von SETENVIRON übernommen.

Plattformbedingte Unterschiede:
Unter Linux muss die Systemvariable 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
SETENVIRON, Betriebssystem-Anweisungen

Letzte Bearbeitung: 21.01.12
Zur Onlinefassung des Eintrags

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 Dateizeiger das Ende einer geöffneten Datei erreicht hat.

'f' ist die Nummer der Datei, die geprüft werden soll. Diese Nummer wird in der OPEN-Anweisung festgelegt.

Beispiel:

DIM AS INTEGER f
DIM AS STRING txt

' eine unbenutzte Dateinummer finden und Datei zum Einlesen öffnen
f = FREEFILE
OPEN "file.ext" FOR INPUT AS #f

' Daten so lange einlesen, bis das Ende erreicht wurde.
DO UNTIL EOF(f)
' Zeile aus der Datei einlesen und auf dem Bildschirm ausgeben
INPUT #f, txt
PRINT txt
LOOP

' Datei schließen
CLOSE #f

'Auf Tastendruck vor dem Beenden warten
SLEEP

Wegen der plattformbedingten Unterschiede in den vom Compiler verwendeten Bibliotheken kann es zu Problemen kommen, wenn die EOF-Funktion verwendet wird, um in Linux erstellte Textdateien (mit LF als Zeilenende) in einem für Windows compilierten Programm zu verwenden. Die DOS- und Linux-Compiler haben dieses Problem nicht. Eine mögliche Lösung des Problems ist die Verwendung des Dateimodus BINARY statt INPUT. LINE INPUT# und EOF können im oberen Beispiel immer noch genutzt werden und EOF wird zuverlässig arbeiten.

Unterschiede zu QB

- In QB sendet der COM-Port ein EOF, wenn dort keine Zeichen zum Einlesen warten.

- In QB geben Dateien, die im Dateimodus RANDOM oder BINARY geöffnet werden, bei EOF nur dann einen Wert ungleich 0 zurück, nachdem versucht wurde, hinter dem Dateiende zu lesen. In FreeBASIC gibt EOF true (-1) zurück, sobald der letzte Eintrag gelesen wurde.

Siehe auch:
LOF, LOC, OPEN, Dateien (Files)

Letzte Bearbeitung: 14.03.11
Zur Onlinefassung des Eintrags

EQV

Syntax A: Ergebnis = Ausdruck1 EQV Ausdruck2
Syntax B: Ausdruck1 EQV= Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

EQV kann als einfacher (Syntax A) und kombinierter (Syntax B) Operator eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 EQV Ausdruck2

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 denselben Status haben müssen, also entweder beide wahr oder beide falsch sein müssen.

Beispiel 1: EQV 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: Verknüpfung zweier Zahlen mit EQV:

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 28 Bits werden selbstverständlich auch mit EQV verglichen. Würden diese in dieses Beispiel mit einbezogen, dann würde das Beispiel einen Teil seiner Anschaulichkeit verlieren.

Beispiel 3: EQV als kombinierter Operator

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

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
NOT, AND (Operator), OR (Operator), XOR (Operator), IMP, Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

ERASE

Syntax: ERASE Array [, Array [,...]]
Typ: Anweisung
Kategorie: Speicherverwaltung

ERASE löscht dynamische Arrays aus dem Speicher oder setzt alle Elemente eines statischen Arrays auf 0 bzw. auf den Initialisationswert. Es dürfen beliebig viele Array-Bezeichner angegeben werden.

Beispiel:

TYPE myUdt
AS INTEGER x, y
DECLARE CONSTRUCTOR(xx AS INTEGER = 1, yy AS INTEGER = 2)
END TYPE
CONSTRUCTOR myUdt(xx AS INTEGER = 1, yy AS INTEGER = 2)
THIS.x = xx
THIS.y = yy
END CONSTRUCTOR

DIM zahl(2) AS INTEGER = {0, 1, 2}
DIM text(2) AS STRING = {"a", "b", "c"}
REDIM dynamisch(2) AS INTEGER
DIM udt(2) AS myUdt
udt(0) = myUdt(9, 9)
udt(1) = myUdt(8, 8)
udt(2) = myUdt(7, 7)

' Arrays ausgeben
PRINT "zahl()", "text()", "udt()"
FOR i AS INTEGER = 0 TO 2
PRINT zahl(i), text(i), udt(i).x & "/" & udt(i).y
NEXT
PRINT "Adresse von dynamisch(): " & @dynamisch(0)
PRINT

' Arrays löschen und erneut ausgeben
ERASE zahl, text, udt, dynamisch
PRINT "zahl()", "text()", "udt()"
FOR i AS INTEGER = 0 TO 2
PRINT zahl(i), text(i), udt(i).x & "/" & udt(i).y
NEXT
PRINT "Adresse von dynamisch(): " & @dynamisch(0)
SLEEP

Ausgabe:

zahl()        text()        udt()
0            a             9/9
1            b             8/8
2            c             7/7
Adresse von dynamisch(): 143869584

zahl()        text()        udt()
0                          1/2
0                          1/2
0                          1/2
Adresse von dynamisch(): 0

Unterschiede zu früheren Versionen von FreeBASIC:
Vor FreeBASIC v0.11 war der Einsatz von ERASE nur für dynamische Arrays zulässig.

Siehe auch:
DIM, CLEAR, Arrays

Letzte Bearbeitung: 27.01.12
Zur Onlinefassung des Eintrags

ERFN

Syntax: ERFN
Typ: Funktion
Kategorie: Fehler

ERFN gibt einen ZSTRING PTR auf den Namen der Prozedur zurück, in der 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 diesem Fall immer null.

Beispiel:
Kompilieren Sie dieses Beispiel mit der Kommandozeile

fbc -exx -lang deprecated ERFN_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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.16

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ERFN nicht zur Verfügung und kann nur über __ERFN aufgerufen werden.

Siehe auch:
ERMN, ERROR, ON ERROR, Fehlerbehandlung, Debugging

Letzte Bearbeitung: 06.10.10
Zur Onlinefassung des Eintrags

ERL

Syntax: ERL
Typ: Funktion
Kategorie: Fehlerbehandlung

ERL gibt eine INTEGER-Zahl zurück, welche die Zeilennummer des letzten aufgetretenen Fehlers enthält. Ist kein Fehler aufgetreten, dann gibt ERL 0 zurück.

ERL wird durch RESUME und RESUME NEXT zurückgesetzt.

Beispiel:

#LANG "fblite"

' Hinweis: muss mit der Option -ex compiliert werden.

ON ERROR GOTO ErrorHandler

' Fehler erzeugen
ERROR 100

SLEEP
END

ErrorHandler:
DIM num AS INTEGER = ERR
PRINT "Fehler "; num; " in Zeile "; ERL
RESUME NEXT

Unterschiede zu QB:
FreeBASIC gibt die Zeilennummern des Quellcodes zurück und ignoriert die Werte explizierter Zeilennummern, während QB den Wert der letzten explizierten Zeilennummer zurück gibt.

Siehe auch:
ERROR (Anweisung), ERR (Funktion), __LINE__, Fehler-Behandlung in FreeBASIC, Übersicht: Fehlerbehandlung, Debugging

Letzte Bearbeitung: 03.11.10
Zur Onlinefassung des Eintrags

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 diesem 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: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.16

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ERMN nicht zur Verfügung und kann nur über __ERMN aufgerufen werden.

Siehe auch:
ERFN, ERROR, ON ERROR, Fehlerbehandlung, Debugging

Letzte Bearbeitung: 25.08.10
Zur Onlinefassung des Eintrags

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.
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 verursacht wird. Siehe auch die FreeBASIC-Fehlernummern.

Unterschiede zu QB:
Die Fehlernummern sind in FreeBASIC nicht die gleichen wie in QB.

Siehe auch:
ERROR (Anweisung), ON ERROR, ERR (Funktion), OPEN ERR, Fehler-Behandlung in FreeBASIC, Übersicht: Fehlerbehandlung, Debugging

Letzte Bearbeitung: 25.08.10
Zur Onlinefassung des Eintrags

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.

Achtung: Der Befehl PRINT setzt ERR auf 0 zurück. Wollen Sie die Fehlernummer durch PRINT ausgeben, dann sollten Sie sie zuerst in einer Variablen speichern und diese ausgeben.

Beispiel:

OPEN "datei.ext" FOR INPUT AS #1
IF ERR = 2 THEN PRINT "Fehler: Datei nicht gefunden!"
' ...
CLOSE #1

Kann die Datei fehlerlos geöffnet werden, dann bleibt ERR auf dem Wert 0. Wenn sie nicht existiert, wird ERR auf die zugehörige Fehlernummer 2 gesetzt.
Hinweis: OPEN kann (wie viele andere Anweisungen) als Funktion verwendet werden; der Rückgabewert ist ggf. die Fehlernummer. Damit kann ein möglicher Fehler direkter abgefangen werden.

Siehe auch:
ERR (Anweisung), ERROR (Anweisung), ON ERROR, OPEN ERR, ERL, Fehler-Behandlung in FreeBASIC, Übersicht: Fehlerbehandlung, Debugging

Letzte Bearbeitung: 25.08.10
Zur Onlinefassung des Eintrags

ERROR (Anweisung)

Syntax: ERROR Fehlernummer
Typ: Anweisung
Kategorie: Fehlerbehandlung

ERROR simuliert einen Fehler (runtime error). Der Befehl 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 in FreeBASIC nicht die gleichen wie in QB.

Siehe auch:
#ERROR, ON ERROR, ERR (Funktion), ERL, ERR (Anweisung), Fehler-Behandlung in FreeBASIC, Übersicht: Fehlerbehandlung, Debugging

Letzte Bearbeitung: 03.11.10
Zur Onlinefassung des Eintrags

ERROR (Meta)

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, damit der Compiliervorgang nur abgebrochen wird, wenn eine bestimmte Bedingung eintritt.

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 der Compiler die Meldung "Plattform not supported" aus.

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
ERROR (Anweisung), Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

ESCAPE

Syntax: OPTION ESCAPE
Typ: Schlüsselwort
Kategorie: Verschiedenes

OPTION ESCAPE aktiviert die Verwendung von Escape-Characters in Strings. Diese Option kann nur bis FreeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption -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 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 das 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, die 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)

- \" 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 "
message += "is the \"SECOND\" line \45"
PRINT message

PRINT CRLF + "^-- CRLF --V" + CRLF;

PRINT "The Path is \34" $"C:\FREEBASIC\33a" "\34"
SLEEP

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 "
message += !"is the \"SECOND\" line \45"
PRINT message

PRINT CRLF + !"^-- CRLF --V" + CRLF;

PRINT !"The Path is \34" "C:\FREEBASIC\33a" !"\34"
SLEEP

Die Markierung von Strings, die nicht geparsed werden sollen, mit einem Dollarzeichen $ ist also nicht 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 QB: neu in FreeBASIC

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.

Siehe auch:
OPTION, Ausrufezeichen, Dollarzeichen, __FB_OPTION_ESCAPE__

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

EXEC

Syntax: EXEC (Datei, Argumente)
Typ: Funktion
Kategorie: Programmorganisation

EXEC startet eine ausführbare Datei mit den übergebenen Argumenten. Nachdem das aufgerufene Programm beendet wurde, erhält das Originalprogramm die Kontrolle zurück.

- 'Datei' ist ein STRING, der den vollen Dateinamen (inklusive Erweiterung) der auszuführenden Datei enthält.

- 'Argumente' ist ein STRING, der die Argumente enthält, die an das Programm übergeben werden sollen. Wenn keine Argumente übergeben werden sollen, können Sie einen Leerstring "" angeben.

- Der Rückgabewert ist der vom Programm gesetzte Errorlevel (siehe END). Konnte kein Programm aufgerufen werden (z. B. weil die angegebene Datei nicht existiert), so wird -1 zurückgegeben. Beachten Sie, dass auch der vom Programm zurückgegebene Wert -1 sein könnte!

Beispiel:

#IF __FB_UNIX__
DIM AS STRING program = "./program"
#ELSEIF __FB_PCOS__
DIM AS STRING program = "program.exe"
#ENDIF

PRINT "Starte " & program & " ..."
DIM AS INTEGER ret = EXEC(program, "")
SELECT CASE ret
CASE 0    : PRINT "Das Programm wurde korrekt ausgeführt."
CASE -1   : PRINT program & " nicht gefunden!"
CASE ELSE : PRINT program & " beendete mit Errorlevel " & ret
END SELECT

SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht EXEC nicht zur Verfügung und kann nur über __EXEC aufgerufen werden.

Siehe auch:
RUN, CHAIN, SHELL, END, COMMAND, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

EXEPATH

Syntax: EXEPATH[$]
Typ: Funktion
Kategorie: Programmorganisation

EXEPATH gibt das Verzeichnis zurück, in dem sich das gerade ausgeführte Programm befindet. Dieses ist nicht unbedingt identisch mit dem aktuellen Arbeitsverzeichnis (siehe CURDIR).

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

CHDIR "C:"
PRINT "Das Programm befindet sich in: ";
PRINT EXEPATH
PRINT "Das aktuelle Arbeitsverzeichnis ist: ";
PRINT CURDIR
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht EXEPATH nicht zur Verfügung und kann nur über __EXEPATH aufgerufen werden.

Siehe auch: CURDIR, CHDIR, MKDIR, RMDIR, SHELL, OPEN, DIR, Betriebssystem-Anweisungen

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

EXIT

Syntax: EXIT { SUB | FUNCTION | OPERATOR | PROPERTY | IF | DO | FOR | WHILE | SELECT }
Typ: Anweisung
Kategorie: Schleifen

EXIT verlässt einen Codeblock wie SUB, FUNCTION, OPERATOR, PROPERTY, oder Bedingungsstrukturen wie IF ... THEN und SELECT CASE, oder Schleifen wie DO ... LOOP, FOR ... NEXT oder WHILE ... WEND. Die Programmausführung wird am Ende der entsprechenden Blockstruktur fortgesetzt.

Beispiel 1: Der PRINT-Befehl wird nie ausgeführt.

DO
EXIT DO
PRINT "Wird nie ausgeführt"
LOOP
SLEEP

Wenn mehrere Blöcke ineinander verschachtelt sind, dann wird der innerste Block der angegebenen Art verlassen. Durch die mehrfache Angabe von Blocktypen, durch Komma getrennt, kann auch ein weiter außen liegender Block angesprochen werden.

Beispiel 2: Verlassen mehrerer Schleifen gleichzeitig

DIM AS INTEGER i, j
FOR i = 1 TO 10
FOR j = 1 TO 10
EXIT FOR, FOR
NEXT
PRINT "Wird nie ausgeführt"
NEXT
SLEEP

Unterschiede zu QB:

- Unter QB waren nur EXIT { DEF | DO | FOR | FUNCTION | SUB } möglich.

- EXIT DEF existiert unter FreeBASIC nicht mehr.

Unterschiede zu früheren Versionen von FreeBASIC:

- EXIT OPERATOR und EXIT PROPERTY sind erst seit FreeBASIC v0.17 möglich.

- Die Möglichkeit, mehrere Codeblock-Ebenen gleichzeitig zu verlassen (z. B. EXIT FOR, FOR) existiert erst seit FreeBASIC v0.17.

- EXIT SELECT und EXIT WHILE sind erst seit FreeBASIC v0.16 möglich.

Siehe auch:
SUB, FUNCTION, OPERATOR, PROPERTY, IF ... THEN, SELECT CASE, DO ... LOOP, WHILE ... WEND, FOR ... NEXT, CONTINUE

Letzte Bearbeitung: 23.08.11
Zur Onlinefassung des Eintrags

EXP

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

Gibt die Potenz einer angegebenen Zahl zur eulerschen Zahl e zurück. e ist näherungsweise 2.718281828459045.

- 'Zahl' ist ein beliebiger numerischer Ausdruck. Variablen, Konstanten, Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jedem Datentyp außer STRING, ZSTRING oder WSTRING sein.

- Der Rückgabewert ist eine DOUBLE-Zahl, die das Ergebnis des Ausdrucks e^Zahl darstellt. Daraus folgt, dass Exp(1)=e ist.

EXP ist die Gegenfunktion zu LOG.

Beispiel:
Berechnung des Kapitals mit Zinseszins

#INCLUDE "vbcompat.bi"
DIM r AS DOUBLE
DIM p AS DOUBLE
DIM t AS DOUBLE
DIM a AS DOUBLE

INPUT "Ursprünglich investiertes Kapital: ", p
INPUT "Jährliche Verzinsung (als Dezimale): ", r
INPUT "Verzinsungszeitraum in Jahren: ", t

a = p * EXP ( r * t )
PRINT ""
PRINT "Nach";t;" Jahren wird bei einer Verzinsung"
PRINT "von"; r * 100; "% ihr Ausgangskapital von"; p; "$ "
PRINT FORMAT(a, "##########.00"); "$ wert sein."
SLEEP

Ausgabebeispiel:

Ursprünglich investiertes Kapital: 100
Jährliche Verzinsung (als Dezimale): .08
Verzinsungszeitraum in Jahren: 20

Nach 20 Jahren wird bei einer Verzinsung
von 8% ihr Ausgangskapital von 100$
495.30$ Wert sein.

Hinweis: Die Einbindung von vbcompat.bi wird im obigen Beispiel nur für den Befehl FORMAT benötigt.

Unterschiede zu QB: keine

Siehe auch:
mathematische Funktionen, LOG, Exp

Letzte Bearbeitung: 06.07.10
Zur Onlinefassung des Eintrags

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.

OPTION EXPLICIT kann nur bis FreeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption -lang deprecated oder -lang fblite 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.

Bei FreeBASIC v0.16 bzw. in der Dialektform -lang fb ist diese Funktion 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.

EXPLICIT wird auch im Zusammenhang mit ENUM verwendet.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option in der Dialektform -lang fb nicht mehr nötig.

Siehe auch:
DIM, COMMON, STATIC, OPTION, __FB_OPTION_EXPLICIT__, ENUM

Letzte Bearbeitung: 23.02.12
Zur Onlinefassung des Eintrags

EXPORT

Syntax: DECLARE SUB | FUNCTION foo ( Argumente ) AS output_type EXPORT
Typ: Klausel
Kategorie: Programmorganisation

Wenn eine SUB oder FUNCTION in einer DLL mit der EXPORT-Klausel deklariert wurde, wird sie zur PUBLIC-EXPORT-Tabelle hinzugefügt, sodass sie von externen Programmen aus mit DYLIBSYMBOL verlinkt werden kann.

Beispiel: mydll.bas

' kompiliert mit: fbc -dll mydll.bas (erstellt mydll.dll und libmydll.dll.a unter Win32,
' oder libmydll.so unter Linux)
DECLARE FUNCTION AddNumbers ALIAS "AddNumbers" ( _
BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) _
AS INTEGER

FUNCTION AddNumbers ( _
BYVAL operand1 AS INTEGER, BYVAL operand2 AS INTEGER ) _
AS INTEGER EXPORT
AddNumbers = operand1 + operand2
END FUNCTION

Beispiel: Testmydll.bas

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

Unterschiede zu QB: Neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: EXPORT existiert seit FreeBASIC v0.11.

Siehe auch:
DECLARE, DYLIBLOAD, DYLIBSYMBOL

Letzte Bearbeitung: 07.01.09
Zur Onlinefassung des Eintrags

EXTENDS

Syntax: TYPE kindKlasse EXTENDS basisKlasse
Typ: Anweisung
Kategorie: OOP

EXTENDS wird in Verbindung mit Vererbung verwendet. Dabei gibt das Schlüsselwort an, dass die eigene Klasse die Records und Methoden einer bereits bestehenden erbt, also erhält, ohne dass man diese zusätzlich angeben müsste.

Beispiel:

TYPE Haustier EXTENDS OBJECT
AS INTEGER beine = 4
AS INTEGER schwanz = 1
END TYPE

TYPE Hund EXTENDS Haustier
AS INTEGER anhaenglich = 1
DECLARE SUB gibLaut
END TYPE
SUB Hund.gibLaut
PRINT "Wuff!"
END SUB

TYPE Chihuahua EXTENDS Hund
DECLARE SUB gibLaut
END TYPE
SUB Chihuahua.gibLaut
PRINT "Klaeffklaeff!"
END SUB

TYPE Bernhardiner EXTENDS Hund
AS INTEGER gutmuetig = 1
END TYPE

'#####################################################

DIM benno AS Bernhardiner, husky AS Chihuahua
PRINT "Benno hat " & benno.beine & " Beine und " & benno.schwanz & " Schwanz."
PRINT "Benno ist gutmuetig (Wert " & benno.gutmuetig & ")."
benno.gibLaut
PRINT
PRINT "Husky hat " & husky.beine & " Beine und " & husky.schwanz & " Schwanz."
husky.gibLaut
PRINT

SLEEP

Ausgabe:

Benno hat 4 Beine und 1 Schwanz.
Benno ist gutmuetig (Wert 1).
Wuff!

Husky hat 4 Beine und 1 Schwanz.
Klaeffklaeff!

Erläuterung: Sowohl Benno als auch Husky erben die Records 'beine' und 'schwanz' vom Elternobjekt. 'gutmuetig' steht nur Benno zur Verfügung. Dafür besitzt Husky eine eigene 'gibLaut'-Methode, während Benno auf die Methode des Elternobjekts zugreift.

Unterschiede zu QB: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: EXTENDS existiert seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht EXTENDS nicht zur Verfügung und kann nur über __EXTENDS aufgerufen werden.

Siehe auch:
TYPE (UDT), BASE, OBJECT, IS (Vererbung)

Letzte Bearbeitung: 24.01.12
Zur Onlinefassung des Eintrags

EXTERN (Module)

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 DLLs deklariert sind. Im Gegensatz zu COMMON wird kein Speicherplatz reserviert, die Variable wird lediglich definiert und zeigt auf den Speicherbereich des anderen Moduls. 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 beliebiger Datentyp wie z.B. INTEGER oder ein UDT (user defined type; siehe TYPE)

Seit FreeBASIC v0.15 kann eine Variable mehrmals EXTERN deklariert werden, sofern bei dieser Deklaration der selbe Datentyp angegeben wird.

Eine als EXTERN definierte Variable benötigt kein SHARED (die Syntax erlaubt dies auch nicht), da diese Variablen automatisch global im Modul zur Verfügung stehen.

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.

Unterschiede zu früheren FreeBASIC-Versionen:

- Seit FreeBASIC v0.15 sind doppelte EXTERN-Deklarationen zulässig, sofern beide Male derselbe Datentyp angegeben wird.

- Existiert erst seit FreeBASIC v0.11

Siehe auch:
COMMON, DIM, REDIM, PRESERVE, SHARED, STATIC, ALIAS

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

EXTERN ... END EXTERN

Syntax:

EXTERN { "C" | "C++" | "Windows" | "Windows-MS" } [ LIB "LibName" ]
' Deklarationen
END EXTERN

Typ: Anweisung
Kategorie: Programmorganisation

'EXTERN "Mangling"' startet einen Block, innerhalb dessen alle Deklarationen andere interne Bezeichner erhalten, als sie von FreeBASIC bekommen würden. Dies hat für den Programmfluss keine direkten Auswirkungen. Bei der Rückgabe von Fehlermeldungen oder beim Debuggen mittels externer Programme kann dies allerdings von Vorteil sein.

Beschreibung:

- EXTERN "C": setzt alle Prozeduren auf CDECL und erhält die Groß-/Kleinschreibung von allen Namen. Dasselbe Verhalten erreicht man ohne EXTERN durch die Aufrufkonvention CDECL zusammen mit einem ALIAS-String, der exakt denselben Prozedurnamen enthält.

- EXTERN "C++": wie EXTERN "C", stellt die Namen zusätzlich aber auf die Konventionen von g++-4.x

- EXTERN "Windows": setzt alle Prozeduren auf STDCALL, erhält die Groß-/Kleinschreibung von allen Namen und setzt zusätzlich das Suffix "@N" an alle Prozedurnamen, wobei N die Größe aller Parameter der jeweiligen Prozedur in Bytes ist.

- EXTERN "Windows-MS": wie EXTERN "Windows", nur dass das Suffix unter DOS/Windows nicht angehängt wird.

LIB "LibName" kann verwendet werden, um eine Lib einzubinden. Zusätzlich werden alle Prozedurdeklarationen innerhalb des Blocks so behandelt, als wäre bei der Deklaration ein 'LIB "LibName"' angegeben worden. Das kann aber durch explizite Angabe von LIB bei der Deklaration überschrieben werden.

Im EXTERN...END EXTERN-Block sind nur Deklarationen zulässig, sogenannte "ausführbare Anweisungen" dürfen innerhalb eines Blocks nicht auftreten. Im Detail sind die erlaubten Anweisungen:

- DIM

- STATIC

- COMMON

- DECLARE

- TYPE

- UNION

- ENUM

- CONST

- VAR

- NAMESPACE

Der Vorteil einer solchen Behandlung ist, dass der Linker einen leichter lesbaren Namen zurückgibt, wenn eine Referenz nicht gefunden werden konnte.

Als Block-Anweisung erstellt EXTERN einen eigenen SCOPE-Block.

Beispiel:

EXTERN "C++"
' Auch innerhalb des Namespace gilt die C++-Behandlung
NAMESPACE Ns1
DECLARE FUNCTION theFunction( BYVAL AS INTEGER ) AS UINTEGER
END NAMESPACE
END EXTERN

' Innerhalb dieses Namespace 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 demonstriert, wie GNU C++ und
' FreeBASIC die Bezeichner intern handhaben; die
' Fehlermeldung EXTERN C++-Funktion ist wesentlich
' einfacher zu lesen:

PRINT Ns1.theFunction( 1 )
PRINT Ns2.theFunction( 1 )

Ausgabe:
Unter Windows erhält man in etwa folgende Fehlermeldung:

test.o:fake:(.text+0x54): undefined reference to `Ns1::theFunction(int)'
test.o:fake:(.text+0x68): undefined reference to `_ZN3NS211THEFUNCTIONEi@4

Dagegen sieht die Fehlermeldung unter Linux im zweiten Fall freundlicher aus:

test.o: In function `main':
(.text+0x23): undefined reference to `Ns1::theFunction(int)'
test.o: In function `main':
(.text+0x3a): undefined reference to `NS2::THEFUNCTION(int)'

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unter Linux hängt EXTERN "Windows" nie das Suffix "@N" an

Unterschiede zu früheren Versionen von FreeBASIC:
Die Verwendung von EXTERN als Blockanweisung existiert erst seit FreeBASIC v0.16s

Unterschiede unter den FB-Dialektformen:
nur zulässig in der Dialektform -lang fb

Siehe auch:
EXTERN (Module), NAMESPACE, DECLARE, CDECL, STDCALL

Letzte Bearbeitung: 16.04.11
Zur Onlinefassung des Eintrags

Startbuchstabe F

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 NormalPacked
i AS INTEGER
b AS BYTE
END TYPE

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 WSTR("Größe der einzelnen Datentypen")
PRINT "Integer    : " & SIZEOF(     INTEGER)
PRINT "Byte       : " & SIZEOF(        BYTE)
PRINT

PRINT WSTR("Größe der verschiedenen UDTs")
PRINT "Ohne Field : " & SIZEOF(NormalPacked)
PRINT "Field = 1  : " & SIZEOF(  BytePacked)
PRINT "Field = 2  : " & SIZEOF(  WordPacked)
PRINT "Field = 4  : " & SIZEOF( DWordPacked)
SLEEP

Ausgabe:

Größe der einzelnen Datentypen
Integer    : 4
Byte       : 1

Größe der verschiedenen UDTs
Ohne Field : 8
Field = 1  : 5
Field = 2  : 6
Field = 4  : 8

Unterschiede zu QuickBASIC:

- QuickBASIC unterstützte noch kein Padding. Daher war die Feldbreite immer 1. Beachten Sie dies, wenn Sie Dateien, die von QuickBASIC generiert wurden in FreeBASIC einlesen

- Unter QuickBASIC wurde FIELD verwendet, um die Puffergröße bei RANDOM-Files festzulegen. Diese Verwendung ist unter FreeBASIC nicht mehr möglich

Letzte Bearbeitung: 13.09.10
Zur Onlinefassung des Eintrags

FILEATTR

Syntax: FILEATTR ( Dateinummer, [Ausgabe] )
Typ: Funktion
Kategorie: Datei

FILEATTR 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 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. Weiter unten ist aufgelistet, welcher Wert welche Information zurück gibt. Wird dieser Parameter ausgelassen, nimmt FreeBASIC automatisch 1 an.

- Der Rückgabewert ist eine INTEGER-Zahl, die von 'Ausgabe' abhängig 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ückgabewert 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, welche 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 derselbe Handle, den die C Runtime-Library verwendet.

Nur unter Windows:
Wenn an dieser Stelle 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 fbFileEncodASCII
PRINT "Die Datei ist als ASCII-Datei geoeffnet"
CASE fbFileEncodUTF8
PRINT "Die Datei ist als UTF-8-Datei geoeffnet"
CASE fbFileEncodUTF16
PRINT "Die Datei ist als UTF-16-Datei geoeffnet"
CASE fbFileEncodUTF32
PRINT "Die Datei ist als UTF-32-Datei geoeffnet"
END SELECT

CLOSE #f

SLEEP

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

- 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 genutzt werden.

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
OPEN, ENCODING, Dateien (Files), Betriebssystem-Anweisungen

Letzte Bearbeitung: 20.08.10
Zur Onlinefassung des Eintrags

FILECOPY

Syntax: FILECOPY ( Quelle, Ziel )
Typ: Funktion
Kategorie: Datei

FILECOPY 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

' Eine Datei erstellen und...
OPEN "TMP\Src.txt" FOR OUTPUT AS #1
' ...mit Text befüllen:
PRINT #1, "Source-File"
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"
PRINT "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"

SLEEP

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 QB: existiert nur in Visual Basic

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
FILEEXISTS, KILL, Dateien (Files), Betriebssystem-Anweisungen

Letzte Bearbeitung: 20.08.10
Zur Onlinefassung des Eintrags

FILEDATETIME

Syntax: FILEDATETIME(Dateiname)
Typ: Funktion
Kategorie: Datei

FILEDATETIME gibt den Zeitpunkt (Datum und Uhrzeit), an dem die Datei zuletzt bearbeitet wurde, als Serial Number 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 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 eine Serial Number, die Datum und Uhrzeit der letzten Bearbeitung enthält, oder 0, wenn ein Fehler aufgetreten ist. Die Serial Number wird als DOUBLE-Wert zurückgegeben.

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
SLEEP

Ausgabe:

Bitte geben Sie einen Dateinamen ein:
D:\BASIC\FreeBASIC\fbc.exe
Die Datei wurde zuletzt geändert am 16.04.2010, 00:15:02

Plattform-Unterschiede:

- Linux erwartet Dateinamen case sensitive. Windows und DOS sind case insensitive.

- Das Pfad-Trennzeichen in Linux ist der Slash / . Windows verwendet den Backslash, \ erlaubt jedoch auch den Slash. DOS verwendet den Backslash \ .

Unterschiede zu QB: Neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen: Existiert seit FreeBASIC v0.17.

Siehe auch:
FILEATTR, FILECOPY, FILEEXISTS, FILELEN, OPEN, CLOSE, Dateien (Files), Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

FILEEXISTS

Syntax: FILEEXISTS(Dateiname)
Typ: Funktion
Kategorie: Datei

FILEEXISTS überprüft, ob eine Datei existiert oder nicht.
Intern wird versucht, die Datei zu öffnen. Dies kann bewirken, dass ein bestehender LOCK gelöst wird. Je nach Anforderung kann auf andere Methoden zur Überprüfung ausgewichen werden, etwa mit Hilfe von DIR (hierbei muss genau auf die Attribute und den Pfad geachtet werden) oder mit OPEN versuchen, die Datei zu öffnen und den Rückgabewert zu prüfen.

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
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Unterschiede unter den FB-Dialektformen:

- Unter Linux muss beim 'Dateinamen' auf Groß- und Kleinschreibung geachtet werden.

- Das Trennzeichen für den Dateipfad unter Linux ist '/', unter DOS '\'. Unter Windows ist das Trennzeichen '\', es wird jedoch auch "/" akzeptiert.

Siehe auch:
DIR, OPEN (Funktion), Dateien (Files), Betriebssystem-Anweisungen

Letzte Bearbeitung: 08.05.11
Zur Onlinefassung des Eintrags

FILELEN

Syntax: FILELEN ( Dateiname )
Typ: Funktion
Kategorie: Datei

FILELEN gibt die Länge von einer Datei 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, welche 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 0 Bytes groß ist.

Beispiel:

#INCLUDE "file.bi"

DIM laenge AS INTEGER
laenge = FILELEN("C:\BASIC\FreeBASIC\fbc.exe")

PRINT "Der fbc ist"; laenge; " Bytes gross, das sind:"
PRINT  laenge \ (1024   *  1024); " Megabytes,";
PRINT (laenge \  1024) MOD 1024 ; " Kilobytes und";
PRINT  laenge          MOD 1024 ; " Bytes."

SLEEP

Ausgabebeispiel:

Der fbc ist 568832 Bytes gross, das sind:
0 Megabytes, 555 Kilobytes und 512 Bytes.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu älteren FreeBASIC-Versionen: existiert seit FreeBASIC v0.17

Siehe auch:
LOF, FILEEXISTS, FILEATTR, FILEDATETIME, Dateien (Files), Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

FIX

Syntax: FIX (Variable)
Typ: Funktion
Kategorie: mathematische Funktionen

FIX verwandelt eine beliebige Zahl in eine INTEGER-Zahl, indem der Nachkommateil abgeschnitten wird. Wenn die Eingabezahl ein INTEGER ist, bleibt sie unverändert. Ansonsten wird in Richtung 0 gerundet. Beispielsweise gibt FIX(1.9) 1 und FIX(-1.9) -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.

FIX kann mithilfe von OPERATOR überladen werden.

Unterschiede zu QB: keine

Siehe auch:
INT, CINT, FRAC, mathematische Funktionen

Letzte Bearbeitung: 27.06.10
Zur Onlinefassung des Eintrags

FLIP

Syntax: FLIP [Quellseite] [, Zielseite]
Typ: Anweisung
Kategorie: Gfx

Im Grafikmodus hat der Befehl FLIP dieselbe 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.

Beispiel:

SCREENRES 320, 240, 32, 2   'Fenster mit 320x240 Pixeln und 32-bit Farbtiefe und zwei Bildseiten.

FOR n AS INTEGER = 50 TO 270

SCREENSET 2, 1              'Stellt die zu bearbeitende Seite auf 2 und zeigt Seite 1 an.
CLS
CIRCLE (n, 50), 50 , RGB(255, 255, 0) 'Zeichnet einen gelben Kreis und einem Radius von 50 Pixel auf Seite 2.
SCREENSET 1, 1              'Stellt die zu bearbeitende und anzuzeigende Seite auf Seite 1.
SCREENSYNC                  'Wartet bis die Bildschirmaktualisierung erfolgt ist.
FLIP 2, 1                   'Kopiert den Kreis von Seite 2 auf Seite 1.

SLEEP 25
NEXT

PRINT "Taste druecken um zu beenden."
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht FLIP nicht zur Verfügung und kann nur über __FLIP aufgerufen werden.

Siehe auch:
SCREENRES, SCREENCOPY, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

FOR

FOR wird in FOR-Schleifen, bei Datei- und Hardwarezugriffen, sowie bei Operatoren verwendet.

FOR-Schleife:
siehe FOR ... NEXT

Datei- und Hardwarezugriffe:
siehe OPEN

Operatoren:
Als Operator wird FOR deklariert, wenn man den Befehl für eigene Datentypen überladen möchte.
Das Tutorial zu Thema 'OverLoad' erklärt die Verwendung hierbei näher.

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

FOR ... NEXT

Syntax:

FOR Variable [AS Typ] = Start TO Ende [STEP Schrittweite]
' Programmcode
NEXT [Variable]

Typ: Anweisung
Kategorie: Schleifen

Die FOR-Schleife wiederholt den Codeblock zwischen FOR und NEXT, wobei eine Variable bei jedem Durchlauf um einen bestimmten Wert erhöht wird.

- 'Variable' ist die Zählvariable, deren Wert sich beim Schleifendurchlauf verändern soll. Es kann sich bei ihr um jeden Zahlen-Datentyp handeln

- 'AS Typ' sorgt dafür, dass 'Variable' speziell für die Scheife neu angelegt wird. Diese Dimensionierung gehört dann zum SCOPE-Block der FOR-Schleife (vgl. Gültigkeitsbereich von Variablen).

- 'Start' ist der Startwert, welcher der Zählvariablen zu Beginn der Schleife zugewiesen wird.

- 'Schrittweite' gibt an, um welchen Wert die Zählvariable bei jedem Schleifendurchlauf verändert werden soll. Wird 'STEP Schrittweite' ausgelassen, dann wird die Zählvariable bei jedem Durchlauf um 1 erhöht.

- 'Ende' ist der Wert, bis zu dem die Zählvariable laufen soll. Wird dieser Wert erreicht, dann wird die Schleife noch ein letztes mal durchlaufen; wird der Wert überschritten (oder bei negativer Schrittweite unterschritten), dann wird die Schleife verlassen.

'Start' und 'Ende' werden zu Beginn der Schleife intern gespeichert und können innerhalb der Schleife nicht mehr geändert werden. Werden für 'Start' bzw. 'Ende' Variablen verwendet, dann können diese Variablen zwar in der Schleife geändert werden, dies beeinflusst jedoch nicht mehr den Start- bzw. Endwert der Schleife.

Achtung: Die Verwendung der Datentypen UBYTE und USHORT arbeiten zur Zeit nicht zusammen mit einer negativen Schrittweite! Wenn Sie mit STEP eine negative Schrittweite verwenden wollen, dann verwenden Sie die vorzeichenbehaftete Version der beiden Datentypen oder den wesentlich schneller berechenbaren Datentyp INTEGER.

Bei Ganzzahl-Datentypen ist es außerdem nicht möglich, bis zum höchstmöglichen Wert zu zählen (oder bis zum tiefstmöglichen bei negativer Schrittweite), da die Schleife nur verlassen wird, wenn die Zählvariable den Endwert überschreitet. Das tritt in diesem Fall jedoch nie ein. Wird beispielsweise versucht eine UBYTE-Variable von 0 bis 255 zählen zu lassen, wird die Schleife erst verlassen, wenn die Variable den Wert 256 oder höher erreicht. Den Wert 256 kann die UBYTE-Variable jedoch nicht speichern. Stattdessen wird sie nach 255 auf 0 zurückgesetzt und die Schleife läuft weiter.

Wenn Sie für 'Variable' einen Ganzzahlentyp und für 'Schrittweite' eine Fließkommazahl verwenden, dann wird 'Schrittweite' zuvor auf eine Ganzzahl gerundet. Ist 'Schrittweite' kleiner oder gleich 0.5, dann wird sie auf 0 abgerundet und damit eine Endlosschleife erzeugt.
Ist 'Schrittweite' positiv und 'Start' größer als 'Ende', dann wird die Schleife nicht durchlaufen. Dasselbe gilt für eine negative 'Schrittweite', wenn 'Start' kleiner ist als 'Ende'.

Als Block-Anweisung initialisiert die FOR-Schleife einen SCOPE-Block, der mit der Zeile NEXT endet. Wird die Zählvariable mit 'AS Typ' neu dimensioniert, dann ist sie ebenfalls außerhalb der Schleife nicht mehr gültig.

Eine FOR-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. Die Zählvariable wird dabei um 'Schrittweite' erhöht.

FOR, STEP und NEXT können mithilfe von OPERATOR überladen werden. Zum Einsatz von UDTs als Zählvariable siehe den Tutorial-Beitrag zum Überladen von Iteratoren.

Beispiel 1: Gibt ein Dreieck aus Sternen aus:

DIM AS INTEGER i, hoehe
hoehe = 10
FOR i = 1 TO hoehe
PRINT STRING(i, "*")
NEXT
PRINT "Nach der Schleife hat i den Wert "; i
SLEEP

Ausgabe:

*
**
***
****
*****
******
*******
********
*********
**********
Nach der Schleife hat i den Wert 11

Erläuterung zu Beispiel 1: Nach dem zehnten Durchlauf wird die Zählvariable ein weiteres mal erhöht und ihr Wert anhand der Schleifenbedingung überprüft. Da sie nun den Wert 11 besitzt, wird die Schleife verlassen.

Beispiel 2: Zählschleife mit automatischer Initialisierung

DIM i AS INTEGER = 1357
PRINT "Wert von i vor der Schleife: "; i

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

PRINT "Wert von i nach der Schleife: "; i
SLEEP

Erläuterung zu Beispiel 2: Nach Beendigung der Schleife wird die Zählvariable zerstört; die außerhalb der Schleife deklarierte Variable existiert weiterhin und es kann nun wieder auf sie zugegriffen werden.
Beachten Sie in diesem Beispiel auch die auftretenden Rundungsungenauigkeiten.

FOR in Prozeduren kann nicht mit Variablen als Zähler verwendet werden, die BYREF übergeben wurden. Das liegt daran, dass bei BYREF intern ein Pointer übergeben wird und dieser nicht als Zählvariable eingesetzt werden kann.

Beispiel 3: ergibt einen Compilier-Fehler

DECLARE SUB foo (BYREF a AS INTEGER)

DIM a AS INTEGER
foo a
SLEEP

SUB foo(BYREF a AS INTEGER)
FOR a = 1 TO 100
NEXT a
END SUB

Alternativ kann in der Prozedur eine neue Variable angelegt werden:

SUB foo (BYREF a AS INTEGER)
DIM b AS INTEGER = a
FOR b = 1 TO 100
NEXT
a = b
END SUB

Die hinter NEXT angegebene (optionale) Variable muss mit der bei FOR angegebenen Zählvariablen übereinstimmen. Es ist auch möglich, mehrere Zählvariablen hintereinander anzugeben, um mehrere FOR-Schleifen gleichzeitig abzuschließen.

Beispiel 4:

FOR i AS INTEGER = 1 TO 3 : FOR k AS INTEGER = 7 TO 9
PRINT i, k
NEXT k, i
SLEEP

Unterschiede zu QB:

- FreeBASIC erlaubt als Zählvaribale keine mit BYREF übergebene Variable.

- In QB dürfen innerhalb einer Schleife keine Variablen definiert werden.

- Die Syntax FOR Variable AS Typ = ... ist neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.18.3 muss die Variable hinter NEXT (sofern angegeben) der Schleifenvariablen entsprechen.

- 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-Schleife wie ein SCOPE-Block.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb und -lang fblite besitzen Variablen, die innnerhalb einer FOR-Schleife dimensioniert werden, in der ganzen Funktion sichtbar.

- In der Dialektform -lang fb und -lang deprecated sind Variablen, die in einer FOR-Schleife dimensioniert wurden, nur innerhalb dieser Schleife gültig.

Siehe auch:
DO...LOOP, WHILE...WEND, CONTINUE, SCOPE, EXIT, Schleifen

Letzte Bearbeitung: 30.01.12
Zur Onlinefassung des Eintrags

FORMAT

Syntax: FORMAT[$](numerischer_Ausdruck, FormatString)
Typ: Funktion
Kategorie: Stringmanipulation

FORMAT wandelt einen numerischen Ausdruck anhand der angegebenen Formatierung in einen STRING um.

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

- 'numerischer_Ausdruck' ist ein beliebiger Ausdruck, der als DOUBLE gehandhabt wird. Dies kann insbesondere auch eine Serial Number sein.

- 'FormatString' ist ein String, der festlegt, welche Form die Ausgabe haben soll. Er wird in den unten stehenden Tabellen näher erläutert.

Das Dollarzeichen ($) als Suffix ist optional.

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. Nach dem Dezimaltrennzeichen werden so viele Ziffern dargestellt wie angegeben. Die Ziffern vor dem Dezimaltrennzeichen werden vollständig angezeigt, auch wenn im Formatierungsstring weniger Stellen angegeben werden.

#

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 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 (bei Serial Numbers):

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

dddd

Zeige den Tag als vollen Namen an (Sonntag - Samstag)*

ddddd

Zeige das Datum als vollständiges Datum an, einschließlich Tag, Monat und Jahr.*

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

M, MM

Zeige den Monat als Zahl ohne bzw. mit führender Null an (wie m und mm), jedoch auch dann, wenn es direkt nach 'h' oder 'hh' benutzt wird.

mmm

Zeige den Monat als Abkürzung seines Namens an (Jan-Dez).*

mmmm

Zeige den Monat als vollen Namen an (Januar-Dezember).*

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)

n

Zeige die Minute ohne führender Null an (wie m), jedoch auch wenn es nicht direkt hinter h oder hh verwendet wird.

nn

Zeige die Minute mit führender Null an (wie mm), jedoch auch wenn es nicht direkt hinter h oder hh verwendet wird.

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

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.

Hinweis: * Die Darstellung ist von den lokalen Ländereinstellungen abhängig.

Ausgabebeispiel:

Einfache Zahlenformatierung:
Formatstring           5         -5         .5        5000.5
Leerstring             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 existiert nur in QBX PDS und in VBDOS.

Unterschiede zu früheren Versionen von FreeBASIC:

- FORMAT existiert seit FreeBASIC v0.15

- Die Formatierungsangabe 'n' und 'nn' existiert seit FreeBASIC v0.21

Siehe auch:
PRINT USING, STR, Serial Numbers, String-Funktionen

Letzte Bearbeitung: 20.05.12
Zur Onlinefassung des Eintrags

FRAC

Syntax: FRAC(Variable)
Typ: Funktion
Kategorie: mathematische Funktionen

FRAC gibt die Nachkommastellen inklusive Vorzeichen einer Zahl zurück.

Wird FRAC(10.625) aufgerufen, so wird 0.625 zurückgegeben.
Wird FRAC(-10.625) aufgerufen, so wird -0.625 zurückgegeben.

FRAC kann mithilfe von OPERATOR überladen werden.

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
FIX, INT, mathematische Funktionen

Letzte Bearbeitung: 27.06.10
Zur Onlinefassung des Eintrags

FRE

Syntax: FRE [(parameter)]
Typ: Funktion
Kategorie: Verschiedenes

FRE gibt den verfügbaren RAM-Speicher in Bytes zurück.
Der Parameter kann lediglich aus Kompatibilitätsgründen angegeben werden, er erfüllt aber keinen Zweck und kann somit ignoriert werden.

Beispiel:

DIM AS INTEGER mem

mem = FRE
PRINT "Freier Speicher:"
PRINT
PRINT mem; " Bytes"
PRINT mem / 1024; " Kilobytes"
PRINT mem / (1024 * 1024); " Megabytes"
SLEEP

Unterschiede zu QB:
FRE braucht in FreeBASIC keinen Parameter mehr. Es gibt immer den verfügbaren physischen freien Speicher zurück.

Siehe auch:
DIM, ALLOCATE, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

FREEFILE

Syntax: FREEFILE
Typ: Funktion
Kategorie: Datei

FREEFILE gibt die nächste unbenutzte Dateinummer zurück.

Beispiel:

DIM buffer AS STRING, FF AS INTEGER
buffer = "Hello World in einer Datei."

'Die erste freie Dateinummer zuweisen
FF = FREEFILE

'Die Datei "file.txt" mit der Nummer "FF" öffnen
OPEN "file.txt" FOR BINARY AS #FF

'Den String in die Datei laden
PUT #FF, , buffer

'Die Datei schließen
CLOSE #FF

'Das Programm beenden (Die Ausgabe befindet sich in der Datei "file.txt")
END

FREEFILE sollte immer vor jedem OPEN aufgerufen werden:

'So ist es richtig:
DIM fr AS INTEGER, fs AS INTEGER

fr = FREEFILE
OPEN "File1" FOR INPUT AS #fr
fs = FREEFILE
OPEN "file2" FOR INPUT AS #fs
CLOSE #fs
CLOSE #fr

'So ist es falsch:
DIM fr AS INTEGER, fs AS INTEGER

fr = FREEFILE
fs = FREEFILE    ' fs enthält nun dieselbe Nummer wie fr
OPEN "File1" FOR INPUT AS #fr
OPEN "file2" FOR INPUT AS #fs
CLOSE #fs
CLOSE #fr

FREEFILE gibt Nummern zwischen 1 und 255 zurück. Sollten alle Dateinummern vergeben sein, da so viele Dateien geöffnet sind oder das CLOSE vergessen wurde, so gibt FREEFILE 0 zurück. Dies zeigt an, dass keine weiteren Dateien geöffnet werden können.

Hinweis: Wenn man FREEFILE aus einer DLL aus aufruft, ergibt das nicht die gleichen Nummern wie im Hauptprogramm. Dateinummern können also nicht beliebig zwischen Hauptprogramm und DLL übertragen werden.

Siehe auch:
OPEN, Dateien (Files)

Letzte Bearbeitung: 12.10.10
Zur Onlinefassung des Eintrags

FUNCTION

Syntax A:

[{PRIVATE | PUBLIC }] FUNCTION Funktionsname [Aufrufkonvention] [ALIAS "AliasName"] _
[OVERLOAD] ([Parameterliste]) AS Rückgabetyp [STATIC] [EXPORT]
' Anweisungen
END FUNCTION

Typ: Prozedur
Kategorie: Programmorganisation

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.

Eine FUNCTION ist eine Prozedur, die einen Wert an das Hauptprogramm zurück gibt. FUNCTIONs werden dazu verwendet, häufig auftretende Berechnungen zusammenzufassen. Siehe auch SUB zum Thema Prozeduren.

- Die Klausel 'PRIVATE' bewirkt, dass die Funktion nur aus dem Modul heraus aufgerufen werden kann, in dem sie sich befindet. Siehe dazu die Referenzeinträge PRIVATE und PUBLIC.

- 'Funktionsname' ist der Bezeichner, unter dem die Funktion aufgerufen wird.

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

- 'ALIAS' gibt einer Funktion in einer Library einen neuen Namen, mit dem man auf sie verweisen kann.

- 'OVERLOAD' erlaubt, Prozeduren mit unterschiedlicher Parameterliste, aber gleichem Funktionsnamen zu deklarieren. Siehe dazu den Referenzeintrag OVERLOAD.

- 'Parameterliste' gibt die Parameter an, die an die Funktion übergeben werden. Die Parameterübergabe wird weiter unten erläutert.

- 'Rückgabetyp' ist der Datentyp des Rückgabewerts. Auch UDTs und POINTER sind erlaubt.

- Die Klausel 'STATIC' bewirkt, dass alle Variablen innerhalb der Funktion zwischengespeichert werden. Das bedeutet, dass die Werte von Variablen, die in der Funktion verwendet werden, nach einem Aufruf nicht verloren gehen, sondern beim nächsten Aufruf der Funktion wieder verfügbar sind. Siehe auch STATIC (Klausel).

- Die Klausel 'EXPORT' bewirkt, dass die Funktion zur PUBLIC-EXPORT-Tabelle hinzugefügt wird, sodass sie von externen Programmen aus mit DYLIBSYMBOL verlinkt werden kann. Siehe dazu den Referenzeintrag EXPORT.

Um eine Funktion aufzurufen, bevor sie im Quellcode definiert wurde, muss sie zuvor deklariert werden:

DECLARE FUNCTION Funktionsname [Aufrufkonvention] [OVERLOAD] [[LIB "DLLName"] _
ALIAS "AliasName"] [ ( Parameterliste ) ]  AS Rückgabetyp

Siehe dazu den Referenzeintrag DECLARE

Parameterübergabe
Der Wert der Funktion kann von übergebenen Parametern abhängig sein. Die Parameterliste besitzt die Form

[ {BYVAL | BYREF } ] [Parameter1] AS [CONST] Typ [= Wert]   [, _
[ {BYVAL | BYREF } ] [Parameter2] AS [CONST] Typ [= Wert] ] [, ...]

- 'Parameter1', 'Parameter2', ... sind die Parameter (auch Argumente genannt). Es sind Variablen (bzw. ihre Werte), die in der Funktion verwendet werden können.

- Wird 'CONST' angegeben, kann der Wert innerhalb der Funktion zwar gelesen, aber nicht mehr beschrieben werden.

- 'Typ' ist der Datentyp des übergebenen Parameters. Auch UDTs und Pointer können verwendet werden.

- Durch '= Wert' wird ein Parameter als optional deklariert; er kann beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird an die Funktion für diesen Parameter 'Wert' übergeben. Das VisualBASIC-Äquivalent heißt OPTIONAL.

- BYVAL und BYREF regeln die Art der Parameterübergabe an die FUNCTION.

Der Datentyp muss bei den Parametern immer angegeben werden.
Siehe auch Parameterübergabe.

Rückgabewert
Der Rückgabewert der 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

Der Rückgabewert einer Funktion kann beim Aufruf auch ignoriert werden. Dies kann dann sinnvoll sein, wenn die Funktion 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 1:

DECLARE FUNCTION twice (x AS INTEGER) AS INTEGER

FUNCTION twice (x AS INTEGER) AS INTEGER
RETURN x * 2
PRINT "Diese Zeile wird nie ausgegeben"
END FUNCTION

PRINT twice (10) 'Gibt 20 aus, das Doppelte von 10
SLEEP

Beispiel 2: Rückgabe eines ganzen UDTs:

TYPE udt
v1 AS INTEGER
v2 AS INTEGER
END TYPE

DECLARE FUNCTION bla(foo AS INTEGER, bar AS INTEGER) AS udt

DIM variable AS udt
variable = bla(1, 3)

PRINT "Variable: v1 ="; variable.v1; ", v2 ="; variable.v2
'Ausgabe: "Variable: v1 = 10, v2 = 30"
SLEEP

FUNCTION bla(foo AS INTEGER, bar AS INTEGER) AS udt
DIM variable AS udt
variable.v1 = foo*10
variable.v2 = bar*10
bla = variable
END FUNCTION

Beispiel 3: 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 AS INTEGER
END TYPE

FUNCTION MyUDT.SumOfAll AS INTEGER
RETURN This.x + This.y + This.z
END FUNCTION

DIM variable AS MyUDT
WITH variable
.x = 5
.y = 10
.z = -3
END WITH

PRINT variable.SumOfAll
SLEEP

Ausgabe:

12

Unterschiede zu QB:

- Parameter können in FreeBASIC optional sein.

- Der Rückgabewert kann in FreeBASIC auch mit FUNCTION = Ausdruck oder RETURN Ausdruck festgelegt werden.

- Funktionen können in FreeBASIC überladen werden.

- Der Rückgabewert kann in FreeBASIC beim Aufruf der Funktion ignoriert werden.

Unterschiede 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 die Form STATIC FUNCTION 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 AS INTEGER foo()).

- Seit FreeBASIV v0.16 kann GOSUB und ON ... GOSUB nicht mehr auf Prozedurebene eingesetzt werden.

- Das Überladen einer FUNCTION 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.

- Variable Argumente sind erst seit FreeBASIC v0.13 möglich; siehe VA_ARG.

- Seit FreeBASIC v0.13 können optionale Parameter auch bei Strings eingesetzt werden.

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

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang fb werden Parameter standardmäßig BYVAL übergeben. In den Dialektformen -lang qb und -lang fblite ist die Standardübergabe BYREF. Siehe die zugehörigen Referenzeinträge für genauere Informationen.

- In den Dialektformen -lang qb und -lang fblite kann RETURN nur eingesetzt werden, wenn OPTION GOSUB ausgeschalten ist. In der Dialektform -lang qb muss dies explizit durch OPTION NOGOSUB festgelegt werden.

Siehe auch:
SUB, PROPERTY, DECLARE, OVERLOAD, EXIT, END, BYVAL, BYREF, SHARED, PRIVATE (Klausel), PUBLIC (Klausel), VA_ARG, Prozeduren, Functions, Parameterübergabe

Letzte Bearbeitung: 30.10.11
Zur Onlinefassung des Eintrags

Startbuchstabe G

GET (Datei)

Syntax: GET #Dateinummer, [Position], Variable [, Menge [, Gelesen] ]
Typ: Anweisung/Funktion
Kategorie: Datei

GET 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 Dateizeigers. Diese ist abhängig von den letzten Lese-/Schreibzugriffen auf die Datei und von der SEEK-Anweisung. Direkt nach dem Öffnen ist der Dateizeiger immer auf der ersten 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.

- 'Gelesen' enthält die Anzahl der tatsächlich gelesenen Bytes. Damit kann überprüft werden, ob versucht wurde, hinter dem Dateiende zu lesen.

- Wird GET als Funktion eingesetzt, 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 [, Menge [, Gelesen] ])

Da 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 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, LONG und ULONG - 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.

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

- ALLOCATE-Puffer - Der Parameter 'Menge' gibt an, wie viele Bytes gelesen werden. Achten Sie 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)

DIM AS INTEGER 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 einzulesende 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

DIM AS INTEGER f = FREEFILE
OPEN "file.ext" FOR BINARY AS #f

GET #f, , inpArray()
GET #f, , inpUDT

CLOSE #f

In inpArray werden 6 * 4 = 20 Bytes eingelesen; 6 ist die Anzahl der Indizes (von 0 bis 5), 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 Pointer-Dereferenzierung

*Pointer

oder

Pointer[index]

Außerdem müssen Sie angeben, wie viele Bytes gelesen werden sollen. Dazu dient der Parameter 'Menge'.

Beispiel 3:

DIM AS INTEGER 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
SLEEP

Ausgabe:

51     !3

Wie Sie sehen, wird in die Datei beim ersten Zugriff zuerst ein BYTE-Wert und anschließend 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 QB:

- GET kann auch als Funktion eingesetzt werden.

- Ganze Arrays und UDTs können eingelesen werden.

- Die Verwendung von ALLLOCATE-Datenpuffern ist möglich.

- Mit dem Parameter 'Gelesen' kann die tatsächlich gelesene Datenmenge bestimmt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.10 können ganze Arrays gelesen werden.

- Seit FreeBASIC v0.13 kann GET als Funktion eingesetzt werden

- Seit FreeBASIC v0.20 steht der fünfte Parameter 'Gelesen' zur Verfügung, um die Anzahl der tatsächlich gelesenen Byte zu bestimmen.

Siehe auch:
GET (Grafik), OPEN, BINARY, RANDOM, PUT #, Dateien (Files)

Letzte Bearbeitung: 15.08.10
Zur Onlinefassung des Eintrags

GET (Grafik)

Syntax: GET [QuellPuffer], [STEP] (x1, y1) - [STEP] (x2, y2), ZielPuffer
Typ: Anweisung
Kategorie: Gfx

GET speichert einen Ausschnitt aus einem Grafikfenster (bzw. vom Bildschirm bei Vollbildmodi) in einem Bildpuffer.

- 'QuellPuffer' ist ein Bildpuffer im Sinne von Interne Pixelformate, wie er mit IMAGECREATE verwendet wird. Wird 'QuellPuffer' 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 untere 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 mit IMAGECREATE verwendet 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-Anweisungen 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 zur manuellen Berechnung des Speicherplatzbedarfs.

Beispiel:
Das folgende Beispiel zeichnet einen Spielstein, der mit der Maus über einen mehrfarbigen Hintergrund bewegt wird. GET wird verwendet, um den aktuellen Hintergrund unter der Spielstein-Position zu speichern, um ihn nach einer Bewegung des Steins wieder herstellen zu können.

#DEFINE PI 3.141592653589793
SCREENRES 300, 200, 32                      ' Grafikscreen mit 32bit Farbtiefe
DIM AS ANY PTR bild, hg
DIM AS UINTEGER hell = RGB(255, 64, 64)     ' heller Farbwert des Steins
DIM AS UINTEGER dunkel = RGB(192, 0, 0)     ' dunkler Farbwert des Steins

' Bild in den Puffer schreiben
bild = IMAGECREATE(40, 40)
hg = IMAGECREATE(40, 40)
CIRCLE bild, (20, 25), 15, dunkel, PI, 0, .6
LINE bild, (5, 20)-STEP (0, 5), dunkel
LINE bild, (35, 20)-STEP (0, 5), dunkel
CIRCLE bild, (20, 20), 15, dunkel, , , .6
PAINT bild, (20, 30), dunkel, dunkel
PAINT bild, (20, 20), hell, dunkel

' Hintergrund erstellen
LINE (50, 50)-(250, 150), RGB(0,255,0), BF  ' gruenes Rechteck ...
LINE (80, 80)-(220, 120), RGB(0,0,255), BF  ' ... und darin ein blaues

DIM AS INTEGER mausX = 0, mausY = 0, mausB  ' Mausposition und Buttonstatus
DIM AS INTEGER altX = 0, altY = 0           ' zuletzt gemerkte Mausposition
SETMOUSE mausX, mausY, 0, 1                 ' Maus auf das Fenster beschraenken
GET (altX, altY)-STEP(39, 39), hg           ' Hintergrund speichern
PUT (mausX, mausY), bild, TRANS
DO
GETMOUSE mausX, mausY, , mausB            ' neue Position ermitteln ...
IF mausX > 260 THEN mausX = 260           ' ... und an den Grenzen anpassen
IF mausy > 160 THEN mausY = 160
IF mausX <> altX OR mausY <> altY THEN    ' Maus wurde bewegt
SCREENLOCK
PUT (altX, altY), hg, PSET              ' alte Position wiederherstellen
GET (mausX, mausY)-STEP(39, 39), hg     ' Hintergrund speichern
PUT (mausX, mausY), bild, TRANS         ' neue Position zeichnen
SCREENUNLOCK
altX = mausX                            ' neue Position merken
altY = mausY
END IF
SLEEP 1
LOOP UNTIL mausB > 0 OR INKEY = CHR(27)     ' bei Mausklick oder ESC beenden
IMAGEDESTROY bild                           ' Bildpuffer freigeben
IMAGEDESTROY hg

Unterschiede zu QB:

- Im Gegensatz zur QB-Version verkleinert sich in FreeBASIC 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 in FreeBASIC unterscheidet sich von dem, der in QB genutzt wird.

Unterschiede zu früheren Versionen von FreeBASIC:

- Die Möglichkeit, anstelle von Arrays auch Pointer als Puffer anzugeben, existiert seit FreeBASIC v0.12.

- Seit FreeBASIC v0.13 wird ein Laufzeitfehler ausgelöst, wenn versucht wird, Bereiche zu scannen, die außerhalb der Bildschirmgrenzen liegen.

- Die Möglichkeit, einen Quellpuffer anzugeben, existiert seit FreeBASIC v0.15.

- Seit FreeBASIC v0.17 benutzt GET das neue Bildpuffer-Format; siehe dazu Interne Pixelformate.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang fb wird als 'ZielPuffer' die neue Version des Bildpuffers verwendet, der mit einem 32-Byte Image-Header beginnt und dessen Zeilen auf Vielfache von 16 Bytes aufgestockt werden. Der benötigte Speicherplatz beträgt
speicherplatz = 32 + (((Breite * bpp + &hF) AND NOT &hF) * Hoehe)

- In der Dialektform -lang qb und -lang fblite wird als 'ZielPuffer' die alte QB-Version des Bildpuffers verwendet, der mit einem 4-Byte Image-Header beginnt und dessen Zeilen nicht aufgestockt werden. Der benötigte Speicherplatz beträgt:
speicherplatz = 4 + (Breite * Hoehe * bpp)

Siehe auch:
GET (Datei), PALETTE GET, PUT (Grafik), IMAGECREATE, SCREENRES, Grafik

Letzte Bearbeitung: 03.08.11
Zur Onlinefassung des Eintrags

GETJOYSTICK

Syntax: GETJOYSTICK (id, buttons[, [x][, [y][, [z][, [r][, [u][, v]]]]]])
Typ: Funktion
Kategorie: Benutzereingabe

GETJOYSTICK gibt die Position des Joysticks oder des Gamepads 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:
Bit 0 wird gesetzt, wenn der erste Button gedrückt wird;
Bit 1 wird gesetzt, wenn der zweite Button gedrückt wird usw.
Bis zu 32 Buttons werden unterstützt. Siehe dazu BIT.

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

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. 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 Achse nicht unterstützt wird, schreibt FreeBASIC an die entsprechende Speicherstelle den Wert -1000.00 ist. Wenn der Joystick mit der angegebenen ID nicht verfügbar ist, gibt FreeBASIC -1 bei den Buttons zurück und alle Achsen liefern den Wert -1000.00 ist.

Beispiel:

SCREENRES 640, 400

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 Tastendruck beenden.
LOOP UNTIL LEN(INKEY)

Wie man sieht, muss der Funktionswert nicht abgefragt werden; GETJOYSTICK kann auch als Anweisung eingesetzt werden. In diesem Fall entfallen die Klammern, und der Rückgabewert geht verloren.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.17 unterstützt GETJOYSTICK acht Achsten.

- GETJOYSTIK existiert seit FreeBASIC v0.14

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht GETJOYSTICK nicht zur Verfügung und kann nur über __GETJOYSTICK aufgerufen werden.

Siehe auch:
GETMOUSE, GETKEY, Benutzereingaben

Letzte Bearbeitung: 14.05.12
Zur Onlinefassung des Eintrags

GETKEY

Syntax: GETKEY
Typ: Funktion
Kategorie: Benutzereingabe

GETKEY wartet mit der Programmausführung, bis eine Taste gedrückt wird. GETKEY arbeitet also ähnlich wie SLEEP, löscht jedoch die abgefragte Taste nach der Abfrage aus dem Tastaturpuffer.

Der Rückgabewert von GETKEY ist ein INTEGER mit dem Ascii-Code der gedrückten Taste (vgl. INKEY). Bei Sondertasten wie den Funktionstasten (F1, F2, etc.), Pfeiltasten usw. wird ein kombinierter Wert aus dem Erweiterungscode 255 und dem regulären Tastencode zurückgegeben (siehe zweites Beispiel).

Für eine Tastaturabfrage ohne Unterbrechung des Programmablaufs siehe INKEY und MULTIKEY.

Beispiel 1:

PRINT "beliebige Taste drücken, um fortzusetzen"
GETKEY
PRINT LEN(INKEY)
SLEEP

Beispiel 2: Illustration der Sondertasten

DIM AS USHORT Result
DIM AS UBYTE a, b

PRINT "Taste druecken."

Result = GETKEY

PRINT "+------++------+"
PRINT BIN(Result,16) & " (dezimal: " & Result & ")"

a = (Result AND &HFF)
b = (Result AND &HFF00) SHR 8

PRINT
PRINT "Beide Bytes einzeln:"
PRINT BIN(A,8) & " = " & a
PRINT BIN(B,8) & " = " & b

SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht GETKEY nicht zur Verfügung und kann nur über __GETKEY aufgerufen werden.

Siehe auch:
SLEEP[/link, [link]ref:313;INKEY, INPUT (Funktion), MULTIKEY, Benutzereingaben

Letzte Bearbeitung: 13.05.12
Zur Onlinefassung des Eintrags

GETMOUSE

Syntax: GETMOUSE x, y[, [Rad][, [Buttons][, [Clip]]]]
Typ: Funktion
Kategorie: Benutzereingabe

GETMOUSE liefert die Position der Maus und den Status der Buttons, des Mausrads und des Clipping-Status zurück.

- Die Position wird in den Variablen 'x' und 'y' zurückgegeben; beide müssen vom Typ INTEGER sein. Die Koordinaten richten sich nach dem Anzeigemodus: In Grafikmodi geben sie die Position in Pixeln an. In Textmodi wird die Position des Cursors in Zeilen und Spalten ausgegeben. In beiden Fällen entspricht die linke obere Ecke den Koordinaten 0, 0. Ä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. Möglicherweise unterstützt FreeBASIC nicht immer Mausräder; in diesem Fall wird immer 0 zurückgegeben.

- '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.
Bit 3 wird gesetzt, wenn die 1. Zusatztaste gedrückt wird.
Bit 4 wird gesetzt, wenn die 2. Zusatztaste gedrückt wird.
Siehe dazu BIT.

- 'Clip' speichert den Maus-Clipping-Status. Bei 1 ist die Maus auf das Grafik-Fenster beschränkt; bei 0 ist die Maus nicht beschränkt.

- Wenn sich die Maus außerhalb des Fensters befindet oder keine Maus angeschlossen ist, werden im Grafikmodus alle übergeben Variablen auf -1 gesetzt. Im Konsolenmodus werden die letzten Koordinaten vor dem Verlassen des Fensters zurückgegeben

- Der Rückgabewert der Funktion ist 0 bei Erfolg oder 1 beim Auftreten eines Fehlers (z. B. weil sich die Maus außerhalb des Fensters befindet).

Da beim Bewegen der Maus aus dem Grafikfenster heraus alle Werte auf -1 gesetzt werden und dies im Zusammenhang mit der Button- und Mausrad-Abfrage zu Fehlinterpretationen führen kann, sollte immer der Rückgabewert der Funktion geprüft werden.

Beispiel:

DIM AS INTEGER x, y, buttons, Ergebnis

' Grafikfenster 320x200x8 setzen
SCREENRES 320, 200

DO
' Lade Mauskoordinaten ohne Mausrad.
Ergebnis = GETMOUSE (x, y, , buttons)
LOCATE 1, 1
IF Ergebnis <> 0 THEN
PRINT "Maus nicht vorhanden/nicht im Fenster"
ELSE
PRINT USING "Maus-Position: ###:###  Buttons: "; x; y;
IF buttons AND 1 THEN PRINT "L";
IF buttons AND 2 THEN PRINT "R";
IF buttons AND 4 THEN PRINT "M";
IF buttons AND 8 THEN PRINT "X1";
IF buttons AND 16 THEN PRINT "X2";
PRINT SPACE(5)
END IF
LOOP WHILE INKEY = ""
END

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:

- Unter Win32 kann im Vollbild-Konsolenmodus nicht garantiert werden, dass die Änderungen des Mausrads korrekt erkannt werden.

- Unter DOS hat das Maus-Clipping keine Auswirkung. Außerdem wird das Mausrad und die mittlere Maustaste nicht von jedem Maustreiber unterstützt.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht GETMOUSE nicht zur Verfügung und kann nur über __GETMOUSE aufgerufen werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- Maus-Clipping wird seit FreeBASIC v0.18 unterstützt.

- Seit FreeBASIC 0.14 wird GETMOUSE im Konsolenfenster unterstützt.

Siehe auch:
SCREENRES, SETMOUSE, Benutzereingaben

Letzte Bearbeitung: 13.05.12
Zur Onlinefassung des Eintrags

GOSUB

Syntax: GOSUB label
Typ: Anweisung
Kategorie: Programmorganisation

GOSUB springt zu einem Label, und speichert, von wo der Sprung ausgeführt wurde, um später dorthin zurückzukehren. Um zur gespeicherten Stelle zurückzukehren, wird der Befehl RETURN verwendet.

GOSUB ist der Vorgänger von SUB und besitzt eine ähnliche Funktionsweise. Jedoch ist es mit SUB leichter, strukturierten Code zu verfassen. Daher steht GOSUB nur in den Dialektformen -lang fblite oder -lang qb zur Verfügung. Unter -lang fblite muss die Unterstützung von GOSUB zudem über OPTION GOSUB aktiviert werden.

Beispiel:

#LANG "fblite"
OPTION GOSUB
GOSUB message
END

message:
PRINT "Welcome!"
RETURN

Unterschiede zu QB:
In der Dialektform -lang qb verhält sich GOSUB wie in QB. Zu den anderen Dialektformen siehe 'Unterschiede unter den FB-Dialektformen'.

Unterschiede unter den FB-Dialektformen:

- GOSUB steht nur in den Dialektformen -lang fblite und -lang qb zur Verfügung.

- In der Dialektform -lang fblite muss GOSUB mittels OPTION GOSUB aktiviert werden.

Siehe auch:
ON ... GOSUB, RETURN, GOTO, SUB, FUNCTION, Prozeduren

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

GOSUB (Schlüsselwort)

Syntax: OPTION GOSUB
Typ: Schlüsselwort
Kategorie: Programmorganisation

OPTION GOSUB aktiviert die Unterstützung von GOSUB und ON ... GOSUB. Die Option 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 GOSUB nicht mehr zulässig!

Da RETURN sowohl eine Rückkehr von GOSUB als auch von einer Prozedur bedeuten kann, können OPTION GOSUB und OPTION NOGOSUB verwendet werden, um GOSUB zu aktivieren bzw. deaktivieren. Wenn GOSUB deaktiviert wurde, wird RETURN nur als Rückkehr aus einer Prozedur bzw. Funktion aufgefasst. Ansonsten wird RETURN nur als Rückkehr von GOSUB aufgefasst.

Beispiel:

#LANG "fblite"

' GOSUB aktivieren
OPTION GOSUB

GOSUB unten
oben:
PRINT "wieder zurück"
END

unten:
PRINT "unten"
RETURN

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
NOGOSUB (Schlüsselwort), GOSUB, RETURN, __FB_OPTION_GOSUB__, OPTION

Letzte Bearbeitung: 09.07.10
Zur Onlinefassung des Eintrags

GOTO

Syntax: GOTO label
Typ: Anweisung
Kategorie: Programmorganisation

GOTO springt zu einem beliebigen Label. Ein Label ist eine Zeichenfolge mit einem abschließenden Doppelpunkt. Die Zeichenfolge darf kein Befehl, Name einer SUB/FUNCTION oder einer bereits bestehenden Variable sein. In der Dialektform -lang qb und -lang deprecated darf als Label auch eine Zahl verwendet werden, der kein Doppelpunkt folgen muss.

Für den Namen von Labels gelten dieselben Regeln wie für die Namen von Variablen. Jedes Label darf nur einmal vergeben werden! Es ist ebenfalls unzulässig, denselben Namen innerhalb zweier Module doppelt zu verwenden. Eine GOTO-Anweisung bezieht sich immer auf ein Label innerhalb derselben SUB/FUNCTION desselben Moduls; es ist also nicht erlaubt, mit GOTO in eine Prozedur hinein- oder aus ihr herauszuspringen.

Beispiel:

#LANG "deprecated"
1 GOTO 4
2 PRINT "Tschüss!"
3 GOTO ende
4 PRINT "Willkommen!"
5 GOTO 2

ende:
END

Mit GOTO ist es sehr leicht, sogenannten Spaghetticode zu erzeugen, der sich nur noch schwer warten lässt. Daher sollte man in der Regel versuchen, den Befehl zu vermeiden. Ersatz dafür bieten Strukturen wie Schleifen, SUBs und FUNCTIONs.

Siehe auch:
GOSUB, DO ... LOOP, FOR ... NEXT, SUB, FUNCTION, EXIT

Letzte Bearbeitung: 25.08.11
Zur Onlinefassung des Eintrags

Startbuchstabe H

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 positive Ganzzahl (eine Zahl ohne Kommastellen und ohne Vorzeichen), die ins Hexadezimalformat übersetzt werden soll. Negate Zahlen werden intern umgewandelt, so dass scheinbar "unerwartete" Ergebnisse auftreten.

- '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; der zurückgegebene Wert ist jedoch nie länger, als maximal für den Datentyp von 'Ausdruck' benötigt wird.
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 Hexadezimalformat enthält.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT HEX(54321)    ' Ausgabe: D431
PRINT HEX(255, 4)   ' Ausgabe: 00FF
PRINT HEX(70000, 3) ' Ausgabe: 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("&HC2")

gibt 194 aus.

Unterschiede zu QB:

- In QB kann die Anzahl der ausgegebenen Stellen nicht festgelegt werden.

- Die Größe des zurückgegebenen Strings ist auf 32 Bits bzw. 8 Hexadezimal-Stellen begrenzt.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
BIN, OCT, VAL, WHEX

Letzte Bearbeitung: 16.08.11
Zur Onlinefassung des Eintrags

HIBYTE

Syntax: HIBYTE (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

HIBYTE gibt das obere Byte eines Ausdrucks als UINTEGER zurück. HIBYTE hat dieselbe Funktion wie

CUNSG(Ausdruck) SHR 8 AND &hFF

Beispiel:

DIM AS INTEGER foo = &b10000100000 ' = 1056 dezimal
PRINT foo
PRINT HEX(foo, 4)
PRINT HIBYTE(foo)
PRINT CUNSG(foo) SHR 8 AND &hFF
SLEEP

Ausgabe:

1056
0420
4
4

Intern wird HIBYTE folgendermaßen behandelt:

#Define HIBYTE(x) ((CUInt(x) And &h0000FF00) Shr 8)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __HIBYTE in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht HIBYTE nicht zur Verfügung und kann nur über __HIBYTE aufgerufen werden.

Siehe auch:
HIWORD, LOBYTE, LOWORD, Bit-Operatoren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

HIWORD

Syntax: HIWORD (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

HIWORD gibt das obere Word eines Ausdrucks als UINTEGER zurück. HIWORD hat dieselbe Funktion wie

CUNSG(Ausdruck) SHR 16 AND &hFFFF

Beispiel:

DIM AS INTEGER foo = &b11000000000000000 ' = 98304 dezimal
PRINT HIWORD(foo)
PRINT CUNSG(foo) SHR 16 AND &hFFFF
SLEEP

Ausgabe:

1
1

Intern wird HIWORD folgendermaßen behandelt:

#Define HIWORD(x) (CUInt(x) Shr 16)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __HIWORD in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht HIWORD nicht zur Verfügung und kann nur über __HIWORD aufgerufen werden.

Siehe auch:
HIBYTE, LOBYTE, LOWORD, Bit-Operatoren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

HOUR

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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: existiert nur in QBX PDS und in VBDOS.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15.

Siehe auch:
NOW, TIMESERIAL, TIMEVALUE, MINUTE, SECOND, FORMAT, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

Startbuchstabe I

IF (Meta)

Syntax:

#IF (Bedingung)
'...Programmcode
[#ELSEIF (Bedingung)
...]
[#ELSE
...]
#ENDIF

Typ: Metabefehl
Kategorie: Präprozessoren

#IF leitet einen Mechanismus ein, der den nachstehenden Code nur kompiliert, 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 genauso, 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 compiliert 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 compiliert. 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 kompiliert.

Beispiel:

#IF DEFINED(__FB_WIN32__)
#INCLUDE "ProjectWin.bi"
#ELSEIF DEFINED(__FB_LINUX__)
#INCLUDE "ProjectLinux.bi"
#ELSE
#ERROR "Plattform wird nicht unterstützt
#ENDIF

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
#IFDEF, #IFNDEF, IF...THEN, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

IF ... THEN

Typ: Anweisung
Kategorie: Bedingungen

Einfache Syntax:

IF Bedingung THEN [:] Anweisungen [ELSE Anweisungen] [:] [END IF]

Blockstruktur-Syntax:

IF Bedingung_1 THEN
' Code
[ELSEIF Bedingung_2 THEN
' Code]
[ ... ]
[ELSE
' Code]
END IF

IF...THEN führt einen Codeteil nur dann aus, wenn eine Bedingung erfüllt ist.

- 'Bedingung', ist ein numerischer 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 eine Variable auf viele verschiedene Möglichkeiten hin 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 vorhergehenden Bedingungen wahr ist.

Folgende Bedingungsstrukturen sind möglich:

- Ein einfacher Vergleich wie 'x = 5'

- Mehrfache Vergleiche, verbunden durch logische Operatoren, wie 'y <> 0 AndAlso x \ y = 1'

- Jede Variable eines nummerischen Datentyps oder jede Zahl, wobei der Wert 0 (null) als FALSE interpretiert wird, alles andere als TRUE.

Der IF...THEN-Block muss mit END IF abgeschlossen werden.

Wenn IF nur als einzeiliger Befehl eingesetzt wird, ist END IF optional; das soll das Portieren von C-Code erleichtern. Alternativ zu END IF kann man auch ENDIF schreiben, also ohne ein Leerzeichen.
Nur in der einzeiligen Version dürfen hinter THEN und ELSE Anweisungen folgen.
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
SLEEP

Unterschiede zu QB:

- Innerhalb eines IF...THEN-Blocks dürfen in QB keine Variablen definiert werden.

- in FreeBASIC muss in einem einzeiligen IF (Syntax A) END IF benutzt werden, wenn direkt hinter dem THEN ein Doppelpunkt (:) folgt.

- Ein einzeiliges IF darf in QB nicht mit END IF enden.

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

Unterschiede unter den FB-Dialektformen:

- In -lang fb und -lang fblite können Doppelpunkte (:) statt Zeilenumbrüchen verwendet werden, um mehrzeilige Bedingungsstrukturen zu erzeugen.

- Wird in diesen Dialekten nach THEN ein Doppelpunkt oder ein Kommentarzeichen (REM oder ' ), so wird es als mehrzeilige Bedingungsstruktur interpretiert, alles andere wird als einzeiliges IF behandelt.

Siehe auch:
IF (Meta), SELECT CASE, IIF, DO ... LOOP, Ausdrücke und Operatoren, Bedingungsstrukturen

Letzte Bearbeitung: 04.08.11
Zur Onlinefassung des Eintrags

IFDEF (Meta)

Syntax: #IFDEF Symbol
Typ: Metabefehl
Kategorie: Päprozessoren

#IFDEF Symbol ist die verkürzte Form von

#IF DEFINED(Symbol)

Es erspart Ihnen die Eingabe von 6 Zeichen.

Symbol darf jede Art von Symbol sein, auch eines, das mit CONST erstellt wurde.

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
#IFNDEF, #IF, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

IFNDEF (Meta)

Syntax: #IFNDEF Symbol
Typ: Metabefehl
Kategorie: Präprozessoren

#IFNDEF Symbol ist die verkürzte Form von

#IF NOT DEFINED(Symbol)

Es erspart Ihnen die Eingabe von 9 Zeichen.

Symbol darf jede Art von Symbol sein, auch eines, das mit CONST erstellt wurde.

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
#IFDEF, #IF, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

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 die Bedingung erfüllt ist oder nicht.

- 'Bedingung' ist ein numerischer 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 numerischer 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 numerischer 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, dass ein Bedingungsausdruck unnötig aufgeteilt werden muss.

IIF berechnet den Ausdruck nur, bis das Ergebnis feststeht. Das spart Zeit und kann auch verhindern, dass Ausdrücke ausgewertet werden, die ungültige Ergebnisse nach Auswertung von Bedingung hätten.

Beispiel 1:

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.

Beispiel 2: Zufallsbedingt a oder b ausgeben

DIM AS INTEGER a, b
PRINT IIF (RND < .5, a, b)

Beispiel 3:
Wie bereits erwähnt, müssen alle Parameter numerischer Natur sein. Dies schließt allerdings auch Pointer ein, sodass über einen Umweg auch mit STRINGs gearbeitet werden kann.

DIM AS INTEGER a, b
PRINT "Ist a > b? Antwort: "; *IIF(a > b, @"Ja", @"Nein")
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht IIF nicht zur Verfügung und kann nur über __IIF aufgerufen werden.

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.12

Siehe auch:
IF...THEN, Ausdrücke und Operatoren, Bedingungsstrukturen

Letzte Bearbeitung: 19.05.12
Zur Onlinefassung des Eintrags

IMAGECONVERTROW

Syntax: IMAGECONVERTROW Quelle, Quell_bpp, Ziel, Ziel_bpp, Breite [, IstRGB]
Typ: Anweisung
Kategorie: Gfx

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

- 'Quelle' ist ein Pointer vom Typ ANY PTR auf 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 die für das Bild korrekte Palette benutzt.

- 'Quell_bpp' ist die Anzahl der Bits pro Pixel in der Quelle. Zulässig sind die Werte 1-8, 24 und 32.

- 'Ziel' ist ein Pointer vom Typ ANY PTR auf 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.

- 'Ziel_bpp' ist die Anzahl der Bits pro Pixel im Zielpuffer. Zulässig sind die Werte 1-8, 16 und 32.

- 'Breite' ist die Breite einer Zeile in Pixel, 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. Während frühere FreeBASIC-Versionen einen QB-artigen Bildpuffer ohne Padding verwendeten, werden die Zeilen in einem aktuellen Bildpuffer auf ein Vielfaches von 16 Byte gepaddet; vgl. dazu GET (Grafik), "Unterschiede unter den FB-Dialektformen".

- 'IstRGB' 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 'Quelle' vorgegeben wurde.

Beispiel:

#INCLUDE "fbgfx.bi"
#IF __FB_LANG__ = "fb"
USING FB
#ENDIF

CONST AS INTEGER w = 64, h = 64
DIM AS IMAGE PTR img8, img32
DIM AS INTEGER x, y

' erstelle ein 32-bit-Image in der Größe w*h:
SCREENRES 1, 1, 32, , GFX_NULL
img32 = IMAGECREATE(w, h)
IF img32 = 0 THEN PRINT "IMAGECREATE ist bei img32 fehlgeschlagen!": SLEEP: END

' erstelle ein 8-bit-Image in der Größe w*h:
SCREENRES 1, 1, 8, , GFX_NULL
img8 = IMAGECREATE(w, h)
IF img8 = 0 THEN PRINT "IMAGECREATE ist bei img8 fehlgeschlagen!": SLEEP: END

' fülle das 8-bit-Image mit einem Muster
FOR y = 0 TO h - 1
FOR x = 0 TO w - 1
PSET img8, (x, y), 56 + (x + y) MOD 24
NEXT x
NEXT y

' öffne ein Grafikfenster im 8-bit-Modus und gib dort das Bild aus
SCREENRES 320, 200, 8
WINDOWTITLE "8-bit-Farbmodus"
PUT (10, 10), img8
SLEEP

' kopiere die Daten in ein 32-bit-Image
DIM AS BYTE PTR p8, p32
DIM AS INTEGER pitch8, pitch32

#IFNDEF IMAGEINFO ' ältere Versionen von FreeBASIC besitzen keine Funktion IMAGEINFO
#DEFINE GETPITCH(img_) IIF(img_->TYPE=PUT_HEADER_NEW,img_->pitch,img_->old.width*img_->old.bpp)
#DEFINE GETP(img_) CPTR(BYTE PTR,img_)+IIF(img_->TYPE=PUT_HEADER_NEW,SIZEOF(PUT_HEADER),SIZEOF(_OLD_HEADER))
pitch8 = GETPITCH(img8): p8 = GETP(img8)
pitch32 = GETPITCH(img32): p32 = GETP(img32)
#ELSE
IMAGEINFO( img8,  , , , pitch8,  p8  )
IMAGEINFO( img32, , , , pitch32, p32 )
#ENDIF

FOR y = 0 TO h - 1
IMAGECONVERTROW(@p8 [ y * pitch8 ],  8, _
@p32[ y * pitch32], 32, _
w)
NEXT y

' öffne ein Grafikfenster im 32-bit-Modus und gib dort das Bild aus:
SCREENRES 320, 200, 32
WINDOWTITLE "32-bit-Farbmodus"
PUT (10, 10), img32

SLEEP

' Speicher freigeben
IMAGEDESTROY img8
IMAGEDESTROY img32

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.16

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht IMAGECONVERTROW nicht zur Verfügung und kann nur über __IMAGECONVERTROW aufgerufen werden.

Siehe auch:
IMAGECREATE, IMAGEDESTROY, IMAGEINFO, GET (Grafik), PUT (Grafik), SCREENRES, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

IMAGECREATE

Syntax: IMAGECREATE(Breite, Höhe[, [Farbe] [, Farbtiefe]])
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 Pixel.

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

- 'Farbtiefe' gibt die Farbtiefe des erstellten Puffers in Bits pro Pixel an. Wird sie ausgelassen, dann wird die mit SCREENRES eingestellte Farbtiefe des Grafikfensters verwendet.

- 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; siehe auch SCREENCONTROL).

IMAGECREATE gibt, ähnlich wie ALLOCATE, einen Pointer auf den reservierten Speicherbereich zurück. Wenn IMAGECREATE verwendet werden soll, um Grafiken zwischen Bildschirm und Puffer auszutauschen, dann funktioniert dies 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, sollten unbedingt mit IMAGEDESTROY entfernt werden, sobald sie nicht mehr benötigt werden, um den Speicherplatz freizugeben.

Zum Speicheraufbau eines Bildpuffers siehe Interne Pixelformate: Bildpuffer.

Beispiel:

DIM Img AS BYTE PTR
DIM Cut AS BYTE PTR

SCREENRES 400, 300, 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
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- IMAGECREATE existiert seit FreeBASIC v0.14.

- Seit v0.17 stehen zwei Speicherformate für Bildpuffer zur Verfügung. Siehe Interne Pixelformate für Details.

- Seit v0.24 setzt IMAGECREATE eine Fehlernummer, die man per ERR abfragen kann.

Siehe auch:
IMAGEDESTROY, IMAGEINFO, IMAGECONVERTROW, GET (Grafik), PUT (Grafik), PSET (Grafik), SCREENRES, Interne Pixelformate, Grafik

Letzte Bearbeitung: 05.02.12
Zur Onlinefassung des Eintrags

IMAGEDESTROY

Syntax: IMAGEDESTROY image
Typ: Anweisung
Kategorie: Gfx

IMAGEDESTROY gibt einen mit IMAGECREATE reservierten Speicher wieder frei. 'image' ist ein Pointer, der auf den freizugebenden Speicherbereich zeigt.

Jeder Speicher, der mit IMAGECREATE erstellt wurde, sollte auch unbedingt wieder mit IMAGEDESTROY freigegeben werden, sobald er nicht mehr benötigt wird.

Beispiel: siehe IMAGECREATE

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht IMAGEDESTROY nicht zur Verfügung und kann nur über __IMAGEDESTROY aufgerufen werden.

Siehe auch: IMAGECREATE, Grafik

Letzte Bearbeitung: 03.08.11
Zur Onlinefassung des Eintrags

IMAGEINFO

Syntax: IMAGEINFO (ImagePtr, [Breite] [, [Höhe] [, [bpp] [, [Pitch] [, [Pixdata] [, [Größe]]]]]])
Typ: Funktion
Kategorie: Gfx

IMAGEINFO gibt Informationen über das mit ImagePtr angesprochene Image zurück.

- 'ImagePtr' ist ein Speicherbereich wie ein mit IMAGECREATE erstellter Puffer, der das abzufragende Image enthält.

- 'Breite' und 'Höhe' geben die Breite und die Höhe des Images in Pixeln zurück.

- 'bpp' enthält die Anzahl der Byte pro Pixel.

- 'Pitch' liefert die Größe einer Image-Zeile in Byte.

- 'Pixdata gibt einen Pointer auf den Anfang des Pixelbereichs zurück.

- 'Größe' liefert die Größe des Images in Byte.

- Der Rückgabewert ist ein INTEGER, das angibt, ob ein Image angelegt ist (Rückgabewert=0) oder nicht (Rückgabewert<>0).

Beispiel:

DIM img AS ANY PTR, pixdata AS ANY PTR, pitch AS INTEGER

' 32bit-Screen und Bildpuffer erzeugen
SCREENRES 320, 200, 32
img = IMAGECREATE(64, 64)

' Zeilengröße und Anfang des Pixelbereichs ermitteln
IMAGEINFO img, ,,, pitch, pixdata

' Muster direkt in den Datenpuffer schreiben
FOR y AS INTEGER = 0 TO 63
DIM AS UINTEGER PTR p = pixdata + y * pitch
FOR x AS INTEGER = 0 TO 63
p[x] = RGB(x * 4, y * 4, (x XOR y) * 4)
NEXT x
NEXT y

' Bild zeichnen und Datenpuffer freigeben
PUT (10, 10), img
IMAGEDESTROY img
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.20.0

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht IMAGEINFO nicht zur Verfügung und kann nur über __IMAGEINFO aufgerufen werden.

Siehe auch:
IMAGECREATE, SCREENINFO, Interne Pixelformate, Grafik

Letzte Bearbeitung: 27.11.11
Zur Onlinefassung des Eintrags

IMP

Syntax A: Ergebnis = Ausdruck1 IMP Ausdruck2
Syntax B: Ausdruck1 IMP= Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

IMP kann als einfacher (Syntax A) und kombinierter (Syntax B) Operator eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 IMP Ausdruck2

IMP ist ein bitweiser Operator, der dieselbe Funktion hat wie

(NOT a) OR b.

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

IMP kann mithilfe von OPERATOR überladen werden.

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: Verknüpfung 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 28 Bits werden selbstverständlich auch mit IMP verglichen. Würden diese in dieses Beispiel miteinbezogen, würde das Beispiel einen Teil seiner Anschaulichkeit verlieren.

Beispiel 3: IMP als kombinierter Operator

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

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
NOT, AND (Operator), OR (Operator), XOR (Operator), EQV, Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

IMPLEMENTS

Syntax: TYPE typeName IMPLEMENTS interface
Typ: Anweisung
Kategorie: OOP

IMPLEMENTS hat bisher keine Funktion, ist als Schlüsselwort aber bereits geschützt. Zukünfig soll der Befehl eine Klasse angeben, die ein Interface (eine Schnittstelle) implementiert.

Beispiel:

'noch nichts

Unterschiede zu QB: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: IMPLEMENTS existiert seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht IMPLEMENTS nicht zur Verfügung und kann nur über __IMPLEMENTS aufgerufen werden.

Siehe auch:
TYPE (UDT), BASE, OBJECT, IS (Vererbung), EXTENDS

Letzte Bearbeitung: 24.01.12
Zur Onlinefassung des Eintrags

IMPORT

Typ: Schlüsselwort

Wird zusammen mit EXTERN (Module) verwendet.

Das Schlüsselwort IMPORT wird für Win32-Plattformen verwendet, wenn auf globale Variablen aus DLLs zugegriffen werden muss, da in solchen ein Zugriff über eine implizite Pointer-Dereferenzierung geschieht.

Letzte Bearbeitung: 29.07.07
Zur Onlinefassung des Eintrags

INCLIB (Meta)

Syntax A: #INCLIB "LibName.a"
Syntax B: '$INCLIB: "LibName.a"
Typ: Metabefehl
Kategorie: Programmorganisation

#INCLIB lädt eine Bibliothek (*.a-Datei) in den Link-Vorgang, wodurch dem Programmierer das Compilieren vereinfacht wird (man erspart sich die Angabe der Compiler-Option -l LibName).

- 'LibName.a' ist der Dateiname der einzubindenden 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.

Beispiel:

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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

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

Siehe auch:
INCLUDE, Präprozessor-Anweisungen

Letzte Bearbeitung: 11.07.10
Zur Onlinefassung des Eintrags

INCLUDE (Meta)

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 Compilieren 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 einzubindenden 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 eingebundene Dateien ebenfalls INCLUDE-Befehle enthalten.

Beispiel:

#INCLUDE ONCE "vbcompat.bi"

Im Gegensatz zu QB können in per #INCLUDE eingebundene Daten auch 'ausführbare' Befehle enthalten sein.

Es hat sich durchgesetzt, Deklarationsdateien (Dateien, die lediglich COMMON/DIM [SHARED]-, DECLARE-, oder TYPE-Anweisungen enthalten) mit der Erweiterung BI zu kennzeichnen. BIs 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.

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.

Unterschiede zu früheren Versionen von FreeBASIC:

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

Siehe auch:
INCLIB, Präprozessor-Anweisungen

Letzte Bearbeitung: 21.04.11
Zur Onlinefassung des Eintrags

INKEY

Syntax: INKEY[$]
Typ: Funktion
Kategorie: Benutzereingabe

INKEY gibt einen STRING zurück, der die erste Taste im Tastaturpuffer enthält. Bei Funktionstasten sind meist zwei Zeichen enthalten, z.B. F1: CHR(255) & CHR(59) bzw. CHR(255, 59). Ist der Tastaturpuffer leer, wird ein Leerstring zurückgegeben.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel 1:

PRINT "Druecken Sie 'q', um zu beenden."
DO
SLEEP 1 'Prozessorauslastung auf ein Minimum senken
LOOP UNTIL INKEY = "q"

Beispiel 2:
Bei einer Tastaturabfrage über MULTIKEY oder der Programmunterbrechung durch SLEEP wird der Tastaturpuffer nicht geleert. In solchen Fällen kann es sinnvoll sein, den Puffer an geeigneter Stelle mittels INKEY zu leeren. Der folgende Code fragt solange den Tastaturpuffer ab, bis der Rückgabestring leer ist, also die Länge 0 besitzt.

DO : LOOP WHILE LEN(INKEY)

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Bei erweiterten Zeichen (z.B. Pfeiltasten) ist in FreeBASIC das erste Zeichen CHR(255). In QB ist es CHR(0).

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich. Das erste Zeichen bei erweiterten Zeichen ist, wie in QB, CHR(0) statt CHR(255).

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
INPUT (Funktion), GETKEY, MULTIKEY, Benutzereingaben

Letzte Bearbeitung: 18.05.12
Zur Onlinefassung des Eintrags

INP

Syntax: INP (Portnummer)
Typ: Funktion
Kategorie: Hardware

INP liest ein Byte von einem Port.

- 'Portnummer' ist ein USHORT und gibt die Adresse des zu lesenden Ports an.

- Der Rückgabewert ist ein INTEGER mit dem Wert, der am abgefragten Port anliegt.

Direkte Portzugriffe sind unter Windows NT, 2000, XP und Vista ohne einen speziellen Systemtreiber nicht möglich. Ab FreeBASIC v0.15b wird vom FBCompiler ein 3KB großer Systemtreiber in die erstellte EXE integriert.
Dieser Systemtreiber wird nur ausgeführt, wenn das Programm unter Administrator-Rechten gestartet wurde. Danach können auch Programme, die nicht unter Administrator-Rechten laufen, auf diesen Treiber zugreifen. Nach jedem Neustart des Betriebssystems ist ein erneuter Aufruf des Systemtreibers unter Administrator-Rechten erforderlich.

Unterschiede zu früheren Versionen von FreeBASIC:

- Bis FreeBASIC v0.14 emuliert INP den 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.

- Ab FreeBASIC v0.15b werden Zugriffe auf den VGA-Port immer noch emuliert, wie in FreeBASIC v0.14. Wenn der Zugriff auf den Port fehlschlägt, wird ein Laufzeit-Fehler erzeugt.

Siehe auch:
OUT, WAIT, PALETTE, PALETTE GET

Letzte Bearbeitung: 18.08.11
Zur Onlinefassung des Eintrags

INPUT (Anweisung)

Syntax: INPUT [;] ["Frage" {; | , } ] Variable [, Variable [...] ]
Typ: Anweisung
Kategorie: Benutzereingabe

INPUT gibt dem Benutzer die Möglichkeit, über Tastatur Werte einzugeben.

- 'Frage' ist ein String-Literal, der auf dem Bildschirm an der aktuellen Cursorposition angezeigt wird, bevor der Benutzer seine Eingabe tätigen kann. Es darf sich nicht um eine Variable oder einen zusammengesetzten Stringausdruck handeln. Wird 'Frage' ausgelassen, so wird stattdessen ein Fragezeichen ausgegeben.

- Wird als Trennzeichen zwischen 'Frage' und 'Variable' ein Strichpunkt statt eines Kommas gesetzt, so wird an das Ende von 'Frage' ein Fragezeichen angehängt.

- Bei 'Variable' handelt es sich um Variablen beliebigen Typs, in denen die Eingabe des Benutzers gespeichert wird.

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, dass die Eingaben selbst keine Kommata enthalten dürfen. Bei der Eingabe von Zahlen dienen auch Leerzeichen zur Trennung der einzelnen Werte.

Um dennoch Strings mit Kommata eingeben zu können, setzen Sie Ihre Eingabe in "Anführungszeichen". Wenn ein Eingabewert mit einem Anführungszeichen beginnt, wird alles bis zum nächsten Anführungszeichen als zusammenhängender Wert interpretiert. Ein anschließendes Komma zur Trennung vom nächsten Eingabewert ist weiterhin möglich, jedoch nicht erforderlich.

Gibt der Benutzer mehr Werte an, als in der Anweisung gefordert werden, so werden die überflüssigen Werte ignoriert. Gibt der Benutzer zu wenige Daten an, befüllt FreeBASIC die fehlenden Variablen mit 0 bzw. Nullstrings. Wird versucht, einer numerischen Variablen einen String zuzuweisen, wird dieser mittels VAL umgewandelt und gegebenenfalls mathematisch gerundet (vgl. CINT).

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

Hinweis: 'wert3' hat hier den Wert "", ist also ein Leerstring.

INPUT kann durchaus für einfache Eingaben verwendet werden. Fortgeschrittene Programmierer verwenden jedoch oft eigene Ersatz-Routinen, die erweiterte Fähigkeiten besitzen oder von der LOCATE-Anweisung unabhängig sind.

Unterschiede zu QB:
In FreeBASIC ist es 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.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.18 wird beim Auslassen der Frage ein Fragezeichen ausgegeben.

- Seit v0.16 rundet FreeBASIC eine eingegebene Gleitkommazahl automatisch zu einem INTEGER, wenn keine Gleitkommavariable zur Verfügung steht.

Siehe auch:
INPUT (Funktion), INPUT #, PRINT (Anweisung), LINE INPUT, Benutzereingaben

Letzte Bearbeitung: 06.04.12
Zur Onlinefassung des Eintrags

INPUT (Datei)

Syntax: INPUT #f, Variable [, Variable [, ...] ]
Typ: Anweisung
Kategorie: Datei

INPUT liest Daten aus einer Datei, die im Dateimodus INPUT oder BINARY 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:
Datei liste.dat öffnen und alle Datensätze in der Datei auf dem Bildschirm ausgeben:

DIM satznr AS INTEGER
DIM satz   AS STRING
satznr = 0

DIM f AS INTEGER = FREEFILE
OPEN "liste.dat" FOR INPUT AS #f

DO
satznr = satznr + 1
INPUT #f, satz

PRINT satznr, satz
LOOP UNTIL EOF(f)
GETKEY

Die Länge eines Datensatzes wird beim Schreiben in die Datei mit PRINT # oder WRITE # festgelegt. Bei unpassenden Datentypen gelten dieselben Regeln wie bei INPUT (Anweisung).

Siehe auch:
INPUT (Anweisung), INPUT (Funktion), OPEN, INPUT (Dateimodus), LINE INPUT #, PRINT #, WRITE #, Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

INPUT (Dateimodus)

Syntax: OPEN Dateiname FOR INPUT [ ... ]
Typ: Schlüsselwort
Kategorie: Datei

Das Schlüsselwort INPUT wird mit der OPEN-Anweisung verwendet und öffnet die Datei im INPUT-Modus. Das heißt, die Datei wird mit sequentiellem Zugriff zum Lesen geöffnet und der Lesezugriff erfolgt am Anfang der Datei.

Siehe auch:
INPUT #, INPUT (Anweisung), INPUT (Funktion), LINE INPUT #, OPEN (Anweisung)

Weitere Informationen:
QB Express Issue #4: File Manipulation In QuickBasic: Sequential Files

Letzte Bearbeitung: 07.08.10
Zur Onlinefassung des Eintrags

INPUT (Funktion)

Syntax: INPUT[$] (Anzahl [, [#]Dateinummer])
Typ: Funktion
Kategorie: Eingabe

INPUT liest eine bestimmte Menge an Zeichen von der Tastatur oder aus einer Datei und gibt sie als STRING zurück.

- 'Anzahl' ist die Zahl der Zeichen, die eingelesen werden sollen.

- 'Dateinummer' ist die Nummer einer im INPUT-Modus geöffneten Datei.

- Der Rückgabewert ist ein String, der die eingegebenen Zeichen enthält.

Wird eine Dateinummer angegeben, dann liest der Befehl 'Anzahl' Zeichen aus einer Datei und aktualisiert den Dateicursor. Ansonsten wartet er auf die Eingabe von 'Anzahl' Zeichen von der Tastatur und gibt diese als STRING zurück. Erweiterte Zeichen (wie z.B. die Pfeiltasten) werden nicht eingelesen. Die Zeichen werden nicht auf dem Bildschirm ausgegeben.

Das Dollarzeichen ($) als Suffix ist optional.

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
CASE ELSE
PRINT "ungültige Auswahl!"
END SELECT
SLEEP

Beispiel 2: Die ersten drei Zeichen aus der Datei "file.ext" lesen

DIM AS INTEGER f = FREEFILE
OPEN "file.ext" FOR INPUT AS #f
PRINT INPUT(3, #f)
CLOSE #1
SLEEP

Unterschiede zu QB:
In QB ist das Suffix $ verbindlich.

Siehe auch:
INPUT (Anweisung), INPUT (Datei), INPUT (Dateimodus), LINE INPUT, INKEY, GETKEY, MULTIKEY, OPEN, WINPUT

Letzte Bearbeitung: 06.04.12
Zur Onlinefassung des Eintrags

INSTR

Syntax: INSTR ([Start,] String1, [ANY] String2)
Typ: Funktion
Kategorie: Stringmanipulation

INSTR prüft, ob 'String2' oder Teile davon in 'String1' vorkommt, und liefert die Position innerhalb 'String1' zurück.

- 'Start' ist eine INTEGER-Zahl, die angibt, von welchem Zeichen an 'String1' durchsucht werden soll. Wenn 'Start' ausgelassen wird, beginnt die Suche beim ersten Zeichen.

- 'String1' und 'String2' sind zwei Zeichenketten ( STRING, ZSTRING oder WSTRING).

- INSTR prüft, ob der gesamte 'String2' in 'String1' vorkommt. Wird die ANY-Klausel verwendet, prüft INSTR nur, ob irgendeines der Zeichen aus 'String2' vorkommt.

- Der Rückgabewert ist ein INTEGER, der die erste Position angibt, an der 'String2' bzw. Teile davon in 'String1' gefunden wurden. Falls keine Treffer erzielt werden, liefert INSTR den Wert 0 zurück.

Beispiel:

PRINT INSTR("abcdefg", "def")
PRINT INSTR(4, "Das Leben ist ein Hund", ANY "Wasser")
SLEEP

Ausgabe:

4
6

Beispiel 2: alle vorkommenden 'b' suchen

DIM teststring AS STRING
DIM idx AS INTEGER

teststring = "abababab"
idx = INSTR(teststring, "b")

DO WHILE idx > 0 'Falls nichts gefunden wird, wird die Schleife übersprungen
PRINT """b"" an Stelle " & idx
idx = INSTR(idx + 1, teststring, "b")
LOOP
SLEEP

Hinweis: Die ANY-Klausel hat nichts mit dem Datentyp ANY zu tun

Unterschiede zu QB:

- Die ANY-Klausel ist neu in FreeBASIC.

- QB gibt 'Start' zurück, falls der Suchstring leer ist.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb können dort auch keine Unicode-Strings umgewandelt werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Die ANY-Klausel kann seit FreeBASIC v0.15 eingesetzt werden.

Siehe auch:
INSTRREV, String-Funktionen

Letzte Bearbeitung: 04.09.11
Zur Onlinefassung des Eintrags

INSTRREV

Syntax: INSTRREV (String1, [ANY] String2, [Start])
Typ: Funktion
Kategorie: Stringmanipulation

INSTRREV prüft, ob 'String2' oder Teile davon in 'String1' vorkommt, und liefert die letzte auftretende Position zurück.

- 'String1' und 'String2' sind zwei Zeichenketten ( STRING, ZSTRING oder WSTRING).

- INSTRREV prüft, ob der gesamte 'String2' in 'String1' vorkommt. Wird die ANY-Klausel verwendet, prüft INSTRREV nur, ob irgendeines der Zeichen aus 'String2' vorkommt.

- 'Start' ist eine INTEGER-Zahl, die angibt, von welchem Zeichen an 'String1' durchsucht werden soll. Wenn 'Start' ausgelassen wird, beginnt die Suche beim letzten Zeichen.

- Der Rückgabewert ist ein INTEGER, der die Position angibt, an der 'String2' bzw. Teile davon das letzte Mal in 'String1' auftreten. Falls keine Treffer erzielt werden, liefert INSTRREV den Wert 0 zurück.

Beispiele:

PRINT INSTRREV("abcdefg", "de") ' gibt 4 zurück

PRINT INSTRREV("abcdefg", "h")  ' gibt 0 zurück

' alle auftretenden 'b' suchen:
DIM test AS STRING = "abababab"
DIM idx AS INTEGER

idx = INSTRREV(test, "b")

DO WHILE idx > 0 'falls nicht gefunden, wird die Schleife übersprungen
PRINT "b bei " & idx
idx = INSTRREV(Test, "b", idx - 1)
LOOP
SLEEP

Hinweis:
Bis einschließlich Version 0.20.0b ist ein Fehler in INSTRREV enthalten, der dafür sorgt, dass manche Treffer nicht angezeigt werden. Dieser Fehler ist ab Version 0.21.0 SVN behoben.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb können dort auch keine Unicode-Strings umgewandelt werden.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.18.4

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht INSTRREV nicht zur Verfügung und kann nur über __INSTRREV aufgerufen werden.

Siehe auch:
INSTR, String-Funktionen

Letzte Bearbeitung: 04.09.11
Zur Onlinefassung des Eintrags

INT

Syntax: INT(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.

INT kann mithilfe von OPERATOR überladen werden.

Unterschiede zu QB: keine

Siehe auch:
FIX, CINT, FRAC, mathematische Funktionen

Letzte Bearbeitung: 27.06.10
Zur Onlinefassung des Eintrags

INTEGER

Typ: Datentyp

INTEGER-Zahlen sind vorzeichenbehaftete 32-bit-Ganzzahlen. Sie liegen im Bereich von -(2^31) bis (2^31)-1, bzw. von -2'147'483'648 bis 2'147'483'647.

Unterschiede zu QB:
INTEGER-Variablen sind nun 32-bit-Zahlen (in QB waren sie 16-bit-Zahlen).

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb werden INTEGER als 16-bit-Ganzzahlen behandelt.

Siehe auch:
DIM, CAST, CINT, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

IS

Syntax: CASE IS Bedingung
Typ: Schlüsselwort
Kategorie: Bedingungen

IS wird im Zusammenhang mit SELECT CASE verwendet.

Beispiel:

DIM AS INTEGER x = 5

SELECT CASE x
CASE IS < 0
PRINT "x ist kleiner als 0"
CASE IS <= 5
PRINT "x ist ein Wert von 0 bis 5"
CASE IS > 5
PRINT "x ist groeßer als 5"
END SELECT

SLEEP

Seit FreeBASIC v0.24 ist IS auch ein Syntaxbestandteil in der Vererbung.

Siehe auch:
SELECT CASE, IS (Vererbung)

Letzte Bearbeitung: 19.05.12
Zur Onlinefassung des Eintrags

IS (Vererbung)

Syntax: Variable IS Klasse
Typ: Operator
Kategorie: Datentypen

IS wird in Verbindung mit Vererbung dazu genutzt, um den Typen einer Variable zu prüfen. Der Operator kann nur genutzt werden, wenn die Basis-Klasse von OBJECT erbt und somit die RTTI-Funktionalität zur Verfügung steht.

Der Operator prüft nicht, ob die Variable exakt zur gefragten Klasse gehört. Er liefert vielmehr auch dann ein wahres Ergebnis, wenn die Variablen-Klasse von der angegebenen Klasse erbt. Das bedeutet, dass eine Variable einer Kind-Klasse auch in die Basis-Klasse fällt. Ein Beispiel dazu finden Sie im Artikel zu OBJECT. Wenn Sie die exakte Zugehörigkeit zu einer Klasse prüfen wollen, sollten Sie aus diesem Grund die abgefragten Klassen immer in zur Erbreihenfolge entgegengesetzen Reihenfolge prüfen.

Beispiel 1:

TYPE Haustier EXTENDS OBJECT
AS INTEGER beine   = 4
AS INTEGER schwanz = 1
END TYPE

TYPE Hund EXTENDS Haustier
DECLARE SUB gibLaut
END TYPE
SUB Hund.gibLaut
PRINT "Wuff!"
END SUB

TYPE Chihuahua EXTENDS Hund
DECLARE SUB gibLaut
END TYPE
SUB Chihuahua.gibLaut
PRINT "Klaeffklaeff!"
END SUB

DIM AS Haustier balto = Hund
IF balto IS Chihuahua THEN
PRINT "Balto ist sehr klein."
ELSEIF balto IS Hund THEN
PRINT "Balto ist ein normaler Hund."
ELSE
PRINT "Balto ist ein Haustier."
END IF

SLEEP

IS arbeitet nur mit der Klasse, die direkt von OBJECT erbt. Andererseits kann diese Klasse natürlich nicht auf die Records und Methoden seiner Kindklassen zugreifen; balto.gibLaut ist in oben stehenden Beispiel nicht möglich. Als Lösung kann die Variable entsprechend geCASTet werden. Damit ist es z. B. auch möglich, an eine Prozedur eine Variable zu übergeben, die je nach zugehöriger Klasse anders behandelt wird.

Beispiel 2:

' ###   Klassendeklarationen   ###
TYPE Haustier EXTENDS OBJECT
AS INTEGER beine   = 4
AS INTEGER schwanz = 1
END TYPE

TYPE Hund EXTENDS Haustier
AS INTEGER anhaenglich = 1
DECLARE SUB gibLaut ()
END TYPE
SUB Hund.gibLaut ()
PRINT "Wuff!"
END SUB

TYPE Katze EXTENDS Haustier
AS INTEGER verspielt = 1
DECLARE SUB gibLaut ()
END TYPE
SUB Katze.gibLaut ()
PRINT "Miau!"
END SUB

' ###   Prozedur zur Behandlung aller Haustier-Klassen   ###
SUB haustiertest(tier AS Haustier)
IF tier IS Hund THEN
PRINT "Dieser Hund hat einen Anhaenglichkeitswert von " & CAST(Hund PTR, @tier)->anhaenglich & "."
CAST(Hund PTR, @tier)->gibLaut
ELSEIF tier IS Katze THEN
' dasselbe mit temporaerer Variable
DIM AS Katze PTR k = CAST(Katze PTR, @tier)
PRINT "Diese Katze hat einen Verspieltheitswert von " & k->verspielt & "."
k->gibLaut
ELSE
PRINT "Ueber dieses Tier weiss ich nichts."
END IF
END SUB

' ###   Testaufrufe   ###
DIM mautzi AS Katze, balu AS Hund
haustiertest(balu)
PRINT
haustiertest(mautzi)
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
IS in Verbindung mit Vererbung existiert seit FreeBASIC v0.24

Siehe auch:
TYPE (UDT), BASE, OBJECT, EXTENDS

Letzte Bearbeitung: 24.01.12
Zur Onlinefassung des Eintrags

ISDATE

Syntax: ISDATE(Datumsstring)
Typ: Funktion
Kategorie: Zeit

Überprüft, ob ein String einem korrekten Datumsformat entspricht.

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

'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üssen 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.

Achtung: Je nach Benutzereinstellung bzw. Betriebssystem variiert die Reihenfolge der Segmente (z. B. dd.mm.yy oder mm.dd.yy).

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 0
PRINT FB_QM; s; FB_QM; Tab(40)

If IsDate(s) Then
Color 10
PRINT "ist ein gueltiges Datum"
Else
Color 12
PRINT "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: neu in FreeBASIC.

Unterschiede zu älteren FreeBASIC-Versionen: existiert seit FreeBASIC v0.17.

Siehe auch:
NOW, DATESERIAL, DATEVALUE, YEAR, MONTH, DAY, WEEKDAY, MONTHNAME, WEEKDAYNAME, DATEDIFF, DATEPART, DATEADD, FORMAT, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

Startbuchstabe K

KILL

Syntax: KILL (Dateiname)
Typ: Funktion
Kategorie: Datei

KILL 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 0, wenn der Löschvorgang erfolgreich abgeschlossen wurde, oder die Fehlernummer 2, wenn die Datei nicht existiert, bzw. 3, wenn die Datei nicht gelöscht werden kann.

Beispiel:

SELECT CASE KILL("file.ext")
CASE 0 : PRINT "Die Datei wurde gelöscht."
CASE 2 : PRINT "Fehler: Die Datei existiert nicht!"
CASE 3 : PRINT "Fehler: Unzureichende Zugriffsrechte, oder es handelt sich um einen Ordner!"
END SELECT
SLEEP

Achtung: Die zu löschende Datei wird nicht in den Papierkorb verschoben; sie wird unwiederbringlich gelöscht!

Unterschiede zu QB:
KILL kann auch als Funktion eingesetzt werden.

Plattformbedingte Unterschiede:

- Auf manchen Plattformen kann KILL möglicherweise Ordner und schreibgeschützte Dateien löschen. Ob dies möglich ist oder nicht, ist zur Zeit nicht festgelegt. Überprüfen Sie ggf. zuvor die Attribute der Datei und entscheiden Sie dementsprechend, ob Sie die Datei löschen wollen.

- Unter Linux muss der Ordnername 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch:
MKDIR, RMDIR, CHDIR, CURDIR, SHELL, Betriebssystem-Anweisungen

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

Startbuchstabe L

LANG (Meta)

Syntax A: #Lang "Sprachversion"
Syntax B: '$Lang: "Sprachversion"
Syntax C: Rem $Lang: "Sprachversion"
Typ: Metabefehl
Kategorie: Präprozessoren

"Sprachversion" kann einer der Begriffe "fb", "fblite", "qb" oder "deprecated" sein und wird in Anführungszeichen angegeben.

Beschreibung:
Wird die -lang-Option in der Befehlszeile nicht angegeben, kann '$Lang verwendet werden, um für den Code des aktuellen Moduls einen bestimmten Dialekt einzustellen. Meistens gibt es zwei Compiler-Durchläufe für ein Quell-Code-Modul. Im ersten Durchlauf wird, falls der angegebene Dialekt nicht -lang "fb" ist, der Parser für einen neuen Durchlauf zurückgesetzt, sodass die Übersetzung neustartet. Taucht im zweiten Durchlauf wieder ein Lang-Befehl auf, der nicht dem ersten entspricht, wird eine Warnung ausgegeben und die Übersetzung fortgesetzt. Sind im ersten Durchlauf irgendwelche Fehler aufgetreten, bricht der Compiler ab.

'$Lang darf nicht in einer verbundenen Anweisung (z.B. FOR ... NEXT, WHILE ... WEND), einem Programmbereich (SCOPE) oder in einem Unterprogramm auftauchen. Jedoch darf es innerhalb anderer Präprozessor-Anweisungen (z.B. IF (Meta)) oder in einer Include-Datei benutzt werden.

Es gibt aktuell keine Einschränkung für die Platzierung dieser Anweisung im Quell-Code, das kann sich jedoch in zukünftigen Versionen ändern. Diese Anweisung sollte besser nur am Anfang einer Quell-Code-Datei verwendet werden. Sie überschreibt die -lang-Option, falls sie in der Befehlszeile übergeben wurde. Jedoch kann der Befehl durch die -forcelang-Option wiederum überschrieben werden.

Beispiel:

#LANG "qb"
'Der Quellcode wird wie mit fbc -lang qb übersetzt.

Achtung:
Die Anweisung ist im Entwicklungsstadium und kann sich noch ändern.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FB 0.20b

Siehe auch:
FB-Dialektformen, Der Compiler, __FB_LANG__

Letzte Bearbeitung: 02.06.11
Zur Onlinefassung des Eintrags

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, deren 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 der Wert 0 ausgegeben.

Ist das Array bisher nur deklariert, hat aber noch keine Dimensionen, so gibt LBOUND 0 aus. Ob das Array nun den geringsten Index 0 hat oder einfach keine Dimensionen, kann man über die Adresse des ersten Elements erfahren, welche 0 ist sofern es keine Dimensionen gibt.

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)
PRINT @unArray(0)
SLEEP

Ausgabe:

-10
5
1
0

0
0

Unterschiede zu früheren Versionen von FreeBASIC:
Bis einschließlich FreeBASIC v0.15 ergaben leere Dimensionen statt 0 den Wert -1.

Siehe auch:
UBOUND, DIM, REDIM, Arrays

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

LCASE

Syntax: LCASE[$] (Stringausdruck)
Typ: Funktion
Kategorie: Stringmanipulation

UCASE wandelt einen Stringausdruck in Kleinbuchstaben.

- 'Stringausdruck' ist ein STRING, ZSTRING oder WSTRING, der in Kleinbuchstaben zurückgegeben werden soll.

- Der Rückgabewert ist der in Kleinbuchstaben gewandelte STRING bzw. WSTRING.

Achtung: LCASE wandelt nur die ASCII-Zeichen "A" - "Z" um. Umlaute werden nicht beachtet!

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT LCASE("Hello World abCDefGHäÄ")
SLEEP

Ausgabe:

hello world abcdefghäÄ

Umlaute müssen bei Bedarf gesondert umgewandelt werden; siehe dazu Umlaute umwandeln.

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
UCASE, String-Funktionen

Letzte Bearbeitung: 20.01.12
Zur Onlinefassung des Eintrags

LEFT

Syntax: LEFT[$](Text, Anzahl)
Typ: Funktion
Kategorie: Stringmanipulation

LEFT gibt die ersten 'Anzahl' Zeichen von 'Text' zurück.

- 'Text' ist ein STRING, ZSTRING oder WSTRING, dessen Teilstring zurückgegeben werden soll.

- 'Anzahl' ist ein INTEGER mit der Anzahl der zurückgegebenen Zeichen. Ist 'Anzahl' kleiner als 0, dann wird ein Leerstring zurückgegeben. Ist 'Anzahl' größer als die Länge von 'Text', dann wird der gesamte 'Text' zurückgegeben.

- Der Rückgabewert ist ein STRING bzw. WSTRING, der die ersten 'Anzahl' Zeichen von 'Text' enthält.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

DIM Text AS STRING
Text = "hello world"
PRINT LEFT(Text, 5) ' Ausgabe: "hello"
SLEEP

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
RIGHT, MID (Funktion), String-Funktionen

Letzte Bearbeitung: 06.09.11
Zur Onlinefassung des Eintrags

LEN

Syntax: LEN( {Variable | Datentyp} )
Typ: Funktion
Kategorie: Stringmanipulation

LEN gibt die Größe eines Stringausdrucks oder eines Datentyps zurück.

- Ist 'Variable' ein STRING, ZSTRING oder WSTRING, so wird die Anzahl der Zeichen zurückgegeben.

- Bei Strings fester Länge wird immer die Gesamtgröße des Strings zurückgegeben. Dies betrifft nicht ZSTRING und WSTRING.

- Ist 'Variable' eine Zahl oder ein UDT, so wird die Größe des zugrunde liegenden Datentyps in Byte zurückgegeben. Dies ist auch der Fall, wenn stattdessen 'Datentyp' angegeben wird.

Beispiel 1:

PRINT LEN("hello world")  ' Ausgabe: 11
PRINT LEN(INTEGER)        ' Ausgabe: 4
SLEEP

Aufgrund der konstanten Länge von fixed-length-Strings gibt LEN in diesem Fall immer die Gesamtgröße des Strings zurück. Bei ZSTRING und WSTRING ist das jedoch nicht der Fall.

Beispiel 2:

DIM festerText AS STRING  * 15, zstr AS ZSTRING * 15
festerText = "TestA"
zstr       = "TestB"
PRINT LEN(festerText)               ' Ausgabe: 15
PRINT LEN(zstr)                     ' Ausgabe: 5
PRINT LEN(festerText & "")          ' Ausgabe: 5
PRINT INSTR(festerText, CHR(0)) - 1 ' Ausgabe: 5
SLEEP

Unterschiede zu QB:
In FreeBASIC funktioniert LEN mit allen Datentypen und mit benutzerdefinierten Typen.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist nur die Übergabe von 'Variable' erlaubt.

- In den Dialektformen -lang fblite und -lang fb kann auch die Länge von Datentypen abgefragt werden.

Siehe auch:
SIZEOF, STRING (Datentyp), OPEN

Letzte Bearbeitung: 31.01.12
Zur Onlinefassung des Eintrags

LET

Syntax A: [LET] Variable = Ausdruck
Syntax B: LET (Variablenliste) = UDT_Variable
Typ: Anweisung
Kategorie: Verschiedenes

LET hat in der Verwendung einer einfachen Variablenzuweisung (Syntax A) keine praktische Funktion mehr; es wurde nur beibehalten, um die Kompatibilität zu älteren BASIC-Dialekten zu wahren. Stattdessen sollte LET hier einfach ausgelassen werden.

Mit Syntax B ist eine mehrfache Variablenzuweisung möglich. Dabei wird einer Liste von Variablen die Werte der einzelnen Records eines UDTs zugewiesen. 'Variablenliste' muss aus Variablen derselben (oder kompatiblen) Datentypen wie die Records bestehen. Es können auch weniger Variablen aufgelistet werden, als 'UDT_Variable' Records besitzt.

LET kann mithilfe von OPERATOR überladen werden.

Beispiel 1 (funktioniert nicht mit -lang fb):

DIM AS INTEGER a, b

LET a = 15 + 7
b = 3 * 6

PRINT a, b
SLEEP

Beispiel 2:

TYPE Vector3D
x AS DOUBLE
y AS DOUBLE
z AS DOUBLE
END TYPE

DIM a AS Vector3D = ( 5, 7, 9 )

DIM x AS DOUBLE, z AS DOUBLE

' nur den ersten und letzten Eintrag holen
LET( x, , z ) = a

PRINT "x ="; x
PRINT "z ="; z
SLEEP

Ausgabe:

x = 5
z = 9

Unterschiede zu QB:
Mehrfache Variablenzuweisung (Syntax B) ist neu in FreeBASIC.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang fb ist LET in der einfachen Variablenzuweisung (Syntax A) nicht erlaubt.

- Mehrfache Variablenzuweisung (Syntax B) ist nur in der Dialektform -lang fb erlaubt.

Letzte Bearbeitung: 28.06.10
Zur Onlinefassung des Eintrags

LIB

Syntax A:

DECLARE { SUB | FUNCTION } NAME LIB "LibName" [ ALIAS "Aliasname" ] (...)

Syntax B:

TYPE T
AS INTEGER dummy
Decalre CONSTRUCTOR LIB "LibName" [ ALIAS "Aliasname" ] (...)
END TYPE

Typ: Klausel
Kategorie: Programmorganisation

Bindet eine SUB/FUNCTION aus einer Lib/DLL ein.
In UDTs können so auch SUBs/FUNCTIONs eingebunden werden, als normale Methode, aber auch als CONSTRUCTOR oder DESTRUCTOR.

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

Beispiel:

'mydll.bas
'Bitte so compilieren:
'fbc -dll mydll.bas

PUBLIC FUNCTION GetValue() AS INTEGER EXPORT
FUNCTION = &h1234
END FUNCTION

DECLARE FUNCTION GetValue LIB "mydll" () AS INTEGER

PRINT "GetValue = &h"; HEX(GetValue())

'Erwartete Ausgabe :
'GetValue = &h1234

LIB kann auch in EXTERN ... END EXTERN Blöcken verwendet werden.

Unterschiede zu QuickBASIC:
- Neu in FreeBASIC

Siehe auch:
DECLARE
ALIAS

Letzte Bearbeitung: 17.10.10
Zur Onlinefassung des Eintrags

LIBPATH (Meta)

Syntax: #LIBPATH Pfad
Typ: Metabefehl
Kategorie: Programmorganisation

#LIBPATH fügt einen weiteren Pfad zu der Liste der Verzeichnisse hinzu, in welcher 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: Verzeichnis der aktuell umgesetzten Quellcodedatei hinzufügen

#LIBPATH __PATH__

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu älteren FreeBASIC-Versionen: existiert seit FreeBASIC v0.17

Siehe auch:
#INCLIB, #INCLUDE, Präprozessor-Anweisungen

Letzte Bearbeitung: 07.03.12
Zur Onlinefassung des Eintrags

LINE (Grafik)

Syntax: LINE [Puffer,] [[STEP] (x1, y1)]-[STEP] (x2, y2)[, [Farbe][, [B|BF][, Stil]]]
Typ: Anweisung
Kategorie: Gfx

LINE zeichnet eine Strecke 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 Strecke bzw. das Rechteck befinden soll. Die Koordinaten werden durch die letzten WINDOW- und VIEW-Befehle beeinflusst.

- 'STEP' gibt an, dass die darauf folgenden Koordinaten relativ zur aktuellen Position des Grafikcursors sind.

- Wird '[STEP] (x1, y1)' ausgelassen - wird also der Befehl in der Form LINE -(x2, y2) verwendet - dann wird für die Startkoordinaten die aktuelle Position des Grafikcursors verwendet.

- 'Farbe' ist die Nummer einer Farbe. Welche Nummer für welche Farbe steht, ist von der letzten SCREENRES-Anweisung sowie den letzten PALETTE-Befehlen abhängig.

- Ist das 'B'-Flag gesetzt, wird ein Rechteck anstatt einer Strecke gezeichnet.

- Ist das 'BF'-Flag gesetzt, wird ein ausgefülltes Rechteck gezeichnet.

- 'Stil' ist eine 16-bit-Maske, die den Stil der Strecke festlegt. "Stil der Strecke" bedeutet, auf welche Art die Strecke 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 und ein weißes Rechteck und zeigt beides 3 Sekunden lang an.

SCREENRES 320, 200, , ,1                ' Vollbildmodus 320x200x8

LINE (20, 20)-(300, 180), 4,  , &hFF00  ' gestrichelte Strecke
LINE (140, 80)-(180, 120), 15, B        ' weißes Rechteck

SLEEP 3000

Unterschiede zu QB:
In FreeBASIC ist es möglich, in einen Datenpuffer zu zeichnen.

Siehe auch:
LINE (Meta), __LINE__, LINE INPUT, SCREENRES, DRAW (Grafik), Grafik

Letzte Bearbeitung: 24.08.11
Zur Onlinefassung des Eintrags

LINE (Meta)

Syntax: #LINE Zeilennummer [ "Modulname" ]
Typ: Metabefehl
Kategorie: Präprozessor

#LINE setzt die aktuelle Zeilennummer und den Dateinamen des Moduls. 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-Warnungen 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 Programme andere Quellcodes einbinden und für diese Warnungen und Fehlermeldungen ausgegeben, 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: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
__LINE__, __FILE__, ERMN, Präprozessor-Anweisungen

Letzte Bearbeitung: 11.07.10
Zur Onlinefassung des Eintrags

LINE INPUT

Syntax: LINE INPUT [;] [Frage { , | ; } ] Variable
Typ: Anweisung
Kategorie: Benutzereingabe

LINE INPUT gibt dem Benutzer die Möglichkeit, über Tastatur eine Textzeile einzugeben.

- Wird vor 'Frage' ein Strichpunkt angegeben, so bleibt der Cursor nach der Benutzereingabe an der Stelle stehen, an der die Eingabe endet. Ansonsten wird nach der Eingabe ein Zeilenumbruch durchgeführt.

- 'Frage' ist ein STRING, ZSTRING oder WSTRING, der auf dem Bildschirm an der aktuellen Cursorposition angezeigt wird, bevor der Benutzer seine Eingabe tätigen kann..

- Wird als Trennzeichen zwischen 'Frage' und 'Variable' ein Strichpunkt statt eines Kommas gesetzt, so wird an das Ende von 'Frage' ein Fragezeichen angehängt.

- 'Variable' ist eine Variable, die vom Typ STRING, ZSTRING oder WSTRING sein muss. Die Eingabe des Benutzers wird in dieser Variablen gespeichert.

Im Gegensatz zu INPUT gibt es bei LINE INPUT nur die Möglichkeit, eine einzelne Variable einzugeben. Diese muss zudem von einem String-Datentyp sein. Dafür treten keine Probleme mit Sonderzeichen wie Kommata (,) oder "Anführungszeichen" auf. Außerdem darf es sich bei 'Frage' auch um eine Variable oder einen zusammengesetzten Stringausdruck handeln. Wird 'Frage' ausgelassen, so wird vor der Benutzereingabe kein Text (auch kein Fragezeichen wie bei INPUT) ausgegeben.

Beispiel:

DIM AS STRING benutzername, eingabe
LINE INPUT "Gib deinen Namen ein: ", benutzername
LINE INPUT "Hallo, " & benutzername & ". Willst du noch etwas sagen"; eingabe

Unterschiede zu QB:
In QB kann für 'Frage' nur ein String-Literal angegeben werden. In FreeBASIC sind auch Variablen und zusammengesetzte Stringausdrücke erlaubt.

Siehe auch:
LINE INPUT #, INPUT (Anweisung), Benutzereingaben

Letzte Bearbeitung: 06.04.12
Zur Onlinefassung des Eintrags

LINE INPUT (Datei)

Syntax: LINE INPUT #Dateinummer, Stringvariable
Typ: Anweisung
Kategorie: Datei

LINE INPUT # liest eine ganze Zeile aus einer Datei, die im Dateimodus INPUT oder BINARY geöffnet wurde.

- 'Dateinummer' ist die Nummer, die beim Öffnen der Datei mit OPEN zugewiesen wurde.

- 'Stringvariable' ist eine Variable, die als STRING deklariert sein muss. In dieser Variablen wird die ausgelesene Zeile gespeichert.

Beispiel: Datei zeilenweise auslesen und ausgeben

DIM zeile AS STRING, f AS INTEGER = FREEFILE
OPEN "Datei.txt" FOR INPUT AS #f

DO
LINE INPUT #f, zeile
PRINT zeile
LOOP UNTIL EOF(f)

CLOSE #f
SLEEP

Siehe auch:
LINE INPUT, INPUT #, PRINT #, WRITE #, OPEN (Anweisung), INPUT (Dateimodus), BINARY, Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

LOBYTE

Syntax: LOBYTE (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

LOBYTE gibt das niedere Byte eines Ausdrucks als UINTEGER zurück. LOBYTE hat dieselbe Funktion wie

Ausdruck AND 255

Beispiel:

DIM AS INTEGER foo = &b10000100000 ' = 1056 dezimal
PRINT LOBYTE(foo)
PRINT foo AND 255
SLEEP

Ausgabe:

32
32

Intern wird LOBYTE folgendermaßen behandelt:

#Define LOBYTE(x) (CUInt(x) And &h000000FF)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __LOBYTE in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht LOBYTE nicht zur Verfügung und kann nur über __LOBYTE aufgerufen werden.

Siehe auch:
HIBYTE, HIWORD, LOWORD, Bit-Operatoren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

LOC

Syntax: LOC (Dateinummer)
Typ: Funktion
Kategorie: Datei

LOC gibt die Position des Zeigers innerhalb einer mit OPEN geöffneten Datei zurück.

- Wurde die Datei im Dateimodus BINARY geöffnet, dann wird die Position des Bytes zurückgegeben, das zuletzt gelesen wurde. Zu Beginn steht LOC also auf Position 0, nach dem Lesen eines Bytes auf Position 1 usw. LOC gibt damit immer einen Wert zurück, der um 1 kleiner ist als SEEK.

- Im Dateimodus RANDOM wird die Nummer des zuletzt gelesenen Datensatzes zurückgegeben.

- Bei den sequentiellen Dateimodi INPUT, OUTPUT und APPEND wird eine Datensatzlänge von 128 Byte angenommen. LOC(Dateinummer) verhält sich damit wie (SEEK(Dateinummer) - 1) \ 128.

Beispiel:

DIM AS UBYTE dummy, nr=FREEFILE
DIM AS INTEGER firstPos
OPEN "mydata.ext" FOR BINARY AS #nr

DO
GET #nr, , dummy
IF dummy = ASC("A") THEN EXIT DO
LOOP UNTIL LOC(nr) = LOF(nr)

firstPos = LOC(nr)
IF firstPos = LOF(nr) THEN firstPos = 0
CLOSE #nr

IF firstPos THEN
PRINT "In dieser Datei kommt 'A' zum ersten ";
PRINT "Mal an Byte " & firstPos &" vor."
ELSE
PRINT "In dieser Datei kommt 'A' nie vor."
END IF

Unterschiede zu QB:
Die Berechnung bei sequentiellen Dateimodi unterscheidet sich in QB etwas.

Siehe auch:
OPEN, LOF, EOF, SEEK (Funktion), SEEK (Anweisung), Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

LOCAL

Syntax: ON LOCAL ERROR GOTO { label | 0 }
Typ: Schlüsselwort
Kategorie: Fehlerbehandlung

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

Beispiel:

ON ERROR GOTO errorhandler             ' globale Fehlerroutine setzen

SUB Test
ON LOCAL ERROR GOTO suberrorhandler  ' Fehlerroutine lokal ersetzen
ERROR 24

suberrorhandler:
PRINT "In der SUB 'Test' ist der Fehler #" & ERR & " aufgetreten!"
PRINT "Beliebige Taste zum Beenden"
SLEEP
END
END SUB

Test
END

errorhandler:
' Diese Fehlerroutine kommt nicht zum Einsatz
PRINT "Fehler #" & ERR & " ist aufgetreten!"   'Fehlernummer anzeigen
PRINT "Beliebige Taste zum Beenden"
SLEEP
END

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
ON ERROR

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

LOCATE (Anweisung)

Syntax: LOCATE [Zeile] [, Spalte] [, sichtbar] [, Start] [, Ende]
Typ: Anweisung
Kategorie: Konsole

LOCATE setzt die Position des Cursors in die angegebene Zeile und Spalte.

- 'Zeile' ist die Y-Koordinate, also der Hochwert. Die erste Zeile trägt den Wert 1. Wird dieser Parameter ausgelassen, verwendet FreeBASIC die aktuelle Cursorzeile.

- 'Spalte' ist die X-Koordinate, also der Rechtswert. Die erste Spalte trägt den Wert 1. Wird dieser Parameter ausgelassen, verwendet FreeBASIC die aktuelle Cursorspalte.

- 'sichtbar' gibt an, ob ein Cursor angezeigt werden soll oder nicht. Wenn ein Cursor angezeigt werden soll, muss 'sichtbar' ungleich null sein. Wird dieser Parameter ausgelassen, so wird die Sichtbarkeit des Cursors nicht verändert.

- 'Start' und 'Ende' sind nur in der Dialektform -lang qb erlaubt und existieren aus Kompatibilitätsgründen zu QB. Der Wert dieser Parameter wird ignoriert.

Beispiel:

LOCATE 5, 10, 0
PRINT "Zeile 5, Spalte 10"
PRINT "Zeile 6, Spalte  1"
PRINT "Kein Cursor."
PRINT
GETKEY
LOCATE , , 1
PRINT "Cursor aktiv"
SLEEP

Hinweis:
Der Cursor ist nur im Textmodus sichtbar, nicht dagegen im Grafikmodus (siehe SCREENRES). Will man im Grafikmodus dennoch einen Cursor anzeigen, muss er selbst auf den Bildschirm gezeichnet werden.

Unterschiede zu QB:
Die optionalen Parameter 'Start' und 'Ende' haben in FreeBASIC keine Auswirkung.

Unterschiede zu früheren Versionen von FreeBASIC:
Die optionalen Parameter 'Start' und 'Ende' existieren seit FreeBASIC v0.17

Unterschiede unter den FB-Dialektformen:
Die Parameter 'Start' und 'Ende' sind nur in der Dialektform -lang qb erlaubt.

Siehe auch:
LOCATE (Funktion), SPC, CSRLIN (Funktion), POS (Funktion), WIDTH (Anweisung), Konsole

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

LOCATE (Funktion)

Syntax: LOCATE
Typ: Funktion
Kategorie: Konsole

LOCATE gibt Informationen über die aktuelle Cursorposition und die Sichtbarkeit des Cursors 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 = 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 = HIBYTE(pst)
vis = HIWORD(pst)

PRINT "Cursorposition:"
PRINT "Line: "; lin
PRINT "Row:  "; row
PRINT "visible: "; vis

SLEEP

Unterschiede zu QB:
Der Einsatz von LOCATE als Funktion ist neu in FreeBASIC.

Siehe auch:
LOCATE (Anweisung), CSRLIN (Funktion), POS (Funktion), WIDTH (Funktion), Konsole

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

LOCK

Syntax: LOCK Dateinummer, { Satznummer | Start TO Ende }
Typ: Anweisung
Kategorie: Datei

LOCK sperrt den Zugriff auf eine Datei. Dieser Befehl ist nützlich, wenn mehrere Programme, Benutzer oder Prozesse auf dieselbe Datei zuzugreifen versuchen.

- 'Dateinummer' ist die Nummer, die beim Öffnen der Datei mit OPEN zugewiesen wurde.

- Im Dateimodus RANDOM ist 'Satznummer' die Nummer eines Datensatzes, auf den der Zugriff gesperrt werden soll. Im BINARY-Modus gibt 'Start' und 'Ende' den zu sperrenden Datenbereich an.

Achtung: Durch LOCK wird zur Zeit immer die gesamte Datei gesperrt; trotzdem ist die Angabe von 'Satznummer' bzw. von 'Start' und 'Ende' verbindlich!

Eine Datei kann auch bereits beim Öffnen für Lese- und/oder Schreibzugriffe gesperrt werden; siehe dazu OPEN (Anweisung)

UNLOCK entsperrt eine Datei wieder. Für UNLOCK gilt dieselbe Syntax wie für LOCK.

Dateien, die noch nicht mit UNLOCK freigegeben wurden, sollten nicht ein zweites Mal mit LOCK gesperrt werden!
Vorsicht:
Offensichtlich funktioniert das LOCK-Kommando 'nicht ganz' wie oben beschrieben..

Beispiel:
Eine Datei sperren, 100 Bytes lesen, und anschließend wieder entsperren. Um dieses Programm ausführen zu können, sollten Sie sicherstellen, dass die Datei 'file.ext' existiert, sich im aktuellen Arbeitsverzeichnis befindet und mindestens 100 Bytes lang ist.

DIM AS UBYTE array(1 TO 100), f = FREEFILE
OPEN "file.ext" FOR BINARY AS #f
LOCK #f, 1 TO 100
FOR i AS INTEGER = 1 TO 100
GET #f, i, array(i)
NEXT
UNLOCK #f, 1 TO 100
CLOSE #f

Plattformbedingte Unterschiede:
Das Sperren von Dateien mit FreeBASIC wird nicht unter allen Plattformen unterstützt!

Siehe auch:
UNLOCK, OPEN, Dateien (Files)

Letzte Bearbeitung: 14.04.11
Zur Onlinefassung des Eintrags

LOF

Syntax: LOF (Dateinummer)
Typ: Funktion
Kategorie: Datei

LOF (Len Of File) gibt die Länge einer geöffneten Datei in Bytes zurück. Wurde OPEN COM verwendet, dann gibt LOF die Länge der Daten zurück, die im Buffer zum Lesen bereitstehen.

Beispiel:

DIM AS INTEGER nr = FREEFILE
OPEN "file.ext" FOR BINARY AS #nr
PRINT LOF(nr)
CLOSE #nr
SLEEP

Siehe auch:
OPEN, LOC, SEEK (Funktion), EOF, Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

LOG

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

Gibt den Logarithmus zur Eulerschen Zahl e zurück. e ist näherungsweise 2.718281828459045 und kann durch Exp(1) zurückgegeben werden.

- 'Zahl' ist eine beliebiger numerischer 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:

' x = b ^ k <=> k = LogX(x, b)
DECLARE FUNCTION LogX (x AS DOUBLE, basis AS DOUBLE) AS DOUBLE

FUNCTION LogX (x AS DOUBLE, basis AS DOUBLE)
LogX = LOG(x) / LOG(basis)
END FUNCTION

PRINT LogX(100, 10) 'Ergebnis: 2, denn 10 ^ 2 = 100
SLEEP

Unterschiede zu QB: keine

Siehe auch:
mathematische Funktionen, EXP

Letzte Bearbeitung: 06.07.10
Zur Onlinefassung des Eintrags

LONG

Typ: Datentyp

Abhängig von der verwendeten Plattform entspricht LONG dem Datentyp INTEGER (32-bit-Systeme) oder LONGINT (64-bit-Systeme). LONG hat dieselbe Größe wie SIZEOF(ANY PTR).

Hinweis: Da FreeBASIC zur Zeit nur für 32-bit-Systeme kompiliert, hat LONG immer die Größe von 32 Bit. Dies kann sich in Zukunft ändern.

Unterschiede zu QB:
In QB ist LONG immer eine 32-bit-Ganzzahl.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb ist LONG immer eine 32-bit-Ganzzahl. In den anderen Dialektformen hängt die Größe von der verwendeten Plattform ab.

Siehe auch:
SIZEOF, ANY, PTR, DIM, CAST, CLNG, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

LONGINT

Typ: Datentyp

LONGINT-Zahlen sind vorzeichenbehaftete 64-bit-Ganzzahlen. Sie liegen im Bereich von -(2^63) bis (2^63)-1, bzw. von -9'223'372'036'854'775'808 bis 9'223'372'036'854'775'807.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht LONGINT nicht zur Verfügung und kann nur über __LONGINT aufgerufen werden.

Siehe auch:
DIM, CAST, CLNGINT, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

LOOP

Siehe DO ... LOOP

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

LOWORD

Syntax: LOWORD (Ausdruck)
Typ: Funktion
Kategorie: Speicherorganisation

LOWORD gibt das niedere Word eines Ausdrucks als UINTEGER zurück. LOWORD hat dieselbe Funktion wie

Ausdruck AND 65535

Beispiel:

DIM AS INTEGER foo = &b11000000000000000 ' = 98304 dezimal
PRINT LOWORD(foo)
PRINT foo AND 65535
SLEEP

Ausgabe:

32768
32768

Intern wird LOWORD folgendermaßen behandelt:

#Define LOWORD(x) (CUInt(x) and &h0000FFFF)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __LOWORD in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht LOWORD nicht zur Verfügung und kann nur über __LOWORD aufgerufen werden.

Siehe auch:
HIWORD, HIBYTE, LOBYTE, Bit-Operatoren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

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

Letzte Bearbeitung: 30.07.07
Zur Onlinefassung des Eintrags

LPRINT (Anweisung)

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, PRINT (Anweisung), PRINT #, WIDTH

Letzte Bearbeitung: 30.07.07
Zur Onlinefassung des Eintrags

LPRINT USING

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, PRINT USING, WIDTH

Letzte Bearbeitung: 30.07.07
Zur Onlinefassung des Eintrags

LPT

Siehe OPEN LPT

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

LSET

Syntax: LSET Ziel, Quelle
Typ: Anweisung
Kategorie: Stringmanipulation

LSET befüllt das 'Ziel' mit 'Quelle', behält aber die Länge von 'Ziel' bei. Es wird benutzt, um Strings linksbündig zu formatieren.

- 'Ziel' ist ein STRING oder ein UDT, der befüllt werden soll.

- 'Quelle' enthält die Daten, mit denen 'Ziel' befüllt wird. Ist 'Ziel' ein String, so muss auch 'Quelle' ein String sein. Ist 'Ziel' ein UDT, so muss 'Quelle' ein UDT sein, jedoch nicht notwendigerweise desselben Typs.

War 'Ziel' vor der Bearbeitung mit LSET z. B. ein fünf Zeichen langer String, so ist er auch nach der Bearbeitung noch fünf Zeichen lang, unabhängig von der Länge von 'Quelle'. Ist 'Quelle' länger als 'Ziel', so werden die vorderen Zeichen des Strings nach 'Ziel' kopiert, der Rest von 'Quelle' wird ignoriert. Ist 'Quelle' kürzer als 'Ziel', so werden die restlichen Zeichen von 'Ziel' mit Leerzeichen aufgefüllt. In allen Fällen bleibt 'Quelle' unverändert.

Beispiel:

DIM Quelle AS STRING
DIM Ziel AS STRING

Ziel = "0123456789"
Quelle = "***"
PRINT Ziel, Quelle

LSET  Ziel, Quelle
PRINT Ziel, Quelle
SLEEP

Ausgabe:

0123456789   ***
***          ***

Bei der Verwendung von UDTs werden die Daten Byte für Byte kopiert; der Programmierer muss selbst darauf achten, dass das Ergebnis valide ist.

Beispiel:

TYPE mytype1
x AS BYTE
y AS SHORT
END TYPE

TYPE mytype2
z AS INTEGER
END TYPE

DIM a AS mytype1 , b AS mytype2
b.z = &h01020304

LSET a, b
PRINT "&h" & HEX(a.x, 2), "&h" & HEX(a.y, 4)
SLEEP

Ausgabe:

&h04    &h0102

Das hinterste Byte des Integers b.z wurde also nach a.x kopiert, die beiden vorderen nach a.y - das dritte Byte ging wegen des Paddings verloren.

Unterschiede zu QB:
In QB lautet die Syntax LSET Ziel=Quelle.

Siehe auch:
RSET, SPACE, String-Funktionen

Letzte Bearbeitung: 19.01.12
Zur Onlinefassung des Eintrags

LTRIM

Syntax: LTRIM[$] (Stringausdruck [, [ANY] zuEntfernen])
Typ: Funktion
Kategorie: Stringmanipulation

LTRIM (=left trim) entfernt bestimmte führende Zeichen aus einem String.

- 'Stringausdruck' ist der STRING, ZSTRING oder WSTRING, der gekürzt werden soll.

- 'zuEntfernen' ist ein Ausdruck, der angibt, welche Zeichen entfernt werden sollen. Wird dieser Parameter ausgelassen, entfernt FreeBASIC automatisch alle Leerzeichen am Anfang des Strings. 'zuEntfernen' darf aus mehreren Zeichen bestehen.

- Wird die ANY-Klausel verwendet, entfernt FreeBASIC jedes Zeichen aus 'zuEntfernen' am Anfang von 'Stringausdruck'.

- Der Rückgabewert ist der um die angegebenen Zeichen gekürzte String.

LTRIM arbeitet case-sensitive, d. h. die Groß-/Kleinschreibung ist ausschlaggebend.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT LTRIM(" hello")
PRINT LTRIM("hello World", "he")
PRINT LTRIM("hello World", "eh")
PRINT LTRIM("hello World", ANY "eh")
SLEEP

Ausgabe:

hello
llo World
hello World
llo World

Unterschiede zu QB:

- Der Parameter 'zuEntfernen' und die ANY-Klausel sind neu in FreeBASIC.

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Der Parameter 'zuEntfernen' und die ANY-Klausel existieren seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
RTRIM, TRIM, INSTR, String-Funktionen

Letzte Bearbeitung: 20.01.12
Zur Onlinefassung des Eintrags

Startbuchstabe M

MACRO (Meta)

Syntax:

#MACRO Bezeichner ( [Parameterliste] )
' Makro-Code
#ENDMACRO

'oder auch

#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' spezifizierten 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 Parametern ist bei Makros nicht möglich.

Die Verwendung der Ellipsis ("...") hinter dem letzten Parameter eines Makros, erlaubt es, Makros mit variabler Anzahl von Parametern zu erzeugen. Diehe hierzu #DEFINE.

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

Unterschiede zu QuickBASIC:
- neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
- MACRO existiert seit FreeBASIC v0.17
- seit der SVN-Version 0.22 kann man eine variable Anzahl von Parametern verwenden

Siehe auch:
#ENDMACRO, DEFINE (Meta), UNDEF (Metabefehl), IFDEF (Meta), IFNDEF (Meta), DEFINED, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 17.10.10
Zur Onlinefassung des Eintrags

MID (Anweisung)

Syntax: MID[$](Text, Start[, Anzahl]) = Ausdruck
Typ: Anweisung
Kategorie: Stringmanipulation

MID ersetzt einen Teil einer Zeichenkette durch eine andere.

- 'Text' ist ein STRING, ZSTRING oder WSTRING, 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 'Text' lang ist, oder einen Wert kleiner als 1, dann wird nichts geändert.

- 'Anzahl' gibt an, wie viele Zeichen geändert werden sollen. Wird 'Anzahl' ausgelassen, richtet sich die Anzahl der zu ändernden Zeichen nach der Länge des nachfolgenden 'Ausdruck'. Ist 'Anzahl' größer, als der 'Ausdruck' lang ist, wird automatisch die Länge von 'Ausdruck' verwendet. Ist 'Ausdruck' länger, als 'Anzahl' groß ist, dann werden nur die ersten 'Anzahl' Zeichen aus 'Ausdruck' verwendet.

In jedem Fall bleibt die Länge von 'Text' erhalten. Sollen mehr Zeichen ersetzt werden, als 'Text' aufnehmen kann, dann findet nur eine Ersetzung bis zum Ende von 'Text' statt.

Das Dollarzeichen ($) als Suffix ist optional.

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

Wenn man eine Anzahl von Zeichen durch eine andere Anzahl von Zeichen ersetzen will, kann diese Anweisung nicht eingesetzt werden. Stattdessen muss man den neue String selbst zusammensetzen.

Beispiel:

DIM AS STRING text = "Schönen Abend!"
DIM AS INTEGER suche

' Da Umlaute u. U. nicht korrekt dargestellt werden, wird 'ö' durch 'oe' ersetzt.
suche = INSTR(text, "ö")
IF suche > 0 THEN       ' 'ö' gefunden
' Umlaut ersetzen
text = LEFT(text, suche-1) & "oe" & MID(text, suche+1)
END IF
PRINT text
SLEEP

Hinweis: Das Beispiel funktioniert nur einwandfrei, wenn es in einem Format wie ISO 8859-1 o. ä. gespeichert wurde, bei dem der Buchstabe "ö" nur ein Byte Speicherplatz benötigt.

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
MID (Funktion), String-Funktionen

Letzte Bearbeitung: 06.09.11
Zur Onlinefassung des Eintrags

MID (Funktion)

Syntax: MID[$](Ausdruck AS STRING, Start[, Länge])
Typ: Funktion
Kategorie: Stringmanipulation

MID gibt einen Ausschnitt einer Zeichenkette zurück.

- 'Ausdruck' ist der STRING, ZSTRING oder WSTRING, 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 oder negativ ist, gibt MID alle Zeichen des STRINGs ab 'Start' zurück; MID funktioniert dann so ähnlich wie RIGHT.

- Der Rückgabewert ist ein STRING bzw. WSTRING, der den angeforderten Teilstring enthält.

Wird für einen der Parameter 0 (bzw. ein Leerstring) angegeben, ist der Rückgabewert ein Leerstring. Ist die Anzahl der zurückzugebenden Zeichen größer als der verbliebene Rest des Strings, dann werden nur die Zeichen bis zum Stringende zurückgegeben.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT MID("abcdefg" , 3, 2) 'Ausgabe: "cd"
PRINT MID("abcdefg" , 3) 'Ausgabe: "cdefg"
PRINT MID("abc" + "defg", 2, 1) 'Ausgabe: "b"
PRINT MID("Test!", 2, 20) 'Ausgabe: "est!"

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
MID (Anweisung), INSTR, LEFT, RIGHT, String-Funktionen

Letzte Bearbeitung: 06.09.11
Zur Onlinefassung des Eintrags

MINUTE

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, TIMESERIAL, TIMEVALUE, HOUR, SECOND, FORMAT, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

MKD

Syntax: MKD[$](DOUBLE-Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

MKD verwandelt eine DOUBLE-Zahl in einen 8-Byte-STRING. Die Funktion wurde in älteren BASIC-Dialekten oft mit FIELD benutzt. Das Dollarzeichen ($) als Suffix ist optional. MKD ist die Umkehrung von CVD.

Der von MKD zurückgegebene String stellt eine binäre Kopie der übergebenen Zahl dar. Siehe dazu die Beispiele zu CVD und zu MKL.

Unterschiede zu QB: keine

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

MKDIR

Syntax: MKDIR(Ordnername)
Typ: Funktion
Kategorie: Datei

MKDIR 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 den angegebenen Pfad nicht zugegriffen werden kann (z.B. auf eine CD oder einen schreibgeschützten Ordner).

Beispiel:

MKDIR "data"
IF MKDIR("C:\BASIC\Testfolder") THEN
PRINT "'Testfolder' konnte nicht erstellt werden!"
END IF
SLEEP

Das Beispiel erstellt, wenn möglich, den Ordner 'data' im aktuellen Arbeitsverzeichnis und den Ordner 'Testfolder' in C:\BASIC. Wenn 'Testfolder' nicht erstellt werden kann, wird eine Meldung ausgegeben.

Unterschiede zu QB:
In FreeBASIC kann MKDIR auch als Funktion eingesetzt werden .

Plattformbedingte Unterschiede:

- Unter Linux muss der Ordnername 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch:
RMDIR, CHDIR, CURDIR, SHELL, Betriebssystem-Anweisungen

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

MKI

Syntax: MKI[$](INTEGER-Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

MKI verwandelt eine INTEGER-Zahl in einen 4-Byte-STRING. Die Funktion wurde in älteren BASIC-Dialekten oft mit FIELD benutzt. Das Dollarzeichen ($) als Suffix ist optional. MKI ist die Umkehrung von CVI.

Beispiel:

DIM  n AS  INTEGER
n = &h21504246
PRINT MKI(n)
PRINT CHR(&h46, &h42, &h50, &h21)
SLEEP

Ausgabe:

FBP!
FBP!

Unterschiede zu QB: keine

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

MKL

Syntax: MKL[$](LONG-Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

MKL verwandelt eine LONG-Zahl in einen 4-Byte-STRING. Die Funktion wurde in älteren BASIC-Dialekten oft mit FIELD benutzt. Das Dollarzeichen ($) als Suffix ist optional. MKL ist die Umkehrung von CVL.

Der von MKL zurückgegebene String stellt eine binäre Kopie der übergebenen Zahl dar.

Beispiel:

DIM AS LONG n
n = &h21504246
PRINT MKL(n)
PRINT CHR(&h46, &h42, &h50, &h21)
SLEEP

Ausgabe:

FBP!
FBP!

Unterschiede zu QB: keine

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

MKLONGINT

Syntax: MKLONGINT[$](LONGINT-Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

MKLONGINT verwandelt eine LONGINT-Zahl in einen 8-Byte-STRING. Das Dollarzeichen ($) als Suffix ist optional. MKLONGINT ist die Umkehrung von CVLONGINT.

Der von MKLONGINT zurückgegebene String stellt eine binäre Kopie der übergebenen Zahl dar.

Beispiel:

DIM n AS LONGINT
n = &h21656D6F636C6557
PRINT MKLONGINT(n)
PRINT CHR(&h57, &h65, &h6C, &h63, &h6F, &h6D, &h65, &h21)
SLEEP

Ausgabe:

Welcome!
Welcome!

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MKLONGINT nicht zur Verfügung und kann nur über __MKLONGINT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

MKS

Syntax: MKS[$](SINGLE-Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

MKS verwandelt eine SINGLE-Zahl in einen 4-Byte-STRING. Die Funktion wurde in älteren BASIC-Dialekten oft mit FIELD benutzt. Das Dollarzeichen ($) als Suffix ist optional. MKS ist die Umkehrung von CVS.

Der von MKS zurückgegebene String stellt eine binäre Kopie der übergebenen Zahl dar. Siehe dazu die Beispiele zu CVS und zu MKL.

Unterschiede zu QB: keine

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

MKShort

Syntax: MKSHORT[$](SHORT-Ausdruck)
Typ: Funktion
Kategorie: Speicherverwaltung

MKSHORT verwandelt eine SHORT-Zahl in einen 2-Byte-STRING. Das Dollarzeichen ($) als Suffix ist optional. MKSHORT ist die Umkehrung von CVSHORT.

Der von MKL zurückgegebene String stellt eine binäre Kopie der übergebenen Zahl dar.

Beispiel:

DIM AS SHORT a = &h6968
PRINT MKSHORT(a); CHR(&h68, &h69)
SLEEP

Ausgabe:

hihi

Unterschiede zu QB:
Die Funktion ist neu in FreeBASIC. In QB entspricht sie der Funktion MKI.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MKSHORT nicht zur Verfügung und kann nur über __MKSHORT aufgerufen werden.

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

Letzte Bearbeitung: 20.09.11
Zur Onlinefassung des Eintrags

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 Gleitkommazahlen (SINGLE oder DOUBLE) verwendet, so werden diese zuerst mithilfe von CINT mathematisch 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

MOD kann mithilfe von OPERATOR überladen werden.

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:
mathematische Funktionen, SHL, SHR, Backslash

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

MONTH

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, YEAR, DAY, WEEKDAY, HOUR, MINUTE, SECOND, MONTHNAME, WEEKDAYNAME, DATEDIFF, DATEPART, DATEADD, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

MONTHNAME

Syntax: MONTHNAME(Monat [, Kurzform])
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

- '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 drei Zeichen besteht, ansonsten wird der volle Name ausgegeben.

Beispiel: Den Namen des aktuellen Monats ausgeben:

#INCLUDE  "vbcompat.bi"
PRINT "Wir befinden uns im Monat " & MONTHNAME(MONTH(NOW)) & "."
SLEEP

Unterschiede zu QB: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, YEAR, MONTH, DAY, WEEKDAY, WEEKDAYNAME, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

MULTIKEY

Syntax: MULTIKEY(Scancode)
Typ: Funktion
Kategorie: Benutzereingabe

MULTIKEY 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 (vom Typ INTEGER) 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 z. B. durch INKEY abgefragt wird. Damit kein Überlauf im Tastaturpuffer stattfindet, müssen Sie diesen selbstständig leeren; es empfiehlt sich daher, MULTIKEY in Kombination mit INKEY zu verwenden.

Das Arbeiten mit MULTIKEY ist komfortabler als der alleinige Einsatz von INKEY; da das gleichzeitige Drücken zweier Tasten mit einer einfachen AND-Verknüpfung geschehen kann:

IF MULTIKEY(&H01) AND _
(MULTIKEY(&H2A) OR MULTIKEY(&H36)) THEN ...

Der Code hinter THEN würde ausgeführt, 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 Bedingung 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
'Grafikfenster 640x480x8 mit zwei Seiten initialisieren
SCREENRES 640, 480, ,2
COLOR 2, 15
work_page = 0
x = 320
y = 240
DO
SLEEP 1
' 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 zum Beenden druecken."
SLEEP

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(FB.SC_F1) THEN PRINT "F1 wurde gedrückt."
IF MULTIKEY(FB.SC_LEFT) THEN PRINT "Linke Pfeiltaste wurde gedrückt."
IF MULTIKEY(FB.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

Plattformbedingte Unterschiede:
Die Unterstützung von MULTIKEY im Konsolenfenster ist möglicherweise nicht unter allen Plattformen gewährleistet.

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

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MUKTIKEY nicht zur Verfügung und kann nur über __MULTIKEY aufgerufen werden.

Siehe auch:
INKEY, DOS Keyboard Scancodes, Benutzereingaben

Letzte Bearbeitung: 13.05.12
Zur Onlinefassung des Eintrags

MUTEXCREATE

Syntax: handle = MUTEXCREATE
Typ: Funktion
Kategorie: Programmorganisation

MUTEXCREATE erstellt einen Mutex und gibt einen Handle darauf zurück.

Der Rückgabewert ist ein ANY PTR, der einen Mutex eindeutig identifiziert. Über diesen wird später auf den Mutex zugegriffen. In früheren Versionen von FreeBASIC (vor v0.17) wurde ein INTEGER zurückgegeben.

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.

Wenn das Mutex nicht mehr benötigt wird, sollte es mit MUTEXDESTROY zerstört werden.

Beispiel (aus dem examples-Ordner Ihres FreeBASIC-Verzeichnisses):

DIM SHARED produced AS ANY PTR
DIM SHARED consumed AS ANY PTR
DIM consumer_id AS ANY PTR
DIM producer_id AS ANY PTR

SUB consumer ( BYVAL param AS INTEGER )
FOR i AS INTEGER = 0 TO 9
MUTEXLOCK produced
PRINT ", consumer gets:", i
MUTEXUNLOCK consumed
NEXT i
END SUB

SUB producer (BYVAL param AS INTEGER)
FOR i AS INTEGER = 0 TO 9
PRINT "Producer puts:", i;
MUTEXUNLOCK produced
MUTEXLOCK consumed
NEXT i
END SUB

produced = MUTEXCREATE
consumed = MUTEXCREATE
IF (produced = 0) OR (consumed = 0) THEN
PRINT "Error creating mutexes! Exiting..."
SLEEP
END
END IF

MUTEXLOCK produced
MUTEXLOCK consumed

consumer_id = THREADCREATE(CAST(ANY PTR,@consumer))
producer_id = THREADCREATE(CAST(ANY PTR,@producer))
IF (producer_id = 0) OR (consumer_id = 0) THEN
PRINT "Error creating threads! Exiting..."
SLEEP
END
END IF

THREADWAIT consumer_id
THREADWAIT producer_id

MUTEXDESTROY consumed
MUTEXDESTROY produced
SLEEP

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 versucht, 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.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC stehen Mutexe nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- MUTEXCREATE existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 gibt MUTEXCREATE einen ANY PTR zurück.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MUTEXCREATE nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 02.09.11
Zur Onlinefassung des Eintrags

MUTEXDESTROY

Syntax: MUTEXDESTROY handle
Typ: Anweisung
Kategorie: Programmorganisation

MUTEXDESTROY löscht einen Mutex. Dieser kann sowohl gesperrt als auch entsperrt sein; es wird nicht auf seine Entsperrung gewartet.

'handle' ist ein ANY PTR. Er stellt den Handle zu einem mit MUTEXCREATE erstellten Mutex dar. In früheren Versionen von FreeBASIC (vor v0.17) wurde ein INTEGER verwendet.

MUTEXDESTROY sollte immer aufgerufen werden, nachdem alle Threads, die auf den Mutex zugreifen, beendet wurden.

Beispiel: siehe MUTEXCREATE.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC stehen Mutexe nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- MUTEXDESTROY existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt MUTEXDESTROY einen ANY PTR als Parameter.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MUTEXDESTROY nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

MUTEXLOCK

Syntax: MUTEXLOCK handle
Typ: Anweisung
Kategorie: Programmorganisation

MUTEXLOCK sperrt den Zugriff auf einen Mutex.

'handle' ist ein ANY PTR. Er stellt den Handle zu einem mit MUTEXCREATE erstellten Mutex dar. In früheren Versionen von FreeBASIC (vor v0.17) wurde ein INTEGER verwendet.
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.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC stehen Mutexe nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- MUTEXLOCK existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt MUTEXLOCK einen ANY PTR als Parameter.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MUTEXLOCK nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

MUTEXUNLOCK

Syntax: MUTEXUNLOCK handle
Typ: Funktion
Kategorie: Programmorganisation

MUTEXUNLOCK entsperrt einen Mutex. Der Mutex wird in jedem Fall entsperrt, egal ob er zuvor gesperrt oder entsperrt war.

'handle' ist ein ANY PTR. Er stellt den Handle zu einem mit MUTEXCREATE erstellten Mutex dar. In früheren Versionen von FreeBASIC (vor v0.17) wurde ein INTEGER verwendet.

Beispiel: siehe MUTEXCREATE.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In der DOS-Version von FreeBASIC stehen Mutexe nicht zur Verfügung, da Threads nicht unterstützt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- MUTEXUNLOCK existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt MUTEXUNLOCK einen ANY PTR als Parameter.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht MUTEXUNLOCK nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 22.08.10
Zur Onlinefassung des Eintrags

Startbuchstabe N

NAKED

Syntax:

SUB SubName NAKED [Konvention] ([Parameterliste])
Assemblerbefehle
END SUB

FUNCTION FunctionName NAKED [Konvention] ([Parameterliste]) AS Typ
Assemblerbefehle
END FUNCTION

Typ: Schlüsselwort
Kategorie: Programmorganisation

NAKED erstellt Funktionen ohne Handlingcode.

- 'SubName' bzw. 'FunctionName' ist der Bezeichner, unter dem die SUB/FUNCTION aufgerufen wird.

- 'Konvention' enthält die Aufrufkonventionen wie CDECL, PASCAL und STDCALL.

- 'Parameterliste' gibt die Parameter an, die an das Unterprogramm übergeben werden sollen.

- 'Typ' ist der Datentyp des übergebenen Parameters; siehe Datentypen. Auch UDTs können verwendet werden.

NAKED ermöglicht dem Programmierer, ein Unterprogramm ohne Handlingcode zu erstellen. Das ist vor allem dann nützlich, wenn schnelle Funktionen in ASM benötigt werden.
Derzeit ist NAKED nicht kompatibel mit der Compiler-Option -exx. Die Funktionsaufrufe der exx-Option benötigen den fehlenden Handlingcode.

Beispiel:

' Naked Cdecl Function
FUNCTION addieren NAKED CDECL (BYVAL a AS INTEGER, BYVAL b AS INTEGER) AS INTEGER
ASM
mov eax,[esp+4] ' a
ADD eax,[esp+8] ' + b
ret                       ' gibt das Ergebnis in eax zurück
END ASM
END FUNCTION

' Naked StdCall Function
FUNCTION addieren2 NAKED (BYVAL a AS INTEGER, BYVAL b AS INTEGER) AS INTEGER
ASM
mov eax,[esp+4]  ' a
ADD eax,[esp+8]  ' + b
ret 8                        ' 8 Byte auf dem Stack freigeben, Ergebnis in eax
END ASM
END FUNCTION

PRINT addieren ( 3,5 )
PRINT addieren2 ( 7,9 )
SLEEP

Plattformbedingte Unterschiede:
Die Standardaufrufkonvention kann von der verwendeten Plattform abhängen. Zusätzlich hierzu verhält sich StdCall nicht auf allen Plattformen gleich - unter Linux funktioniert es nicht, dort besser CDECL benutzen. Dadurch könnte eine Prüfung der vordefinierten Symbole (wie __FB_WIN32__) nötig sein und der Code speziell darauf ausgerichtet werden müssen.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.21

Siehe auch:
ASM, FUNCTION, SUB, CDECL, PASCAL, STDCALL

Letzte Bearbeitung: 22.02.12
Zur Onlinefassung des Eintrags

NAME

Syntax: NAME (NameAlt, NameNeu)
Typ: Funktion
Kategorie: Datei

NAME 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 die Datei erhalten soll.

- Der Rückgabewert ist 0, wenn die Datei erfolgreich umbenannt werden konnte, oder -1, wenn ein Fehler aufgetreten ist (z. B. weil die Datei 'NameAlt' nicht existiert oder weil bereits eine Datei namens 'NameNeu' existiert).

FreeBASIC geht davon aus, dass sich die Datei 'NameAlt' im aktuellen Arbeitsverzeichnis befindet (siehe CURDIR). Ist dies nicht der Fall, muss 'NameAlt' eine Pfadangabe enthalten. Diese darf absolut oder relativ sein.
Enthält 'NameNeu' eine andere Pfadangabe als 'NameAlt', so wird die Datei in den bei 'NameNeu' angegeben Ordner verschoben. Das bedeutet auch, dass bei einer Pfadangabe in 'NameAlt' auch 'NameNeu' dieselbe Pfadangabe enthalten muss, wenn die Datei nicht verschoben werden soll.

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
IF NAME ("C:\BASIC\Projekt\Dialog.bas", "C:\BASIC\Beispiele\Dialog.bas") <> 0 THEN
PRINT "Fehler: Die Datei konnte nicht verschoben werden."
END IF
SLEEP

Unterschiede zu QB:

- In QB lautet die Syntax NAME NameAlt AS NameNeu.

- In FreeBASIC kann NAME auch als Funktion verwendet werden.

Da FreeBASIC ein 32bit-Compiler ist, werden auch lange Dateinamen bis zu 255 Zeichen unterstützt.

Plattformbedingte Unterschiede:

- Unter Linux muss der Dateiname 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch:
KILL, CURDIR, Betriebssystem-Anweisungen

Letzte Bearbeitung: 30.01.12
Zur Onlinefassung des Eintrags

NAMESPACE

Syntax:

NAMESPACE Bereichsname
' Programmcode
END NAMESPACE

Typ: Anweisung
Kategorie: Programmorganisation

NAMESPACE 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 'foobar' verwendet, kann der User einen eigenen Type 'foobar' 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.

FreeBASIC-Namespaces sind kompatibel zu GCC C++.

Folgende Anweisungen sind innerhalb eines Namespaces erlaubt:

- DIM

- STATIC

- COMMON

- DECLARE

- TYPE

- UNION

- ENUM

- CONST

- VAR

Beispiel:

NAMESPACE Forms
TYPE Dot ' 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 AdjustDot( BYREF pt AS Dot, BYVAL newx AS INTEGER, BYVAL newy AS INTEGER )
pt.x = newx
pt.y = newy
END SUB
END NAMESPACE

TYPE Dot ' Ein 3D-Punkt
x AS INTEGER
y AS INTEGER
z AS INTEGER
END TYPE

SUB AdjustDot( BYREF PT AS Dot, BYVAL newx AS INTEGER, BYVAL newy AS INTEGER, BYVAL newz AS INTEGER )
pt.x = newx
pt.y = newy
pt.z = newz
END SUB

DIM d1 AS Dot
AdjustDot( d1, 1, 1, 1 )

DIM d2 AS Forms.Dot
Forms.AdjustDot( d2, 1, 1 )

SLEEP

Namespace kann man auch beliebig verschachteln, was durchaus nützlich sein kann:

NAMESPACE erste
DIM AS INTEGER variable = 1
END NAMESPACE

NAMESPACE zweite
DIM AS INTEGER variable = 2
END NAMESPACE

NAMESPACE dritte
DIM AS INTEGER variable = 3

NAMESPACE verschachtelte
DIM AS INTEGER variable = 4
END NAMESPACE
END NAMESPACE

PRINT erste.variable
PRINT zweite.variable
PRINT dritte.variable
PRINT dritte.verschachtelte.variable

SLEEP

Unterschiede zu QuickBASIC: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.16

Siehe auch:
USING (Namespace), EXTERN...END EXTERN

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

NEW

Syntax A: Rueckgabe = NEW [(Adresse)] Datentyp (Parameterliste)
Syntax B: Rueckgabe = NEW [(Adresse)] Datentyp [Anzahl]
Typ: Operator
Kategorie: Speicherverwaltung

NEW weist dynamisch Speicher zu und erzeugt Daten/Objekte des angegebenen Typs.

- 'Parameterliste' gibt den/die Anfangswert(e) der Variablen an. Sie kann auch ausgelassen werden.

- 'Datentyp' ist der Name des zu erzeugenden Datentyps. Es kann sich um einen Standarddatentyp oder ein UDT handeln. Strings sind allerdings nicht erlaubt.

- 'Anzahl' gibt die Anzahl der zu erzeugenden Elemente an.

- 'Adresse' ist ein bereits alloziierter Pointer, an den das Objekt geschrieben werden soll.

- 'Rueckgabe' ist ein Pointer des Typs 'Datentyp' auf den neu erzeugten Datenbereich.

NEW weist dynamisch Speicher zu und konstruiert den angegebenen Datentyp. Bei einfachen Typen wie INTEGERs kann ein Anfangswert angegeben werden. Bei Typen ohne Konstruktoren können Anfangswerte für jedes Feld angegeben werden. Bei Typen, die Konstruktoren besitzen, können diese durch NEW auch aufgerufen werden. Wird 'Parameterliste' nicht angegeben, werden die Standardwerte für diese Typen benutzt.

NEW ['Anzahl'] ist die Array-Version von NEW und weist genügend Speicher für die angegebene Anzahl der Objekte zu. Der Standard-Constructor des Typs wird dann aufgerufen, um die Anfangswerte jedes Objekts zu setzen.

Objekte, die mit NEW erzeugt wurden, müssen mit DELETE freigegeben werden, Speicher, der mittels NEW [Anzahl] reserviert wurde jedoch mit DELETE [ ], der Array-Version von DELETE. Die verschiedenen Versionen der Operatoren dürfen nicht vermischt werden und 'passen' auch nicht zueinander.

Wird NEW mit dem Adressen-Parameter verwendet, so reserviert NEW keinen Speicher, sondern erzeugt das Objekt an der vorgegebenen Adresse. Der Speicher muss also schon vorher reserviert werden. Da der Speicher nicht durch NEW reserviert wird, sollte er auch nicht mit DELETE freigegeben werden. Stattdessen sollte der Destructor des Objekts explizit aufgerufen und der Speicher hinterher mit der zur Reservierung entsprechenden Freigabemethode freigegeben werden.

Wird der Anfangswert 'ANY' benutzt, wie z.B. in NEW Datentyp (ANY) oder NEW Datentyp [Anzahl] {ANY}, wird zwar Speicher für 'Datentyp' reserviert, aber die Daten werden nicht initialisiert. Das gilt nur bei Datentypen, die keine Konstruktoren besitzen.

NEW kann mithilfe von OPERATOR überladen werden.

Beispiel 1:

TYPE Rational
AS INTEGER Zaehler, Nenner
END TYPE

SCOPE

' Erzeugen und Initialisieren eines Rationalbruchs
' und Speichern seiner Adresse
DIM p AS Rational PTR = NEW Rational(3, 4)

PRINT p->Zaehler & "/" & p->Nenner

' Löschen des Bruchs und Rückgabe des Speichers
' an das System
DELETE p

END SCOPE

SCOPE

' Speicherreservierung für 100 Integers, Speichern
' der Adresse des ersten
DIM p AS INTEGER PTR = NEW Integer[100]

' Zuweisen von Werten an die Integers im Array
FOR i AS INTEGER = 0 TO 99
p[i] = i
NEXT

' Freigeben des gesamten Integer-Arrays
Delete[] p

END SCOPE

SLEEP

Beispiel 2:

TYPE Rational
AS INTEGER zaehler, nenner
END TYPE

'Pointer anlegen und Größe des Types reservieren
DIM AS ANY PTR ap = CALLOCATE(SIZEOF(Rational))

'Pointer des Types anlegen und neues Objekt an die Stelle
'des bereits reservierten Speichers schreiben
DIM AS Rational PTR r = NEW (ap) Rational( 3, 4 )

'Beide Pointer haben nun die selbe Adresse im Speicher
PRINT ap, r
PRINT r->zaehler & "/" & r->nenner

'Statt mit DELETE sollte das Objekt durch explizites
'aufrufen des Destructors zerstört werden, da DELETE
'den Speicher danach freigibt, was zu Speicherproblemen
'und Programmabstürzen führen kann
r->DESTRUCTOR( )

'Den Speicher letztlich freigeben
DEALLOCATE( ap )

'Auf Tastendruck vor Programmende warten
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen: nur in der Dialektform -lang fb verfügbar

Siehe auch:
DELETE, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

NEXT

Syntax 1: NEXT [Variable]
Syntax 2: RESUME [NEXT]
Typ: Schlüsselwort
Kategorie: Schleifen/Fehler

Syntax 1: FOR-Schleife
NEXT ist der schließende Bestandteil der Zählschleife FOR ... NEXT.

Auf NEXT folgt die Zählvariable, die am Anfang des Schleifenblocks in der FOR-Zeile verwendet wurde. Die Angabe der Zählvariablen hinter NEXT kann auch ausgelassen werden.

DIM i AS INTEGER
FOR i = 1 TO 5
PRINT "Hallo Welt!"
NEXT i
SLEEP : END

Unterschiede zu älteren Versionen von FreeBASIC:
War es vor FreeBASIC 0.18.3b noch möglich,

FOR i = 0 TO 3
PRINT "i = " & i
NEXT irgendwasesmussnurzusammengeschriebensein

zu schreiben, also dem NEXT eine beliebige Zeichenfolge folgen zu lassen, ist seit FB 0.18.3b die Zählvariable (Laufindex) anzufügen, in diesem Fall 'i', oder nur ein NEXT ohne Variable. Dabei wird dann automatisch die Variable des dazugehörigen FOR-Befehls verwendet. Bei einer anderen beliebigen Zeichenfolge gibt der Compiler eine Fehlermeldung aus.

Unterschiede zu QB:
Auch mehrere Zähler werden unterstützt.
Beispiel:

NEXT a, b, c

Syntax 2: Fehlerbehandlung
NEXT ist auch Teil der RESUME-Anweisung. RESUME [NEXT] steht nur in den Dialektformen -lang qb und -lang fblite zur Verfügung.

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

NOGOSUB (Schlüsselwort)

Syntax: OPTION NOGOSUB
Typ: Schlüsselwort
Kategorie: Programmorganisation

OPTION NOGOSUB deaktiviert die Unterstützung von GOSUB undON ... GOSUB. Die Option 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 NOGOSUB nicht mehr zulässig!

Da RETURN sowohl eine Rückkehr von GOSUB als auch von einer Prozedur bedeuten kann, können OPTION GOSUB und OPTION NOGOSUB verwendet werden, um GOSUB zu aktivieren bzw. deaktivieren. Wenn GOSUB deaktiviert wurde, wird RETURN nur als Rückkehr aus einer Prozedur bzw. Funktion aufgefasst. Ansonsten wird RETURN nur als Rückkehr von GOSUB aufgefasst.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
NOGOSUB (Schlüsselwort), GOSUB, RETURN, __FB_OPTION_GOSUB__, OPTION

Letzte Bearbeitung: 08.10.10
Zur Onlinefassung des Eintrags

NOKEYWORD

Syntax: OPTION NOKEYWORD keyword
Typ: Schlüsselwort
Kategorie: Programmorganisation

Mit OPTION NOKEYWORD kann ein reserviertes Schlüsselwort freigeben und anschließend als Variable, Objekt, Prozedur oder anderes Symbol verwendet werden. 'keyword' ist das Schlüsselwort, das freigegeben wird.

Die Option kann nur bis FreeBASIC v0.16 eingesetzt werden, oder in entsprechend höheren Versionen, die mit der Kommandozeilenoption -lang deprecated kompiliert wurden! Seit FreeBASIC v0.17 wird dieser Befehl durch den Metabefehl UNDEF ersetzt.

Beispiel:

#LANG "fblite"

OPTION NOKEYWORD INT ' gibt das Schlüsselwort INT frei
DIM INT AS INTEGER ' INT wird ab sofort als Variable verwendet

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde. Ansonsten kann ab FreeBASIC v0.17 der Metabefehl UNDEF verwendet werden.

Siehe auch:
UNDEF (Metabefehl), OPTION

Letzte Bearbeitung: 09.07.10
Zur Onlinefassung des Eintrags

NOT

Syntax: NOT Ausdruck
Typ: Operator
Kategorie: logische Operatoren

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

NOT kann mithilfe von OPERATOR überladen werden.

Beispiel 1: NOT 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.

Hinweis: NOT ist keine Funktion. Die Verwendung der Form

NOT(Variable)

kann zu Problemen führen. Ein kleines dazu Beispiel:

NOT(0) + 1

wird behandelt wie

NOT ((0) + 1)

obwohl man diese Interpretation erwarten würde:

(NOT 0) + 1

Unterschiede zu QB: keine

Siehe auch:
AND (Operator), OR (Operator), XOR (Operator), IMP, EQV, Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

NOW

Syntax: NOW
Typ: Funktion
Kategorie: Zeit

Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird. NOW wird vom Compiler solange ignoriert, bis die Datei datetime.bi (bzw. vbcompat.bi) in den Quellcode eingebunden wurde.

Diese Funktion gibt die aktuelle Systemzeit als Serial Number aus. Der Rückgabetyp ist DOUBLE. Das Datum wird bei einer Serial Number im ganzzahligen Bereich der Zahl gespeichert, die Uhrzeit im Nachkommabereich. Das bedeutet: Wenn Sie zur Speicherung eine INTEGER-Zahl verwenden, erhalten Sie die nächstliegende Mitternacht zurück.

Beispiel:

#INCLUDE "vbcompat.bi"
DIM a AS DOUBLE
a = NOW
PRINT FORMAT( a, "dd.mm.yyyy, hh:mm:ss" )

Ausgabebeispiel:

06.11.2007, 18:40:14

Unterschiede zu QB: existiert nur in QBX PDS und in VBDOS.

Unterschiede 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, DATEPART, DATEADD, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

Startbuchstabe O

OBJECT

Syntax: TYPE basisklasse EXTENDS OBJECT
Typ: Datentyp
Kategorie: OOP

OBJECT wird in Verbindung mit Vererbung genutzt. Will man über IS den Typ einer Variable erfahren, muss die Basis-Klasse von OBJECT erben, da nur so die RTTI-Funktionalität zur Verfügung steht, die dies ermöglicht.

Beispiel:

TYPE Haustier EXTENDS OBJECT
AS INTEGER beine   = 4
AS INTEGER schwanz = 1
END TYPE

TYPE Hund EXTENDS Haustier
' Deklarationen für Hunde
END TYPE

TYPE Dackel EXTENDS Hund
' Deklarationen für Dackel
END TYPE

DIM AS Haustier waldi = Dackel
IF waldi IS Hund THEN PRINT "Waldi ist ein Hund."
IF waldi IS Dackel THEN PRINT "Waldi ist ein Dackel."

SLEEP

Ausgabe:

Waldi ist ein Hund.
Waldi ist ein Dackel.

Erläuterung: Da 'waldi' sowohl ein Hund als auch ein Dackel ist, spricht er auf beide Abfragen an. Wenn Sie die exakte Zugehörigkeit zu einer Klasse prüfen wollen, sollten Sie aus diesem Grund die abgefragten Klassen immer in zur Erbreihenfolge entgegengesetzen Reihenfolge prüfen; siehe dazu IS (Vererbung).

IS arbeitet nur mit der Klasse, die direkt von OBJECT erbt. Andererseits kann diese Klasse nicht auf die Records und Methoden seiner Kindklassen zugreifen. Um diese Records ansprechen zu können, muss die Variable entsprechend geCASTet werden; siehe dazu IS (Vererbung).

Unterschiede zu QB: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: OBJECT existiert seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht OBJECT nicht zur Verfügung und kann nur über __OBJECT aufgerufen werden.

Siehe auch:
TYPE (UDT), BASE, EXTENDS, IS (Vererbung)

Letzte Bearbeitung: 24.01.12
Zur Onlinefassung des Eintrags

OCT

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

OCT gibt den oktalen Wert eines beliebigen Ausdrucks 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; der zurückgegebene Wert ist jedoch nie länger, als maximal für den Datentyp von 'Ausdruck' benötigt wird.
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)      ' Ausgabe: 10
PRINT OCT(20, 4)  ' Ausgabe: 0024
PRINT OCT(100, 2) ' Ausgabe: 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)
SLEEP

gibt 64 aus.

Unterschiede zu QB:

- In QB kann die Anzahl der ausgegebenen Stellen nicht festgelegt werden.

- Die Größe des zurückgegebenen Strings ist auf 32 Bits bzw. 11 Oktal-Stellen begrenzt.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
HEX, BIN, VAL, WOCT

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

OFFSETOF

Syntax: OFFSETOF( TypeName, RecordName )
Typ: Funktion
Kategorie: Speicherverwaltung

OFFSETOF gibt den Offset (Abstand in Byte zur Adresse des TYPEs) 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 Offset zurückgegeben werden soll.

Beispiel:

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

Interne Darstellung:

#Define OFFSETOF(type_,field_) CInt( @Cast( type_ ptr, 0 )->field_ )

Unterschiede zu QB: Neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __OFFSETOF in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht OFFSETOF nicht zur Verfügung und kann nur über __OFFSETOF aufgerufen werden.

Siehe auch:
TYPE, SIZEOF, VARPTR

Letzte Bearbeitung: 23.01.12
Zur Onlinefassung des Eintrags

ON ... GOSUB

Syntax: ON Ausdruck GOSUB label1[, label2 [, ...] ]
Typ: Anweisung
Kategorie: Programmorganisation

ON...GOSUB 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 mit RETURN wieder zur Zeile nach dem ON...GOSUB zurückgesprungen werden.

ON...GOSUB steht nur in den Dialektformen -lang fblite oder -lang qb zur Verfügung. Es sollte durch SELECT CASE, evtl. in Verbindung mit SUB, ersetzt werden.

Beispiel:

#LANG "fblite"
OPTION GOSUB
DIM AS INTEGER wahl = 3
ON wahl GOSUB labelA, labelB, labelC
PRINT "Good bye."
SLEEP
END

labelA:
PRINT "Wahl A"
RETURN

labelB:
PRINT "Wahl B"
RETURN

labelC:
PRINT "Wahl C"
RETURN

Ausgabe:

Wahl C
Good bye.

Unterschiede zu QB:
FreeBASIC erzeugt keinen Laufzeitfehler, wenn 'Ausdruck' negativ oder größer als 255 ist.

Unterschiede unter den FB-Dialektformen:

- ON...GOSUB steht nur in den Dialektformen -lang fblite und -lang qb zur Verfügung.

- In der Dialektform -lang fblite muss ON...GOSUB mittels OPTION GOSUB aktiviert werden.

Siehe auch:
ON...GOTO, GOSUB, RETURN, GOTO, SELECT CASE

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

ON ... GOTO

Syntax: ON Ausdruck GOTO label1[, label2 [, ...] ]
Typ: Anweisung
Kategorie: Programmorganisation

ON...GOTO 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 durch SELECT CASE ersetzt werden.

Beispiel:

DIM AS INTEGER wahl = 3
ON wahl GOTO labelA, labelB, labelC

labelA:
PRINT "Wahl A"
SLEEP
END

labelB:
PRINT "Wahl B"
SLEEP
END

labelC:
PRINT "Wahl C"
SLEEP
END

Unterschiede zu QB:
FreeBASIC erzeugt keinen Laufzeitfehler, wenn 'Ausdruck' negativ oder größer als 255 ist.

Siehe auch:
ON...GOSUB, GOTO, GOSUB, RETURN, SELECT CASE

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

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 -e, -ex oder -exx aufrufen; siehe die Kommandozeile, anderenfalls wird kein Sprung ausgeführt, der Befehl verbraucht aber dennoch Prozessorzeit.

- Das Label muss sich auf Modulebene befinden, darf also nicht in einer SUB oder FUNCTION sein; ansonsten muss zusätzlich das Schlüsselwort LOCAL verwendet werden.

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

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"
SLEEP
END

Beispiel 2: Fehlerroutine in einer SUB

ON ERROR GOTO errorhandler             ' globale Fehlerroutine setzen

SUB Test
ON LOCAL ERROR GOTO suberrorhandler  ' Fehlerroutine lokal ersetzen
ERROR 24

suberrorhandler:
PRINT "In der SUB 'Test' ist der Fehler #" & ERR & " aufgetreten!"
PRINT "Beliebige Taste zum Beenden"
SLEEP
END
END SUB

Test
END

errorhandler:
' Diese Fehlerroutine kommt nicht zum Einsatz
PRINT "Fehler #" & ERR & " ist aufgetreten!"   'Fehlernummer anzeigen
PRINT "Beliebige Taste zum Beenden"
SLEEP
END

Unterschiede zu QB:
In QB existiert das Schlüsselwort LOCAL nicht. Das Label muss sich auf Modulebene befinden.

Siehe auch:
ERROR (Anweisung), ERR (Funktion), RESUME, Der Compiler, Fehler-Behandlung in FreeBASIC, Übersicht: Fehlerbehandlung, Debugging, __FB_ERR__

Letzte Bearbeitung: 09.08.11
Zur Onlinefassung des Eintrags

ONCE

Syntax: #INCLUDE ONCE "Datei"
Typ: Schlüsselwort
Kategorie: Programmorganisation

#INCLUDE ONCE bindet eine Datei in den Quellcode ein, verhindert dabei aber, dass die Datei mehrfach eingebunden wird.

Beispiel:

#INCLUDE ONCE "windows.bi"

Unterschiede zu QB: ONCE ist neu in FreeBASIC

Siehe auch:
INCLUDE, Präprozessor-Anweisungen

Letzte Bearbeitung: 08.10.10
Zur Onlinefassung des Eintrags

OPEN (Anweisung)

Syntax:

OPEN Datei FOR Dateimodus [ACCESS Zugriffsart] [LOCK Sperrart] _
[ENCODING "Format"] AS [#]Dateinummer [LEN = Recordlänge]

Typ: Anweisung
Kategorie: Datei

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.

OPEN 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 die OPEN-Varianten am Ende dieses Eintrags.

- '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 (Dateimodus))

- 'Dateimodus' gibt an, in welchem Modus die Datei geöffnet werden soll. Möglich sind:

- RANDOM

- INPUT (Dateimodus)

- 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 kodiert werden soll. '"Format"' ist dabei einer von diesen Strings, der angibt, wie die Datei kodiert sein soll:

- ASCII

- UTF-8

- UTF-16

- UTF-32

Dadurch ist es möglich, ohne großen Aufwand Unicode-Dateien nach derzeit gültigen Kodierungsregeln 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 (Standard)

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

OPEN kann auch als Funktion eingesetzt werden. In diesem Fall müssen die übergebenen Parameter von Klammern umschlossen werden. Der Rückgabewert ist ggf. eine Fehlernummer. Wird 0 zurückgeliefert, konnte die Datei geöffnet werden.

Beispiel 1:
Öffnen der UTF-8-Datei "file.ext" im aktuellen Arbeitsverzeichnis und Ausgabe ihrer ersten Zeile auf dem Bildschirm

DIM Zeile AS STRING, DNr AS INTEGER = FREEFILE
OPEN "file.ext" FOR INPUT ENCODING "UTF-8" AS #DNr
LINE INPUT #DNr, Zeile
PRINT Zeile
CLOSE #DNr

Beispiel 2:
Dasselbe Beispiel wie oben, mit Einsatz von OPEN als Funktion:

DIM Zeile AS STRING, DNr AS INTEGER = FREEFILE
IF OPEN("file.ext" FOR INPUT ENCODING "UTF-8" AS #DNr) = 0 THEN
LINE INPUT #DNr, Zeile
PRINT Zeile
CLOSE #DNr
END IF

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.)
Beispiel: LPT: Dieses Gerät ermöglicht die Kommunikation mit dem LPT-Port und dadurch mit dem Drucker.
Weitere Informationen zum Thema finden sich bei den Spezialseiten zum Thema:

- OPEN COM

- OPEN CONS

- OPEN ERR

- OPEN LPT

- OPEN PIPE

- OPEN SCRN

Unterschiede zu QB:

- Die Verwendung von MS-DOS Gerätenamen zum Öffnen eines Datenstroms zu Hardwaregeräten ("LPT:", "SCR:", etc.) wird nur in der Dialektform -lang qb unterstützt. Verwenden Sie ansonsten die neuen Schlüsselwörter, die oben im Abschnitt 'Zugriff auf Geräte' aufgelistet sind.

- OPEN kann als Funktion eingesetzt werden, die einen Fehlercode zurückgibt.

Plattformbedingte Unterschiede:

- Unter Linux muss der Dateiname 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

- Unter Windows ist die Dateinummer, die in einer DLL verwendet wird, nicht dieselbe wie eine identische Dateinummer, die vom Hauptprogramm verwendet wird. Dateinummern können nicht einfach zwischen DLL und Hauptprogramm ausgetauscht werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Der Zugriff auf Geräte mittels OPEN COM usw. (s. o.) existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
Die Dialektform -lang qb unterstützt auch den alte GW-BASIC-Syntax

OPEN Dateimodus, [#]Dateinummer, Dateiname [, Länge]

mit dem Dateimodus "I" für Input, "O" für Output, "A" für Append, "R" für Random und "B" für Binary.

Siehe auch:
OPEN (Funktion), OPEN CONS, OPEN ERR, OPEN LPT, LPRINT (Anweisung), FREEFILE, INPUT (Dateimodus), OUTPUT, APPEND, BINARY, CLOSE, Dateien (Files), ENCODING

Letzte Bearbeitung: 25.11.11
Zur Onlinefassung des Eintrags

OPEN (Funktion)

Syntax:

Ergebnis = OPEN (Datei FOR Dateimodus [ACCESS Zugriffsart] [LOCK Sperrart] _
[ENCODING "Format"] AS [#]Dateinummer [LEN = Recordlänge])

Typ: Funktion
Kategorie: Datei

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.

OPEN 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. Der Rückgabewert ist ggf. eine Fehlernummer. Wird 0 zurückgeliefert, konnte die Datei geöffnet werden.

Siehe OPEN (Anweisung) für eine ausführliche Beschreibung des OPEN-Befehls.

Letzte Bearbeitung: 07.08.10
Zur Onlinefassung des Eintrags

OPEN COM

Syntax: OPEN COM "COMn:Optionen, erweiterte_Optionen" AS [#]Dateinummer
Typ: Anweisung
Kategorie: Hardware

OPEN COM 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] [,[Stoppbits]]]]
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, sofern es sich dort um eine korrekt konfigurierte serielle Schnittstelle handelt. '#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.

75, 110, 150, 300,.., 115200

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

Stoppbits

Anzahl der Stoppbits

1, 1.5, oder 2 (der Standardwert ist abhängig von Baudrate und Datenbits)

Die Reihenfolge innerhalb dieser Liste muss eingehalten werden. Benutzen Sie Kommata, um Platzhalter zu verwenden:

OPEN COM "COM1: ,N,8," AS #1

Wenn Sie acht Datenbits verwenden, müssen Sie als Parität 'none' (N) angeben.

Erweiterte_Optionen:

- CSn Setze die CTS-Dauer (in ms) (n>=0), 0 = abschalten, Standard = 1000

- DSn Setze die DSR-Dauer (in ms) (n>=0), 0 = abschalten, Standard = 1000

- CDn Setze die "Carrier Detect"-Dauer (in ms) (n>=0), 0 = abschalten

- OPn Setze "Open Timeout" (in ms) (n>=0), 0 = abschalten

- TBn Setze die "Transmit Buffer"-Größe (n>=0), 0 = Standard, plattformabhängig

- RBn Setze die "Receive Buffer"-Größe (n>=0), 0 = Standard, plattformabhängig

- RS Unterdrücken der RTS-Erkennung

- LF (oder ASC) Kommunikation im ASCII-Modus (füge LF zu jedem CR hinzu) - Win32 unterstützt das nicht

- BIN Das Gegenstück zu LF, funktioniert immer

- PE Erlaube Paritätsprüfung

- DT DTR nach CLOSE weiterhin erlauben

- FE ungültige Zeichen bei Fehler nicht beachten

- ME Alle Fehler ignorieren

- IRn IRQ-Nummer für COM (wird nur unter DOS unterstützt)

Beispiele:

OPEN COM "COM1:9600,N,8,1" AS #1
' Zugriff auf COM1 mit 9600 Baud, ohne
' Paritäts-Bit, acht Datenbits, ein Stoppbit

OPEN COM "COM1:115200" AS #1
' Zugriff auf COM1 mit 115200 Baud, gerader Parität, 7 Datenbits und 1 Stoppbit

Unterschiede zu QB:

- Neben der geänderten Syntax lässt sich OPEN COM auch als Funktion einsetzen; siehe OPEN (Funktion). Es wurde von Problemen bei der Verwendung von OPEN COM unter Windows XP berichtet.
Wird OPEN COM als Funktion benutzt, liefert sie 0 bei Erfolg und -1 bei Fehler.

- In QB werden nur "COM1:" und "COM2:" unterstützt. In FreeBASIC kann jede korrekt konfigurierte serielle Schnittstelle verwendet werden.

Plattformbedingte Unterschiede:

- Unter Windows verweist "COM:" auf "COM1:"

- Unter Linux verweist

- "COM:" auf "/dev/modem"

- "COM1:" auf "/dev/ttyS0"

- "COM2:" auf "/dev/ttyS1", usw.

- "/dev/xyz:" auf "/dev/xyz", usw.

- Die seriellen Schnittstellen unter DOS sind experimentell, und es kann auf die Ports 1 bis 4 zugegriffen werden. Standardmäßig werden für die Ports folgende Basisadressen und IRQs verwendet:

- COM1 - &h3f8 - IRQ4

- COM2 - &h2f8 - IRQ3

- COM3 - &h3e8 - IRQ4

- COM4 - &h2e8 - IRQ3

Seit fbc v0.18.4 kann mit der Protokoll-Option "IRn" ein alternatives IRQ festgelegt werden, wobei "n" eine Zahl von 3 bis 7 ist.
Im Augenblick nicht unterstützt werden IRQ am Slave-PIC, alternative Basisadressen für I/O, Timeouts und die meisten in QB entdeckten Fehler, hardware flow control sowie FIFOs.

Siehe auch:
OPEN (Anweisung), INP, OUT, WAIT, LPRINT (Anweisung), LPRINT USING

Letzte Bearbeitung: 07.08.10
Zur Onlinefassung des Eintrags

OPEN CONS

Syntax: OPEN CONS FOR Dateimodus AS #Dateinummer
Typ: Anweisung
Kategorie: Datei

OPEN CONS öffnet die Standard-Eingabe stdin sowie die Standard-Ausgabe stdout. Dies ist im Normalfall das Konsole-Fenster. Im Konsolenmodus kann die Ausgabe aber auch umgeleitet werden: Wird das Programm mit Umleitungszeichen (<, >, |) aufgerufen, interpretiert sie OPEN CONS entsprechend.

OPEN CONS funktioniert also genauso wie OPEN SCRN, mit dem Unterschied, dass mit OPEN CONS auch gelesen werden kann.

- 'Dateimodus' gibt einen der sequentiellen Dateimodi INPUT oder OUTPUT an.

- 'Dateinummer' ist eine Ganzzahl von 1 bis 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.

LOCATE (Anweisung) und COLOR (Anweisung) haben keine Auswirkung auf die Ausgaben, die mit OPEN CONS gemacht werden.

Beispiel:

' Quelltext zu ConsTest.exe
DIM DateiNr AS INTEGER
DateiNr = FREEFILE
OPEN CONS FOR OUTPUT AS #DateiNr
PRINT #DateiNr, "HELLO"
CLOSE #DateiNr
SLEEP

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. Um die Standardeingabe bzw. -ausgabe zurückzusetzen, muss RESET verwendet werden.

Unterschiede zu QB:
In QB lautet der Befehl OPEN "CONS:" ...

Plattformbedingte Unterschiede:
Unter Linux kann ein mit OPEN CONS geöffneter Datenstrom während des Programmlaufs nicht mehr korrekt geschlossen werden. Andere Betriebssysteme als Linux und Windows wurden nicht getestet.

Unterschiede zu früheren Versionen von FreeBASIC:

- OPEN CONS existiert erst seit FreeBASIC v0.15

- Ab v0.12 bis v0.14 existierte der analoge Befehl OPEN "CONS:" ...

Siehe auch:
OPEN (Anweisung), OPEN ERR, PRINT #, WRITE #, INPUT #, LINE INPUT #, CLOSE, RESET

Weitere Informationen:
Wikipedia-Artikel zu den Standard-Datenströmen

Letzte Bearbeitung: 20.08.10
Zur Onlinefassung des Eintrags

OPEN ERR

Syntax: OPEN ERR [FOR Dateimodus] AS [#]Dateinummer
Typ: Anweisung
Kategorie: Datei

Mit OPEN ERR wird eine Eingabe von der Standardeingabe stdin sowie eine Ausgabe auf die Standardfehlerausgabe stderr geöffnet. Standardausgabe (stdout) und Standardfehlerausgabe können sich unterscheiden; in der Regel leitet stderr auf die Konsole weiter. Damit kann OPEN ERR z. B. verwendet werden, wenn die Standardausgabe mit OPEN CONS umgeleitet wird und dennoch eine Meldung im Konsolenfenster erscheinen soll, oder wenn ein Grafikmodus verwendet wird (siehe SCREENRES) und zu Debugging-Zwecken eine Statusmeldungen auf der Konsole ausgegeben werden soll.

- 'Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten und wird ignoriert.

- 'Dateinummer' ist eine Ganzzahl von 1 bis 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.

LOCATE (Anweisung) und COLOR (Anweisung) haben keine Auswirkung auf die Ausgaben, die mit CONS oder ERR gemacht werden.

Beispiel 1: Verwendung zusammen mit OPEN CONS

' Quelltext ConsErrTest.exe
DIM AS INTEGER stdout, stderr
stdout = FREEFILE
OPEN CONS FOR OUTPUT AS #stdout
stderr = FREEFILE
OPEN ERR  FOR OUTPUT AS #stderr
PRINT #stdout, "HELLO"
PRINT #stderr, "FINISHED"
CLOSE #stdout, #stderr

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.

Beispiel 2: Verwendung zusammen mit SCREENRES

DIM AS INTEGER stderr = FREEFILE
DIM AS STRING text
OPEN ERR  FOR OUTPUT AS #stderr
SCREENRES 640, 480
LINE INPUT "Geben Sie einen beliebigen Text ein: ", text
IF text = "" THEN PRINT #stderr, "Warnung: Es wurde kein Text eingegeben!"
PRINT "Sie haben folgendes geschrieben:"
PRINT text
SLEEP

Die Ausgabe der Warnung wird auf der Konsole ausgegeben, um damit den weiteren Programmablauf nicht zu stören.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- OPEN ERR existiert erst seit FreeBASIC v0.15

- Ab v0.12 bis v0.14 existierte der analoge Befehl OPEN "ERR:" ...

Siehe auch:
OPEN (Anweisung), OPEN CONS, PRINT #, WRITE #, INPUT #, LINE INPUT #, CLOSE

Weitere Informationen:
Wikipedia-Artikel zu den Standard-Datenströmen

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

OPEN LPT

Syntax: OPEN LPT "LPT:Printer_Name,TITLE=Doc_Title,EMU=TTY" [FOR Dateimodus] AS #Dateinummer
Typ: Anweisung
Kategorie: Hardware

OPEN LPT bereitet einen Drucker darauf vor, Daten vom Befehl PRINT # bzw. PUT # auszugeben. Anders als bei LPRINT kann jeder Drucker angesprochen werden, der im System registriert ist. Auch USB-Drucker können verwendet werden.

- 'x' gibt eine Port-Nummer an. Wird die Zahl ausgelassen, dann werden die Daten an den Drucker-Spooler gesendet.

- '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 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), Carriage 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. "EMU=TTY" steht nur unter Windows zur Verfügung.

- 'FOR Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten und wird ignoriert.

- '#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.

OPEN LPT kann auch als Funktion eingesetzt werden. In diesem Fall müssen die übergebenen Parameter von Klammern umschlossen werden. Der Rückgabewert ist ggf. eine Fehlernummer. Wird 0 zurückgeliefert, konnte der Drucker geöffnet werden.

Beispiel 1:
"Hello World" drucken

DIM AS INTEGER Drucker = FREEFILE
OPEN LPT "LPT:" FOR OUTPUT AS #Drucker
PRINT #Drucker,"Hello World!"
PRINT #Drucker, CHR(12)    'Neue Seite: die meisten Druckertreiber machen nichts
'bis eine neue Seite empfangen wird
CLOSE #Drucker

Beispiel 2:
Den Inhalt der Datei test.txt auf dem Windows-Drucker "ReceiptPrinter" drucken

DIM RptInput AS STRING
DIM AS INTEGER RptFilehandle = FREEFILE

OPEN "test.txt" FOR INPUT AS #RptFilehandle

DIM AS INTEGER 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 druecken..."
GETKEY

Plattformbedingte Unterschiede:

- Das Argument "EMU=TTY" wird unter Linux und DOS ignoriert.

- "Printer_Name" und "TITLE=Doc_Title" werden unter DOS ignoriert

- Unter Linux muss ein Drucker-Spooler installiert sein, der über lp verfügbar ist. Der Zugriff auf den Spooler wurde nur mit CUPS getestet, aber es können auch andere Spooler funktionieren, die durch lp aufgerufen werden. Bei der Angabe des Ports entspricht "LPT1:" "/dev/lp0" usw.
Die Daten müssen in einer Druckersprache (ESC/P, HPGL, PostScript etc.) gesendet werden. Emulationsmodi werden unter Linux noch nicht unterstützt.

- Unter DOS werden Drucker-Spooler nicht unterstützt. Drucker müssen über "LPTx:" geöffnet werden.
Die Daten müssen in einer Druckersprache (ESC/P, HPGL, PostScript etc.) gesendet werden. Emulationsmodi werden unter DOS noch nicht unterstützt.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb wird die alte Syntax OPEN "LPT:..." unterstützt. Wird diese Syntax in einer anderen Dialektform eingesetzt, dann wird eine normale Datei geöffnet.

Siehe auch:
OPEN (Anweisung), LPRINT (Anweisung)

Letzte Bearbeitung: 09.08.10
Zur Onlinefassung des Eintrags

OPEN PIPE

Syntax: OPEN PIPE "Shellbefehl" FOR Dateimodus [ACCESS Zugriffsart] AS [#]Dateinummer
Typ: Anweisung
Kategorie: Datei

PIPE ist ein Gerät, auf das man 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.

- '"Shellbefehl"' ist eine beliebige Kommandozeile, wie sie mit SHELL aufgerufen werden kann. Diese Kommandozeile wird normal ausgeführt.

- 'Dateimodus' gibt einen der Dateimodi INPUT, OUTPUT oder BINARY an. Bei BINARY wird zudem die Angabe der Zugriffsart erwartet. Der Zugriff auf den aufgerufenen Befehl erfolgt, je nach Angabe, über die Standardeingabe (stdin) oder die Standardausgabe (stdout) des Befehls.

- 'Zugriffsart' wird zusammen mit dem Dateimodus BINARY benötigt und lautet entweder READ oder WRITE.

- 'Dateinummer' ist eine Ganzzahl von 1 bis 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:

#IFDEF __FB_UNIX__
CONST TEST_COMMAND = "ls *"
#ELSE
CONST TEST_COMMAND = "dir *.*"
#ENDIF

DIM AS INTEGER nr = FREEFILE
DIM s AS STRING

OPEN PIPE TEST_COMMAND FOR INPUT AS #nr

DO UNTIL EOF(nr)
LINE INPUT #nr, s
PRINT s
LOOP
CLOSE #nr
SLEEP

Ein umfangreicheres Beispiel zu OPEN PIPE findet sich in der Code-Beispiel-Rubrik des FreeBASIC-Portals.

FreeBASIC unterstützt keine bidirektionalen Pipes. Diese müssen über die API-Funktionen des Betriebssystems initialisiert werden.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Der Dateimodus BINARY wird nicht von allen Plattformen unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC:

- OPEN PIPE existiert erst seit FreeBASIC v0.15

- Ab v0.13 bis v0.14 existierte der analoge Befehl OPEN "PIPE:Shellbefehl" ...

Siehe auch:
OPEN (Anweisung), CLOSE, INPUT #, LINE INPUT #, EOF, SHELL

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

OPEN SCRN

Syntax: OPEN SCRN [FOR Dateimodus] AS #Dateinummer
Typ: Anweisung
Kategorie: Datei

Über SCRN kann auf das Standardausgabegerät im Lese- und Schreibmodus zugegriffen werden. Das Standardausgabegerät ist im Normalfall das Konsole-Fenster. Durch die Umleitungszeichen kann die Ausgabe aber auch umgeleitet werden: Wird das Programm mit Umleitungszeichen (<, >, |) aufgerufen, interpretiert sie SCRN entsprechend. Auf SCRN können nur Ausgaben erfolgen; ein Versuch, von SCRN zu lesen, führt zu einer Endlosschleife.

- 'Dateimodus' wurde nur aus Kompatibilitätsgründen beibehalten und wird ignoriert.

- 'Dateinummer' ist eine Ganzzahl von 1 bis 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.

LOCATE (Anweisung) und COLOR (Anweisung) haben keine Auswirkung auf die Ausgaben, die mit SCRN gemacht werden.

Beispiel:

' Quelltext zu ScrnTest.exe
DIM AS INTEGER nr = FREEFILE
OPEN SCRN AS #nr
PRINT #nr, "Test"
CLOSE #nr

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.

Unterschiede zu QB:
In QB lautet der Befehl OPEN "SCRN:" ...

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
OPEN (Anweisung), OPEN CONS, PRINT #, WRITE #, INPUT #, LINE INPUT #, CLOSE

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

OPERATOR

Syntax A:

TYPE typname
' Typdeklarationen
DECLARE [STATIC] OPERATOR Operatorname ([Parameterliste]) [AS Datentyp]
END TYPE

Syntax B:

[STATIC] OPERATOR Typename.Operatorname ([Parameterliste]) [AS Datentyp]

Typ: Prozedur
Kategorie: Programmorganisation

OPERATOR deklariert oder definiert einen überladenen Operator. Der Befehl kann im Zusammenhang mit TYPE, CLASS und UNION eingesetzt werden.

- 'Typenname' gibt den Namen von TYPE, CLASS bzw. UNION an.

- 'Operatorname' ist eine Zuweisung, ein Iterator oder ein unärer oder binärer Operator.

Als 'Operatorname' sind folgede Operatoren erlaubt:

Zuweisung:

unärer Operator:

binärer Operator:

Iterator:

- LET

- +=

- -=

- *=

- /=

- \=

- MOD=

- SHL=

- SHR=

- AND=

- OR=

- XOR=

- IMP=

- EQV=

- ^=

- - (Negation)

- NOT

- @

- * (Pointer-Dereferenzierung)

- ->

- NEW

- DELETE

- ABS

- SGN

- FIX

- FRAC

- INT

- EXP

- LOG

- SIN

- ASIN

- COS

- ACOS

- TAN

- ATN

- CAST

- + (Addition)

- - (Subtraktion)

- * (Multiplikation)

- / (Division)

- \ (Integerdivision)

- MOD

- SHL

- SHR

- AND

- OR

- XOR

- IMP

- EQV

- ^ (Exponent)

- = (Vergleich)

- <>

- <

- >

- <=

- >=

- FOR

- STEP

- NEXT

Eine Überladung der unären Operatoren zur Pointer-Dereferenzierung * und der Pointer-Referenzierung -> arbeitet zur Zeit nicht korrekt.

Hinweis: LET verweist auf den Zuweisungsoperator wie in LET a=b (das Schlüsselwort LET wird im üblichen Gebrauch weggelassen)

Ein Beispiel zur Überladung von Iteratoren wird in diesem Tutorial behandelt.

Beschreibung:
Mit OPERATOR kann festgelegt werden, wie die oben genannten Operatoren arbeiten sollen, wenn mindestens eines der Argumente dem Datentyp des TYPE-, CLASS-, ENUM- oder UNION-Blocks entspricht.

Operatoren sind Funktionen. Der Operator '+' arbeitet wie FUNCTION plus( a AS datentyp, b AS datentyp ) AS datentyp. Operatoren können überladen werden, um verschiedene Datentypen als Parameter zu akzeptieren. Nur der CAST-Operator kann auch dazu überladen werden, um verschiedene Datentypen zurückzugeben.

Manche Operatoren werden innerhalb des Typs oder der Klasse deklariert, manche außerhalb. Dabei gilt:

- LET und andere Zuweisungen müssen innerhalb von TYPE oder CLASS (usw.) deklariert werden.

- NEW, DELETE und @ müssen ebenfalls innerhalb von TYPE oder CLASS definiert werden. Bei NEW und @ ist der Rückgabewert ein Pointer. DELETE besitzt keinen Rückgabewert.

- Unäre und binäre Operatoren (außer @) müssen außerhalb von TYPE oder CLASS deklariert werden. Ihr Rückgabewert wird explizit angegeben. Sie können jeden erlaubten Datentyp zurückgeben, außer -> (Zeiger auf Element-Zugriff), das den Datentyp von TYPE bzw. CLASS zurückgeben muss. Vergleichsoperatoren können nur dann sinnvoll eingesetzt werden, wenn der Rückgabewert als Zahl interpretiert werden kann. CAST darf nicht den Datentyp des TYPE bzw. CLASS zurückgeben.

Sämtliche Definitionen der Operatoren stehen außerhalb der TYPE- bzw. CLASS-Definition.

Beispiel:

TYPE Vector
AS SINGLE x, y
' gibt einen String zurück, der die Vektordaten enthält.
DECLARE OPERATOR CAST() AS STRING
END TYPE

' erlaubt die Addition zweier Vektoren
DECLARE OPERATOR + (v1 AS Vector, v2 AS Vector) AS Vector

OPERATOR Vector.CAST () AS STRING
RETURN "(" + STR(x) + ", " + STR(y) + ")"
END OPERATOR

OPERATOR + (v1 AS Vector, v2 AS Vector) AS Vector
RETURN TYPE<Vector>( v1.x + v2.x, v1.y + v2.y )
END OPERATOR

DIM a AS Vector = TYPE<Vector>( 1.2, 3.4 )
DIM b AS Vector = TYPE<Vector>( 8.9, 6.7 )

PRINT "a = "; a
PRINT "b = "; b
PRINT "a + b = "; a + b

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- OPERATOR existiert seit FreeBASIC 0.17

- Die Operatoren EXP, LOG, SIN, ASIN, COS, ACOS, TAN und ATN sind seit Version 0.22.0 überladbar

Siehe auch:
TYPE (UDT), UNION

Letzte Bearbeitung: 23.02.12
Zur Onlinefassung des Eintrags

OPTION

Syntax: OPTION Programmstandard
Typ: Anweisung
Kategorie: Programmorganisation

OPTION setzt verschiedene Standards in Ihrem Programm. Die Anweisung 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 nicht mehr zulässig!

'Programmstandard' ist eines von diesen Schlüsselwörtern:

- BASE

- PRIVATE (Schlüsselwort)

- BYVAL (Schluesselwort)

- DYNAMIC (Schlüsselwort) oder STATIC (Schlüsselwort)

- EXPLICIT

- ESCAPE

- GOSUB

- NOGOSUB

- NOKEYWORD

Dieser Befehl sollte nicht mit Option() verwechselt werden, siehe Option()

OPTION-Zeilen sollten die ersten Zeilen Ihres Programms 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 kompilieren 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 55: 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.

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

- Seit FreeBASIC v0.17 können Programmstandards nur noch dann mit OPTION festgelegt werden, wenn die Kommandozeilenoption -lang deprecated angegeben wurde. Soll mit -lang fb kompiliert werden, ist es nicht mehr erlaubt, OPTION zu benutzen. Sehen Sie bitte die einzelnen Schlüsselwörter ein, um entsprechende Walkarounds nachzulesen.

Siehe auch:
Option()

Letzte Bearbeitung: 08.10.10
Zur Onlinefassung des Eintrags

Option()

Syntax: Option("Text")
Typ: Schlüsselwort
Kategorie: Programmorganisation

Option() ermöglicht es dem Programmierer zusätzliche Attribute oder Merkmale zu setzen.
Der Übergabeparameter 'Text' ist ein String und muss in Anführungszeichen und Klammern stehen. Nicht erkannte Optionen werden ignoriert.

Option kann auch als Befehl für das Setzen von Compilieroptionen verwendet werden. Siehe hierzu OPTION.

Die möglichen Optionen sind:

SSE
Option("SSE") bewirkt, dass eine Gleitkommazahl (SINGLE oder DOUBLE), die von einer Funktion zurückgegeben wird, im xmm0 Register gespeichert wird. Der Befehl wird ignoriert, sollte nicht mit -fpu SSE compiliert worden sein.
Der Befehl muss sich direkt hinter dem Rückgabetypen einer Funktionsdeklaration oder -definition befinden. Es handelt sich hierbei nur um eine Optimierung und wird nicht dazu benötigt, Programme mit -fpu SSE zu compilieren.

DECLARE FUNCTION ValueInXmm0 () AS DOUBLE OPTION("sse")

FPU
Option("FPU") bewirkt, dass eine Gleitkommazahl (SINGLE oder DOUBLE), die von einer Funktion zurückgegeben wird, im st(0) Register gespeichert wird. Der Befehl muss sich direkt hinter dem Rückgabetypen einer Funktionsdeklaration oder -definition befinden.

DECLARE FUNCTION ValueInStZero () AS DOUBLE OPTION("fpu")

Unterschiede zu QB: Neu in FreeBASIC.

Siehe auch:
Compileroptionen

Letzte Bearbeitung: 07.09.11
Zur Onlinefassung des Eintrags

OR (Methode)

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], OR
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.

Beispiel: drei überlappende Kreise in verschiedenen Farben zeichnen

SCREENRES 320, 200, 16

' 3 Sprite mit je einem Kreis in den Farben rot, grün und blau erzeugen
CONST AS INTEGER radius = 32
DIM AS ANY PTR rotkreis, gruenkreis, blaukreis
rotkreis   = IMAGECREATE(radius * 2 + 1, radius * 2 + 1, RGBA(0, 0, 0, 0))
gruenkreis = IMAGECREATE(radius * 2 + 1, radius * 2 + 1, RGBA(0, 0, 0, 0))
blaukreis  = IMAGECREATE(radius * 2 + 1, radius * 2 + 1, RGBA(0, 0, 0, 0))
CIRCLE rotkreis,   (radius, radius), radius, RGB(255, 0, 0), , , 1, f
CIRCLE gruenkreis, (radius, radius), radius, RGB(0, 255, 0), , , 1, f
CIRCLE blaukreis,  (radius, radius), radius, RGB(0, 0, 255), , , 1, f

' Kreise überlappend zeichnen
PUT (146 - radius, 108 - radius), rotkreis,   OR
PUT (174 - radius, 108 - radius), gruenkreis, OR
PUT (160 - radius,  84 - radius), blaukreis,  OR

' Speicher freigeben und auf Tastendruck warten
IMAGEDESTROY rotkreis
IMAGEDESTROY gruenkreis
IMAGEDESTROY blaukreis
SLEEP

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

OR (Operator)

Syntax A: Ergebnis = Ausdruck1 OR Ausdruck2
Syntax B: Ausdruck1 OR= Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

OR kann als einfacher (Syntax A) und kombinierter (Syntax B) Operator eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 OR Ausdruck2

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.

OR kann mithilfe von OPERATOR überladen werden.

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."
END IF

Beispiel 2: Adjunktion 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

Beispiel 3: OR als kombinierter Operator

DIM AS INTEGER w, bnr

PRINT "Bitte geben Sie die Nummer des Bits ein, ";
INPUT "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

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
OR (Methode), NOT, AND (Operator), XOR (Operator), IMP, EQV, ORELSE, Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

ORELSE

Syntax: Ausdruck1 ORELSE Ausdruck2
Typ: Operator
Kategorie: Kurzform

ORELSE prüft zwei Ausdrücke auf ihren Wahrheitsgehalt und gibt -1 zurück, wenn mindestens einer der beiden Ausdrücke wahr ist. Ansonsten wird 0 zurückgegeben.

Zunächst wird 'Ausdruck1' geprüft. Wenn dieser 0 (false) ergibt, wird auch 'Ausdruck2' ausgewertet, sonst wird -1 (true) zurückgegeben. ORELSE liefert also nur dann 0 (false), wenn beiden Ausdrücke 0 ergeben; allerdings wird 'Ausdruck2' nur dann ausgewertet, wenn 'Ausdruck1' 0 war.

Beispiel: ORELSE in einer IF-THEN-Bedingung:

IF (x < 0) ORELSE (x > 639) THEN
PRINT "x ist ausserhalb des sichtbaren Bereiches"
END IF

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.20 CVS

Siehe auch:
ANDALSO, OR (Operator), Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

OUT

Syntax: OUT Port, Wert
Typ: Anweisung
Kategorie: Hardware

OUT schreibt ein Byte an einen Ausgabeport (Hardware).

- 'Port' ist die Adresse (16 Bit) des Ausgabeports.

- 'Wert' ist der Ausgabewert (8 Bit)

Direkte Portzugriffe sind unter Windows NT, 2000, XP und Vista ohne einen speziellen Systemtreiber nicht möglich. Ab FreeBASIC v0.15b wird vom FreeBASIC-Compiler ein 3KB großer Systemtreiber in die erstellte EXE integriert. Diese Systemtreiber wird nur ausgeführt, wenn das Programm unter Administrator-Rechten gestartet wurde. Danach können auch Programme, die nicht unter Administrator-Rechten laufen, auf diesen Treiber zugreifen. Nach jedem Neustart des Betriebssystems ist ein erneuter Aufruf des Systemtreibers unter Administrator-Rechten erforderlich.

Windows NT und dessen Nachfolger verwenden dies als Sicherheitsmaßnahme, da der Büronutzer selbstverständlich nicht im schlimmsten Falle die Hardware zerstören soll. Man sollte daher wissen was man tut, wenn man diesen Befehl anwendet.

Der von FBC aktuell integrierte Treiber wird nicht auf Linux angewandt. Daher muss beim Zugriff unter Linux mit Root-Rechten gearbeitet werden, andernfalls findet keine Ausführung statt. Unter allen anderen Betriebssytemen, welche FreeBASIC unterstützt, ist dies nicht nötig.

Unterschiede zu früheren Versionen von FreeBASIC:

- Bis FreeBASIC v0.14 emuliert OUT den VGA-Grafik-Port. Der Befehl 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.

- Ab FreeBASIC v0.15b werden Zugriffe auf den VGA-Port immer noch emuliert, wie in FreeBASIC v0.14. Wenn der Zugriff auf den Port fehlschlägt, wird ein Laufzeit-Fehler erzeugt.

Unterschiede zu QB:
OUT ist auf die Emulation des VGA-Ports begrenzt; nur die Ports &H3C7, &H3C8 und &H3C9 funktionieren.

Siehe auch: PALETTE, PALETTE GET, INP, WAIT

Letzte Bearbeitung: 18.08.11
Zur Onlinefassung des Eintrags

OUTPUT

Syntax: OPEN Dateiname FOR OUTPUT [ ... ]
Typ: Schlüsselwort
Kategorie: Datei

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

Vorsicht: Wenn Sie eine bereits bestehende Datei FOR OUTPUT öffnen, wird sie gelöscht und neu angelegt! Wenn stattdessen neue Daten an eine bestehende Datei angehängt werden sollen, sodass vorhandene Daten erhalten bleiben, muss statt OUTPUT APPEND verwendet werden.

Siehe auch:
OPEN (Anweisung), PRINT #, WRITE #

Weitere Informationen:
QB Express Issue #4: File Manipulation In QuickBasic: Sequential Files

Letzte Bearbeitung: 07.08.10
Zur Onlinefassung des Eintrags

OVERLOAD

Syntax:

DECLARE FUNCTION Funktionsname OVERLOAD (Parameterliste) AS Typ
DECLARE SUB Funktionsname OVERLOAD (Parameterliste)

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 müssen die OVERLOAD-Klausel nicht tragen, auch wenn es keinen Fehler ausgibt, wenn sie angegeben wird.

Funktionen, die in UDTs deklariert sind, müssen die OVERLOAD-Klausel nicht erhalten, da innerhalb des TYPEs standardmäßig alle Funktionen überladen sind.

Eine überladene Funktion muss sich durch mindestens einen Übergabeparameter von den anderen unterscheiden.

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 zu QuickBASIC: Neu in FreeBASIC.

Siehe auch:
DECLARE, FUNCTION, SUB, Prozeduren

Letzte Bearbeitung: 07.09.11
Zur Onlinefassung des Eintrags

Startbuchstabe P

PAINT

Syntax: PAINT [Puffer] [, STEP] (x, y)[, [Füllfarbe][, Randfarbe] ]
Typ: Anweisung
Kategorie: Gfx

PAINT füllt in einem Grafikfenster einen Bereich mit einer Farbe. Das Verfahren ist 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 dieselben Regeln wie bei COLOR. Wenn hier ein STRING angegeben wird, behandelt FreeBASIC diesen als Muster, in 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, 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 1: Einen weißen, innen rot ausgefüllten Kreis zeichnen und 3 Sekunden warten:

SCREENRES 320, 200
CIRCLE (160, 100), 30, 15
PAINT  (160, 100), 1 , 15

SLEEP 3000

Beispiel 2: Verwendung eines Füllmusters

CONST bit_tiefe = 8 ' Farbtiefe wählen - möglich ist 8, 16 oder 32

' Funktion zur Umwandlung eines Farbwertes in den für das Füllmuster benötigten String
FUNCTION paint_pixel( BYVAL c AS UINTEGER, BYVAL tiefe AS INTEGER ) AS STRING
IF tiefe <= 8 THEN         ' 8-bit:
RETURN CHR( CUBYTE(c) )
ELSEIF tiefe <= 16 THEN    ' 16-bit:
RETURN MKSHORT( c SHR 3 AND &h1f OR _
c SHR 5 AND &h7e0 OR _
c SHR 8 AND &hf800 )
ELSEIF tiefe <= 32 THEN    ' 32-bit:
RETURN MKL(c)
END IF
END FUNCTION

SCREENRES 320, 200, bit_tiefe   ' Grafikfenster in gewünschter Bit-Tiefe öffnen

DIM AS UINTEGER c, c1, c2       ' Variablen für die Farbwerte
DIM AS UINTEGER randfarbe
DIM AS STRING fuellmuster = ""  ' Variable für das Füllmuster

' Farben setzen
IF bit_tiefe <= 8 THEN
c1        = 7  ' Füllfarbe 1
c2        = 8  ' Füllfarbe 2
randfarbe = 15 ' Randfarbe
ELSE
c1        = RGB(192, 192, 192) ' Füllfarbe 1
c2        = RGB(128, 128, 128) ' Füllfarbe 2
randfarbe = RGB(255, 255, 255) ' Randfarbe
END IF

' Karomuster erstellen
FOR y AS UINTEGER = 0 TO 7
FOR x AS UINTEGER = 0 TO 7
' Farbe des Pixels wählen (c)
IF (x \ 4 + y \ 4) MOD 2 > 0 THEN
c = c1
ELSE
c = c2
END IF
' Pixel zum Muster hinzufügen
fuellmuster &= paint_pixel(c, bit_tiefe)
NEXT x
NEXT y

' Kreis zeichnen und mit dem Muster füllen
CIRCLE (160, 100), 50, randfarbe
PAINT (160, 100), fuellmuster, randfarbe
SLEEP

Unterschiede zu QB:

- Der optionale Parameter 'Hintergrund' existiert unter FreeBASIC nicht mehr.

- In FreeBASIC ist es möglich, in einen Datenpuffer zu zeichnen.

Siehe auch:
SCREENRES, COLOR (Anweisung), Grafik

Letzte Bearbeitung: 23.07.11
Zur Onlinefassung des Eintrags

PALETTE

Typ: Anweisung
Kategorie: Gfx
Syntax A: PALETTE [Index, Farbe]
Syntax B: PALETTE Index, Rotwert, Grünwert, Blauwert
Syntax C: PALETTE USING ArrayName[(idx)]

PALETTE bearbeitet die aktuelle Farbpalette.

- 'Index' ist die Nummer der Farbe, die bearbeitet werden soll.

- 'Farbe' ist der neue BGR-Farbwert, welcher der angegebenen Farbnummer zugewiesen werden soll.

- 'Rotwert', 'Grünwert' und 'Blauwert' 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 von der aktuellen Farbtiefe des Grafikfensters. Wird das Grafikfenster mit SCREEN initialisiert, dann gelten folgende Farbbereiche:

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 - 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 sowie bei der Verwendung von SCREENRES 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 SCREENRES- oder SCREEN-Befehl stellt die Standardpalette wieder her (siehe auch Standard-Paletten).

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 (Syntax 3) ä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. Es müssen INTEGER-Werte sein, die 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:

SCREENRES 640, 480, 4     ' 16 indizierte Farben
DIM AS INTEGER rot, gruen, blau, farbe

'Vertikale Streifen in allen 16 Farben zeichnen
FOR i AS INTEGER = 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 AS INTEGER = 0 TO 15
rot   = 0
gruen = 0
blau  = i * 4
farbe = rot OR (gruen SHL 8) OR (blau SHL 16)
PALETTE i, farbe
NEXT

GETKEY

'Farbverlauf von Schwarz nach Grün
FOR i AS INTEGER = 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 AS INTEGER = 0 TO 15
Farben(i) = i * 4
NEXT
PALETTE USING Farben
GETKEY

'Standardpalette wiederherstellen
PALETTE
SLEEP

Unterschiede zu früheren Versionen von FreeBASIC:
Seit Version 0.13b ist es auch möglich, die Teilfarben als einzelne Parameter anzugeben (Syntax B).

Siehe auch:
PALETTE GET, SCREENRES, COLOR (Anweisung), Standardpaletten, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PALETTE GET

Typ: Anweisung
Kategorie: Gfx
Syntax A: PALETTE GET Index, Farbe
Syntax B: PALETTE GET Index, Rotwert, Grünwert, Blauwert
Syntax C: PALETTE GET USING ArrayName(idx)

PALETTE GET speichert den Farbwert eines Palette-Eintrags in einer Variable, einem Array oder in drei einzelnen Speicherstellen.

- 'index' ist der Farbindex, dessen Wert zurückgegeben werden soll.

- 'Farbe' ist eine Variable, in welcher der BGR-Wert gespeichert werden soll.

- 'Rotwert', 'Grünwert' und 'Blauwert' 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 BGR-Wert zurück und speichert ihn in einer Variable, oder es teilt ihn in seine Einzelfarben auf und speichert diese in drei Variablen (dann allerdings in der Reihenfolge rot, grün, blau). 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 farbe AS INTEGER, rot AS INTEGER, gruen AS INTEGER, blau AS INTEGER, i AS INTEGER
DIM farben(15) AS INTEGER

SCREENRES 400, 300, 4   ' 16 indizierte Farben

PALETTE GET 1, farbe
PRINT "Der BGR-Farbwert von Farbe 1 ist &h"; HEX(farbe)
PRINT

PALETTE GET 2, rot, gruen, blau
PRINT "Farbe 2 setzt sich aus diesen Farben zusammen:"
PRINT "Rot:"; rot; " Gruen:"; gruen; " Blau:"; blau
PRINT

PALETTE GET USING farben(0)
PRINT "Alle Farben:"
FOR i = 0 TO 15
IF i = 0 THEN
COLOR 0, 15         ' schwarz auf weiß, da man es sonst nicht sieht
ELSE
COLOR i, 0          ' farbig auf schwarzem Hintergrund
END IF
PRINT "Farbe"; i; ": ";
IF i < 10 THEN PRINT " ";
PRINT "&h"; HEX(farben(i),6)
NEXT

SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.14

Siehe auch:
PALETTE, SCREENRES

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PASCAL

Syntax: [DECLARE] {SUB | FUNCTION} prozedurname PASCAL [OVERLOAD] [ALIAS "externerName"] [(parameterliste) ...] {AS rueckgabetyp} {CONSTRUCTOR [priorität]} [STATIC] [EXPORT]
Typ: Schlüsselwort
Kategorie: Fremdsprachen

Das Schlüsselwort PASCAL 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.

Die PASCAL-Aufrufkonvention ist das Gegenteil der CDECL-Konvention. Die Parameter werden in der Reihenfolge von links nach rechts ( -> ) auf dem Stack abgelegt, und die aufgerufene Funktion muss den Stack vor dem Rücksprung mit RET XX (Return, Anzahl Byte) ausgleichen.

PASCAL ist die Aufrufkonvention, die standardmäßig in Microsoft QuickBASIC und in der API für Windows 3.1 verwendet wird.

Beispiel: Vergleich der verschiedenen Aufrufmöglichkeiten

SUB s STDCALL (s1 AS INTEGER, s2 AS INTEGER)
PRINT "StdCall ", s1, s2
END SUB
SUB c CDECL (c1 AS INTEGER, c2 AS INTEGER)
PRINT "Cdecl ", c1, c2
END SUB
SUB p PASCAL (p1 AS INTEGER, p2 AS INTEGER)
PRINT "Pascal ", p1, p2
END SUB

ASM
push 2 '2. Parameter - s2
push 1 '1. Parameter - s1
CALL s 'rechts nach links

push 2 '2. Parameter - c2
push 1 '1. Parameter - c1
CALL c 'rechts nach links
ADD esp, 8 'der Stack muss durch die aufrufende Funktion aufgeräumt werden

push 1 '1. Parameter - p1
push 2 '2. Parameter - p2
CALL p 'links nach rechts

END ASM

SLEEP

Unterschiede zu QB: neu in FreeBASIC.

Siehe auch:
DECLARE, CDECL, STDCALL

Letzte Bearbeitung: 11.09.11
Zur Onlinefassung des Eintrags

PCOPY

Syntax: PCOPY Quellseite, Zielseite
Typ: Anweisung
Kategorie: Gfx

PCOPY kopiert den Inhalt einer Bildschirmseite auf eine andere. Der Befehl wird benutzt, um weiche Animationen zu erzeugen, indem auf eine unsichtbare Arbeitsseite gezeichnet wird, deren Inhalt per PCOPY auf die aktive Seite übertragen wird. Diese Technik ist auch als 'double buffering' oder 'page flipping' bekannt.

- 'Quellseite' ist die Nummer einer Bildschirmseite, die in einem vorhergehenden SCREENRES-Befehl erstellt wurde. Wird dieser Parameter ausgelassen, nimmt FreeBASIC automatisch die Nummer der aktiven Bildschirmseite an.

- 'Zielseite' ist ebenfalls die Nummer einer Bildschirmseite Wird dieser Parameter ausgelassen, nimmt FreeBASIC automatisch die Nummer der sichtbaren Bildschirmseite an.

Die 'Zielseite' wird mit dem Inhalt der 'Quellseite' überschrieben, wenn PCOPY aufgerufen wird.

Beispiel 1:

SCREENRES 320, 240, 32, 2
DIM AS INTEGER x = 50, max_x = 270

SCREENSET 0, 1       ' aktive Seite auf 0 und die sichtbare Seite auf 1 setzen

DO WHILE x < max_x
' aktive Seite löschen und Kreis zeichnen
CLS
SLEEP 25           ' Diese Pause würde ohne double buffering starkes Flackern hervorrufen
CIRCLE (x, 50), 50
x += 1             ' Kreis im nächsten Durchgang um 1 nach rechts verschieben
SCREENSYNC         ' auf Bildschirm-Aktualisierung warten
PCOPY              ' Kreis von der aktiven Seite auf die sichtbare Seite kopieren
LOOP

SLEEP

Im Grafikmodus macht PCOPY dasselbe wie FLIP und SCREENCOPY, PCOPY ist aber der einzige Befehl, der auch im Konsolen-Modus funktioniert.

Beispiel 2: PCOPY im Konsolen-Modus (SCREEN 0)
Dieses Beispiel funktioniert nur unter Windows und DOS und erst seit FreeBASIC v18.2. Unter Linux ist der Einsatz von PCOPY im Konsolenmodus nicht möglich.

' aktive Seite auf 0 und die sichtbare Seite auf 1 setzen
#IF __FB_LANG__ = "QB"
SCREEN ,, 0, 1
#ELSE
SCREEN , 0, 1
#ENDIF

DIM AS INTEGER i, frames, fps
DIM AS DOUBLE t

t = TIMER

DO
' aktive Seite beschreiben
CLS
LOCATE 1, 1
COLOR (i AND 15), 0
PRINT String$(80 * 25, HEX$(i, 1));
i += 1

' Frames pro Sekunde ausgeben
COLOR 15, 0
LOCATE 1, 1
PRINT "fps: " & fps,
IF INT(t) <> INT(TIMER) THEN
t = TIMER
fps = frames
frames = 0
END IF
frames += 1

' aktive Seite auf die sichtbare Seite kopieren
PCOPY

' 50ms pro Frame warten, um CPU-Zeit freizugeben
SLEEP 50, 1
LOOP UNTIL LEN(Inkey$)

Plattformbedingte Unterschiede:
PCOPY kann im SCREEN-Modus 0 nur unter Windows und DOS eingesetzt werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Die Möglichkeit, PCOPY im SCREEN-Modus 0 einzusetzen (unter Windows und DOS), besteht seit FreeBASIC v18.2

Siehe auch:
FLIP, SCREENCOPY, SCREENRES, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PEEK

Syntax: PEEK ([Datentyp,] Adresse)
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 UDTs (user-defined types; siehe TYPE) werden akzeptiert. Die zu lesende Datenmenge richtet sich hier nach der Länge des STRINGs bzw. der Größe des UDTs. Wird 'Datentyp' ausgelassen, nimmt FreeBASIC automatisch UBYTE an.

- 'Adresse' ist ein Pointer auf die Speicherstelle im RAM, von der gelesen werden soll.

- Der Rückgabewert ist eine Referenz auf den Wert, der sich an der Speicherstelle befindet.

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 byteAddr AS BYTE PTR, shortAddr AS SHORT PTR, intAddr AS INTEGER PTR

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

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

Die Syntax *Pointer gibt also den Wert zurück, der an der Speicherstelle steht, auf die der Pointer zeigt. Wie viele Bytes gelesen werden, hängt dabei vom Typ des Pointers ab (BYTE PTR, SINGLE PTR, ...)

Unterschiede zu QB:

- Unter QB ist es nicht möglich, den Datentyp des zu lesenden Werts festzulegen; es wird immer ein UBYTE zurückgegeben.

- Unter FreeBASIC gibt PEEK eine Referenz auf den Wert an der angegebenen Speicherstelle zurück.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.16 ist der Standard-Rückgabetyp UBYTE; davor war es BYTE.

- Seit FreeBASIC v0.13 ist es möglich, STRINGs und UDTs zu lesen.

Siehe auch:
POKE, VARPTR, SADD, Pointer, Datentypen, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

PIPE

Siehe OPEN PIPE

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

PMAP

Syntax: PMAP(Koordinate, Funktion)
Typ: Funktion
Kategorie: Gfx

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

Beispiel:

SCREENRES 640, 480
WINDOW SCREEN (0, 0)-(100, 100)
PRINT "Logical x=50, Physical x="; PMAP(50, 0)
PRINT "Logical y=50, Physical y="; PMAP(50, 1)
PRINT "Physical x=160, Logical x="; PMAP(160, 2)
PRINT "Physical y=60, Logical y="; PMAP(60, 3)
SLEEP

Siehe auch:
WINDOW, VIEW (Grafik), Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

POINT

Syntax A: POINT(x, y [, Puffer] )
Syntax B: POINT(Funktion)
Typ: Funktion
Kategorie: Gfx

POINT gibt Informationen über die zuletzt gesetzten Pixel oder die Farbe eines Pixels zurück.

- 'x' und 'y' sind die Koordinaten des Pixels, dessen Farbe zurückgegeben werden soll. Die Koordinaten sind von den letzten WINDOW und VIEW-Anweisungen abhängig.

- 'Puffer' ist ein Puffer, wie er mit PUT verwendet wird. Wird 'Puffer' ausgelassen, so liest FreeBASIC direkt vom Bildschirm.

- 'Funktion' gibt an, welche Koordinate zurückgegeben werden soll.

Wenn die Koordinaten (Syntax A) außerhalb des aktuellen Clipping-Bereichs liegen, gibt POINT -1 zurück. Achtung: In einem TrueColor-Screenmodus kann auch ein weißer Pixel diesen Wert zurückgeben!
Andernfalls ist das Ergebnis eine Zahl im Format, das auch bei COLOR verwendet wird.

Wenn POINT mit nur einem Parameter aufgerufen wird (Syntax B), 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 dasselbe wie für POINT(0).

3

aktuelle Y-Bildschirmkoordinate. Wenn WINDOW nicht eingesetzt wurde, ist das Ergebnis dasselbe wie für POINT(1).

Beispiel:

'Grafikfenster erstellen (500x200 Pixel mit 32bit Farbtiefe)
SCREENRES 500, 200, 32

'Hintergrundfarbe (rot) einstellen und einfärben
DIM AS INTEGER farbe = &HFF0000
COLOR ,farbe
CLS

PRINT "Die Hintergrundfarbe wurde auf den Wert &H" & HEX(farbe) & " gestellt"

PRINT "Point gibt den Wert &H" & HEX(POINT(10, 10)) & " zurueck"

PRINT "Point mit Funktionswert '0' ergibt: " & POINT(0)

SLEEP

Wie man in einem Hi- oder Truecolor-Modus die von POINT zurückgegebene Farbe auswerten und interpretieren kann, wird in einem anderen Codebeispiel verraten.

Hinweis: POINT und seine Gegenfunktion PSET (Grafik) sind aufgrund der internen Berechnungen und Prüfungen sehr langsam. Wenn Sie stattdessen mithilfe von IMAGEINFO und SCREENINFO/SCREENPTR die Speicheradresse selbst bestimmen und PEEK verwenden, können Sie eine viel bessere Performance erzielen. Mit ASM ist eine noch bessere Geschwindigkeitssteigerung möglich.

Unterschiede zu QB:

- 'Puffer' ist neu in FreeBASIC

- In allen Bildschirm-Modi ab 15-Bit Farbtiefe gibt FreeBASIC einen 32-Bit RGB-Wert zurück.

Siehe auch:
PSET, PMAP, COLOR (Anweisung), Grafik

Letzte Bearbeitung: 09.08.11
Zur Onlinefassung des Eintrags

POINTER

Syntax: ... AS Datentyp POINTER ...
Typ: Schlüsselwort
Kategorie: Speicherverwaltung

POINTER wird mit DIM, REDIM, COMMON, STATIC, EXTERN, TYPE und DECLARE verwendet, um eine Variable oder Funktion als Pointer zu definieren. Es kann also immer angegeben werden, wenn ein Datentyp gebraucht wird.

Das Schlüsselwort POINTER wird meist mit PTR abgekürzt, was dieselbe Bedeutung hat.

Beispiele:

DECLARE FUNCTION foobar (parameter AS INTEGER) AS INTEGER POINTER

TYPE mytype
a AS INTEGER
b AS INTEGER POINTER
END TYPE

DIM VAR AS STRING POINTER
DIM typ AS mytype POINTER

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht POINTER nicht zur Verfügung und kann nur über __POINTER aufgerufen werden.

Siehe auch:
PTR, ALLOCATE, Grundlagen zu Pointern, Zusammenstellung von Pointer-Anweisungen

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

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 UDTs (user-defined types; siehe TYPE) werden akzeptiert. Die zu schreibende Datenmenge richtet sich hier nach der Länge des STRINGs bzw. der Größe des UDTs. 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 BYTE PTR
addr = VARPTR(x)
x = 5
PRINT x
POKE BYTE, addr, 10
PRINT x
SLEEP

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
SLEEP

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 ist es nicht möglich, den Datentyp des zu schreibende Werts festzulegen; es wird immer ein UBYTE geschrieben.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.16 ist der Standard-Datentyp UBYTE; davor war es BYTE.

- Seit FreeBASIC v0.13 ist es möglich, STRINGs und UDTs zu schreiben.

Siehe auch:
PEEK, VARPTR, SADD, Pointer, Datentypen, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

POS

Syntax: POS [(Zahl)]
Typ: Funktion
Kategorie: Konsole

POS gibt die horizontale Position des Cursors zurück. Der Rückgabewert 1 bedeutet, dass sich der Cursor ganz links befindet.

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
SLEEP

Ausgabe:

Position: 10
hello worldPosition: 21

Unterschiede zu QB:
In FreeBASIC ist der Parameter 'Zahl' optional und hat keine Auswirkung.

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.15 ist die Angabe des optionalen Parameters zulässig.

Siehe auch:
CSRLIN, LOCATE (Anweisung), LOCATE (Funktion), TAB, Konsole

Letzte Bearbeitung: 01.02.12
Zur Onlinefassung des Eintrags

PRAGMA (Meta)

Syntax A: #PRAGMA Option = Wert
Syntax B: #PRAGMA PUSH(Option)
Syntax C: #PRAGMA POP(Option)
Typ: Metabefehl
Kategorie: Päprozessoren

#PRAGMA 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 Bitfelder, die mit gcc kompatibel sind (Standard)

msbitfield

(ungleich Null)

verwende Bitfelder, die mit den Microsoft-C-Compilern kompatibel sind

once

N/A

veranlasst die Quelldatei, in der das Pragma verwendet wird, sich so zu verhalten als ob es mit #INCLUDE ONCE eingebunden wurde

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)

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
INCLUDE (Meta), Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

PRESERVE

Syntax: REDIM PRESERVE array(...) AS Datentyp
Typ: Schlüsselwort
Kategorie: Speicherverwaltung

PRESERVE wird zusammen 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. Ab der Kompilerversion 0.17 wird das Meta-Schlüsselwort '$DYNAMIC jedoch nicht mehr akzeptiert. Arrays sind nur dynamisch, wenn sie mit REDIM oder ohne Dimensionsangabe erstellt wurden.

Wichtig: Das Schlüsselwort kann nur bei eindimensionalen Arrays ohne Probleme verwendet werden, bei mehrdimensionalen Arrays bleibt wegen der Speicherverwaltung bei Arrays nur der erste Index erhalten!

Beispiel:

REDIM array(1 TO 3) AS INTEGER
array(1) = 10
array(2) = 5
array(3) = 8

REDIM PRESERVE array(2 TO 9) AS INTEGER
FOR i AS INTEGER = 2 TO 9
PRINT "array(" & i & ") = " & array(i)
NEXT
SLEEP

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

Unterschiede zu QB:
PRESERVE wird erst in PDS 7.1 unterstützt.

Siehe auch:
DIM, REDIM, STATIC (Metabefehl), DYNAMIC (Metabefehl)

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

PRESET (Grafik)

Typ: Anweisung
Syntax: PRESET [Puffer], [STEP] (x, y), [Farbe]
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 von der Farbtiefe, die mit der letzten SCREENRES-Anweisung gewählt wurde. Wenn 'Farbe' ausgelassen wird, verwendet PRESET standardmäßig die Hintergrundfarbe, die von der letzten COLOR-Anweisung eingestellt wurde.

PRESET zeichnet einen einzelnen Pixel auf den Bildschirm. Die Position des Pixels ist abhängig von den letzten VIEW- und WINDOW-Anweisungen. PRESET funktioniert wie PSET (Grafik). Der einzige Unterschied besteht darin, dass, wenn das Argument 'Farbe' ausgelassen wird, die aktuelle Hintergrundfarbe verwendet wird.

Beispiel:

SCREENRES 400, 300
COLOR , 12            ' hellrote Hintergrundfarbe setzen
PRESET (100,100)      ' Pixel in der Hintergrundfarbe zeichnen
PRESET STEP (50, 20)  ' Pixel relativ zu den letzten Koordinaten
SLEEP

Unterschiede zu QB:
In FreeBASIC ist es möglich, in einen Datenpuffer zu zeichnen.

Siehe auch:
PRESET (Methode), PSET (Grafik), COLOR (Anweisung), POINT, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PRESET (Methode)

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], 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.

Beispiel:

SCREENRES 320, 200, 32
LINE (0, 0)-(319, 199), RGB(0, 128, 255), bf

' Bild mit transparenter Hintergrundfarbe erstellen
' (die Transparenz wird bei PRESET nicht genutzt!)
DIM img AS ANY PTR = IMAGECREATE( 33, 33, RGB(255, 0, 255) )
CIRCLE img, (16, 16), 15, RGB(255, 255, 0),     ,     , 1, f
CIRCLE img, (10, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
CIRCLE img, (23, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
CIRCLE img, (16, 18), 10, RGB(  0,   0, 0), 3.14, 6.28

DIM AS INTEGER x = 160 - 16, y = 100 - 16

' Grafik ausgeben
PUT (x, y), img, PRESET

' Bildspeicher freigeben und auf Tastendruck warten
IMAGEDESTROY img
SLEEP

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PRINT (Anweisung)

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 1337) ü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 Semikola (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:

DIM Benutzername AS STRING
Benutzername = "Linus"
PRINT "Name: "; Benutzername

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 diesen Zeilenumbruch.
Beispiel:

PRINT "Hello ";
PRINT "world";
PRINT "!"

Kommata erfüllen dieselbe Funktion wie Semikola, fügen aber ein Tabspace ein.
Beispiel:

DIM x AS INTEGER
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 beginnt. Möglich wären hier auch

CHR(13, 10)

oder

!"\r\n"

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. Kommata (,) 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"

Neue Schreibweise (ab FreeBASIC v0.17):

PRINT !"Normaler String mit \34Escape Chars\34" $" und mit Literalen \34"

Hinweis: Das Aufrufen von Print setzt den Wert unter ERR zurück.

Siehe auch:
WRITE (Anweisung), LOCATE (Anweisung), COLOR (Anweisung), WIDTH (Anweisung), INPUT (Anweisung), WRITE #

Letzte Bearbeitung: 28.03.11
Zur Onlinefassung des Eintrags

PRINT (Datei)

Syntax: PRINT #f, Print-Ausdruck
Typ: Anweisung
Kategorie: Datei

PRINT # schreibt Daten in eine Datei, die für sequentiellen Schreibzugriff (im OUTPUT- oder APPEND-Modus) geöffnet ist. Es kann damit jedoch auch in eine im BINARY-Modus geöffnete Datei geschrieben werden.

- 'f' ist die Dateinummer, die durch OPEN zugewiesen wurde.

- 'Print-Ausdruck' ist ein Ausdruck, für den dieselben 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 (Anweisung), PRINT (Meta), PRINT USING, WRITE #, OPEN, INPUT #, LINE INPUT #, Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

PRINT (Meta)

Syntax: #PRINT Text
Typ: Metabefehl
Kategorie: Ausgabe

Durch #PRINT gibt der Compiler einen Text aus.
Text ist 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 Compiliere nun das Module foo

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
#ERROR

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

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 Semikola getrennt werden.

Werden keine Variablen angegeben, werden alle Zeichen des Ausdrucks, die keine Formatierungszeichen sind, bis zum ersten Formatierungszeichen ausgegeben. Obwohl nicht unbedingt eine Variable vorhanden sein muss, muss das Semikolon (';') dennoch angegeben 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 Tausendertrennzeichens.

.

Setzt die Position des Dezimaltrennzeichens.

+

Reserviert einen Platz für das Vorzeichen der Zahl.

-

Wird dieses Zeichen hinter einen Ausdruck geschrieben, wird das Vorzeichen der Zahl hinter statt vor der Zahl angezeigt.

^^^^

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.

$$

Vor einer Zahl plaziert, bewirkt es, dass ein Dollarzeichen vor der Zahl angezeigt wird (und zusätzlich ein Leerzeichen vor dem Dollarzeichen).

**

Am Anfang einer Zahl angegeben, werden alle vorangestellten Leerzeichen durch Asteriske ('*') ersetzt.

**$

Kombiniert ** und $

&

Gibt eine Zahl intelligent aus, benötigt die exakte Anzahl von Zeichen. (ab 0.21.0)

_

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.

Falls ein numerischer Wert nicht in die angegebenen Stellen des Ausdrucks passt, wird die Formatierung so angepasst, dass dieser passt. Dabei kann die wissenschaftliche Notation verändert werden und die Zahl wird mit einem vorangestellten "%" ausgegeben. So wird z. B. 1234 mit dem Ausdruck "##.##" zu "%1234.00"

Alle anderen Zeichen des Ausdrucks werden unverändert ausgegeben.

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

Hinweis:
Intern verwendet der Befehl einen 2048 Byte Buffer. Sollte diese Grenze erreicht werden, wird die Ausgabe des Befehls abgeschnitten. Dies ist aber sehr unwahrscheinlich.

Siehe auch:
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.
- QB erlaubt kein "&" bei der Ausgabe von Zahlen

Unterschiede zu früheren Versionen von FreeBASIC:
'PRINT USING-Ausdruck' darf erst seit FreeBASIC 0.24 ein WSTRING sein.

Letzte Bearbeitung: 27.04.12
Zur Onlinefassung des Eintrags

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 Der Compiler)

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 demselben Bezeichner vorhanden sein, sofern diese PRIVATE sind.

Beispiel 1:
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 A und Priv2 aus A können nicht aufgerufen werden.

PRIVATE legt explizit für eine SUB/FUNCTION fest, 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 2:
Kompilieren 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 QuickBASIC:
- neu in FreeBASIC

Siehe auch:
PRIVATE (Schlüsselwort), PUBLIC (Klausel), OPTION, DECLARE, SUB, FUNCTION

Letzte Bearbeitung: 31.10.10
Zur Onlinefassung des Eintrags

PRIVATE (Schlüsselwort)

Syntax: OPTION PRIVATE
Typ: Schlüsselwort
Kategorie: Programmorganisation

OPTION PRIVATE bestimmt, dass SUBs und FUNCTIONs standardmäßig PRIVATE deklariert werden. Die Option 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 explizit an, wenn eine Prozedur PRIVATE sein soll.
Siehe dazu auch die FB-Dialektformen.

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 Der Compiler)

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 demselben 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 A und Priv2 aus A 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.

Beispiel:
Kompilieren 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

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
PRIVATE, PUBLIC, __FB_OPTION_PRIVATE__OPTION, DECLARE, SUB, FUNCTION

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

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

SLEEP

'Print mySecInt._data            ' Der Pointer ist nicht verfügbar, da es sich um ein PRIVATE-Feld handelt.

Unterschiede zu QuickBASIC und VisualBASIC:

- In dieser Verwendung neu in FreeBASIC

Unterschiede zu älteren FreeBASIC-Versionen:

- PUBLIC bei UDTs existiert seit FreeBASIC v0.17

Siehe auch:
PRIVATE, PUBLIC (UDT), PROTECTED, TYPE (UDT), THIS, SUB, FUNCTION, PROPERTY, CONSTRUCTOR (Klassen), DESTRUCTOR (Klassen), EXTENDS

Letzte Bearbeitung: 08.01.12
Zur Onlinefassung des Eintrags

PROCPTR

Syntax: PROCPTR(Prozedurname)
Typ: Funktion
Kategorie: Speicherverwaltung

PROCPTR gibt die Adresse einer Prozedur oder Funktion im Speicher zurück. Diese Funktion lässt sich auch durch die Form

@Prozedurname

ersetzen.

Beispiel 1:

DECLARE SUB dummy

PRINT PROCPTR(dummy)
PRINT @dummy

SUB dummy
' ...
END SUB

Beispiel 2:

DECLARE FUNCTION Subtract( x AS INTEGER, y AS INTEGER) AS INTEGER
DECLARE FUNCTION ADD( x AS INTEGER, y AS INTEGER) AS INTEGER
DIM myFunction AS FUNCTION( x AS INTEGER, y AS INTEGER) AS INTEGER

'Verbindet den Funktionspointer mit der Funktion 'Add'
myFunction = PROCPTR( ADD )
PRINT myFunction(2, 3)

'Verbindet den Funktionspointer mit der Funktion 'Subtract'
myFunction = PROCPTR( Subtract )
PRINT myFunction(2, 3)

SLEEP

FUNCTION ADD( x AS INTEGER, y AS INTEGER) AS INTEGER
RETURN x + y
END FUNCTION

FUNCTION Subtract( x AS INTEGER, y AS INTEGER) AS INTEGER
RETURN x - y
END FUNCTION

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht PROCPTR nicht zur Verfügung und kann nur über __PROCPTR aufgerufen werden.

Siehe auch:
@, SADD, Grundlagen zu Pointern, Zusammenstellung von Pointer-Anweisungen

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

PROPERTY

Syntax A:

TYPE TypeName
FeldName [(Indizes)] AS DatenTyp

' Wert abfragen
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 )
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 Klassen befassen. Siehe dazu auch SUB, FUNCTION.
Ebenso nötig sind Kenntnisse über UDTs (User defined Types)

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 demselben 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 denselben Bezeichner; sie unterscheiden sich lediglich durch die Anzahl der Parameter.

Befindet sich der TYPE innerhalb eines NAMESPACEs, so wird die Zuordnung genauso 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 (Namespace) 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 "(" & x & ", " & 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
'' neuer_Vektor = alter_Vektor / laenge * neue_laenge
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

SLEEP

Ausgabe:

a = (3, 4)
a.length =  5

a = (6, 8)
a.length =  10

Mittels der Schlüsselwörter PRIVATE und PUBLIC kann festgelegt werden, von 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
PRINT i, Liste.Items(i)
NEXT
PRINT

Liste.DelItem 2

FOR i = 1 TO Liste.ItemCount
PRINT i, Liste.Items(i)
NEXT

SLEEP
'================================================='
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 ersten 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 QuickBASIC:

- neu in FreeBASIC

Unterschiede zu VisualBASIC:

- Die Verwendung von Properties und Methoden wurde der VB-Syntax nachempfunden, jedoch existierte keine Möglichkeit, solche selbst zu erstellen

Unterschiede zu älteren FreeBASIC-Versionen:

- PROPERTY existiert seit FreeBASIC v0.17.

Siehe auch:
SUB, FUNCTION, CONSTRUCTOR (Klassen), DESTRUCTOR (Klassen), OPERATOR, THIS, TYPE (UDT), PUBLIC, PRIVATE, OVERLOAD

Letzte Bearbeitung: 31.10.10
Zur Onlinefassung des Eintrags

PROTECTED

Syntax:

TYPE TypeName
PROTECTED:
' geschützte Deklarationen

END TYPE

Typ: Schlüsselwort
Kategorie: Programmorganisation

Legt fest, dass die folgenden Deklarationen PROTECTED sein sollen, d.h. dass ein Zugriff nur von TYPE-eigenen Prozeduren aus zulässig ist.
Innerhalb der Typen-Deklaration wird die Zeile

PROTECTED:

eingefügt, sobald ein folgende Deklarationen geschützt sein soll, d.h. wenn der Zugriff darauf eingeschränkt werden soll.
Standardmäßig sind alle Deklarationen 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 PROTECTED-Deklarationen dürfen nur TYPE-eigene Prozeduren (SUBs, FUNCTIONs, PROPERTYs, OPERATORs, Klassen-Konstruktoren und Klassen-Destruktoren), und solche, die sich in TYPEs befinden, die vom Basis-UDT erben, zugreifen.
Ein Zugriff auf geschützte Deklarationen von außerhalb einer TYPE-eigenen Prozedur führt zu der Compiler-Fehlermeldung

Illegal member access

PROTECTED spielt vor allem in Verbindung mit Vererbung eine Rolle. Records, die PRIVATE sind, können nicht von Kind-Klassen verwendet werden, wohingegen PUBLIC und PROTECTED Records auch durch die Kind-Klasse verwendet werden dürfen.

Beispiel:

TYPE mutter
PRIVATE:
x AS INTEGER = 1

PROTECTED:
y AS INTEGER = 2

PUBLIC:
z AS INTEGER = 3
END TYPE

TYPE kind EXTENDS mutter
dummy AS INTEGER
DECLARE SUB ausgeben()
END TYPE

SUB kind.ausgeben()
'Print x 'Funktioniert nicht, da x Private für die Mutter-Klasse ist
PRINT y
PRINT z
END SUB

DIM AS kind einKind

einKind.ausgeben()

SLEEP

Unterschiede zu älteren FreeBASIC-Versionen:
- Bis einschließlich Version 0.22.0 hat PROTECTED überhaupt keine Funktion, ab der SVN Version 0.23.0 verhält es sich hingegen wie PRIVATE.

Unterschiede zu anderen FreeBASIC-Dialektformen:
- Nur gültig für -lang fb

Unterschiede zu QuickBASIC:
- Neu in FreeBASIC

Siehe auch:
PRIVATE (UDT), PUBLIC (UDT), TYPE (UDT), EXTENDS

Letzte Bearbeitung: 08.01.12
Zur Onlinefassung des Eintrags

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 von der Farbtiefe, die mit der letzten SCREENRES-Anweisung gewählt wurde. Wenn 'Farbe' ausgelassen wird, verwendet PSET standardmäßig die Vordergrundfarbe, 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- und WINDOW-Anweisungen.

Beispiel:

SCREENRES 640, 480

PSET (100, 100), 15               ' weißen Punkt an den Koordinaten (100, 100) zeichnen
SLEEP                            '  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)
SLEEP

CLS
WINDOW                            ' physischen Darstellungsbereich zurücksetzen
VIEW (50, 50)-(590, 430)          ' Gültigkeitsbereich neu festlegen
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.)
SLEEP

Hinweis: PSET und seine Gegenfunktion POINT sind aufgrund der internen Berechnungen und Prüfungen sehr langsam. Wenn Sie stattdessen mithilfe von IMAGEINFO und SCREENINFO/SCREENPTR die Speicheradresse selbst bestimmen und PEEK verwenden, können Sie eine viel bessere Performance erzielen. Mit ASM ist eine noch bessere Geschwindigkeitssteigerung möglich.

Unterschiede zu QB:

- In FreeBASIC ist es möglich, in einen Datenpuffer zu zeichnen.

- Im 16- und 32-Bit-Modus werden Farbwerte als 32-Bit Wert benötigt, statt einem 8-Bit Paletten-Index.

Siehe auch:
PSET (Methode), PRESET (Grafik), COLOR (Anweisung), POINT, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PSET (Methode)

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], PSET
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.

Beispiel:

SCREENRES 320, 200, 32
LINE (0, 0)-(319, 199), RGB(0, 128, 255), bf

' Bild mit transparenter Hintergrundfarbe erstellen
' (die Transparenz wird bei PSET nicht genutzt!)
DIM img AS ANY PTR = IMAGECREATE( 33, 33, RGB(255, 0, 255) )
CIRCLE img, (16, 16), 15, RGB(255, 255, 0),     ,     , 1, f
CIRCLE img, (10, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
CIRCLE img, (23, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
CIRCLE img, (16, 18), 10, RGB(  0,   0, 0), 3.14, 6.28

DIM AS INTEGER x = 160 - 16, y = 100 - 16

' Grafik ausgeben
PUT (x, y), img, PSET

' Bildspeicher freigeben und auf Tastendruck warten
IMAGEDESTROY img
SLEEP

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

PTR

Syntax: ... AS Datentyp PTR ...
Typ: Schlüsselwort
Kategorie: Speicherverwaltung

PTR wird mit DIM, REDIM, COMMON, STATIC, EXTERN, TYPE und DECLARE verwendet, um eine Variable oder Funktion als Pointer zu definieren. Es kann also immer angegeben werden, wenn ein Datentyp gebraucht wird.

PTR ist eine Abkürzung des Schlüsselwortes POINTER und hat dieselbe Bedeutung.

Beispiele:

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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht PTR nicht zur Verfügung und kann nur über __PTR aufgerufen werden.

Siehe auch:
ALLOCATE, Grundlagen zu Pointern, Zusammenstellung von Pointer-Anweisungen

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

PUBLIC (Klausel)

Syntax: PUBLIC { SUB | FUNCTION }
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 Der Compiler)

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 demselben Bezeichner vorhanden sein, sofern diese PRIVATE sind.

Beispiel 1:
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 A und Priv2 aus A 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 nur im Prozedurheader stehen, nicht in der DECLARE-Anweisung.

Beispiel 2:
Kompilieren 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 demselben Bezeichner existieren, wenn beide PRIVATE sind.

Unterschiede zu QuickBASIC:

- Neu in FreeBASIC

Unterschiede zu VisualBASIC:

- PUBLIC kann in VB nur eingeschränkt mit TYPE verwendet werden.

Siehe auch:
PUBLIC, PRIVATE (Klausel), OPTION, DECLARE, SUB, FUNCTION, Prozeduren

Letzte Bearbeitung: 31.10.10
Zur Onlinefassung des Eintrags

PUBLIC (UDT)

Syntax:

TYPE TypeName
PRIVATE:
' Deklaration privater Records

PUBLIC:
' Deklaration öffentlicher Records
END TYPE

Typ: Schlüsselwort
Kategorie: Programmorganisation

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

SLEEP

'Print mySecInt._data            ' Der Pointer ist nicht verfügbar, da es sich um ein PRIVATE-Feld handelt.

Unterschiede zu QuickBASIC und VisualBASIC:

- In dieser Verwendung neu in FreeBASIC

Unterschiede zu älteren FreeBASIC-Versionen:

- PUBLIC bei UDTs existiert seit FreeBASIC v0.17

Siehe auch:
PUBLIC, PRIVATE (UDT), PROTECTED, TYPE (UDT), THIS, SUB, FUNCTION, PROPERTY, CONSTRUCTOR (Klassen), DESTRUCTOR (Klassen), EXTENDS

Letzte Bearbeitung: 08.01.12
Zur Onlinefassung des Eintrags

PUT (Datei)

Syntax: PUT #Dateinummer, [Position], Daten [, Menge]
Typ: Anweisung/Funktion
Kategorie: Datei

PUT schreibt Daten in eine 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, 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 Dateizeigers. 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 Dateizeiger 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' ausgelassen, 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 eingesetzt, 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], Daten [, Menge])

Der RANDOM-Modus wird nur noch selten verwendet; die Verwendung sequentieller Modi (INPUT, 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 nach dem Datentyp der Variable, in die die Datei geschrieben wird:

- BYTE und UBYTE - 1 Byte (8 bit)

- SHORT und USHORT - 2 Byte (16 bit)

- INTEGER, UINTEGER, LONG und ULONG - 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.

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

- ALLOCATE-Puffer - Der Parameter 'Menge' gibt an, wie viele Bytes gelesen werden. Achten Sie darauf, dass genügend Speicherplatz reserviert wurde!

- Arrays - Indexzahl * LEN(Datentyp)

- UDTs - Lässt sich mit LEN ermitteln

Beispiel 1:

DIM buffer AS STRING
DIM f AS INTEGER = 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.
Beispiel 2:

TYPE UDT
a AS INTEGER
b AS SINGLE
c AS STRING * 5
END TYPE

DIM f AS INTEGER = 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:

DIM f AS INTEGER = 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
SLEEP

Ausgabe:

51     !3

Wie Sie sehen, wird in die Datei beim ersten Zugriff zuerst ein BYTE-Wert und anschließend 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 zweimal 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 QB:

- PUT kann auch als Funktion eingesetzt werden.

- Ganze Arrays und UDTs können geschrieben werden.

- Die Verwendung von ALLLOCATE-Datenpuffern ist möglich.

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.

Siehe auch:
PUT (Grafik), OPEN, BINARY, RANDOM, GET #, Dateien (Files)

Letzte Bearbeitung: 20.01.11
Zur Onlinefassung des Eintrags

PUT (Grafik)

Syntax: PUT [ZielPuffer,] [STEP] (x, y), QuellPuffer [(x1, y1)-[STEP](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, wie er mit IMAGECREATE verwendet wird. Wird 'ZielPuffer' ausgelassen, zeichnet FreeBASIC direkt auf den Bildschirm.

- 'STEP' gibt an, dass die darauf folgenden Koordinaten relativ zum aktuellen Grafikcursor angegeben sind.

- '(x, y)' sind die Koordinaten der linken oberen Ecke des Bereichs, der gezeichnet werden soll.

- '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)' und '(x2, y2)' sind die gegenüberliegenden Eckpunkte eines Koordinatenbereichs 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. Die Möglichkeit, einen Teilbereich auszugeben, 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. Weiter unten werden die Details dazu aufgelistet. 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 eingesetzt, ist der Rückgabewert eine der FreeBASIC-Fehlernummern. Die Syntax bleibt die gleiche, allerdings müssen die Parameter in Klammern gesetzt 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 ab 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

Das gespeicherte Pixel überschreibt das Pixel auf dem Bildschirm.
Mit diesem Aktionswort wird also tatsächlich der Bildschirmausschnitt ausgegeben, der im Puffer gespeichert wurde.

PRESET

Die gespeicherten Pixel werden invertiert 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 dieselbe Farbnummer auch immer dieselbe Farbe dar.

AND

Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen AND 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 dieselbe Farbnummer auch immer dieselbe Farbe dar.

OR

Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen OR 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 dieselbe Farbnummer auch immer dieselbe Farbe dar.

XOR

Auf dem Bildschirm wird ein Pixel ausgegeben, dessen Farbnummer das Ergebnis eines logischen XOR 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 dieselbe Farbnummer auch immer dieselbe Farbe dar.
XOR ist das Standard-Aktionswort.

TRANS

Die Pixel auf dem Bildschirm werden wie bei PSET durch die gespeicherten Pixel überschrieben. Wenn das gespeicherte Pixel die Masken-Farbe (siehe unten) besitzt, wird es ausgelassen, das Original-Pixel auf dem Bildschirm wird dann 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 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 jedes Pixel einzeln angegeben wurde. Dies ist nur in 32bpp-Modi möglich, da nur hier ein eingebetteter Alphawert für jedes Pixel möglich ist; siehe dazu auch Interne Pixelformate.
Wird 'AlphaWert' ausgelassen, jedoch ein Modus 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 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, das ü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 8bpp 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.

Als weitere Alternative kann eine Blendermaske erzeugt werden. Hierbei erstellt man eine Schwarz-Weiß-Maske unter Berücksichtigung der Maskenfarbe und mischt diese mit dem zu überschreibenden Bildbereich. Anschließend kopiert man diese mit OR auf die zu überzeichnende Fläche. Zum Schluss kann das Bild, das man kopieren möchte, über diesen Bereich geschrieben werden.

Der Trick liegt darin, den Hintergrund teilweise über einen Zwischenschritt in das eigentliche Bild zu integrieren. Ein weiterer Vorteil ist hier auch, das eine beliebige Farbe als Transparenzfarbe genutzt werden kann. Natürlich muss die Farbe bekannt sein, wenn die Schwarz/Weiß-Maske erzeugt wird.

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 SCREENRES ändern, kann es sein, dass die gespeicherten Daten nicht mehr kompatibel sind, sodass PUT mit diesem Puffer nicht richtig eingesetzt werden kann. Eine Konversion zwischen verschiedenen Farbtiefen ist mit IMAGECONVERTROW möglich.

Beispiel 1: Überblick über die verschiedenen Methoden

DECLARE FUNCTION checkered_blend( BYVAL src   AS UINTEGER, _
BYVAL dest  AS UINTEGER, _
BYVAL param AS ANY PTR ) AS UINTEGER

SCREENRES 320, 240, 16

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

' 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 AS UINTEGER
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

SCREENRES 400, 300, 16

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

SLEEP

Unterschiede zu QB:

- In FreeBASIC ist es möglich, in einen Datenpuffer zu zeichnen.

- Die Methoden TRANS, ALPHA, ADD und CUSTOM sind neu in FreeBASIC.

- In QB können als Bildquelle nur Arrays verwendet werden.

- Das interne Speicherformat für Images in FreeBASIC unterscheidet sich von dem in QB. QB kann das Speicherformat von FreeBASIC nicht verarbeiten.

- FreeBASIC unterstützt Clipping (Einhaltung der Bildschirmgrenzen). QB erzeugt bei Koordinaten außerhalb der Bildschirmgrenzen eine Fehlermeldung.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.18.0 kann in der Angabe des darzustellenden Teilbereichs (x1, y1)-(x2, y2) das Schlüsselwort STEP verwendet werden.

- Der Parameter 'param' 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.

- Die Aktionswörter ALPHA und CUSTOM existieren 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 seit FreeBASIC v0.12.

Siehe auch:
PUT (Datei), GET (Grafik), IMAGECREATE, SCREENRES, Interne Pixelformate, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Startbuchstabe R

RANDOM

Syntax: OPEN Dateiname FOR RANDOM [ ... ] , LEN = Recordlänge
Typ: Schlüsselwort
Kategorie: Datei

Das Schlüsselwort RANDOM wird mit der OPEN-Anweisung verwendet und öffnet die Datei im RANDOM-Modus. Dieser Datei-Modus verwendet eine Puffervariable benutzer-definierten Typs, um komplette Records einer Datei zu lesen oder schreiben. Die Puffervariable umfasst gewöhnlich mehrere Felder. Die Daten werden im Binär-Modus gespeichert, im selben internen Format, das FreeBASIC auch bei GET # und PUT # benutzt.

Es wird davon abgeraten, den RANDOM-Modus zu verwenden; stattdessen empfiehlt sich der BINARY-Modus oder die sequentiellen Modi. Es kann nicht garantiert werden, dass FreeBASIC den Dateimodus RANDOM in vollem Umfang unterstützt.

Unterschiede zu QB:

- In FreeBASIC können User Defined Types (UDTs), die STRINGs variabler Länge enthalten, nicht mit RANDOM gespeichert werden.

- Das Schlüsselwort FIELD wird mit TYPE benutzt, um das 'packing' des UDTs zu bestimmen.

Siehe auch:
OPEN (Anweisung), GET #, PUT #

Weitere Informationen:
Pete's QB Site - QB Express Issue 6 - Random Access Files

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

RANDOMIZE

Syntax: RANDOMIZE [Startwert][, Algorithmus]
Typ: Anweisung
Kategorie: mathematische Funktionen

RANDOMIZE initialisiert den Zufallsgenerator.

- 'Startwert' ist vom Typ DOUBLE und gibt den Initialwert für den Zufallsgenerator an. Falls dieser Wert ausgelassen wird, wird ein Wert basierend auf TIMER verwendet.

- 'Algorithmus' ist ein INTEGER-Wert, der den zu verwendenden Algorithmus bestimmt. Falls dieser Wert ausgelassen wird, wird der dialektspezifische Algorithmus verwendet.

Der erstellte Zufallsinitialwert ermöglicht der Funktion RND, Zufallszahlen zu generieren, und bestimmt den Algorithmus, welcher verwendet werden soll. Zulässige Werte für 'Algorithmus' sind:

- 0 - Es soll der dialektspezifische Algorithmus verwendet werden. Bei -lang fb ist dieser 3, bei -lang qb 4 und bei -lang fblite 1.

- 1 - Verwendet die rand()-Funktion der C runtime library. Die Zufallswerte sind hierbei plattformspezifisch.

- 2 - Ein performanter Algorithmus wird verwendet. Diese Methode sollte plattformunabhängig sein und erzeugt 32-bit Doublewerte mit einem annehmbaren Maß an Zufälligkeit.

- 3 - Verwendet den Mersenne-Twister-Algorithmus. Diese Methode sollte plattformunabhängig sein und erzeugt 32-bit Doublewerte mit einem hohen Maß an Zufälligkeit.

- 4 - Eine Funktion wird verwendet, die die gleiche Nummernfolge wie QBASIC erzeugen soll. Diese Methode sollte plattformunabhängig sein und erzeugt 24-bit genaue Zahlen mit einem geringen Maß an Zufälligkeit.

- 5 - Verwendet wie im dritten Algorithmus den Mersenne-Twist-Algorithmus, nur wird beginnend mit dem ersten Aufruf von RND alle 256 Aufrufe ein zusätzlicher Wert auf den Startwert aufaddiert. Dieser Wert entspringt unter Windows der CryptApi und unter Linux /dev/urandom. Dadurch soll ein noch besserer Zufallswert erreicht werden. Sollte diese Methode fehlschlagen, so wird der Standardwert des Mersenne-Twist-Algorithmus verwendet.

Für jeden Initialwert wird jeder Algorithmus eine bestimmte, reproduzierbare Reihenfolge von Zahlen generieren. Soll bei jedem Aufruf von RANDOMIZE eine andere Zahlenreihenfolge erstellt werden, sollte ein sich verändernder Initialwert übergeben werden - z. B. der Rückgabewert der Funktion TIMER. Wird 'Startwert' ausgelassen oder erhält er den Wert -1.0, dann wird ein auf TIMER basierender Startwert verwendet.

Beachten Sie: Wird TIMER als Initialwert öfter in einer Sekunde aufgerufen, werden immer dieselben Zahlen erstellt. Grundsätzlich ist es nicht nötig, RANDOMIZE öfter als einmal mit einem sich verändernden Übergabeparameter aufzurufen, da die Zahlenreihenfolge der späteren Aufrufe nicht zufälliger sind als die nach dem ersten Aufruf. In den meisten Fällen sollte der Mersenne-Twister-Algorithmus zu einer ausreichend zufälligen Reihenfolge von Zahlen führen, ohne dass der Initialwert zwischen RND-Aufrufen neu belegt werden müsste.

Beim Aufruf von RANDOMIZE mit dem QB-kompatiblen Algorithmus wird ein Teil der Zufallswerte aufbewahrt. Das bedeutet, dass bei mehrmaligen Aufrufen von RANDOMIZE mit demselben Initialwert nicht jedes Mal die gleiche Reihenfolge erzeugt wird. Um eine bestimmte Reihenfolge zu erhalten, muss RND mit einem negativen Übergabeparameter aufgerufen werden.

Beispiel:

'Die C-rand()-Funktion soll verwendet werden
RANDOMIZE , 1

'Gibt zehn Zufallszahlen aus
FOR i AS INTEGER = 1 TO 10
PRINT RND
NEXT
SLEEP

Unterschiede zu QB:

- Der Parameter 'Algorithmus' ist neu in FreeBASIC.

- QBASIC hatte nur einen Algorithmus (nachgebaut in FB im Algorithmus 4 und der Standardalgorithmus im Dialekt -lang qb).

Plattformbedingte Unterschiede:
Algorithmus 5 verwendet unter Windows die CryptApi, unter Linux /dev/urandom. Unter DOS ist der Algorithmus nicht vorhanden, hier wird bei Angabe des Wertes 5 der Standard-Algorithmus verwendet.

Unterschiede zu früheren Versionen von FreeBASIC:
Der Algorithmus 5 existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
Der Standardalgorithmus hängt vom aktuellen Dialekt ab:

- -lang fb verwendet die 32-bit Mersenne-Twister-Funktion.

- -lang qb erzeugt dieselbe Ausgabe wie RND in QB.

- -lang deprecated und -lang fblite verwenden die C-Funktion rand(). Diese ergibt unter Win32 15-bit-Werte und unter Linux und DOS 32-bit-Werte.

Siehe auch:
RND

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

READ

Syntax: READ Variable1 [,Variable2 [,...] ]
Typ: Anweisung
Kategorie: Speicherverwaltung

READ liest Daten, die zuvor mit einer DATA-Anweisung gespeichert wurden. Diese Daten werden als einfache Liste betrachtet. Ist eine DATA-Anweisung abgearbeitet, wird mit der folgenden weitergemacht.

READ wird auch als Schlüsselwort im Zusammenhang mit ACCESS verwendet.

Beachte: READ kann nur DATA-Werte lesen, solange welche vorhanden sind. Soll READ darüber hinaus lesen, sind die Ergebnisse in allen FreeBASIC-Dialekten undefiniert und es kann zu einem Programmabsturz kommen.

Beispiel:

DIM AS INTEGER h(4)
DIM AS STRING hs
DIM AS INTEGER readindex

' Daten in das Array einlesen
FOR readindex = 0 TO 4
READ h(readindex)      ' Integer einlesen
PRINT "Nummer" ; readindex ; " = " ; h(readindex)
NEXT readindex
PRINT

READ hs                  ' String einlesen
PRINT  "String = " & hs
SLEEP

' Datenblock.
DATA 3, 234, 4354, 23433, 87643, "Bye!"

Siehe auch:
DATA, RESTORE, Verschiedenes

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

REALLOCATE

Syntax: REALLOCATE (Pointer, Bytes)
Typ: Funktion
Kategorie: Speicherverwaltung

REALLOCATE ändert die Größe eines reservierten Speicherbereichs.

- 'Pointer' ist ein Pointer auf einen bereits bestehenden Speicherbereich, dessen Größe geändert werden soll. Ist 'Pointer' 0, so verhält sich REALLOCATE exakt wie ALLOCATE.

- 'Bytes' ist die neue Größe des Speicherbereichs in Bytes.

- Die Werte, die im Speicherbereich 'Pointer' gespeichert sind, werden bei der Redimensionierung zwischengespeichert.

- Der Rückgabewert ist ein Pointer auf das erste Byte des redimensionierten Speicherbereichs. Er kann im selben Pointer gespeichert werden, der schon bei 'Pointer' 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 'Pointer' zeigt.

- Wenn die Redimensionierung fehlschlägt, ist der Rückgabewert 0.

REALLOCATE ist kein Teil der FreeBASIC Runtime Library, sondern ein Alias von realloc der C-Lib.
Achtung: Es kann nicht garantiert werden, dass diese Funktion auf allen Plattformen Multithreading unterstützt, d.h. thread-safe ist.

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

SLEEP ' Auf Tastendruck warten

Hinweis:
Wenn Speicher mit REALLOCATE vergrößert wird, ist beim Umgang mit Strings auf das gleiche Verhalten wie bei ALLOCATE zu achten. Der neue Speicherbereich wird nicht mit Nullen überschrieben, sodass Probleme auftreten können. Um dem entgegenzuwirken kann der neu reservierte Speicherbereich etwa mit CLEAR auf null gesetzt werden.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Es kann nicht garantiert werden, dass die Prozedur auf allen Plattformen thread-safe ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht REALLOCATE nicht zur Verfügung und kann nur über __REALLOCATE aufgerufen werden.

Siehe auch:
ALLOCATE, CALLOCATE, DEALLOCATE, Pointer, Speicher

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

REDIM

Syntax:

REDIM [PRESERVE] [SHARED] ArrayName([[Untergrenze TO] Obergrenze]  _
[, [Untergrenze TO] Obergrenze] _
[, ...]) [AS Datentyp] [, weitereArrays]

REDIM [PRESERVE] [SHARED] AS Datentyp ArrayName([[Untergrenze TO] Obergrenze] _
[, ...]) [, weitereArrays]

Typ: Anweisung
Kategorie: Speicherverwaltung

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.

REDIM erstellt ein dynamisches Array oder ändert dessen Größe.

- Wird 'PRESERVE' bei einem vorhandenen Array benutzt, bleibt der Inhalt des Arrays bei einer Größenänderung erhalten.
Beachten Sie, dass PRESERVE nicht mit mehrfach-dimensionierten Arrays funktioniert (siehe auch den Artikel zu PRESERVE).

- 'SHARED' legt den gemeinsamen (shared) Zugriff für ein Array für das Modul fest (file-scope).

- 'ArrayName' ist der Name des Arrays, das erstellt oder dessen Größe geändert werden soll.

- 'Untergrenze' und 'Obergrenze' legen die Größe des Arrays fest. Wird 'Untergrenze' ausgelassen, dann verwendet FreeBASIC standardmäßig den Wert 0.

- 'Datentyp' gibt den Datentyp des Arrays an. Wurde das Array bereits zuvor definiert, dann kann 'AS Datentyp' weggelassen werden, oder der Datentyp muss mit dem bereits zuvor verwendeten identisch sein.

REDIM kann benutzt werden, um neue, in der Länge variable Arrays zu erstellen oder vorhandene Arrays dieser Art zu vergrößern. REDIM erstellt IMMER variable Arrays, also können, anders als bei DIM, variable Arrays mit konstanten Indizes erstellt werden.

Wird ein neues variables Array erstellt, dann werden die Element vom Default-Constructor erstellt. Bei einfachen Datatypen wie INTEGER oder DOUBLE werden sie mit Null (0) initialisiert, bei UDTs (user defined types) vom Default-Constructor, der dann aufgerufen wird.

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.
Achtung: '$DYNAMIC bzw. OPTION DYNAMIC steht nur bis FreeBASIC v0.16 zur Verfügung!

Wird die Größe eines variablen Arrays ohne den PRESERVE-Parameter geändert, werden alle Elemente zerstört und neue Elemente werden vom Default-Constructor erstellt. Mit dem PRESERVE-Parameter werden die vorhandenen Elemente nicht zerstört, außer, wenn das Array verkleinert wird: dann gehen zwangsläufig die abgetrennten Elemente verloren. Wird ein variables Array vergrößert, dann werden die neuen Elemente vom Default-Constructor am Ende des Arrays erstellt.

Beachte: Die Benutzung von REDIM in einer 'Member-Procedure' mit einem Array, das Instanzen der Objekt-Klasse enthält, ist undefiniert und wird [hoffentlich] einen fürchterlichen Programmabsturz zur Folge haben.

Achtung: REDIM kann NICHT bei Arrays benutzt werden, die zu UDTs gehören, da momentan nur Arrays mit fester Größe in UDTs unterstützt werden.

Beispiel 1:

DIM x() AS INTEGER

REDIM x(3)
PRINT UBOUND(x)

REDIM x(6)
PRINT UBOUND(x)
SLEEP

Beispiel 2:

' Array mit 5 Elementen anlegen
REDIM Array(1 TO 5) AS INTEGER

FOR index AS INTEGER = LBOUND(Array) TO UBOUND(Array)
Array(index) = index
NEXT

' Auf 10 Elemente vergrößern; dabei wird auch die untere Grenze verschoben
REDIM PRESERVE Array(9) AS INTEGER

PRINT "Index", "Wert"
FOR index AS INTEGER = LBOUND(Array) TO UBOUND(Array)
PRINT index, Array(index)
NEXT

Ausgabe:

Index         Wert
0             1
1             2
2             3
3             4
4             5
5             0
6             0
7             0
8             0
9             0

Unterschiede zu QB:

- Das Schlüsselwort 'PRESERVE' existiert nur in Visual Basic

- Die alternative Syntax DIM AS Typ Variable ist neu in FreeBASIC.

- Bei der Speicherung mehrdimensionaler Arrays folgen in FreeBASIC die Werte aufeinander, deren erster Index gleich ist. In QB folgen die Werte aufeinander, deren letzter Index gleich ist.

Unterschiede zu früheren FreeBASIC-Versionen:

- Seit FreeBASIC v0.17 muss der Typ explizit deklariert werden, außer das Programm wird mit der Option -lang deprecated compiliert.

- Seit FreeBASIC v0.16 dürfen Felder unbekannter Größe an jedem Programmpunkt, auch in Prozeduren, erstellt werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb und -lang fblite sind Variablen, die in einer Prozedur dimensioniert wurden, in der ganzen Prozedur sichtbar. Variablen, die mit 'SHARED' dimensioniert wurden, sind im ganzen Modul sichtbar.

- In der Dialektform -lang fb und -lang deprecated sind Variablen, die in einem Block dimensioniert wurden (FOR ... NEXT, WHILE ... WEND, DO ... LOOP, SCOPE ... END SCOPE) nur in diesem Block sichtbar.

- In der Dialektform -lang fb sind OPTION-Anweisungen (z. B. OPTION BASE, OPTION DYNAMIC) nicht erlaubt.

Siehe auch:
DIM, PRESERVE, SCOPE, DYNAMIC (Meta), STATIC (Meta), UBOUND, LBOUND

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

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 statt des Befehls REM bevorzugt das Kommentarsymbol ' benutzt. Es hat dieselbe Funktion.
Wenn Sie einen größeren Kommentarblock einfügen wollen, können Sie dies mit den Kommentarblock-Zeichen realisieren; ein Kommentarblock beginnt mit /' und endet mit '/.

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

Hinweis:
Kommentare, die in der Syntax B erstellt werden, werden vom Compiler dennoch geprüft. Grund hierfür ist, dass es für die Präprozessor-Befehle INCLUDE und LANG eine Syntaxform gibt, die das Kommentarsymbol nutzt. Es wird dabei geprüft, ob das zweite Symbol ein Dollarzeichen ($) ist. Möchte man das verhindern, genügt es beispielsweise schon, zwei Kommentarsmbol zu verwenden.

'' Ein Kommentar

Unterschiede zu QB:
Die Kommentarblock-Zeichen existierten unter QB nicht.

Unterschiede zu früheren Versionen von FreeBASIC:
Die Kommentarblock-Zeichen existieren erst seit FreeBASIC v0.16

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

RESET

Syntax: RESET [Argument]
Typ: Anweisung
Kategorie: Datei

RESET schließt alle geöffneten Dateien oder setzt die Standardeingabe bzw. -ausgabe zurück.

- Wird 'Argument' ausgelassen, dann schließt der Befehl alle Dateien. So verwendet ist er identisch mit CLOSE ohne Argument.

- Wird für 'Argument' 0 oder 1 angegeben, dann werden umgeleitete Streams der Standardeingabe (stdin) bzw. Standardausgabe (stdout) geschlossen. 0 schließt Streams der Standardeingabe, 1 schließt Streams der Standardausgabe. Andere Werte als 0 und 1 werden ignoriert.

RESET setzt bei einem Fehler eine Fehlernummer, die mittels ERR abgefragt werden kann.

Beispiel:

DIM x AS STRING

' Aus der Standardeingabe eines Datenstroms lesen
OPEN CONS FOR INPUT AS #1
WHILE EOF(1) = 0
INPUT #1, x
PRINT """"; x; """"
WEND
CLOSE #1

' Eingabe auf die Tastatur zurücksetzen
RESET(0)

PRINT "Gib einen Text ein:"
INPUT x

' Aus der Standardeingabe lesen (jetzt Tastatur)
OPEN CONS FOR INPUT AS #1
WHILE EOF(1) = 0
INPUT #1, x
PRINT """"; x; """"
WEND
CLOSE #1

Hinweis: Um dem Programm mitzuteilen, dass die Dateneingabe beendet ist (Übergabe des EOF), können Sie unter Windows STRG+Z drücken und mit der Eingabetaste bestätigen.

Plattformbedingte Unterschiede:
Unter Linux kann ein mit OPEN CONS geöffneter Datenstrom während des Programmlaufs nicht mehr korrekt geschlossen werden. Andere Betriebssysteme als Linux und Windows wurden nicht getestet.

Unterschiede zu früheren Versionen von FreeBASIC:
RESET setzt seit FreeBASIC v0.24 eine Fehlernummer.

Siehe auch:
OPEN, OPEN CONS, OPEN PIPE, CLOSE

Weitere Informationen:
Wikipedia-Artikel zu den Standard-Datenströmen

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

RESTORE

Syntax: RESTORE [Label]
Typ: Anweisung
Kategorie: Speicherverwaltung

RESTORE 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, bei dem das Lesen begonnen werden soll.
Wird 'Label' ausgelassen, beginnt FreeBASIC das Einlesen an der ersten DATA-Anweisung.

Beispiel:

DIM AS INTEGER x, y

RESTORE bar
READ x
PRINT x

RESTORE
READ x,  y
PRINT x,  y

RESTORE foo
READ x, y
PRINT x, y
SLEEP

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, sodass die Organisation per RESTORE sehr nützlich sein kann.

Siehe auch:
DATA, READ, Verschiedenes

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

RESUME

Syntax: RESUME [NEXT]
Typ: Anweisung
Kategorie: Fehlerbehandlung

RESUME wird im Zusammenhang mit ON ERROR verwendet und kehrt von einer Fehlerbehandlungsroutine zu der Anweisung, die den Fehler erzeugt hat, zurück.
RESUME setzt den Wert von ERR auf 0 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:

#LANG "fblite"

ON ERROR GOTO FehlerHandler

DIM File AS STRING
INPUT "Welche Datei öffnen? ", File

OPEN File FOR INPUT AS #1
'Anweisungen
CLOSE #1
END

FehlerHandler:
PRINT "Datei existiert nicht"
INPUT "Bitte geben Sie eine andere Datei an: ", File
RESUME

Unterschiede unter den FB-Dialektformen:
RESUME steht nur in der Dialektform -lang qb und -lang qb zur Verfügung.

Siehe auch:
ERROR, ON ERROR, ERR, GOTO

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

RETURN

Syntax: RETURN [{ Ausdruck | Label }]
Typ: Anweisung
Kategorie: Programmorganisation

Mit RETURN wird eine FUNCTION oder SUB verlassen. In früheren Versionen von FreeBASIC wurde mit diesem Befehl von einem GOSUB-Aufruf zurückgekehrt.

- Beim Verlassen einer FUNCTION wird mit 'Ausdruck' der Rückgabewert festgelegt. RETURN dient damit als Kurzform für
FUNCTION = Ausdruck : EXIT FUNCTION
Beim Verlassen einer SUB entfällt die Angabe von 'Ausdruck'. RETURN dient als Alternative zu EXIT SUB

- Wird RETURN zum Rücksprung von GOSUB 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.

Seit FreeBASIC v0.16 kann GOSUB/RETURN nur noch in den FB-Dialektformen -lang fblite oder -lang qb verwendet werden; siehe GOSUB für weitere Details.

Beispiel:

DECLARE FUNCTION twice (x AS INTEGER) AS INTEGER

PRINT "Das doppelte von 4 ist " & twice(4)
SLEEP

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

Unterschiede zu QB:
In der Dialektform -lang qb arbeitet RETURN genauso wie unter QB. Unterschiede bei anderen Dialektformen siehe unten.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.16 kann mit RETURN eine SUB verlassen werden.

- Seit FreeBASIC v0.16 kann RETURN nicht mehr auf Prozedurebene eingesetzt werden.

- Seit FreeBASIC v0.13 kann RETURN zum Verlassen einer FUNCTION eingesetzt werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb kann RETURN entweder in Verbindung mit GOSUB oder mit Prozeduren verwendet werden. Standardmäßig wird GOSUB unterstützt. Mit OPTION NOGOSUB kann die Unterstützung der Prozeduren eingeschaltet werden

- In der Dialektform -lang fblite kann RETURN ebenfalls entweder in Verbindung mit GOSUB oder mit Prozeduren verwendet werden. Standardmäßig werden Prozeduren unterstützt. Mit OPTION GOSUB wird die Unterstützung von GOSUB eingeschaltet.

- In den Dialektformen -lang fb und -lang deprecated kann RETURN nur in Zusammenhang mit Prozeduren eingesetzt werden.

Siehe auch:
GOSUB, FUNCTION, SUB, OPTION GOSUB, OPTION NOGOSUB

Letzte Bearbeitung: 17.01.12
Zur Onlinefassung des Eintrags

RGB

Syntax: RGB(rot, grün, blau)
Typ: Funktion
Katerorie: Gfx

RGB errechnet die gültige 32-Farbnummer in hi/truecolor-Bildschirmmodi bei angegebenem Rot-, Grün- und Blau-Wert der Farbe.

- 'rot', 'grün' und 'blau' müssen zwischen 0 und 255 liegen.

- Der Rückgabewert ist ein UINTEGER und entspricht einer Farbnummer im Format &hAARRGGBB. RR, GG und BB sind dabei die Farbkomponenten im Hexadezimalformat. AA ist der implizite Alphawert und wird automatisch auf &hFF (=255) gesetzt.

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) OR &hFF000000)

Beispiel:

SCREENRES 640,480,32                ' 32bit Farbtiefe
LINE(0,0)-(319,479), RGB(255,0,0)   ' rote Strecke
LINE(639,0)-(320,479), RGB(0,0,255) ' blaue Strecke

SLEEP

Siehe auch PUT (Grafik) für ein weiteres Beispiel.
Um aus einem RGB-Wert die einzelnen Farbkomponenten auszulesen, können die Befehle AND und SHR verwendet werden. Siehe dazu Beispiel 2 im Referenzeintrag RGBA.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __RGB in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht RGB nicht zur Verfügung und kann nur über __RGB aufgerufen werden.

Siehe auch:
RGBA, COLOR (Anweisung), DEFINE (Meta), Grafik

Letzte Bearbeitung: 23.01.12
Zur Onlinefassung des Eintrags

RGBA

Syntax: RGBA(rot, grün, blau, alpha)
Typ: Funktion
Katerorie: Gfx

RGBA errechnet die gültige 32-Farbnummer in hi/truecolor-Bildschirmmodi bei angegebenem Rot-, Grün-, Blau- und Alphawert der Farbe.

- 'rot', 'grün', 'blau' und 'alpha' müssen zwischen 0 und 255 liegen.

- Der Rückgabewert ist ein UINTEGER und entspricht einer Farbnummer im Format &hAARRGGBB. RR, GG, BB und AA sind dabei die Farbkomponenten bzw. der Alphawert im Hexadezimalformat.

RGBA arbeitet genauso wie RGB, abgesehen von der Möglichkeit, einen Alphawert (Transparenzgrad) anzugeben. Es ist ein Makro, das folgendermaßen definiert ist:

#DEFINE RGBA(r,g,b,a) ((CUINT(r) SHL 16) OR (CUINT(g) SHL 8) OR CUINT(b) OR (CUINT(a) SHL 24))

Beispiel 1: Zeichnen mit halbtransparenten Bildern

SCREENRES 320, 240, 32  ' Grafikfenster erstellen

DIM AS ANY PTR img
DIM AS INTEGER x, y

' Bild mit verschiedenen Transparenzstufen und Farben erstellen
img = IMAGECREATE(64, 64)
FOR x = 0 TO 63
FOR y = 0 TO 63
PSET img, (x, y), RGBA(x * 4, 0, y * 4, (x + y) * 2)
NEXT y
NEXT x
CIRCLE img, (31, 31), 25,      RGBA(0, 127, 192, 192), ,,, F ' halbtransparenter blauer Kreis
LINE   img, (26, 20)-(38, 44), RGBA(255, 255, 255, 0),    BF ' transparentes weißes Rechteck

' Hintergrund zeichnen (diagonale weiße Strecken)
FOR x = -240 TO 319 STEP 10
LINE (x, 0)-STEP(240, 240), RGB(255, 255, 255)
NEXT

LINE (10,  10)-(310,  37), RGB(127, 0, 0), BF ' rotes Rechteck
LINE (10, 146)-(310, 229), RGB(0, 127, 0), BF ' grünes Rechteck

' Bild zeichnen mit PSET
DRAW STRING(64, 20), "PSet"
PUT(48,  48), img, PSET
PUT(48, 156), img, PSET

' Bild zeichnen mit ALPHA
DRAW STRING (220, 20), "Alpha"
PUT(208,  48), img, ALPHA
PUT(208, 156), img, ALPHA

' Speicher freigeben und Programm beenden
IMAGEDESTROY img
SLEEP

Beispiel 2: Auslesen einzelner Farbkomponenten aus einem RGBA-Wert

#DEFINE RGBA_R( c ) ( CUINT( c ) SHR 16 AND 255 )
#DEFINE RGBA_G( c ) ( CUINT( c ) SHR  8 AND 255 )
#DEFINE RGBA_B( c ) ( CUINT( c )        AND 255 )
#DEFINE RGBA_A( c ) ( CUINT( c ) SHR 24         )

DIM AS UINTEGER r, g, b, a
DIM AS UINTEGER col = RGBA(255, 192, 64, 128)

PRINT USING "Color: _&H\      \"; HEX(col, 8)

r = RGBA_R( col )
g = RGBA_G( col )
b = RGBA_B( col )
a = RGBA_A( col )

PRINT
PRINT USING "Red:         _&H\\ = ###"; HEX(r, 2); r
PRINT USING "Green:       _&H\\ = ###"; HEX(g, 2); g
PRINT USING "Blue:        _&H\\ = ###"; HEX(b, 2); b
PRINT USING "Alpha:       _&H\\ = ###"; HEX(a, 2); a

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __RGBA in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht RGBA nicht zur Verfügung und kann nur über __RGBA aufgerufen werden.

Siehe auch:
RGB, COLOR (Anweisung), DEFINE (Meta), Grafik

Letzte Bearbeitung: 23.01.12
Zur Onlinefassung des Eintrags

RIGHT

Syntax: RIGHT[$](Text, Anzahl)
Typ: Funktion
Kategorie: Stringmanipulation

RIGHT gibt die letzten 'Anzahl' Zeichen von 'Text' zurück.

- 'Text' ist ein STRING, ZSTRING oder WSTRING, dessen Teilstring zurückgegeben werden soll.

- 'Anzahl' ist ein INTEGER mit der Anzahl der zurückgegebenen Zeichen. Ist 'Anzahl' kleiner als 0, dann wird ein Leerstring zurückgegeben. Ist 'Anzahl' größer als die Länge von 'Text', dann wird der gesamte 'Text' zurückgegeben.

- Der Rückgabewert ist ein STRING bzw. WSTRING, der die letzten 'Anzahl' Zeichen von 'Text' enthält.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

DIM AS STRING Text
Text = "hello world"
PRINT RIGHT(Text, 5) 'Ausgabe: "world"

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
LEFT, MID (Funktion), String-Funktionen

Letzte Bearbeitung: 06.09.11
Zur Onlinefassung des Eintrags

RMDIR

Syntax: RMDIR (Ordnername)
Typ: Funktion
Kategorie: Datei

RMDIR löscht ein Verzeichnis aus dem Dateisystem. Das angegebene Verzeichnis darf keine Dateien oder Unterordner enthalten.

- 'Ordnername' 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 gelöscht 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 angegebene Gerät nicht zugegriffen werden kann (z.B. auf eine CD oder einen schreibgeschützten Ordner).

Beispiel:

' sicherstellen, dass ein Verzeichnis mit Namen foo existiert
MKDIR "foo"
IF RMDIR("foo") THEN
PRINT "In "; CURDIR; "\foo\ befinden sich noch Dateien!"
END IF
SLEEP

Achtung: Der Ordner wird nicht in den Papierkorb verschoben, sondern unwiederbringlich gelöscht!

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.

Plattformbedingte Unterschiede:

- Unter Linux muss der Ordnername 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch:
CHDIR, MKDIR, CURDIR, SHELL, KILL, Betriebssystem-Anweisungen

Letzte Bearbeitung: 25.01.12
Zur Onlinefassung des Eintrags

RND

Syntax: RND [(Wiederholung)]
Typ: Funktion
Kategorie: mathematische Funktionen

RND gibt eine zufällige DOUBLE-Zahl zwischen 0 und 1 (im Intervall [0; 1[) zurück, abhängig von der mit RANDOMIZE gesetzten Startzahl. Wird kein RANDOMIZE verwendet, dann liefert RND bei jedem Programmstart dieselbe Folge an Zufallszahlen.

'Wiederholung' ist ein optionaler Parameter, der entweder gleich oder ungleich null ist. Wenn er gleich null ist, wird immer dieselbe Zufallszahl ausgegeben; ist er ungleich null oder wird er ausgelassen, dann wird die nächste Zufallszahl der Liste ausgegeben.

Beispiel:

RANDOMIZE TIMER

PRINT "Ausgabe von 3 Zufallszahlen von 1 bis 6"
FOR i AS INTEGER = 1 TO 3
PRINT INT(RND * 6) + 1
NEXT
SLEEP

Erklärung zum Beispiel:
Mit RND*6 wird eine zufällige Gleitkommazahl zwischen 0 und 6 erzeugt und mit INT abgerundet. Dadurch entsteht eine zufällige ganze Zahl von 0 bis 5. Durch Addition von 1 erhält man eine Zufallszahl von 1 bis 6.

Unterschiede zu QB:
In allen Dialektformen außer -lang qb unterscheidet das optionale Argument nur zwischen null und ungleich null; der in QB verfügbare RND-Reset RND(-1) ist damit unmöglich. Stattdessen muss der Zufallsgenerator mit RANDOMIZE zurückgesetzt werden.

Unterschiede unter den FB-Dialektformen:
Der Standard-Algorithmus zur Erzeugung der Zufallzahlen hängt von der verwendeten Dialektform ab. Siehe dazu RANDOMIZE.

Siehe auch:
RANDOMIZE

Letzte Bearbeitung: 30.08.11
Zur Onlinefassung des Eintrags

RSET

Syntax: RSET Ziel, Quelle
Typ: Anweisung
Kategorie: Stringmanipulation

RSET befüllt das 'Ziel' mit 'Quelle', behält aber die Länge von 'Ziel' bei. Es wird benutzt, um Strings rechtsbündig zu formatieren.

- 'Ziel' ist ein STRING, der befüllt werden soll.

- 'Quelle' ist ein String mit den Daten, mit denen 'Ziel' befüllt wird.

War 'Ziel' vor der Bearbeitung mit RSET z. B. ein fünf Zeichen langer String, so ist er auch nach der Bearbeitung noch fünf Zeichen lang, unabhängig von der Länge von 'Quelle'. Ist 'Quelle' länger als 'Ziel', so werden die vorderen Zeichen des Strings nach 'Ziel' kopiert, der Rest von 'Quelle' wird ignoriert. Ist 'Quelle' kürzer als 'Ziel', so wird 'Ziel' von vorn mit Leerzeichen aufgefüllt. In allen Fällen bleibt 'Quelle' unverändert.

Beispiel:

DIM Quelle AS STRING
DIM Ziel AS STRING

Ziel = "0123456789"
Quelle = "***"
PRINT Ziel, Quelle

RSET  Ziel, Quelle
PRINT Ziel, Quelle
SLEEP

Ausgabe:

0123456789   ***
***   ***

Unterschiede zu QB:
In QB lautet die Syntax RSET Ziel=Quelle.

Siehe auch:
LSET, SPACE, String-Funktionen

Letzte Bearbeitung: 19.01.12
Zur Onlinefassung des Eintrags

RTRIM

Syntax: RTRIM[$] (Stringausdruck [, [ANY] zuEntfernen])
Typ: Funktion
Kategorie: Stringmanipulation

RTRIM (=right trim) entfernt bestimmte angehängte Zeichen aus einem String.

- 'Stringausdruck' ist der STRING, ZSTRING oder WSTRING, der gekürzt werden soll.

- 'zuEntfernen' ist ein Ausdruck, der angibt, welche Zeichen entfernt werden sollen. Wird dieser Parameter ausgelassen, entfernt FreeBASIC automatisch alle Leerzeichen am Ende des Strings. 'zuEntfernen' darf aus mehreren Zeichen bestehen.

- Wird die ANY-Klausel verwendet, entfernt FreeBASIC jedes Zeichen aus 'zuEntfernen' am Ende von 'Stringausdruck'.

- Der Rückgabewert ist der um die angegebenen Zeichen gekürzte String.

RTRIM arbeitet case-sensitive, d. h. die Groß-/Kleinschreibung ist ausschlaggebend.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT LEN( RTRIM("hello ") )
PRINT RTRIM("hello World", "ld")
PRINT RTRIM("hello World", "dl")
PRINT RTRIM("hello World", ANY "dl")
SLEEP

Ausgabe:

5
hello Wor
hello World
hello Wor

Unterschiede zu QB:

- Der Parameter 'zuEntfernen' und die ANY-Klausel sind neu in FreeBASIC.

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Der Parameter 'zuEntfernen' und die ANY-Klausel existieren seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
LTRIM, TRIM, INSTR, String-Funktionen

Letzte Bearbeitung: 20.01.12
Zur Onlinefassung des Eintrags

RUN

Syntax: RUN (Datei [, Argumente])
Typ: Funktion
Kategorie: Programmorganisation

RUN startet eine ausführbare Datei. Wenn die Datei ordnungsgemäß ausgeführt werden konnte, wird die Kontrolle anschließend an das Betriebssystem zurückgegeben.

- 'Datei' ist ein STRING, der den vollen Dateinamen (inklusive Erweiterung) der auszuführenden Datei enthält.

- 'Argumente' ist ein STRING, der die Argumente enthält, die an das Programm übergeben werden sollen.

- Wenn ein Fehler aufgetreten ist, z.B. wenn die aufzurufende Datei nicht existiert, wird -1 zurückgegeben.

RUN transferiert die Kontrolle auf das aufgerufene Programm. 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 erfolgreichem Aufruf kein Rückgabewert mehr ausgewertet werden kann.

Beispiel:
Wenn die Datei "file.exe" im aktuellen Arbeitsverzeichnis existiert, wird sie durch diesen Code aufgerufen:

IF RUN "file.exe" = -1 THEN
PRINT """file.exe"" existiert scheinbar doch nicht."
ELSE
PRINT "Es ist egal was hier passiert, es wird nie ausgefuehrt."
ENDIF

SLEEP 'Wird nur ausgefuehrt, wenn der RUN-Aufruf -1 zurueckgibt.

Da das Programm automatisch beendet wird, wenn "file.exe" erfolgreich ausgeführt werden konnte, muss nicht geprüft werden, ob der Rückgabewert -1 war.

Unterschiede zu QB:

- In FreeBASIC muss der volle Dateiname inklusive Erweiterung (.exe unter Win32 und DOS) angegeben werden.

- RUN kann als Funktion eingesetzt werden.

Plattformbedingte Unterschiede:

- Unter Linux muss der Dateiname 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

- Das Trennzeichen für den Dateipfad ist unter Linux der vorwärtsgerichtete Slash /. Windows verwendet den Backslash \, erlaubt aber auch der Slash. DOS verwendet den Backslash.

Siehe auch:
CHAIN, EXEC, SHELL, END, COMMAND, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

Startbuchstabe S

SADD

Syntax: SADD (Stringvariable)
Typ: Funktion
Kategorie: Speicherverwaltung

SADD gibt einen Pointer auf eine String-Variable zurück. Es ist ein Alias zu STRPTR und verweist auf den Anfang des tatsächlichen String-Inhalts, während @ auf den Anfang der Datenstruktur zeigt. Im Artikel zum Datentyp STRING finden Sie nähere Informationen zur Handhabung des Speichers.

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

Ausgabebeispiel:

0
160527952
160527952     3215135288
Abcdefg, 1234567, 54321

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 QuickBasic wurde hier ein 16bit-Offset ausgegeben, das Segment musste zusätzlich ermittelt werden.

Siehe auch:
STRING (Datentyp), @, STRPTR, PEEK, POKE, Grundlagen zu Pointern, Zusammenstellung von Pointer-Anweisungen

Letzte Bearbeitung: 24.08.10
Zur Onlinefassung des Eintrags

SCOPE

Syntax:

SCOPE
' Programmcode
END SCOPE

Typ: Anweisung
Kategorie: Speicherverwaltung

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. Besteht die Variable bereits außerhalb des Blocks und wird im Block neu dimensioniert, dann wird die alte Variable bis zum Ende des Blocks ignoriert - auf ihren Wert kann innerhalb des Blocks nicht zugegriffen werden. Am Ende des Blocks wird der Wert der alten Variablen wiederhergestellt.

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.

Hinweis: Seit FreeBASIC v0.16 erzeugen alle Schleifen (DO ... LOOP, WHILE ... WEND, FOR ... NEXT) und Bedingungen (IF ... THEN, SELECT CASE) intern einen eigenen SCOPE-Block. Seit FreeBASIC v0.17 erzeugen auch TYPE, UNION und ENUM einen eigenen SCOPE-Block.

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
SLEEP

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

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb und -lang fblite steht SCOPE nicht zur Verfügung.

Siehe auch:
DIM, REDIM, Gültigkeitsbereich von Variablen

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

SCREEN (Anweisung)

Syntax: SCREEN Modus[,[ Farbtiefe][,[ Seitenzahl][, [Flags][, Bildwiederholrate]]]]
Typ: Anweisung
Kategorie: Gfx

SCREEN setzt den aktuellen Bildschirm-Grafik-Modus. Sofern möglich, sollte der flexiblere SCREENRES-Befehl statt SCREEN verwendet werden, um das Grafikfenster einzustellen. Die Möglichkeit, Grafikbildschirme mit einer im Modus-Parameter fest kodierten Größe festlegen zu können, existiert lediglich aus Kompatibilitätsgründen zu QB. Mit dem SCREENRES-Befehl kann die Fenstergröße explizit festgelegt werden.

- 'Modus' ist die Nummer des Bildschirmmodus (siehe unten).

- Die anderen Parameter entsprechen denen von SCREENRES.

'Farbtiefe' hat nur Auswirkungen, wenn 'Modus' größer ist als 13. Wird sie ausgelassen, dann wird bei einem Bildschirmmodus über 13 die Farbtiefe von 8 bpp (256 Farben) verwendet

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

10

640x350 in EGA Emulation

80x25 oder 80x43 Text Spalten/Zeilen
8x14 oder 8x8 Zeichensatz

Gleichzeitig je 2 Farben aus 16 Mio. Farben (24 Bit)

11

640x480 in VGA Emulation

80x30 oder 80x60 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 2 Farben aus 16 Mio. Farben (24 Bit)

12

640x480 in VGA Emulation

80x30 oder 80x60 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 16 Farben aus 16 Mio. Farben (24 Bit)

13

320x200 in MCGA Emulation

40x25 Text Spalten/Zeilen
8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit)

14

320x240

40x30 Text Spalten/Zeilen
8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

15

400x300

50x37 Text Spalten/Zeilen
8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

16

512x384

64x24 oder 64x48 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

17

640x400

80x25 oder 80x50 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

18

640x480

80x30 oder 80x60 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

19

800x600

100x37 oder 100x75 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

20

1024x768

128x48 oder 128x96 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

21

1280x1024

160x64 oder 160x128 Text Spalten/Zeilen
8x16 oder 8x8 Zeichensatz

Gleichzeitig je 256 Farben aus 16 Mio. Farben (24 Bit) oder Truecolor

Die Anzahl der verwendeten Spalten und Zeilen kann mit WIDTH geändert werden.

Beispiel: Bildschirmmodus 640x480x32bpp mit 4 Bildschirmseiten im Vollbildmodus einstellen:

SCREEN 18, 32, 4, 1
IF SCREENPTR = 0 THEN
PRINT "Bildschirmmodus nicht initialisiert!"
END
END IF
'...
SLEEP

Unterschiede zu QB:

- QBASIC erlaubt keine SCREEN-Flags.

- Die Bedeutung der Parameter ist nicht mehr dieselbe wie in QB. Siehe dazu die alte QB-Syntax unter 'Unterschiede unter den FB-Dialektformen'.

- Es gibt mehr verfügbare Bildschirmmodi.

Plattformbedingte Unterschiede:

- Unter DOS werden keine Fenster- und OpenGL-Flags unterstützt.

- Das SCREEN-Flag 'GFX_HIGH_PRIORITY' existiert nur unter Win32.

Unterschiede zu früheren FreeBASIC-Versionen:

- Seit FreeBASIC v0.18.4 existiert das SCREEN-Flag 'GFX_HIGH_PRIORITY'.

- 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

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb muss die Syntax von QBASIC verwendet werden:

SCREEN [Modus] [,[Aktive_Seite][,[Sichtbare_Seite]]]

Siehe auch:
SCREEN (Funktion), SCREENRES, SCREENINFO, SCREENLIST, Grafik

Letzte Bearbeitung: 24.09.11
Zur Onlinefassung des Eintrags

SCREEN (Funktion)

Syntax: SCREEN (Zeile, Spalte [, Typ])
Typ: Funktion
Kategorie: Konsole

SCREEN 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 0 (Null) angegeben oder 'Typ' ausgelassen, ist der Rückgabewert der ASCII-Code des Zeichens an der angegebenen Position. Wird 1 (Eins) angegeben, ist der Rückgabewert die Farbe des Zeichens an der angegebenen Position in der Form
Vordergrund OR (Hintergrund SHL 8)

Beispiel:

DIM i AS INTEGER
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

Unterschiede zu QB:
In QB erzeugt SCREEN einen Fehler, wenn Koordinaten außerhalb des Fensters verwendet werden.

Plattformbedingte Unterschiede:
Unter Linux kann der zurückgegebene Wert vom in der Konsole angezeigten Wert abweichen. Zum Beispiel können nicht anzeigbare Kontrollcodes wie das LF-Zeichen (ASCII-Zeichen 10), welches das Ende des geschriebenen Textes markiert, übernommen werden.

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

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

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 abgefragten Einstellungen aufnehmen. Alle param-Variablen sind vom Typ INTEGER.

- 'caption' ist eine STRING-Variable, die ebenso wie die param-Variablen die neue Einstellung enthält oder die aktuelle Einstellung aufnimmt.

Im folgenden werden die für 'Option' einsetzbaren Werte aufgelistet. 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.

In der Regel muss ein Grafik- oder OpenGL-Fenster initialisiert worden sein (siehe SCREENRES), bevor der Befehl sinnvoll eingesetzt werden kann.

Leseoptionen

Wert

Konstante in der fbgfx.bi

Bedeutung

0

GET_WINDOW_POS

Gibt die aktuelle Position des Grafikfensters als Desktopkoordinaten an.
'param1' enthält die X-Koordinate, 'param2' die Y-Koordinate.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN 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. Dies funktioniert auch ohne initialisiertem Grafikscreen, wenn der Titel zuvor mit SCREENCONTROL oder WINDOWTITLE gesetzt wurde.

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"-ID dar.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN 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 die Breite, 'param2' die Höhe des Desktops. Die Aktion funktioniert auch ohne initialisiertem Grafikfenster.

4

GET_SCREEN_SIZE

Gibt die aktuelle Größe des Grafikfensters in Pixeln an.
'param1' enthält die Breite, 'param2' die Höhe des Grafikfensters.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN initialisiert wurde, so wird in 'param1' und 'param2' der Wert 0 zurückgegeben.

5

GET_SCREEN_DEPTH

Gibt in 'param1' die aktuelle Farbtiefe des Grafikfensters in Bits pro Pixel zurück.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN initialisiert wurde, so wird in 'param1' der Wert 0 zurückgegeben.

6

GET_SCREEN_BPP

Gibt in 'param1' die aktuelle Farbtiefe des Grafikfensters in Byte pro Pixel zurück.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN 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 Byte pro Pixel.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN initialisiert wurde, so wird in 'param1' der Wert 0 zurückgegeben.

8

GET_SCREEN_REFRESH

Gibt in 'param1' die Bildwiederholrate in Hertz zurück.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN 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 SCREENRES oder SCREEN initialisiert wurde, so wird in 'caption' ein Leerstring zurückgegeben.

10

GET_TRANSPARENT_COLOR

Gibt in 'param1' die aktuelle Maskenfarbe zurück, die von der aktuellen Farbtiefe abhängig ist.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN 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 SCREENRES oder SCREEN initialisiert wurde, so wird in 'param1' und 'param2' der Wert 0 zurückgegeben.

12

GET_PEN_POS

Gibt in 'param1' und 'param2' die X- und Y-Koordinate des Grafikcursors in Grafikfensterkoordinaten 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 SCREENRES oder SCREEN 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 die Vordergrundfarbe, 'param2' die Hintergrundfarbe auf.
Wird diese Funktion aufgerufen, bevor ein Grafikfenster mit SCREENRES oder SCREEN initialisiert wurde, so wird in 'param1' und 'param2' der Wert 0 zurückgegeben.

14

GET_ALPHA_PRIMITIVES

TRUE (-1) wenn GFX_ALPHA_PRIMITIVES gesetzt wurde, FALSE (0) wenn nicht (siehe SCREENRES).

15

GET_GL_EXTENSIONS

Gibt in 'caption' einen String zurück, der alle unterstützten GL-Erweiterungen enthält. Wird kein OpenGL-Modus verwendet, dann wird ein leerer String zurückgegeben.

16

GET_HIGH_PRIORITY

TRUE (-1) wenn GFX_HIGH_PRIORITY gesetzt wurde, FALSE (0) wenn nicht (siehe SCREENRES).

Schreiboptionen

Wert

Konstante in der fbgfx.bi

Bedeutung

100

SET_WINDOW_POS

Legt die Position des Grafikfensters in Desktopkoordinaten fest; 'param1' und 'param2' sind die neue X- und Y-Koordinate des Grafikfensters relativ zum linken oberen Bildschirmrand.

101

SET_WINDOW_TITLE

Ändert den Text in der Titelleiste des aktiven Fensters. 'caption' enthält den neuen Titel des Fensters.
Diese Aktion hat dieselbe Auswirkung wie
WINDOWTITLE caption (siehe WINDOWTITLE). Sie kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

102

SET_PEN_POS

Bestimmt die Position des Grafikcursors. 'param1' und 'param2' enthalten 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.

103

SET_DRIVER_NAME

Setzt mit 'caption' den aktiven Grafiktreiber. Die Aktion wirkt sich erst auf das nächste initialisierte Grafikfenster aus.

104

SET_ALPHA_PRIMITIVES

Bestimmt mit 'param1', ob GFX_ALPHA_PRIMITIVES gesetzt sein soll (-1) oder nicht (0) (siehe SCREENRES).

105

SET_GL_COLOR_BITS

Setzt mit 'param1' die Anzahl der notwendigen Bits für den OpenGL color buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

106

SET_GL_COLOR_RED_BITS

Setzt mit 'param1' die Anzahl der Bits für die Rot-Komponente des OpenGL color buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

107

SET_GL_COLOR_GREEN_BITS

Setzt die Anzahl der Bits für die Grün-Komponente des OpenGL color buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

108

SET_GL_COLOR_BLUE_BITS

Setzt mit 'param1' die Anzahl der Bits für die Blau-Komponente des OpenGL color buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

109

SET_GL_COLOR_ALPHA_BITS

Setzt mit 'param1' die Anzahl der Bits für die Alpha-Komponente des OpenGL color buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

110

SET_GL_DEPTH_BITS

Setzt mit 'param1' die Anzahl der notwendigen Bits für den OpenGL depth buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

111

SET_GL_STENCIL_BITS

Setzt mit 'param1' die Anzahl der notwendigen Bits für den OpenGL stencil buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

112

SET_GL_ACCUM_BITS

Setzt mit 'param1' die Anzahl der notwendigen Bits für den OpenGL accumulation buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

113

SET_GL_ACCUM_RED_BITS

Setzt mit 'param1' die Anzahl der Bits für die Rot-Komponente des OpenGL accumulation buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

114

SET_GL_ACCUM_GREEN_BITS

Setzt mit 'param1' die Anzahl der Bits für die Grün-Komponente des OpenGL accumulation buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

115

SET_GL_ACCUM_BLUE_BITS

Setzt mit 'param1' die Anzahl der Bits für die Blau-Komponente des OpenGL accumulation buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

116

SET_GL_ACCUM_ALPHA_BITS

Setzt mit 'param1' die Anzahl der Bits für die Alpha-Komponente des OpenGL accumulation buffer. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

117

SET_GL_NUM_SAMPLES

Setzt mit 'param1' die Anzahl der Samples, die von OpenGL Multisampling genutzt werden sollen. Die Aktion kann auch ausgeführt werden, bevor ein Grafikfenster initialisiert wurde.

Weitere Optionen

Wert

Konstante in der fbgfx.bi

Bedeutung

200

POLL_EVENTS

Alle Ereignisse (Events) wie Tasten- oder Mausbetätigung werden abgefragt. Nützlich in OpenGL-Programmen wenn FLIP nicht verwendet wird, da die FLIP-Anweisung diese Abfragen veranlasst.

Beispiel:
Es wird ein transparentes Fenster mit einem Schriftzug erzeugt. Bei einem Mausklick auf den Schriftzug kann das Fenster (samt Inhalt) verschoben werden.

#INCLUDE "fbgfx.bi"
USING FB

DIM AS EVENT e
DIM AS INTEGER x, y, pressed, col
DIM AS ANY PTR img

' Splashscreen (durchsichtiges Fenster) erzeugen
SCREENRES 384, 64, 32,, GFX_SHAPED_WINDOW

img = IMAGECREATE(48, 8)
' graphischen Schriftzug erzeugen
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
' Druck der Maustaste merken
pressed = -1
CASE EVENT_MOUSE_BUTTON_RELEASE
' Loslassen der Maustaste merken
pressed = 0
CASE EVENT_MOUSE_MOVE
IF (pressed) THEN
' Fenster verschieben
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) ' Ende bei Druck der ESC-Taste

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- Der Befehl existiert erst seit FreeBASIC v0.17

- GET_HIGH_PRIORITY existiert erst seit FreeBASIC v0.18.4

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENCONTROL nicht zur Verfügung und kann nur über __SCREENCONTROL aufgerufen werden.

Siehe auch:
SCREENRES, SCREENINFO, SCREENEVENT, WINDOWTITLE, VIEW (Grafik), Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

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 soll. Wird dieser Parameter ausgelassen, nimmt FreeBASIC automatisch die Nummer der aktiven Bildschirmseite an.

- 'Zielseite' ist die Seite, auf welche die Daten kopiert werden sollen. 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-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.

Im Grafikmodus bewirken die Befehle FLIP und PCOPY dasselbe wie SCREENCOPY.

Beispiel:

SCREENRES 320, 240, 32, 2   'Fenster mit 320x240 Pixeln und 32-bit Farbtiefe und zwei Bildseiten.

FOR n AS INTEGER = 50 TO 270

SCREENSET 2, 1              'Stellt die zu bearbeitende Seite auf 2 und zeigt Seite 1 an.
CLS
CIRCLE (n, 50), 50 , RGB(255, 255, 0) 'Zeichnet einen gelben Kreis und einem Radius von 50 Pixel auf Seite 2.
SCREENSET 1, 1              'Stellt die zu bearbeitende und anzuzeigende Seite auf Seite 1.
SCREENSYNC                  'Wartet bis die Bildschirmaktualisierung erfolgt ist.
SCREENCOPY 2, 1                   'Kopiert den Kreis von Seite 2 auf Seite 1.

SLEEP 25
NEXT

PRINT "Taste druecken um zu beenden."
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Möglichkeit, mit SCREENCOPY nur den durch VIEW (Grafik) definierten Darstellungsbereich zu kopieren, besteht seit FreeBASIC v0.13.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENCOPY nicht zur Verfügung und kann nur über __SCREENCOPY aufgerufen werden.

Siehe auch:
SCREENRES, SCREENSET, SCREENSYNC, FLIP, PCOPY, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENEVENT

Syntax: SCREENEVENT [ (Ereignis) ]
Typ: Funktion
Kategorie: Eingabe/Ereignisverwaltung

SCREENEVENT gibt Informationen zu einem Systemereignis, welches 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) '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
w 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, auf 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).

14

EVENT_MOUSE_HWHEEL

Das horizontale Mausrad wurde benutzt. Die neue Position des Mausrads wird im Record '.w' eingetragen.
Dieses Ereignis wird nur ausgewertet, wenn das Programmfenster (nur unter Windows) den Fokus hat.

Beispiel:

#INCLUDE "fbgfx.bi"

DIM AS FB.EVENT PTR event
event = ALLOCATE(20)

SCREENRES 640, 480
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";
ELSEIF (event->button = FB.BUTTON_X1) THEN
PRINT "Die X1";
ELSEIF (event->button = FB.BUTTON_X2) THEN
PRINT "Die X2";
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";
ELSEIF (event->button = FB.BUTTON_X1) THEN
PRINT "Die X1";
ELSEIF (event->button = FB.BUTTON_X2) THEN
PRINT "Die X2";
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
DEALLOCATE event   ' reservierten Speicher wieder freigeben

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Siehe auch:
SCREENRES, MULTIKEY, INKEY, GETMOUSE, NAMESPACE, USING (NAMESPACE), Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENGLPROC

Syntax: SCREENGLPROC (OpenGL_Prozedurname)
Typ: Funktion
Kategorie: Gfx

SCREENGLPROC ermittelt die Adresse einer OpenGL-Prozedur. Sie wird eingesetzt, um Zeiger zu neuen Funktionen bei OpenGL-Erweiterungen abzufragen.

- 'OpenGL_Prozedurname' ist der Name der Prozedur, deren Adresse abgefragt wird.

- Der Rückgabewert ist ein PROCPTR mit der Adresse der OpenGL-Prozedur. Wenn die Prozedur nicht gefunden wurde, wird NULL (0) zurückgegeben.

Beispiel:

#INCLUDE "fbgfx.bi"     ' für einige nützliche Definitionen

DIM SwapInterval AS FUNCTION(BYVAL interval AS INTEGER) AS INTEGER
DIM extensions AS STRING

' OpenGL initialisieren und unterstützte Erweiterungen ermitteln
SCREENRES 640, 480, 32,, FB.GFX_OPENGL
SCREENCONTROL FB.GET_GL_EXTENSIONS, extensions

IF (INSTR(extensions, "WGL_EXT_swap_control") <> 0) THEN
' Erweiterung unterstützt; Adresse der Prozedur ermitteln
SwapInterval = SCREENGLPROC("wglSwapIntervalEXT")
IF (SwapInterval <> 0) THEN
' Adresse ermittelt; mit OpenGL auf vertikale Synchronisation warten
SwapInterval(1)
END IF
END IF
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede: wird unter DOS nicht unterstützt

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENGLPROC nicht zur Verfügung und kann nur über __SCREENGLPROC aufgerufen werden.

Siehe auch:
SCREENRES, SCREENSET, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENINFO

Syntax: SCREENINFO [Breite][,[Höhe][,[Farbtiefe][,[bpp][,[Pitch][,[Rate][,Treiber]]]]]]
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.

- 'Breite' und 'Höhe' sind INTEGER-Variablen, in welche die Breite bzw. Höhe des Bildschirms in Pixeln zurückgegeben werden.

- 'Farbtiefe' ist ein INTEGER mit dem aktuellen Pixelformat in Bit pro Pixel. Es kann 1, 2, 4, 8, 16 oder 32 sein. Siehe Interne Pixelformate.

- Das INTEGER 'bpp' gibt die Byte pro Pixel zurück.

- Das INTEGER 'Pitch' enthält die Größe einer Framebuffer-Zeile in Byte.

- Das INTEGER 'Rate' gibt die Bildschirmaktualisierungsrate an.

- 'Treiber' ist ein STRING mit dem Namen 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 in der entsprechenden Variable der Wert 0gespeichert.
Wenn Sie den Bildschirmmodus via SCREENRES oder SCREEN ä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

SCREENRES 400, 300, 32

' Informationen über aktuellen Modus nachfragen:
SCREENINFO w, h, depth, , , refresh, driver

PRINT w & "x" & h & "x" & depth;
IF (refresh > 0) THEN
PRINT " @ " & refresh & " Hz";
END IF
PRINT " unter Verwendung des Treibers " & driver
SLEEP 2500

' Grafikfenster schließen und Informationen über Desktop nachfragen
SCREEN 0
SCREENINFO w, h, depth
PRINT "Desktopauflösung: " & w & "x" & h & "x" & depth
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.20.0

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENINFO nicht zur Verfügung und kann nur über __SCREENINFO aufgerufen werden.

Siehe auch:
SCREENRES, SCREEN (Anweisung), SCREENLIST, Interne Pixelformate, Grafik

Letzte Bearbeitung: 13.12.11
Zur Onlinefassung des Eintrags

SCREENLIST

Syntax: SCREENLIST ([Farbtiefe])
Typ: Funktion
Kategorie: Gfx

SCREENLIST gibt eine Liste aller unterstützten Bildschirmauflösungen zurück.

- 'Farbtiefe' gibt die Farbtiefe in Bit an, für welche die unterstützten Auflösungen abgefragt werden sollen. Möglich ist die Farbtiefe 8, 15, 16, 24 oder 32. Wird 'Farbtiefe' ausgelassen, dann wird die nächste verfügbare Auflösung der zuletzt abgefragten Farbtiefe zurückgegeben (s. u.).

- Der Rückgabewert ist ein INTEGER, welches die Bildschirmbreite und -höhe der nächsten verfügbaren Auflösung enthält. Steht keine weitere Auflösung zur Verfügung, dann wird 0 zurückgegeben.

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 'Farbtiefe' aufrufen, und angeben, für welche Farbtiefe die Prüfung durchgeführt werden soll. Ausgegeben wird die erste unterstützte Auflösung für diese Farbtiefe, codiert in einer 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) enthält die Breite, und das untere Word (untere 16 Bit, durch LOWORD zurückgegeben) die Höhe.

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 modus, breite, hoehe
' Welche 8bit-Auflösungen werden unterstützt?
modus = SCREENLIST(8)
WHILE (modus)
breite = HIWORD(modus)
hoehe = LOWORD(modus)
PRINT breite & "x" & hoehe
modus = SCREENLIST
WEND
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.14

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENLIST nicht zur Verfügung und kann nur über __SCREENLIST aufgerufen werden.

Siehe auch:
SCREENRES, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENLOCK

Syntax: SCREENLOCK
Typ: Anweisung
Kategorie: Gfx

SCREENLOCK sperrt den Zugriff auf eine Bildschirmseite.

Die Anweisung SCREENLOCK 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 Änderungen durch jegliche Grafikbefehle (z.B. Drawing Primitives wie PSET, LINE, CIRCLE, etc.) sind nicht mehr sichtbar, 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. Wenn die aktive Seite zugleich auch die sichtbare Seite ist, bleiben alle Änderungen so lange unsichtbar, bis die Seite mit SCREENUNLOCK entsperrt wurde.
SCREENLOCK und SCREENUNLOCK müssen immer paarweise verwendet werden. Bei jeder Verwendung von SCREENLOCK wird ein interner Zähler hochgezählt und bei SCREENUNLOCK wieder reduziert. Wenn dieser Zähler auf 0 steht, dann ist die Bildschirmseite entsperrt.

ACHTUNG: Während der Bildschirm gesperrt ist, sollten nur Zeichenbefehle aufgerufen werden. Input/Output und Wartebefehle müssen vermieden werden. Unter Win32 und Linux wird der Bildschirm gesperrt, indem der Thread gestoppt wird, der auch für die Events des Betriebssystems zuständig ist. Wenn der Bildschirm für längere Zeit gesperrt bleibt, kann das System instabil werden.

Beispiel:

' SCREENLOCK/-UNLOCK macht nur mit Grafikscreens Sinn
SCREENRES 300, 100, 32

' ohne SCREENLOCK/-UNLOCK
DO
CLS
LOCATE 2, 2 : PRINT "Ausgabe"
LOCATE 4, 2 : PRINT "Ein Text"
LOCATE 6, 2 : PRINT "Dieser Text flackert"
SLEEP 1 'Auslastung senken
LOOP UNTIL INKEY = CHR(32) ' auf Druck der Leertaste warten

'mit SCREENLOCK/-UNLOCK
DO
SCREENLOCK
CLS
LOCATE 2, 2 : PRINT "Ausgabe"
LOCATE 4, 2 : PRINT "Ein Text"
LOCATE 6, 2 : PRINT "Dieser Text flackert nicht"
SCREENUNLOCK
SLEEP 1
LOOP UNTIL INKEY = CHR(32) ' auf Druck der Leertaste warten

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In DOS reagiert der Mauszeiger nicht auf Mausbewegungen, solange der Bildschirm gesperrt ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENLOCK nicht zur Verfügung und kann nur über __SCREENLOCK aufgerufen werden.

Siehe auch:
SCREENRES, SCREENUNLOCK, SCREENPTR, Grafik

Letzte Bearbeitung: 23.07.11
Zur Onlinefassung des Eintrags

SCREENPTR

Syntax: SCREENPTR
Typ: Funktion
Kategorie: Gfx

SCREENPTR gibt einen Pointer zurück, der auf den Datenbereich (Video-RAM oder Framebuffer, siehe Hinweis unten) der aktiven Bildschirmseite zeigt, oder null, wenn kein Grafikmodus aktiv ist.
SCREENPTR kann dazu verwendet werden, um zu testen, ob ein SCREENRES-Aufruf erfolgreich war, oder um den Videospeicher direkt zu lesen oder zu beschreiben - vorausgesetzt, die Seite wurde zuvor mit SCREENLOCK gesperrt und wird nach dem Speicherzugriff mit SCREENUNLOCK entsperrt.

Um auf die Pixel im Bildschirmpuffer zuzugreifen, müssen die Bildschirmbreite, -höhe, Bytes pro Pixel und Bytes pro Zeile (Pitch) bekannt sein. Diese Informationen können mithilfe von SCREENINFO ermittelt werden.

Der von SCREENPTR zurückgelieferte Pointer ist nur nach einem erfolgreichen SCREENRES-Aufruf gültig und verliert seine Gültigkeit nach jedem weiteren SCREENRES-Aufruf.

Beispiel:

' Bildschirmmodus 320x200x8bpp setzen
' Keine Angaben zu Bildschirmseiten => nur eine aktive Seite = sichtbare Seite
SCREENRES 320, 200

' 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

Hinweis:
Da FreeBASICs GfxLib intern immer zwei Seiten vorhält (Double Buffering), zeigt SCREENPTR immer auf die zweite Seite, die im Hintergrund zur Bearbeitung bereitliegt. Die vordere Seite dient nur der Anzeige. Dies hat bei der Verwendung allerdings keine Bedeutung, da FreeBASIC automatisch zwischen diesen zwei Seiten wechselt.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENPTR nicht zur Verfügung und kann nur über __SCREENPTR aufgerufen werden.

Siehe auch:
SCREENRES, SCREENLOCK, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENRES

Syntax: SCREENRES Breite, Höhe[, [Farbtiefe][, [Seitenzahl][, [Flags][, Bildwiederholrate]]]]
Typ: Anweisung
Kategorie: Gfx

SCREENRES initiiert ein Grafikfenster. Der Befehl 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.

- 'Breite' und 'Höhe' sind die Breite und die Höhe des zu initiierenden Grafikfensters.

- 'Farbtiefe' ist die Farbtiefe in Bits pro Pixel (bpp). Wenn Sie diesen Parameter auslassen, wird die Standard-Farbtiefe von 8 bpp (256 Farben) verwendet.
Achtung: Die Farbtiefe kann im Fenstermodus nicht über der Farbtiefe der Desktopoberfläche liegen; wird dennoch eine höhere Farbtiefe angegeben, setzt FreeBASIC diese automatisch auf die Desktop-Farbtiefe zurück.

- 'Seitenzahl' 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 derselben 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 'Seitenzahl' nicht angeben, wird nur die aktive Seite (mit der Nummer 0) verfügbar sein.

- 'Flags' 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 0 an. Dadurch wird automatisch die günstigste Rate ermittelt. Lassen Sie diesen Parameter am besten einfach aus, außer Sie sind sich völlig im Klaren darüber, was Sie tun - es gibt eigentlich nicht viele Gründe, die vom Benutzer oder System festgelegten Wiederholraten außer Kraft zu setzen. Ganz im Gegenteil, eine Ihrerseits fest gewählte Bildwiederholrate könnte auf einem anderen Bildschirm eventuell gar nicht dargestellt werden!

VORSICHT: Geben Sie keine Auflösung an, welche die aktuelle Bildschirmgröße übersteigt!
Benutzen Sie im Zweifelsfall vorher SCREENINFO, um die aktuelle Auflösung zu ermitteln.

Hinweis: Falls Sie Alphatransparenz nutzen möchten, muss als 'Farbtiefe' mindestens 24-Bit angegeben werden. Des Weiteren muss als 'Flags' der Wert &h40 gesetzt werden oder mit eingebundener fbgfx.bi die Konstante GFX_ALPHA_PRIMITIVES, damit Drawing Primitives wie PSET, LINE etc. die Alphatransparenz verarbeiten (siehe dazu auch die folgende Beschreibung zu 'Flags').

Bedeutung des Parameters 'Flags'
'Flags' ist einer von folgenden 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 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

GFX_NO_FRAME

kein Rahmen

&h10

GFX_SHAPED_WINDOW

Splashscreen-Modus

&h20

GFX_ALWAYS_ON_TOP

Fenster, das immer auf oberster Ebene bleibt

&h40

GFX_ALPHA_PRIMITIVES

Bearbeite auch ALPHA-Werte bei Drawing Primitives wie PSET, LINE, etc.

&h80

GFX_HIGH_PRIORITY

Höhere Priorität für Grafikprozesse, nur unter Win32

&h10000

GFX_STENCIL_BUFFER

Stencil Buffer (Schablonenpuffer) verwenden (nur im OpenGL-Modus)

&h20000

GFX_ACCUMULATION_BUFFER

Accumulation Buffer (nur im OpenGL-Modus)

&h40000

GFX_MULTISAMPLE

Bewirkt im Vollbildmodus Antialiasing durch die ARB_multisample-Erweiterung

-1

GFX_NULL

Grafikmodus ohne visuelles Feedback

- Wenn das Vollbild-Flag gesetzt ist, wird SCREENRES versuchen, den angegebenen Bildschirmmodus zu initialisieren. Wenn es gesetzt ist und das System den Bildschirm nicht im Vollbildmodus initialisieren kann, wird SCREENRES 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 SCREENRES versuchen, den Bildschirm im Vollbildmodus zu initialisieren. Wenn beide Versuche fehlschlagen, hat SCREENRES 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 ersetzen 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 Splashscreen-Flag bewirkt dasselbe 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.

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

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 dieser verfügbar ist.

FreeBASIC wird versuchen, den Bildschirmmodus so gut wie möglich zu initialisieren; wenn alle Versuche fehlschlagen, hat SCREENRES keine Auswirkungen. Die Ausführung des Programms wird mit der Zeile nach der SCREENRES-Anweisung fortgesetzt. Sie sollten daher nachprüfen, ob der Bildschirmmodus erfolgreich initialisiert wurde; dies können Sie mit der SCREENPTR-Funktion tun.

Beispiel 1: ein 320x240 Pixel großes Grafikfenster öffnen und prüfen, ob der Aufruf erfolgreich war

SCREENRES 320, 240, 16
IF SCREENPTR = 0 THEN
PRINT "Bildschirmmodus nicht initialisiert!"
END
END IF
'...
SLEEP

Beispiel 2: ein 200x200 Pixel großes Grafikfenster im Splashscreen-Modus, immer im Vordergrund

#INCLUDE "fbgfx.bi"
SCREENRES 200, 200, 32,, FB.GFX_SHAPED_WINDOW OR FB.GFX_ALWAYS_ON_TOP
CIRCLE (100, 100), 50, RGB(255, 0, 255),,,, F

DO
SLEEP 1
LOOP UNTIL LEN(INKEY)

Weitere Auswirkungen von SCREENRES:
Ein erfolgreicher SCREENRES-Aufruf setzt ...

- die Nummer der sichtbaren als auch die der aktiven Bildschirmseite auf 0

- die Palette in den indizierten Farbmodi (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

- die Schriftgröße auf 8x8 (dies kann geändert werden, indem mit WIDTH die Anzahl der Zeilen und Spalten festgelegt wird)

- den Grafik-Cursor in die Mitte des Bildschirms

- die Vordergrundfarbe auf Weiß (Farbnummer 15 in einer Farbtiefe bis zu 8bpp bzw. &hFFFFFF in allen höheren Farbtiefen)

- die Hintergrundfarbe auf Schwarz (Farbnummer 0)

- den Mauszeiger auf 'sichtbar' (Sie können den Mauszeiger innerhalb des Fensters mit SETMOUSE verbergen)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Einige Bildschirmflags existierten in früheren Versionen nicht oder hatten eine andere Bedeutung:

- GFX_HIGH_PRIORITY (&h80) existiert seit FreeBASIC v0.18

- Folgende Flags existieren erst seit FreeBASIC v0.17: GFX_NO_FRAME (&h08), GFX_ALPHA_PRIMITIVES (&h80) und GFX_MULTISAMPLE (&h40000)

- GFX_STENCIL_BUFFER hatte vor FreeBASIC v0.17 den Wert &h10.

- GFX_ACCUMULATION_BUFFER hatte vor FreeBASIC v0.17 den Wert &h20.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENRES nicht zur Verfügung und kann nur über __SCREENRES aufgerufen werden.

Siehe auch:
SCREEN (Anweisung), SCREENINFO, SCREENLIST, Grafik

Letzte Bearbeitung: 21.01.12
Zur Onlinefassung des Eintrags

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 im Bereich von 0 bis Zahl_der_Seiten - 1 liegen. Zahl_der_Seiten ist die Zahl der Seiten, die durch den letzen SCREENRES-Aufruf festgelegt wurde.

- Wenn Sie eines der beiden Argumente auslassen, dann bleibt die dazu gehörige Einstellung unverändert. Werden beide Argumente ausgelassen, dann 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
SCREENRES 320, 200, ,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 = ""

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENSET nicht zur Verfügung und kann nur über __SCREENSET aufgerufen werden.

Siehe auch:
SCREENRES, SCREENCOPY, SCREENSYNC, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENSYNC

Syntax: SCREENSYNC
Typ: Anweisung
Kategorie: Gfx

SCREENSYNC wartet mit der Programmausführung auf eine Bildschirmaktualisierung. Damit wird ein Flimmern des Bildschirms vermieden.
Diese Anweisung soll WAIT ersetzen.

Beispiel: siehe SCREENSET

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.14

Siehe auch:
SCREENRES, SCREENSET, SCREENCOPY, WAIT, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

SCREENUNLOCK

Syntax: SCREENUNLOCK [Startzeile][, Endzeile]
Typ: Anweisung
Kategorie: Gfx

SCREENUNLOCK hebt eine Sperrung durch SCREENLOCK auf.

- 'Startzeile' ist ein optionaler Parameter, der die erste Bildschirmzeile (Y-Koordinate) angibt, ab welcher 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.

Diese Anweisung lässt das System den Bildschirm wieder aktualisieren und aktualisiert ihn bereits beim Aufruf selbst. Diese erste Aktualisierung kann auf einen Bildschirmausschnitt begrenzt werden, indem eine Start- und Endzeile angegeben wird. Z. B. kann angegeben werden, dass nur der Bereich aktualisiert werden soll, der tatsächlich verändert wurde.

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.

SCREENLOCK und SCREENUNLOCK müssen immer paarweise verwendet werden. Bei jeder Verwendung von SCREENLOCK wird ein interner Zähler hochgezählt und bei SCREENUNLOCK wieder reduziert. Wenn dieser Zähler auf 0 steht, dann ist die Bildschirmseite entsperrt.

ACHTUNG: Während der Bildschirm gesperrt ist, sollten nur Zeichenbefehle aufgerufen werden. Input/Output und Wartebefehle müssen vermieden werden. Unter Win32 und Linux wird der Bildschirm gesperrt, indem der Thread gestoppt wird, der auch für die Events des Betriebssystems zuständig ist. Wenn der Bildschirm für längere Zeit gesperrt bleibt, kann das System instabil werden.

Beispiel:

' SCREENLOCK/-UNLOCK macht nur mit Grafikscreens Sinn
SCREENRES 300, 100, 32

' ohne SCREENLOCK/-UNLOCK
DO
CLS
LOCATE 2, 2 : PRINT "Ausgabe"
LOCATE 4, 2 : PRINT "Ein Text"
LOCATE 6, 2 : PRINT "Dieser Text flackert"
SLEEP 1 'Auslastung senken
LOOP UNTIL INKEY = CHR(32) ' auf Druck der Leertaste warten

'mit SCREENLOCK/-UNLOCK
DO
SCREENLOCK
CLS
LOCATE 2, 2 : PRINT "Ausgabe"
LOCATE 4, 2 : PRINT "Ein Text"
LOCATE 6, 2 : PRINT "Dieser Text flackert nicht"
SCREENUNLOCK
SLEEP 1
LOOP UNTIL INKEY = CHR(32) ' auf Druck der Leertaste warten

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
In DOS reagiert der Mauszeiger nicht auf Mausbewegungen, solange der Bildschirm gesperrt ist.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SCREENUNLOCK nicht zur Verfügung und kann nur über __SCREENUNLOCK aufgerufen werden.

Siehe auch:
SCREENRES, SCREENLOCK, SCREENPTR, Grafik

Letzte Bearbeitung: 23.07.11
Zur Onlinefassung des Eintrags

SCRN

Siehe OPEN SCRN

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

SECOND

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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: existiert nur in QBX PDS und in VBDOS.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, TIMESERIAL, TIMEVALUE, HOUR, MINUTE, FORMAT, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

SEEK (Anweisung)

Syntax: SEEK (Dateinummer, Position)
Typ: Anweisung
Kategorie: Datei

SEEK setzt die Position des Zeigers 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 bzw. in einem der sequentiellen Modi (INPUT, OUTPUT und APPEND) geöffnet wurde, oder die Nummer des Datensatzes für den RANDOM-Modus. Der Positionswert 1 setzt den Zeiger auf den Anfang der Datei.

Beispiel:
Cursor auf das 100ste Byte in der Datei setzen:

DIM AS INTEGER f = FREEFILE
OPEN "file.ext" FOR BINARY AS #f
SEEK f, 100
CLOSE #f

Siehe auch:
SEEK (Funktion), OPEN, Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

SEEK (Funktion)

Syntax: Position = SEEK (Dateinummer)
Typ: Funktion
Kategorie: Datei

SEEK 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 bzw. in einem der sequentiellen Modi (INPUT, OUTPUT und APPEND) geöffnet wurde, oder die Nummer des Datensatzes für den RANDOM-Modus. Zu Beginn steht der Dateizeiger auf 1, nach dem Lesen eines Bytes (bzw. eines Datensatzes) auf Position 1 usw. (im Gegensatz dazu startet LOC mit der Position 0)

Beispiel:

DIM AS INTEGER f = FREEFILE, position
OPEN "file.ext" FOR BINARY AS #f
'... Programmcode, Lese/Schreibe-Anweisungen, etc...
position = SEEK(f)
'...weitere Anweisungen
CLOSE #f

Siehe auch:
SEEK (Anweisung), OPEN, LOC, Dateien (Files)

Letzte Bearbeitung: 14.08.10
Zur Onlinefassung des Eintrags

SELECT CASE

Syntax:

SELECT CASE [AS CONST] Ausdruck
CASE (Ausdrucksliste)
' Code
[CASE (Ausdrucksliste2)
' Code ]
[ ... ]
[CASE ELSE
' Code ]
END SELECT

Typ: Anweisung
Kategorie: Bedingungen

SELECT CASE führt, abhängig vom Wert eines Ausdrucks, bestimmte Codeteile aus.

- 'Ausdruck' ist eine beliebige, aber sinnvolle Aneinanderreihung von Konstanten, Variablen, Operatoren und Funktionen, die einen Zahlenwert oder einen String ergeben. Je nach Wert dieses Ausdrucks wird der Code auf verschiedene Art und Weise fortgesetzt.

- 'Ausdrucksliste', 'Ausdrucksliste2' usw. enthalten ebenso wie 'Ausdruck' Konstanten, Variablen, Operatoren und Funktionen, die einen Wert ergeben. Dabei können pro CASE-Zeile mehrere Ausdrücke und auch Vergleichsoperatoren angegeben werden. Die dazu verwendete Syntax wird weiter unten erläutert. Der Datentyp von 'Ausdrucksliste' muss derselbe sein wie in 'Ausdruck'.

- 'Code' stellt normalen FreeBASIC-Programmcode dar, der unter gegebenen Voraussetzungen (dem Wert von 'Ausdruck' und dessen 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 genauso. Wird keine der angegebenen Bedingungen erfüllt, führt FreeBASIC den Code hinter CASE ELSE aus, sofern diese Zeile existiert. Ansonsten wird gar kein Code ausgeführt und die Programmausführung wird hinter dem SELECT-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.

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, erspart sich der Programmierer Tipparbeit. Außerdem ist schneller ersichtlich, welche Bedingung geprüft wird.

Der in 'Ausdruck' bzw. 'Ausdrucksliste' verwendete Datentyp kann eine Ganzzahl (z. B. INTEGER), Gleitkommazahl (z. B. DOUBLE) oder ein STRING, ZSTRING oder WSTRING sein. Nicht zulässig sind hingegen UDTs. 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.

Als Block-Anweisung initialisiert SELECT CASE seit FreeBASIC v0.16 einen SCOPE-Block, der mit der Zeile END SELECT endet. Variablen, die nach einem 'CASE Ausdrucksliste' deklariert werden, sind nur bis zum Ende des SELECT-Blocks gültig.

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 SELECT CASE eine sinnvolle Aneinanderreihung von Konstanten, Variablen, Operatoren und Funktionen, die einen Wert ergeben müssen, dessen Datentyp derselbe 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, usw.

Beispiele für Ausdrucksliste

SELECT CASE a
' ist a = 5?
CASE 5
' ist a zwischen 5 und 10?
' Die kleinere Zahl muss zuerst angegeben werden
CASE 5 TO 10
' ist a größer als 5?
CASE IS > 5
' ist a entweder 1 oder zwischen 3 und 10?
CASE 1, 3 TO 10
' ist a gleich 1, 3, 5, 7 oder b + 8?
CASE 1, 3, 5, 7, b + 8
END SELECT

Beispiel für die Benutzung von SELECT CASE:

DIM AS INTEGER wahl
INPUT "Geben Sie eine Nummer zwischen 1 und 10 ein: ", wahl
SELECT CASE wahl
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
SLEEP

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, usw. 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.

- Funktionen sind in 'Ausdrucksliste' nur dann erlaubt, sofern es sich um FreeBASICs eigene mathematische Funktionen handelt (wie etwa FIX, ABS, SGN, etc.), 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.

- In 'Ausdrucksliste' kann mit 4097 aufeinanderfolgenden UINTEGER-Werten verglichen werden, also z. B. im Bereich von 0 bis 4097 oder von 3 bis 4100.

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.

- In einer Bereichsangabe 'Ausdruck TO Ausdruck' wertet QB immer beide ausdrücke aus, auch wenn der erste Ausdruck bereits größer ist als der zu prüfende Wert.

Unterschiede zu früheren Versionen von FreeBASIC:

- 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 seit FreeBASIC v0.12

Siehe auch:
IF ... THEN, IIF, ON ... GOTO, ON ... GOSUB, SCOPE, EXIT, CONST, CONST (Klausel), Ausdrücke, Bedingungsstrukturen

Letzte Bearbeitung: 18.01.12
Zur Onlinefassung des Eintrags

SETDATE

Syntax: SETDATE NeuesDatum
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

- 'yy' bzw. 'yyyy' ist das Jahr.

Hinweis: Abhängig vom System bleibt SETDATE unter Umständen ohne Auswirkungen.

Beispiel:

DIM AS STRING MONTH, DAY, YEAR
MONTH = "03"       ' März
DAY = "13"         ' der 13
YEAR = "1994"      ' die guten alten Zeiten...
SETDATE MONTH & "/" & DAY & "/" & YEAR

Unterschiede zu QB:
In QB kann das Systemdatum (nur) mit DATE$ = NeuesDatum zugewiesen werden.

Siehe auch:
DATE, TIME, TIMER, SETTIME, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

SETENVIRON

Syntax: SETENVIRON "Variable=Wert"
Typ: Anweisung
Kategorie: Verschiedenes

SETENVIRON verändert die Systemumgebungsvariablen.

- 'Variable' ist die Systemumgebungsvariablen, die mit dem neuen Wert 'Wert' belegt werden soll.

- Der Rückgabewert ist 0, wenn die Änderung erfolgreich durchgeführt werden konnte, oder ungleich 0, wenn ein Fehler auftrat.

Beispiel Die Systemvariable "PATH" mit "C:" belegen:

SUB zeigePATH
' Den Wert von "PATH" anzeigen
#IF __FB_PCOS__
SHELL "SET PATH"
#ELSEIF __FB_UNIX__
SHELL "echo $PATH"
#ENDIF
END SUB

zeigePATH
SETENVIRON "PATH=C:"  ' diese Zuweisung macht unter Linux wenig Sinn ...
zeigePATH
SLEEP

Hinweis: Die Systemvariable hätte auch mit ENVIRON abgefragt werden können.

Unterschiede zu QB:
Dieser neue Befehl ersetzt den in QB verwendeten Befehl ENVIRON.

Plattformbedingte Unterschiede:
Unter Linux muss die Systemvariable 'case sensitive' erfolgen. Windows und DOS sind 'case insensitive'.

Siehe auch:
ENVIRON, SHELL, Betriebssystem-Anweisungen

Letzte Bearbeitung: 21.01.12
Zur Onlinefassung des Eintrags

SETMOUSE

Syntax: SETMOUSE [x][,[y][, [cursor][, clip]]]
Typ: Anweisung
Kategorie: Benutzereingabe

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.

- 'clip' ist 1, wenn die Mausbewegung auf das Fenster begrenzt ist, 0 wenn der Mauscursor das Fenster verlassen kann.

- Wird einer der Parameter ausgelassen, behält FreeBASIC den alten Status bei.

Beispiel:

DIM AS INTEGER x, y, buttons, clip
'erstellt eine Fenster 800x600, 32-Bit Farbe, 1 Seite
SCREENRES 800, 600, 32, 1

DO
' Mausposition ermitteln und ausgeben.
GETMOUSE x, y , , buttons, clip
LOCATE 1, 1
PRINT x, y, BIN(buttons, 3), clip

IF buttons = 1 THEN     'linke Maustaste
SETMOUSE 400, 300, 1, 0 'Mauspfeil sichtbar und zentrieren
END IF
IF buttons = 2 THEN     'rechte Maustaste
SETMOUSE 400, 300,1,1 'Mauspfeil auf das Fenster begrenzt
END IF
IF buttons = 4 THEN     'mittlere Maustaste
SETMOUSE 400, 300, 0, 0 'Mauspfeil unsichtbar
END IF
LOOP UNTIL MULTIKEY(1)

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- Maus-Clipping wird seit FreeBASIC v0.18 unterstützt.

- Seit FreeBASIC 0.14 wird SETMOUSE im Konsolenfenster unterstützt.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SETMOUSE nicht zur Verfügung und kann nur über __SETMOUSE aufgerufen werden.

Siehe auch:
SCREENRES, GETMOUSE, Benutzereingaben

Letzte Bearbeitung: 13.05.12
Zur Onlinefassung des Eintrags

SETTIME

Syntax: SETTIME Uhrzeit
Typ: Anweisung
Kategorie: Zeit

SETTIME setzt die neue Systemzeit.

- 'Uhrzeit' ist ein STRING, der die neue Zeit angibt. Er muss dazu das Format hh:mm:ss oder hh:mm oder hh besitzen.

- 'hh' sind dabei die Stunden,

- 'mm' die Minuten

- 'ss' die Sekunden der einzustellenden Zeit.

Hinweis: Abhängig vom System bleibt SETTIME unter Umständen ohne Auswirkungen.

Beispiel:

#INCLUDE "vbcompat.bi"
DIM AS DOUBLE alteZeit = NOW, neueZeit

' Uhrzeit drei Srunden vorstellen
neueZeit = DATEADD("h", 3, alteZeit)
SETTIME FORMAT(neueZeit, "hh:mm:ss")
PRINT "Die Zeit wurde auf " & FORMAT(neueZeit, "hh:mm:ss") & " vorgestellt."

SLEEP 5000, 1

' wieder zurueckstellen
neueZeit = DATEADD("s", 5, alteZeit)
SETTIME FORMAT(neueZeit, "hh:mm:ss")
PRINT "Die Zeit wurde auf " & FORMAT(neueZeit, "hh:mm:ss") & " zurueckgestellt."

SLEEP

Unterschiede zu QB:
In QB kann die Systemzeit (nur) mit TIME$ = Uhrzeit zugewiesen werden.

Unterschiede zu früheren FreeBASIC-Versionen:

- existiert erst seit FreeBASIC v0.10 für Windows

- existiert erst seit FreeBASIC v0.13 für Linux

Siehe auch:
TIME, DATE, TIMER, SETDATE, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

SGN

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

Gibt einen Wert aus, der das Vorzeichen eines Ausdrucks identifiziert.

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

- Der Rückgabewert ist ein INTEGER. 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.

SGN kann mithilfe von OPERATOR überladen werden.

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

Ausgabebeispiel:

Geben Sie bitte eine Zahl ein: 8.41
Ihre Zahl war positiv

Unterschiede zu QB: keine

Siehe auch:
ABS, mathematische Funktionen

Letzte Bearbeitung: 27.06.10
Zur Onlinefassung des Eintrags

SHARED

Syntax A: { DIM | REDIM | COMMON | STATIC } SHARED Variable AS Typ [, Variable AS Typ ...]
Syntax B: { DIM | REDIM | COMMON | STATIC } SHARED AS Typ Variablenliste
Typ: Schlüsselwort
Kategorie: Programmorganisation

SHARED wird zusammen mit DIM / REDIM, COMMON und STATIC eingesetzt und bewirkt, dass Variablen sowohl auf Modulebene als auch innerhalb von Prozeduren (SUBs und FUNCTIONs) verfügbar sind.

DIM SHARED und STATIC SHARED bewirken dabei nur Zugriffsrechte für Prozeduren innerhalb desselben Moduls, während auf die Variablen, die mit COMMON SHARED deklariert werden, von jeder Prozedur und von jedem Modul aus zugegriffen werden kann.
DIM und STATIC sind in Verbindung mit SHARED gleichbedeutend, was auf die Eigenschaften von STATIC zurückzuführen sind. STATIC SHARED ist faktisch nur aus Kompatibilitätsgründen zu QuickBASIC vorhanden.

Beispiel:

DECLARE SUB MySub ()

DIM SHARED x AS INTEGER
DIM y AS INTEGER

x = 10
y = 5
PRINT "x ist:";x
PRINT "y ist:";y
PRINT

MySub
SLEEP

SUB MySub
PRINT "x ist: "; x
PRINT "y ist: "; y
END SUB

Dieser Code erzeugt beim Compilieren mit der Option -lang fb einen Fehler, weil 'y' in der SUB MySub nicht deklariert wurde.

In der Sub MySub kann durchaus mit einer Variable mit dem Namen 'y' gearbeitet werden:

DECLARE SUB 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
SLEEP

SUB MySub
DIM y AS INTEGER = 15
PRINT "Innerhalb der Prozedur:"
PRINT "x ist:"; x
PRINT "y ist:"; y
x = 3
END SUB

Ausgabe:

x ist: 10
y ist: 5

Innerhalb der Prozedur:
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, 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), SUBs, FUNCTIONs.

Hinweis zur expliziten Variableninitialisierung:
Da SHARED-Variablen zur Compilezeit umgesetzt werden, können direkt bei der Deklaration nur Konstanten zur expliziten Initialisierung zugewiesen werden.

DIM SHARED AS INTEGER variable = 20

Da Integer-Literale (Zahlen) immer zu Konstanten umgesetzt werden, ist die oben stehende Deklaration mit expliziter Initialisierung möglich, wohingegen Folgendes nicht compiliert (Compilezeit-Fehler):

DIM AS INTEGER x = 20
DIM SHARED AS INTEGER variable = x

Stattdessen müssen Deklaration und Wertzuweisung der Integer-Variablen variable aufgeteilt werden, sodass variable zunächst in der zweiten Zeile implizit mit 0 (Konstante) initialisiert wird:

DIM AS INTEGER x = 20
DIM SHARED AS INTEGER variable
variable = 20 + x

Hinweis zu Constructoren von Objekten:
Wird eine Variable eines UDTs erzeugt und mit SHARED global zugänglich gemacht, wird das Objekt noch vor Programmbeginn initiiert. Dies hat gerade dann Bedeutung, wenn der CONSTRUCTOR des Objekts bestimmte Arbeiten übernehmen soll. Die exakte Reihenfolge kann anhand des folgenden Beispiels gesehen werden:

TYPE foo
bar AS INTEGER
DECLARE CONSTRUCTOR ()
END TYPE
CONSTRUCTOR foo ()
PRINT "Ctor"
END CONSTRUCTOR

SUB Start1 CONSTRUCTOR 101
PRINT "Start1"
END SUB
SUB Start2 CONSTRUCTOR
PRINT "Start2"
END SUB

PRINT "Hauptprogramm startet"
PRINT "Deklariere Variable"

DIM SHARED AS foo bar

PRINT "Hauptprogramm beendet"
SLEEP

Ausgabe:

Start1
Ctor
Start2
Hauptprogramm startet
Deklariere Variable
Hauptprogramm beendet

Soll die Initialisierung dagegen nicht zu Programmbeginn, sondern an einer bestimmten (späteren) Stelle im Programmablauf erfolgen, so kann dies durch die Verwendung von Pointern erzwungen werden. Der Grund hierfür ist, dass Pointervariablen erst initialisiert werden, wenn mit NEW ein Objekt erstellt wird.

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.

- Die alternative Syntax DIM SHARED AS Typ Variablenliste (Syntax B) ist neu in FreeBASIC.

Siehe auch:
DIM, REDIM, COMMON

Letzte Bearbeitung: 15.01.12
Zur Onlinefassung des Eintrags

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 inklusive 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 -alh"

Soll das aufgerufene Programm parallel zum FB-Programm laufen, kann unter Win32 "Start" gestartet werden:

SHELL "START notepad"

Beispiel zum Aufruf als Funktion:

DIM AS INTEGER Result
Result = SHELL ("NOTEPAD.EXE")
PRINT "Rueckgabe war " & Result & "."
SLEEP

Unterschiede
zu QB:

- SHELL kann auch als Funktion eingesetzt werden.

- Ohne Parameter wird keine CMD-Sitzung gestartet.

Bug in der Linux-Version (bis einschließlich V. 0.20.0):
Ab dem 1020. Aufruf des SHELL-Befehls innerhalb eines Programms (etwa durch eine Schleife) funktioniert SHELL nicht mehr, d.h. das übergebene Kommando wird nicht ausgeführt. Stattdessen wird die Fehlermeldung

sh: pipe error: Zu viele offene Dateien

ausgegeben. Der Fehler ist im Bugtracker dokumentiert (siehe auch Bugreport im Forum) und wurde am 08.04.2010 in der SVN-Version behoben. Die aktuelle Stable-Version (0.20.0) enthält den Bug noch. Nutzer dieser Version können einen Workaround wie den folgenden verwenden, wenn sie nicht auf eine SVN-Version updaten möchten: Ersatzfunktion für Shell in der NoPaste-Codeablage

Siehe auch:
RUN, EXEC, CHAIN, END, COMMAND, CONSTRUCTOR, DESTRUCTOR

Letzte Bearbeitung: 09.04.10
Zur Onlinefassung des Eintrags

SHL

Syntax A: Ergebnis = Zahl1 SHL Zahl2
Syntax B: Zahl1 SHL= Zahl2
Typ: Operator
Kategorie: mathematische Operatoren

Verschiebt alle Bits in der Variable um eine bestimmte Stellenzahl nach links.

- 'Zahl1' und 'Zahl2' sind INTEGER-Werte. Wird SHL mit Gleitkommazahlen (SINGLE oder DOUBLE) verwendet, so werden diese zuerst mithilfe von CINT mathematisch gerundet.

- Beim kombinierten SHL (Syntax B) wird der Wert von 'Zahl1' um 'Zahl2' Stellen nach links verschoben; es ist die Kurzform für Zahl1 = Zahl1 SHL Zahl2

- Bits, die über die letzte Stelle hinaus verschoben werden, gehen verloren.

SHL ist für einen INTEGER gleichwertig mit der Multiplikation einer Zweierpotenz; der Exponent dabei ist '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.

SHL ist die Gegenfunktion zu SHR. Sie kann mithilfe von OPERATOR überladen werden.

Beispiel:

DIM AS UBYTE  a, b, c
DIM AS SINGLE d, e, f

a = 3
b = 2
c = a SHL b

PRINT BIN(a, 8); " wird um "; b; " Stellen nach links";
PRINT " verschoben. Das Ergebnis ist "; BIN(c, 8); "."
c SHL= 5
PRINT "Um fuenf weitere Stellen nach links verschoben";
PRINT " ergibt sich "; BIN(c, 8); "."

d = 2.9
e = 2.4
f = d SHL e

PRINT BIN(d, 8); " wird um "; e; " Stellen nach links";
PRINT " verschoben. Das Ergebnis ist "; BIN(f, 8); "."
f SHL= 5
PRINT "Um fuenf weitere Stelle nach links verschoben";
PRINT " ergibt sich "; BIN(f); "."
SLEEP

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 dieselben 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 &H10000000 zustande.
Dieser Code bietet sich zum Experimentieren an; ändern Sie einfach die Zahlenwerte für a, b, c, d, e und f.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SHL nicht zur Verfügung und kann nur über __SHL aufgerufen werden.

Siehe auch:
SHR, MOD, mathematische Funktionen

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

SHORT

Typ: Datentyp

SHORT-Zahlen sind vorzeichenbehaftete 16-bit-Ganzzahlen. Sie liegen im Bereich von -(2^15) bis (2^15)-1, bzw. von -32768 bis 32767.

Unterschiede zu QB:
Der Datentyp SHORT ist neu in FreeBASIC; er hat dieselben Eigenschaften wie der Datentyp INTEGER in QB.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SHORT nicht zur Verfügung und kann nur über __SHORT aufgerufen werden.

Siehe auch:
DIM, CAST, CSHORT, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

SHR

Syntax A: Ergebnis = Zahl1 SHR Zahl2
Syntax B: Zahl1 SHR= Zahl2
Typ: Operator
Kategorie: mathematische Operatoren

Verschiebt alle Bits in der Variable um eine bestimmte Stellenzahl nach rechts.

- 'Zahl1' und 'Zahl2' sind INTEGER-Werte. Wird SHR mit Gleitkommazahlen (SINGLE oder DOUBLE) verwendet, so werden diese zuerst mithilfe von CINT mathematisch gerundet.

- Beim kombinierten SHR (Syntax B) wird der Wert von 'Zahl1' um 'Zahl2' Stellen nach rechts verschoben; es ist die Kurzform für Zahl1 = Zahl1 SHR Zahl2

- Bits, die über die letzte Stelle hinaus verschoben werden, gehen verloren.

SHR ist für einen INTEGER gleichwertig mit der Division durch eine Zweierpotenz; der Exponent dabei ist '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.

SHR ist die Gegenfunktion zu SHL. Sie kann mithilfe von OPERATOR überladen werden.

Beispiel:

DIM AS INTEGER a, b, c
DIM AS SINGLE  d, e, f

a = 12
b = 2
c = a SHR b

PRINT BIN(a, 8); " wird um "; b; " Stellen nach rechts verschoben. Das Ergebnis ist "; BIN(c, 8); "."
c SHR= 1
PRINT "Um eine weitere Stelle nach rechts verschoben ergibt sich "; BIN(c, 8); "."

d = 11.5
e = 2.4
f = d SHR e

PRINT BIN(d, 8); " wird um "; e; " Stellen nach rechts verschoben. Das Ergebnis ist "; BIN(f, 8); "."
f SHR= 1
PRINT "Um eine weitere Stelle nach rechts verschoben ergibt sich "; BIN(f, 8); "."
SLEEP

Ausgabe:

00001100 wird um 2 Stellen nach rechts verschoben. Das Ergebnis ist 00000011.
Um eine weitere Stelle nach rechts verschoben ergibt sich 00000001.
00001100 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 dieselben Werte.
Dieser Code bietet sich zum Experimentieren an; ändern Sie einfach die Zahlenwerte für a, b, c, d, e und f.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SHR nicht zur Verfügung und kann nur über __SHR aufgerufen werden.

Siehe auch:
SHL, MOD, mathematische Funktionen

Letzte Bearbeitung: 02.07.10
Zur Onlinefassung des Eintrags

SIN

Syntax: SIN ( w )
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt den Sinus eines Winkels w im Bogenmaß zurück. Der Sinus zu einem Winkel 'w' ist die relative Höhe innerhalb des Normkreises zu seinem Mittelpunkt (Wikipedia-Artikel zum Thema).

'w' ist eine beliebiger numerischer Ausdruck. Variablen, Konstanten, Operatoren und Funktionen sind erlaubt. Der Ausdruck darf von jedem Datentyp außer STRING, ZSTRING oder WSTRING sein. Der Rückgabewert ist ein DOUBLE-Wert, der den Sinus-Wert zum Winkel enthält.

Die Umkehrfunktion zu SIN lautet ASIN.

Beispiel:

CONST pi AS DOUBLE = ACOS(0)*2
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; "°-Winkels ist ";
PRINT USING "#.##"; SIN(r)
SLEEP

Ausgabe:

Bitte geben Sie einen Winkel in Grad (DEG) ein: 30

Der Sinus eines 30°-Winkels ist 0.50

Unterschiede zu QB: keine

Siehe auch:
mathematische Funktionen, ASIN, COS, ACOS, TAN, ATN, ATAN2

Letzte Bearbeitung: 07.07.10
Zur Onlinefassung des Eintrags

SINGLE

Typ: Datentyp

SINGLE bedeutet einfache Genauigkeit. Variablen vom Typ SINGLE sind vorzeichenbehaftete 32-bit-Gleitkommazahlen.
Damit lassen sich Zahlen mit circa 6 Stellen darstellen, der Wertebereich für SINGLE-Zahlen liegt bei positiven Zahlen zwischen 1.401298e-45 und 3.402823e+38 und bei negativen zwischen -1.401298e-45 und -3.402823e+38.

SINGLE 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.123456
PRINT a

Unterschiede zu QB: keine

Siehe auch:
DIM, CAST, CSNG, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 11.03.11
Zur Onlinefassung des Eintrags

SIZEOF

Syntax: SIZEOF (Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

SIZEOF gibt die Größe einer Struktur im Speicher in Bytes aus.

- Diese Struktur kann eine Variable (a, b(), ...) 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 Typs ausgegeben. Dieser beträgt bei Strings 12.

- Wird SIZEOF an einem String fester Länge oder an einem ZSTRING bzw. WSTRING angewandt, wird die Größe des reservierten Speicherbereichs ausgegeben.

Das Ergebnis von SIZEOF ist oft gleich dem von LEN, jedoch nicht immer!

Wird SIZEOF auf Arrays angewendet, gibt es immer nur die Größe eines Elements zurück, nicht des ganzen Arrays. Um Missverständnisse zu vermeiden, sollte SIZEOF deswegen immer nur auf einzelne Elemente statt auf das ganze Array angewandt werden.

Beispiel:

DIM a AS INTEGER, b AS STRING, c AS STRING * 5, d(5) AS INTEGER

PRINT "1) LEN"
PRINT LEN(a)       ' Ausgabe: 4 => 32bit-Integer
PRINT LEN(b)       ' Ausgabe: 0 => Leerstring
PRINT LEN(c)       ' Ausgabe: 5 => 5-Zeichen-String
PRINT LEN(d(0))    ' Ausgabe: 4 => 32bit-Integer
PRINT LEN(d)       ' Ausgabe: 4 => Pointer auf Array, also 32bit-Integer
PRINT
PRINT "2) SIZEOF"
PRINT SIZEOF(a)    ' Ausgabe: 4  => 32bit-Integer
PRINT SIZEOF(b)    ' Ausgabe: 12 => Siehe STRING (Datentyp) für Erklärung
PRINT SIZEOF(c)    ' Ausgabe: 6  => 5 Zeichen + 1 Nullzeichen CHR(0)
PRINT SIZEOF(d(0)) ' Ausgabe: 4  => 32bit-Integer
PRINT SIZEOF(d)    ' Ausgabe: 4  => Pointer auf Array, also 32bit-Integer
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht SIZEOF nicht zur Verfügung und kann nur über __SIZEOF aufgerufen werden.

Siehe auch:
LEN, OFFSETOF, STRING (Datentyp), Verschiedenes

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

SLEEP

Syntax: SLEEP [Zeit] [, Flag]
Typ: Anweisung
Kategorie: Verschiedenes

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

- Wenn für 'Flag' 1 angegeben wird, reagiert SLEEP nicht auf Tastendrücke; es wird wirklich gewartet, bis die Zeit verstrichen ist. Für Zeiteinheiten unter 100 Millisekunden wird dieses Flag allerdings ignoriert.

- Wird SLEEP ohne 'Zeit', aber mit 'Flag' aufgerufen, wird ein Fehler erzeugt.

Achtung: Der Tastaturpuffer wird durch SLEEP nicht geleert! Er muss nach einem Aufruf von SLEEP erst neu geleert werden! Alternativ kann, wenn einfach nur auf eine Taste gewartet werden soll, GETKEY verwendet werden.

Hinweis: Angegebene Wartezeiten und tatsächliche Wartezeiten können insbesondere bei sehr kurzen Zeitangaben stark voneinander abweichen! Die Genauigkeit beträgt:

- 15 ms unter Windows NT / 2000 / XP

- 50 ms unter Windows 9x / Me

- 10 ms unter Linux

- 55 ms unter DOS

SLEEP sollte in Schleifen regelmäßig (am besten in jedem Durchgang) bis zu 25 ms warten (hierfür bietet sich ein simples "SLEEP 1" an), um anderen Prozessen die Gelegenheit zu geben, Berechnungen durchzuführen. Dies wirkt sich positiv auf die Rechnerperformance und auch auf die Performance des eigenen Programms aus.

Beispiel:

PRINT "Drücken Sie bitte eine Taste"
SLEEP
PRINT "Sie haben "; INKEY ; " gedrückt."
PRINT "Warte 5 Sekunden"
SLEEP 5000

Unterschiede zu QB:

- Die zu wartende Zeit wird in Millisekunden angegeben (außer in -lang qb; siehe unten). In QB wird die angegebene Zeit in Sekunden gewartet.

- Das optionale Flag zum Ignorieren der Tastendrücke ist neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC:

- Das optionale Flag zum Ignorieren der Tastendrücke existiert seit FreeBASIC v0.15

- Seit FreeBASIC v0.18.3 wartet SLEEP in der Dialektform -lang qb die angegebene Zeit in Sekunden (siehe unten).

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb wartet SLEEP wie unter QB die angegebene Zeit in Sekunden. Wird 'Flag' angegeben oder __SLEEP verwendet, dann wird die angegebene Zeit in Millisekunden gewartet.

Siehe auch:
GETKEY, TIMER, INKEY, Datum und Zeit

Letzte Bearbeitung: 01.02.12
Zur Onlinefassung des Eintrags

SPACE

Syntax: SPACE[$](n)
Typ: Funktion
Kategorie: Stringmanipulation

SPACE 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 eingerueckter Text"
PRINT s & "eingerueckter Text"
SLEEP

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
STRING (Funktion), TAB, SPC, WSPACE

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

SPC

Syntax: SPC (n)
Typ: Anweisung
Kategorie: Konsole

SPC wird im Zusammenhang mit PRINT oder PRINT # verwendet, um Texteinrückungen zu erzeugen. Der Cursor wird um 'n' Zeichen weiter gerückt. Der dazwischen liegende Text wird dabei nicht überschrieben, sondern nur der Cursor neu positioniert.

Befindet sich die Anweisung SPC am Ende der PRINT-Anweisung, so wird anschließend kein Zeilenumbruch durchgeführt.

Beispiel:

DIM AS STRING A1, B1, A2, B2

A1 = "Jana"
B1 = "Bauer"
A2 = "Robert"
B2 = "Meier"

PRINT STRING(35, ".");
LOCATE , 1
PRINT "VORNAME"; SPC(35 - 10); "NACHNAME"
PRINT "-------"; SPC(35 - 10); "--------"
PRINT A1; SPC(35 - LEN(A1)); B1
PRINT A2; SPC(35 - LEN(A2)); B2

SLEEP

Ausgabe:

VORNAME.........................NACHNAME
-------                         --------
Jana                               Bauer
Robert                             Meier

Unterschiede zu QB:
In QB wird der Zwischenraum mit Leerzeichen überschrieben. In FreeBASIC kann dieses Verhalten mit SPACE erreicht werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.21 wird SPC auch von PRINT USING unterstützt.

Siehe auch:
PRINT (Anweisung), SPACE, TAB, LOCATE (Anweisung), Konsole

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

SQR

Syntax: SQR(Wert)
Typ: Funktion
Kategorie: mathematische Funktionen

Gibt die Quadratwurzel (square root) von 'Wert' aus. SQR hat dieselbe Funktion wie Wert^(1/2).

Beispiel:

PRINT SQR(9)      ' Ausgabe 3
PRINT 9 ^ (1/2)   ' Ausgabe 3
PRINT SQR(20 ^ 2) ' Ausgabe 20
SLEEP

Unterschiede zu QB: keine

Siehe auch:
mathematische Funktionen

Letzte Bearbeitung: 06.07.10
Zur Onlinefassung des Eintrags

STATIC (Anweisung)

Syntax A: STATIC Variable AS Typ [= einfacherAusdruck] [,Variable AS Typ [= einfacherAusdruck] [, ...] ]
Syntax B: STATIC AS Typ Variable [= einfacherAusdruck] [, Variable [= einfacherAusdruck] [, ...] ]
Syntax C: STATIC Array([Start TO] Ende [, [Start TO] Ende] [, ...]) AS Typ [= {einfacherAusdruck [, ...] }]
Typ: Anweisung
Kategorie: Speicherverwaltung

STATIC deklariert Variablen oder Arrays einer lokalen Prozedur und speichert sie, wenn die Prozedur beendet wird, sodass ihr Wert beim nächsten Aufruf der Prozedur wieder verfügbar ist. Die Anweisung arbeitet damit ähnlich wie DIM, nur dass der Wert für den nächsten Prozeduraufruf erhalten bleibt.

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

DECLARE SUB zaehl

zaehl
zaehl
SLEEP

SUB zaehl
STATIC i AS INTEGER
i += 1
PRINT "Dies ist der " & i & ". Aufruf."
END SUB

Ausgabe:

Dies ist der 1. Aufruf.
Dies ist der 2. Aufruf.

STATIC kann auch den Wert einer Variable initialisieren. In diesem Fall wird die Wertzuweisung des Initiators nur beim ersten Aufruf der Prozedur vorgenommen. Bei späteren Aufrufen wird mit dem gespeicherten Wert weitergearbeitet.

Beispiel:

FUNCTION produkt (param AS INTEGER) AS INTEGER
STATIC wert AS INTEGER = 1

wert *= param
RETURN wert
END FUNCTION

PRINT produkt(3)
PRINT produkt(4)
PRINT produkt(5)
SLEEP

Ausgabe:

3
12
60

Anmerkung:
Seit FreeBASIC v0.16 kann STATIC auch auf Modulebene (außerhalb von SUBs/FUNCTIONs) angewandt werden. So verwendet arbeitet es genauso wie DIM.

Unterschiede zu QB:
In QB kann STATIC nur in Prozeduren und innerhalb DEF FN verwendet werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.16 kann STATIC auch auf Modulebene (außerhalb von SUBs/FUNCTIONs) angewandt werden.

Siehe auch:
STATIC (Klausel), STATIC (Meta), STATIC (Schlüsselwort), STATIC (UDT), DIM, SHARED

Letzte Bearbeitung: 17.01.12
Zur Onlinefassung des Eintrags

STATIC (Klausel)

Syntax: { SUB | FUNCTION } Bezeichner (Parameterliste) [AS Typ] STATIC
Typ: Klausel
Kategorie: Programmorganisation

Als Klausel bei Prozeduren bewirkt STATIC, dass die Werte aller in der Prozedur lokal dimensionierten Variablen zwischengespeichert werden; das bedeutet, dass nach einem Aufruf die Belegung der Variablen innerhalb der Prozedur erhalten bleibt.

Siehe SUB bzw. FUNCTION 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

SLEEP

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 früheren Versionen von FreeBASIC:
Bis FreeBASIC v0.17 war es auch zulässig, das STATIC-Schlüsselwort links vom Prozedur-Header zu platzieren (STATIC SUB Name); seit v0.17 ist diese Form allerdings ungültig.

Siehe auch:
STATIC (Anweisung), STATIC (Schlüsselwort), STATIC (UDT), STATIC (Meta), DECLARE, SUB, FUNCTION, Prozeduren

Letzte Bearbeitung: 04.09.11
Zur Onlinefassung des Eintrags

STATIC (Meta)

Syntax: '$STATIC
Typ: Metabefehl
Kategorie: Programmorganisation

'$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 hat dieselbe Wirkung wie OPTION STATIC. Der Metabefehl DYNAMIC und OPTION DYNAMIC setzen diesen Standard außer Kraft. Wird keiner von beiden Standards explizit gesetzt, geht FreeBASIC von OPTION STATIC aus.

'$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 sind alle Arrays statisch, außer sie werden mit REDIM oder ohne Dimensionsangabe erstellt.

REDIM Dynamisch1 (200) AS INTEGER
DIM Dynamisch2 () AS INTEGER
DIM Statisch (200) AS INTEGER

Folgendes Beispiel ist 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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Der Metabefehl ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist der Befehl nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
STATIC (Schlüsselwort), STATIC (Anweisung), STATIC (Klausel), DYNAMIC (Meta), DIM, REDIM, Präprozessor-Anweisungen

Letzte Bearbeitung: 10.07.10
Zur Onlinefassung des Eintrags

STATIC (Schlüsselwort)

Syntax: OPTION STATIC
Typ: Schlüsselwort
Kategorie: Programmorganisation

OPTION STATIC legt fest, dass Arrays standardmäßig STATIC verwaltet werden sollen. Der Metabefehl STATIC hat dieselbe Wirkung wie OPTION STATIC. Der Metabefehl DYNAMIC und OPTION DYNAMIC setzen diesen Standard außer Kraft. Wird keiner von beiden Standards explizit gesetzt, geht FreeBASIC von OPTION STATIC aus.

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 sind alle Arrays statisch, außer sie werden mit REDIM oder ohne Dimensionsangabe erstellt.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Option ist nur bis FreeBASIC v0.16 erlaubt. Seit FreeBASIC v0.17 ist diese Option nur noch zulässig, wenn mit der Kommandozeilenoption -lang deprecated kompiliert wurde.

Siehe auch:
STATIC (Meta), DYNAMIC (Schlüsselwort), __FB_OPTION_DYNAMIC__, OPTION, DIM, REDIM

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

STATIC (UDT)

Syntax:

TYPE typename
DECLARE STATIC FUNCTION functionname ...
DECLARE STATIC SUB subname ...
DECLARE STATIC OPERATOR New[] ...
DECLARE STATIC OPERATOR Delete[] ...
END TYPE

Typ: Klausel
Kategorie: Programmorganisation

STATIC wird verwendet, um Methoden zu deklarieren, denen beim Aufruf keine implizite Instanz des UDTs mitgegeben werden soll. Dadurch kann diese statische Methode auch aufgerufen werden, ohne dass eine Instanz des UDTs existieren muss.

- 'typename' ist der Name des UDTs

- 'functionname' und 'subname' sind die Namen der Prozeduren

Beim Aufruf einer Methode (also einer innerhalb des UDTs deklarierten SUBs oder FUNCTION) wird für gewöhnlich implizit eine Instanz der zugehörigen UDT-Variablen mitgeben. Diese kann dann innerhalb der Methode mit THIS angesprochen werden. Dadurch ist ein Zugriff auf die Records des UDTs möglich. Bei der Deklaration einer 'static', also einer statischen Prozedur wird dagegen intern keine implizite Instanz des Objekts an die Prozedur übergeben, sodass nur Zugriff auf übergebene Parameter besteht.

Statische Memberprozeduren können nur auf andere statische Member (Attribute und Methoden) des UDTs zugreifen, nicht aber auf normale Member. Um dies doch zu tun, muss ein Objekt-Pointer als zusätzlicher Parameter übergeben werden. Außerhalb des UDTs kann eine statische Memberprozedur wie eine nicht statische verwendet werden. Die Adresse einer statischen Memberfunktion kann wie gewohnt mit Hilfe von PROCPTR oder dem @-Operator einem Function-Pointer zugewiesen werden.

STATIC funktioniert nur mit SUB, FUNCTION und den Operatoren NEW[] und DELETE[].

Beispiel:

'Ein Beispiel, wie man während der Laufzeit einen Pointer auf eine Prozedur innerhalb eines UDTs setzt
TYPE myType

ENUM handlertype
ht_default
ht_A
ht_B
END ENUM

DECLARE CONSTRUCTOR( BYVAL ht AS handlertype = ht_default )

DECLARE SUB handler()

PRIVATE:
DECLARE STATIC SUB handler_default( BYREF obj AS myType )
DECLARE STATIC SUB handler_A( BYREF obj AS myType )
DECLARE STATIC SUB handler_B( BYREF obj AS myType )
handler_func AS SUB( BYREF obj AS myType )

END TYPE

CONSTRUCTOR myType( BYVAL ht AS handlertype )
SELECT CASE ht
CASE ht_A
handler_func = @myType.handler_A
CASE ht_B
handler_func = @myType.handler_B
CASE ELSE
handler_func = @myType.handler_default
END SELECT
END CONSTRUCTOR

SUB myType.handler()
handler_func(THIS)
END SUB

SUB myType.handler_default( BYREF obj AS myType )
PRINT "Standardhandler"
END SUB

SUB myType.handler_A( BYREF obj AS myType )
PRINT "Handler der Methode A"
END SUB

SUB myType.handler_B( BYREF obj AS myType )
PRINT "Handler der Methode B"
END SUB

DIM objects(1 TO 4) AS myType => { myType.handlertype.ht_B, myType.handlertype.ht_default, myType.handlertype.ht_A }
'Das vierte Array-Element wird die Standardhandlermethode sein

FOR i AS INTEGER = 1 TO 4
PRINT i,
objects(i).handler()
NEXT

SLEEP

Beispiel 2 - Verwendung einer statischen Memberprozedur wie eine nicht statische:

TYPE myType
DECLARE STATIC FUNCTION ADD( x AS INTEGER, y AS INTEGER ) AS INTEGER

dummy AS INTEGER
END TYPE

FUNCTION myType.add( x AS INTEGER, y AS INTEGER ) AS INTEGER
RETURN x + y
END FUNCTION

PRINT myType.add( 5, 3 )

SLEEP

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
STATIC (Anweisung), STATIC (Klausel), STATIC (Meta), STATIC (Schlüsselwort), DECLARE, TYPE, CLASS

Letzte Bearbeitung: 17.01.12
Zur Onlinefassung des Eintrags

STDCALL

Syntax: [DECLARE] {SUB | FUNCTION} prozedurname STDCALL [OVERLOAD] [ALIAS "externerName"] [(parameterliste) ...] {AS rueckgabetyp} {CONSTRUCTOR [priorität]} [STATIC] [EXPORT]
Typ: Schlüsselwort
Kategorie: Fremdsprachen

Die STDCALL-Aufrufkonvention ist die Standard-Aufrufkonvention für FreeBASIC und die Microsoft Win32-API.
Wird in der Deklaration keine Angabe zur Aufrufkonvention gemacht, benutzt FreeBASIC 'STDCALL'.

Angegebene Parameter werden von rechts nach links ( <- ) übergeben, der letzte angegebene Parameter wird also als erster auf den Stack gelegt. Die aufgerufene Funktion muss den Stack vor dem Rücksprung mit RET XX (Return, Anzahl Byte) ausgleichen.

STDCALL kann nicht mit variabler Argumenten-Anzahl (siehe ... ) verwendet werden.

STDCALL ist die Aufrufkonvention, die standarmäßig unter Windows verwendet wird, sofern keine andere Konvention explizit festgelegt oder durch einen der EXTERN-Blöcke impliziert wird. Es ist außerdem die gebräuchlichste Konvention in BASIC-Dialekten und in der Windows-API.

Beispiel 1:

#INCLUDE "fbgfx.bi"

'SCREEN 18,32
ASM
push 0  '5. Parameter optional
push 0  '4. Parameter optional
push 0  '3. Parameter optional
push 32 '2. Parameter Farbbits
push 18 '1. Parameter Screenmodus
CALL _fb_GfxScreen@20
END ASM

Die aufgerufene Funktion (im Beispiel '_fb_GfxScreen@20') nimmt die Werte vom Stack und bereinigt den Stack.
Der x86-Befehl RET (Return) erlaubt als Parameter einen optionalen Byte-Wert, der die Größe des abzubauenden Stacks angibt (RET 20).

Beispiel 2: Vergleich der verschiedenen Aufrufmöglichkeiten

SUB s STDCALL (s1 AS INTEGER, s2 AS INTEGER)
PRINT "StdCall ", s1, s2
END SUB
SUB c CDECL (c1 AS INTEGER, c2 AS INTEGER)
PRINT "Cdecl ", c1, c2
END SUB
SUB p PASCAL (p1 AS INTEGER, p2 AS INTEGER)
PRINT "Pascal ", p1, p2
END SUB

ASM
push 2 '2. Parameter - s2
push 1 '1. Parameter - s1
CALL s 'rechts nach links

push 2 '2. Parameter - c2
push 1 '1. Parameter - c1
CALL c 'rechts nach links
ADD esp, 8 'der Stack muss durch die aufrufende Funktion aufgeräumt werden

push 1 '1. Parameter - p1
push 2 '2. Parameter - p2
CALL p 'links nach rechts

END ASM

SLEEP

Unterschiede zu QB: neu in FreeBASIC.

Siehe auch:
DECLARE, CDECL, PASCAL

Letzte Bearbeitung: 11.09.11
Zur Onlinefassung des Eintrags

STEP

STEP ist ein Schlüsselwort, das in FOR-Schleifen und in Grafikbefehlen verwendet wird.

FOR-Schleife:
In einer FOR-Schleife gibt STEP die Schrittweite an, um welche die Zählvariable in jedem Durchlauf verändert werden soll.
siehe FOR ... NEXT

FOR-Schleife für UDTs:
Als OPERATOR ist STEP auch für eigene Typen überladbar.
siehe Überladen von Prozeduren und Operatoren (Overload)

Grafikbefehle:
In Grafikbefehlen wie z. B.PSET, LINE oder PUT / GET legt STEP fest, dass die darauf folgenden Koordinaten relativ zum aktuellen Grafikcursor angegeben sind.
siehe Grafik

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

STICK

Syntax: STICK (n)
Typ: Funktion
Kategorie: Benutzereingabe

STICK wird in QB verwendet, um die x-y-Koordinaten zweier Joysticks zu ermitteln. Wenn ein Joystick erkannt wurde, wird als Ergebnis ein Wert von 1 bis 200 ausgegeben, sonst wird 0 zurück gegeben.

STICK funktioniert nur in der Dialektform -lang qb und dient der Abwärtskompatibilität zu QB. Verwenden Sie stattdessen GETJOYSTICK zur umfassenden Joystick-Abfrage.

'n' gibt an, welcher Joystick bzw. welche Koordinate abgefragt werden soll:

- 0: x- Position von Joystick A

- 1: y- Position von Joystick A (nach STICK(0)-Aufruf)

- 2: x- Position von Joystick B (nach STICK(0)-Aufruf)

- 3: y- Position von Joystick B (nach STICK(0)-Aufruf)

Jede Abfrage des Joysticks muss mit STICK(0) beginnen, da sonst für STICK(1) bis STICK(3) immer die gleichen Werte ausgegeben werden.

Beispiel:

#LANG "qb"
SCREEN 12
DO
LOCATE 1, 1
PRINT "Joystick A, X-Position : "; STICK(0); "   "
PRINT "Joystick A, Y-Position : "; STICK(1); "   "
PRINT "Joystick B, X-Position : "; STICK(2); "   "
PRINT "Joystick B, Y-Position : "; STICK(3); "   "
PRINT
PRINT "Druecke ESC zum Beenden"

IF Inkey$ = CHR$(27) THEN
EXIT DO
END IF
SLEEP 1
LOOP

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.18.3

Unterschiede unter den FB-Dialektformen: nur gültig für -lang qb

Siehe auch:
STRIG, GETJOYSTICK, Benutzereingaben

Letzte Bearbeitung: 14.05.12
Zur Onlinefassung des Eintrags

STOP

Syntax: STOP [Errorlevel]
Typ: Anweisung
Kategorie: Verschiedenes

STOP beendet die Ausführung eines Programms und gibt einen Errorlevel an das System zurück. Wird 'Errorlevel' ausgelassen, nimmt FreeBASIC automatisch 0 an.

STOP hat dieselbe Funktion wie END oder SYSTEM und besteht nur aus Kompatibilitätsgründen zu älteren BASIC-Dialekten. Es wird empfohlen, stattdessen END zu verwenden.

Wenn das Programm mit STOP beendet wird, dann werden Variablen und Speicher nicht automatisch zerstört. Die Destruktoren von Objekten werden nicht aufgerufen. Benötigte Objekt-Destruktoren müssen daher vor der STOP-Anweisung explizit aufgerufen werden.

Beispiel:

PRINT "Dieser Text wird angezeigt."
SLEEP
STOP
PRINT "Dieser Text wird niemals angezeigt."

Unterschiede zu QB:
STOP hat den Programmablauf im QB-Interpreter gestoppt und konnte wieder fortgeführt werden.

Siehe auch:
END, SYSTEM, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

STR

Syntax A: STR[$](numerischer Ausdruck)
Syntax B: STR[$](Unicode-String)
Typ: Funktion
Kategorie: Stringmanipulation

STR verwandelt einen numerischen Ausdruck in einen STRING. Es ist die Gegenfunktion zu VAL.

STR kann auch verwendet werden, um einen Unicode-String in einen ASCII-String zu verwandeln. So verwendet ist es die Gegenfunktion von WSTR.

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

Die Funktion von STR kann vom Operator & übernommen werden, wenn die auszugebende Zahl nicht am Stringanfang stehen soll:

PRINT "Test=" & (17+4)*2

Beginnt der nachfolgende Befehl mit einem H, B oder O, so muss er durch ein Leerzeichen vom & getrennt sein, da es sonst als Einleitung für eine Hexadezimal-, Binär bzw. Oktalzahl interpretiert wird.

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb wird bei positiven Zahlen ein Leerzeichen vorangestellt.

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
VAL, WSTR, ASC, CHR, STRING (Funktion), STRING (Datentyp)

Letzte Bearbeitung: 06.09.11
Zur Onlinefassung des Eintrags

STRIG

Syntax: STRIG (button)
Typ: Funktion
Kategorie: Benutzereingabe

STRIG wird in QB verwendet, um den Zustand der Tasten an zwei Joysticks zu ermitteln. Wenn die Taste als gedrückt erkannt wurde, wird -1 ausgegeben, sonst wird 0 zurückgegeben.

STRIG funktioniert nur in der Dialektform -lang qb und dient der Abwärtskompatibilität zu QB. Verwenden Sie stattdessen GETJOYSTICK zur umfassenden Joystick-Abfrage.

'button' gibt an, welcher Joystick bzw. welcher Button geprüft werden soll:

- 0: Erste Taste von Joystick A wurde nach dem letzten STICK(0) Aufruf gedrückt.

- 1: Erste Taste von Joystick A wird gedrückt.

- 2: Erste Taste von Joystick B wurde nach dem letzten STICK(0) Aufruf gedrückt.

- 3: Erste Taste von Joystick B wird gedrückt.

- 4: Zweite Taste von Joystick A wurde nach dem letzten STICK(0) Aufruf gedrückt.

- 5: Zweite Taste von Joystick A wird gedrückt.

- 6: Zweite Taste von Joystick B wurde nach dem letzten STICK(0) Aufruf gedrückt.

- 7: Zweite Taste von Joystick B wird gedrückt.

Jede Abfrage mit STICK(0) setzt die Werte von STRIG( 0; 2; 4; 6 ) auf 0 zurück.

Beispiel:

#LANG "qb"
SCREEN 12
DO
LOCATE 1, 1
STICK(0)
PRINT "Knopf A1 wurde gedrueckt : "; STRIG(0); "  "
PRINT "Knopf A1 wird gedrueckt  : "; STRIG(1); "  "
PRINT "Knopf B1 wurde gedrueckt : "; STRIG(2); "  "
PRINT "Knopf B1 wird gedrueckt  : "; STRIG(3); "  "
PRINT "Knopf A2 wurde gedrueckt : "; STRIG(4); "  "
PRINT "Knopf A2 wird gedrueckt  : "; STRIG(5); "  "
PRINT "Knopf B2 wurde gedrueckt : "; STRIG(6); "  "
PRINT "Knopf B2 wird gedrueckt  : "; STRIG(7); "  "
PRINT
PRINT "Druecke ESC zum Beenden"

IF Inkey$ = CHR$(27) THEN
EXIT DO
END IF
SLEEP 1
LOOP

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.18.3

Unterschiede unter den FB-Dialektformen: nur gültig für -lang qb

Siehe auch:
STICK, GETJOYSTICK, Benutzereingaben

Letzte Bearbeitung: 14.05.12
Zur Onlinefassung des Eintrags

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 genauso 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, welches das Stringende markiert, nicht fehlen darf!

- Seit v0.17 kann auch die folgende Schreibweise benutzt werden:!"Und er sagte: \34Möge die Macht mit dir sein\34" (man beachte das Ausrufezeichen vor dem ersten Anführungszeichen)

Man unterscheidet zwei Arten von Strings:

- var-length-Strings (Strings variabler Länge)

- fixed-length-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 diese Zeile erstellt:

DIM variable AS STRING

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ück, während STRPTR einen Pointer auf den tatsächlichen String zurückgibt.
Am Ende 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: Die Adresse seines Bezeichners, die Adresse der Zeichenkette und ihre Länge. Deshalb gibt SIZEOF(STRING) immer 12 aus, da 3 Integerstellen zu je 4 Byte verwendet werden.

Achtung: Bei der Nutzung von variablen Strings sollte auch der Artikel zu BYVAL (Schlüsselwort) gelesen werden, da die Nutzung von BYVAL in Parameter-Deklarationen von Funktionen oder SUB-Routinen zu Problemen führen kann.

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 einem String fester Länge eine Zeichenkette zugewiesen werden soll, die größer ist als die zuvor festgelegte Länge des Strings, dann 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 Zeichens 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. Das letzte Zeichen wäre 'LEN(StringVariable) - 1'. Werden Bereiche außerhalb dieser Werte verwendet, kann das zu schweren Fehlern führen.

Beispiel:

DIM a AS STRING, b AS STRING * 11  ' Strings erstellen
a = "hello World"   ' und befüllen
b = a
PRINT a   ' auf dem Bildschirm ausgeben
PRINT b
PRINT

DIM aa AS STRING PTR, ab AS BYTE PTR  ' Zwei Pointer zur Analyse...
aa = @a                               ' die Adresse des Bezeichners
ab = CPTR(BYTE PTR, @b)               ' die Adresse des ersten Zeichens
PRINT aa                              ' Adressen ausgeben
PRINT ab
PRINT
PRINT *ab                             ' 104, ASCII-Code von h, dem
' ersten Zeichen im String
PRINT CHR(*ab)                        ' h, das erste Zeichen im String
PRINT
PRINT PEEK(UINTEGER, aa)              ' beide Male die Adresse der
PRINT STRPTR(a)                       ' eigentlichen Zeichenkette
PRINT
PRINT PEEK(UBYTE, PEEK(UINTEGER, aa)) ' Beide Male das erste Zeichen des
PRINT a[0]                            ' var-length-Strings als ASCII...
PRINT
PRINT CHR(PEEK(UBYTE, PEEK(UINTEGER, aa)))  ' und als Zeichen.
PRINT CHR(a[0])
SLEEP

Ausgabe:

hello World
hello World

3216641896
3216641884

104
h

166291024
166291024

104
104

h
h

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.

- In FreeBASIC wird einem String intern ein CHR(0) angehängt.

Siehe auch:
SIZEOF, VARPTR, STRPTR, CAST, CHR, ASC, STR, VAL, BIN, HEX, OCT, SPACE, INPUT (Funktion), DIM, ZSTRING, WSTRING (Datentyp), Datentypen, Datentypen und Deklarationen, String-Funktionen

Letzte Bearbeitung: 19.12.10
Zur Onlinefassung des Eintrags

STRING (Funktion)

Syntax A: STRING[$] (Anzahl, Code)
Syntax B: STRING[$] (Anzahl, Charakter)
Typ: Funktion
Kategorie: Stringmanipulation

STRING gibt eine Zeichenkette aus 'Anzahl' 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

DIM msg AS STRING
DIM l AS INTEGER
msg = "FreeBASIC ist ein BASIC-Compiler."
l = LEN(msg)
PRINT msg
PRINT STRING(l, "-")
SLEEP

Unterschiede zu QB:
In QB ist das Suffix $ verbindlich.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
WSTRING (Funktion), SPACE, ASCII-Codes, String-Funktionen

Letzte Bearbeitung: 21.01.12
Zur Onlinefassung des Eintrags

STRPTR

Syntax: STRPTR(StringVariable)
Typ: Funktion
Kategorie: Speicherverwaltung

STRPTR gibt einen Pointer zu einer String-Variablen zurück. Es ist ein Alias zu SADD und verweist auf den Anfang des tatsächlichen String-Inhalts, während @ auf den Anfang der Datenstruktur zeigt. Im Artikel zum Datentyp STRING finden Sie nähere Informationen zur Handhabung des Speichers.

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

Ausgabebeispiel:

0
160527952
160527952     3215135288
Abcdefg, 1234567, 54321

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
STRING (Datentyp), @, SADD, PEEK, POKE, Pointer

Letzte Bearbeitung: 23.08.10
Zur Onlinefassung des Eintrags

SUB

Syntax:

[{PRIVATE | PUBLIC }] SUB Subname [Aufrufkonvention] [ALIAS "AliasName"] _
[OVERLOAD] ([Parameterliste]) [{CONSTRUCTOR | DESTRUCTOR}] [STATIC] [EXPORT]
' Anweisungen
END SUB

Typ: Prozedur
Kategorie: Programmorganisation

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.

SUB definiert ein Unterprogramm. Ein Unterprogramm besteht aus normalen Anweisungen und folgt denselben Regeln wie der Code auf Modulebene (dem Code außerhalb eines Unterprogramms).

- Die Klausel 'PRIVATE' bewirkt, dass das Unterprogramm nur aus dem Modul heraus aufgerufen werden kann, in dem es sich befindet. Siehe dazu die Referenzeinträge PRIVATE und PUBLIC.

- 'Subname' ist der Bezeichner, unter dem die SUB aufgerufen wird.

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

- 'ALIAS' gibt einer Prozedur in einer Library einen neuen Namen, mit dem man auf sie verweisen kann.

- 'OVERLOAD' erlaubt, Prozeduren mit unterschiedlicher Parameterliste, aber gleichem Subnamen zu deklarieren. Siehe dazu den Referenzeintrag OVERLOAD.

- 'Parameterliste' gibt die Parameter an, die an das Unterprogramm übergeben werden. Die Parameterübergabe wird weiter unten erläutert.

- Die Klausel 'CONSTRUCTOR und DESTRUCTOR bewirken, dass eine SUB aufgerufen wird, bevor das Programm gestartet wird bzw. nachdem es beendet wurde. Siehe dazu CONSTRUCTOR (Module) und DESTRUCTOR (Module). CONSTRUCTOR/DESTRUCTOR-SUBs dürfen keine Parameter besitzen.

- Die Klausel 'STATIC' bewirkt, dass alle Variablen innerhalb des Unterprogramms 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 Klausel 'EXPORT' bewirkt, dass das Unterprogramm zur PUBLIC-EXPORT-Tabelle hinzugefügt wird, sodass sie von externen Programmen aus mit DYLIBSYMBOL verlinkt werden kann. Siehe dazu den Referenzeintrag EXPORT.

Um ein Unterprogramm aufzurufen, bevor es im Quellcode definiert wurde, muss es zuvor deklariert werden:

DECLARE SUB Subname [Aufrufkonvention] [OVERLOAD] [[LIB "DLLName"] _
ALIAS "AliasName"] [ ( Parameterliste ) ] [{CONSTRUCTOR | DESTRUCTOR}]

Siehe dazu den Referenzeintrag DECLARE

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 immer wiederkehrende Aufgaben in eine SUB 'ausgelagert' und mittels nur einer einzigen Programmzeile ausgeführt werden können.

Parameterübergabe
Der vom Unterprogramm ausgeführte Code kann von übergebenen Parametern abhängig sein. Die Parameterliste besitzt die Form

[ {BYVAL | BYREF } ] [Parameter1] AS [CONST] Typ [= Wert]   [, _
[ {BYVAL | BYREF } ] [Parameter2] AS [CONST] Typ [= Wert] ] [, ...]

- 'Parameter1', 'Parameter2', ... sind die Parameter (auch Argumente genannt). Es sind Variablen (bzw. ihre Werte), die im Unterprogramm verwendet werden können.

- Wird 'CONST' angegeben, kann der Wert innerhalb des Unterprogramms zwar gelesen, aber nicht mehr beschrieben werden.

- 'Typ' ist der Datentyp des übergebenen Parameters. Auch UDTs und Pointer können verwendet werden.

- Durch '= Wert' wird ein Parameter als optional deklariert; er kann beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird an die Funktion für diesen Parameter 'Wert' übergeben. Das VisualBASIC-Äquivalent heißt OPTIONAL.

- BYVAL und BYREF regeln die Art der Parameterübergabe an das Unterprogramm.

Der Datentyp muss bei den Parametern immer angegeben werden.
Siehe auch Parameterübergabe.

Aufgerufen wird ein Unterprogramm über seinen 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 erfolgen, auch wenn sich das Programm bereits auf Prozedurebene (also innerhalb einer SUB, FUNCTION, PROPERTY oder einem OPERATOR) befindet.

Hinweis: Früher wurde der Befehl CALL verwendet, um eine SUB aufzurufen. Dieser Befehl ist aber in der Dialektform -lang fb nicht mehr zulässig.

Die im Hauptprogramm verwendeten Variablen sind in Prozeduren nicht verfügbar. Um auf sie dennoch zuzugreifen, müssen sie zuerst in der Parameterliste übergeben werden. Bei einer SUB (oder Prozeduren allgemein) handelt es sich um SCOPE-Blöcke. Das bedeutet, dass Variablen, die auf SUB-Ebene dimensioniert werden, auf Modulebene nicht verfügbar sind. Siehe auch Gültigkeitsbereich von Variablen.

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 " & i, i
NEXT
SLEEP

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

SUB colortext (txt AS STRING, clr AS INTEGER)
COLOR clr
PRINT txt
END SUB

Unterschiede zu QB:

- Parameter können in FreeBASIC optional sein.

- In FreeBASIC kann eine SUB auch mit RETURN verlassen werden.

- SUBs können in FreeBASIC überladen werden.

Unterschiede 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 die 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 AS INTEGER 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.

- Das Überladen einer SUB ist erst seit FreeBASIC v0.14 möglich; siehe OVERLOAD.

- Variable Argumente sind erst seit FreeBASIC v0.13 möglich; siehe VA_ARG.

- Seit FreeBASIC v0.13 können optionale Parameter auch bei Strings eingesetzt werden.

- Seit FreeBASIC v0.12 müssen in den DECLARE-Zeilen keine Parameter-Namen mehr genannt werden; es ist jedoch immer noch zulässig.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang fb werden Parameter standardmäßig BYVAL übergeben. In den Dialektformen -lang qb und -lang fblite ist die Standardübergabe BYREF. Siehe die zugehörigen Referenzeinträge für genauere Informationen.

- In den Dialektformen -lang qb und -lang fblite kann RETURN nur eingesetzt werden, wenn OPTION GOSUB ausgeschalten ist. In der Dialektform -lang qb muss dies explizit durch OPTION NOGOSUB festgelegt werden.

Siehe auch:
FUNCTION, PROPERTY, DECLARE, OVERLOAD, STATIC (Klausel), EXIT, END, BYVAL, BYREF, SHARED, PRIVATE (Klausel), PUBLIC (Klausel), OPTION, CONSTRUCTOR, DESTRUCTOR (Module), Prozeduren, Parameterübergabe

Letzte Bearbeitung: 30.10.11
Zur Onlinefassung des Eintrags

SWAP

Syntax: SWAP Variable1, Variable2
Typ: Anweisung
Kategorie: Verschiedenes

SWAP tauscht die Werte zweier Variablen vom selben Typ.

Beispiel:

' Benutzung von Swap zum Ordnen zweier Zahlen:
DIM AS INTEGER a, b

INPUT "Eingabe einer Zahl: "; a
INPUT "Eingabe einer weiteren Zahl: "; b
IF a > b THEN SWAP a, b
PRINT "Die Zahlen, in aufsteigender Reihenfolge, sind:"
PRINT a, b
SLEEP

Siehe auch:
LET

Letzte Bearbeitung: 07.09.11
Zur Onlinefassung des Eintrags

SYSTEM

Syntax: SYSTEM [Errorlevel]
Typ: Anweisung
Kategorie: Verschiedenes

SYSTEM beendet die Ausführung eines Programms und gibt einen Errorlevel an das System zurück. Wird 'Errorlevel' ausgelassen, nimmt FreeBASIC automatisch 0 an.

SYSTEM hat dieselbe Funktion wie END oder STOP und besteht nur aus Kompatibilitätsgründen zu älteren BASIC-Dialekten. Es wird empfohlen, stattdessen END zu verwenden.

Wenn das Programm mit SYSTEM beendet wird, dann werden Variablen und Speicher nicht automatisch zerstört. Die Destruktoren von Objekten werden nicht aufgerufen. Benötigte Objekt-Destruktoren müssen daher vor der SYSTEM-Anweisung explizit aufgerufen werden.

Beispiel:

PRINT "Dieser Text wird angezeigt."
SLEEP
SYSTEM
PRINT "Dieser Text wird niemals angezeigt."

Siehe auch:
END, STOP, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

Startbuchstabe T

TAB

Syntax: TAB (Spalte)
Typ: Anweisung
Kategorie: Konsole

TAB dient zur Einrückung eines Textes (Tabulator). Die Anweisung wird zusammen mit PRINT und PRINT # benutzt, um die Ausgabe in der angegebenen Spalte fortzusetzen. TAB funktioniert ähnlich wie LOCATE (Anweisung), wird jedoch innerhalb einer PRINT-Anweisung eingesetzt und dient nur zum Setzen der Spalte.

- Ist 'Spalte' größer als die maximale Zeichenzahl in einer Zeile (siehe WIDTH), so wird zuerst Spalte MOD Zeichenzahl gerechnet.

- Ist 'Spalte' bzw. der mit Spalte MOD Zeichenzahl errechnete Wert kleiner als die aktuelle Cursorposition, so wird der Cursor außerdem eine Zeile nach unten gesetzt. Ansonsten bleibt der Cursor in der aktuellen Zeile.

TAB wird vorwiegend dazu genutzt, Text in Tabellenform auszugeben.

Beispiel:

PRINT "foo"; TAB(20); "bar"
PRINT "Hallo"; TAB(20); "Welt"
PRINT
PRINT "Weiteres"; TAB(5); "Beispiel"
SLEEP

Ausgabe:

foo                bar
Hallo              Welt

Weiteres
Beispiel

Unterschiede zu QB:
In QB wird der Zwischenraum mit Leerzeichen überschrieben. In FreeBASIC kann dieses Verhalten mit SPACE erreicht werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.21 wird TAB auch von PRINT USING unterstützt.

Siehe auch:
PRINT (Anweisung), SPC, LOCATE (Anweisung), SPACE, POS, Konsole

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

TAN

Syntax: TAN ( w )
Typ: Funktion
Kategorie: mathematische Funktionen

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

- 'w' ist ein beliebiger numerischer 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 Umkehrfunktionen zu TAN lauten ATN und ATAN2.

Hinweis: Die TAN-Funktion lässt sich auch durch SIN und COS ausdrücken:

TAN(w) = SIN(w) / COS(w)

Hieran erkennt man auch, dass TAN für die Werte 90°, 270°=3*90°, 450°=5*90° usw. (bzw. w=pi/2, w=pi*3/2, w=pi*5/2 usw.) nicht definiert ist.

Beispiel:

CONST pi AS DOUBLE  = ACOS(0)*2
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; "°-Winkels ist"; TAN(r)
SLEEP

Ausgabebeispiel:

Bitte geben Sie einen Winkel in Grad (DEG) ein: 75
Der Tangens eines 75°-Winkels ist 3.732050807568878

Unterschiede zu QB: keine

Siehe auch:
mathematische Funktionen, SIN, ASIN, COS, ACOS, ATN, ATAN2

Letzte Bearbeitung: 07.07.10
Zur Onlinefassung des Eintrags

THEN

Siehe IF ... THEN

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

THIS

Syntax: THIS
Typ: Schlüsselwort
Kategorie: Datentypen

THIS wird in Prozeduren verwendet, die einem UDT (user defined type) 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 myType
DECLARE SUB MyCall ()

myVar AS INTEGER
END TYPE

DIM AS myType test

'Setze den Record 'myVar' auf 0
test.myVar = 0
PRINT "'myVar' = "; test.myVar

'Rufe die zugeordnete SUB auf
test.MyCall()

'jetzt ist der 'value' gleich 10
PRINT test.myVar
SLEEP

SUB myType.MyCall ()
THIS.myVar = 10
END SUB

THIS kann aber auch ausgelassen werden, so funktioniert das Beispiel auch, wenn die Sub so aussieht:

SUB myType.MyCall ()
myVar = 10
END SUB

Doch was ist, wenn eine globale Variable exakt genauso heißt, wie eine Variable innerhalb meines UDTs, man aber auf die globale zugreifen will? Nun auch dafür gibt es eine Lösung:

TYPE myType
DECLARE SUB changeVar ( newValue AS INTEGER )

myVar AS INTEGER = 5 'Initialwert für die lokale Variable
END TYPE

DIM SHARED AS INTEGER myVar 'Damit die globale Variable innerhalb des Unterprogramms der Klasse bekannt ist, muss sie vorher dimensioniert werden

SUB myType.changeVar ( newValue AS INTEGER )
THIS.myVar = newValue 'verändert die lokale Variable - erkennbar an 'this'
PRINT THIS.myVar

myVar = newValue 'verändert auch die lokale Variable - 'this' kann ausgelassen werden
PRINT myVar

..myVar = newValue 'verändert die globale Variable - die zwei Punkte sorgen dafür, dass der "Scope" der Klasse verlassen wird
PRINT ..myVar
END SUB

DIM AS myType test

test.changeVar(10)
PRINT myVar 'Ausgabe der globalen Variable

SLEEP

Es sei dazu aber gesagt, dass man solche Situationen vermeiden sollte, da einem schnell Fehler unterlaufen und Variablen nicht die erwarteten Werte enthalten, weil statt auf die globale nur die lokale Variable geändert wurde oder umgekehrt.

Eine andere Art der Verwendung von THIS ist die mit Pointern auf Typen. In diesen Fällen darf nicht wie gewohnt mit einem Punkt auf die Variablen zugegriffen werden,

PRINT THIS.myVar

sondern mit einem Pfeil.

Beispiel:

TYPE myType
DECLARE SUB changeVar ( newValue AS INTEGER )

myVar AS INTEGER = 5 'Initialwert für die lokale Variable
END TYPE

SUB myType.changeVar ( newValue AS INTEGER )
THIS.myVar = newValue
PRINT THIS.myVar

END SUB

DIM AS myType test
DIM AS myType PTR testPtr = @test

testPtr->changeVar(10)

SLEEP

Unterschiede zu QB: neu in FreeBASIC.

Unterschiede zu früheren Versionen von FreeBASIC: THIS existiert seit FreeBASIC v0.17.

Unterschiede unter den FB-Dialektformen: THIS ist nur in -lang fb zulässig

Siehe auch:
TYPE (UDT), CONSTRUCTOR, DESTRUCTOR, BASE, PROPERTY

Letzte Bearbeitung: 21.02.12
Zur Onlinefassung des Eintrags

THREADCALL

Syntax: THREADCALL Prozedurname [(Parameterliste)]
Typ: Funktion
Kategorie: Programmorganisation

Diese Funktion existert erst ab FreeBASIC v0.24 !

THREADCALL startet eine Prozedur Ihres Programmes als eigenständigen Thread.

- 'Prozedurname' ist der Name einer SUB, die unabhängig vom Hauptprogramm arbeiten soll.

- 'Parameterliste' enthält die Parameter, die an die SUB übergeben werden sollen. Sie ist identisch mit der Parameterliste, die bei einem normalen Aufruf der SUB übergeben werden muss. Die Klammern um die Parameterliste sind erforderlich, außer die Parameterliste ist leer.

- Der Rückgabewert ist ein ANY PTR und gibt den Handle an, der den Thread identifiziert. Später kann der Thread über diesen Handle angesprochen werden. Ist der Rückgabewert gleich null, so trat ein Fehler auf; kein Thread wurde gestartet.

THREADCALL arbeitet ähnlich wie THREADCREATE. Wird eine Prozedur mit THREADCALL aufgerufen, so wird sie in einem neuen Thread gestartet und gleichzeitig mit dem Code ausgeführt, von dem sie aufgerufen wurde. Das Betriebssystem erreicht diese Gleichzeitigkeit, indem es die Prozedur einem anderen Prozessor zuweist, sofern einer vorhanden ist, oder indem es die Wartezeiten des Hauptprogrammes ausnutzt.

Bevor Sie Ihr Programm beenden, müssen Sie mit THREADWAIT auf die Beendigung aller Threads warten, die von ihm aufgerufen wurden.

THREADCALL ist eine einfachere Methode, Threads zu erstellen, und erlaubt die Übergabe von Daten, ohne dass dabei auf globale Variablen oder Pointer zurückgegriffen werden muss. Trotzdem ist die Funktion effizienter und sollte in Programmen verwendet werden, die eine große Zahl an Threads erstellen.
Unter Linux wird die Bibliothek libffi (bzw. das zugehörige devel-Paket) benötigt, um die Funktion verwenden zu können, unter Windows wird die statische Version der Bibliothek mitgeliefert. Da es sich bei libffi um eine externe Bibliothek handelt, sollte die Lizenz beachtet werden.

Obwohl die meisten Prozeduren unterstützt werden, können folgende Prozeduren nicht mit THREADCALL gestartet werden:

- Prozeduren mit einer variablen Argumentenzahl

- Prozeduren mit UNIONs, die BYVAL übergeben werden

- Prozeduren mit UDTs, die UNIONs, Arrays, Strings oder Bitfelder enthalten und BYVAL übergeben werden

Beispiel:

SUB thread(id AS STRING, tlock AS ANY PTR, anzahl AS INTEGER = 5)
FOR i AS INTEGER = 1 TO anzahl
MUTEXLOCK tlock
PRINT "Schleife "; id; " befindet sich im Durchlauf Nr. "; i
MUTEXUNLOCK tlock
SLEEP 1
NEXT
END SUB

DIM tlock AS ANY PTR = MUTEXCREATE()
DIM a AS ANY PTR = THREADCALL thread("A", tlock)
DIM b AS ANY PTR = THREADCALL thread("B", tlock, 7)
THREADWAIT a
THREADWAIT b
MUTEXDESTROY tlock
PRINT "Fertig (und das ohne die Verwendung von DIM SHARED!)"

Mögliche Ausgabe:

Schleife B befindet sich im Durchlauf Nr.  1
Schleife A befindet sich im Durchlauf Nr.  1
Schleife B befindet sich im Durchlauf Nr.  2
Schleife A befindet sich im Durchlauf Nr.  2
Schleife B befindet sich im Durchlauf Nr.  3
Schleife A befindet sich im Durchlauf Nr.  3
Schleife B befindet sich im Durchlauf Nr.  4
Schleife A befindet sich im Durchlauf Nr.  4
Schleife B befindet sich im Durchlauf Nr.  5
Schleife A befindet sich im Durchlauf Nr.  5
Schleife B befindet sich im Durchlauf Nr.  6
Schleife B befindet sich im Durchlauf Nr.  7
Fertig (und das ohne die Verwendung von DIM SHARED!)

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:

- THREADCALL existiert nicht unter DOS, da DOS kein Multithreading unterstützt.

- Unter Linux starten Threads immer in der Reihenfolge, in der sie erstellt wurden. Unter Win32 kann dies nicht vorausgesetzt werden.

- Unter Linux werden die Aufrufkonventionen STDCALL und PASCAL nicht unterstützt.

- Unter Windows wird die Aufrufkonvention PASCAL nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.24

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADCALL nicht zur Verfügung.

Siehe auch:
THREADCREATE, Multithreading

Letzte Bearbeitung: 18.01.12
Zur Onlinefassung des Eintrags

THREADCREATE

Syntax: THREADCREATE(MySub [, Argument] [, Stackgroesse])
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. Die Parameterliste dieser SUB darf entweder kein Argument enthalten oder nur aus einer einzelnen INTEGER-Stelle bestehen.

- 'Argument' ist der Integer-Parameter von MySub. Wenn mehr als ein Parameter benötigt wird, kann hier ein Pointer auf eine Array- oder UDT-Struktur übergeben werden. Da 'Argument' BYVAL übergeben wird, kann der Parameter nicht verwendet werden, um ein Ergebnis zurückzuliefern. 'Argument' ist optional; erwartet das Programm, das als Thread gestartet wird, einen Parameter, so wird null übergeben, wenn dieser Parameter ausgelassen wird.

- 'Stackgroesse' ist optional und gibt an, wie viele Byte für den Stack des Thread reserviert werden sollen.

- Der Rückgabewert ist ein ANY PTR und gibt den Handle an, der den Thread identifiziert. Später kann der Thread über diesen Handle angesprochen werden. Ist der Rückgabewert gleich null, so trat ein Fehler auf; kein Thread wurde gestartet. In früheren Versionen von FreeBASIC (vor v0.17) war der Rückgabewert ein INTEGER.

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.

Bevor Sie Ihr Programm beenden, müssen Sie mit THREADWAIT auf die Beendigung aller Threads warten, die von ihm aufgerufen wurden.

Um mehrere Threads zu synchronisieren, existieren verschiedene Möglichkeiten; sie können entweder über Mutexe aufeinander abgestimmt werden oder auf ein COND-Signal warten. Siehe dazu MUTEXCREATE sowie CONDCREATE.

Auf manchen Systemen steigt die Stackgröße automatisch über die angegebene Größe, falls nötig, auf anderen stellt der Wert die absoulte Grenze dar. Wenn auf Systemen, auf denen der Stack nicht automatisch wachsen kann, ein größerer Stack verwendet wird, als reserviert wurde, kann es das Programmverhalten beeinflussen.

Beispiel:

DIM AS ANY PTR i
DIM SHARED AS ANY PTR mutex

DIM AS INTEGER DotCount
DIM SHARED AS INTEGER terminate

SUB MyThread ()
DO 'alle 100ms einen "*" ausgeben
PRINT "*";
SLEEP 100, 1
MUTEXLOCK(mutex)
IF terminate = 1 THEN 'abbrechen wenn 1
MUTEXUNLOCK(mutex)
EXIT DO
ENDIF
MUTEXUNLOCK(mutex)
LOOP
END SUB

PRINT "Hauptprogramm gibt Punkte aus"
PRINT "Thread gibt Sterne aus"
PRINT
terminate = 0

mutex = MUTEXCREATE() 'Mutex, um die terminate-Variable zu schützen

i = THREADCREATE(CAST(ANY PTR, @MyThread))

DO  'alle 50ms einen "." ausgeben
PRINT ".";
SLEEP 50, 1
DotCount += 1
LOOP UNTIL DotCount = 100

MUTEXLOCK(mutex)
terminate = 1 'MyThread abbrechen
MUTEXUNLOCK(mutex)

PRINT
PRINT "Beendevorgang begonnen"
THREADWAIT(i) 'warten bis MyThread endet
PRINT "Thread beendet"

MUTEXDESTROY(mutex)

SLEEP

Ausgabebeispiel:

Hauptprogramm gibt Punkte aus
Thread gibt Sterne aus

.*..*..*..*.*..*..*..*..*..*..*..*...*.*..*..*...*.*..*..*...*.*...*.*...*.*..*.
.*...*.*..*..*..*..*..*..*...*.*..*..*...*.*..*..*...*.*..*..*...*.*..*
Beendevorgang begonnen
Thread beendet

Wie Sie sehen, werden die Punkte und Sterne nicht ganz gleichmäßig ausgegeben, obwohl das Zeitverhältnis für Hauptprogramm und Thread konstant bei 2:1 liegt (erreicht durch die beiden SLEEP-Anweisungen). Dies liegt an diversen Prozessen, die das System im Hintergrund beanspruchen und so das Programm beeinflussen. Wenn eine exakte Abstimmung zweier Threads aufeinander nötig ist, muss dies über Mutexe oder Conds erreicht werden.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:

- In der DOS-Version von FreeBASIC steht THREADCREATE nicht zur Verfügung, da Threads nicht unterstützt werden.

- Unter Linux starten Threads in der Reihenfolge in der sie erstellt wurden. Dies kann unter Windows systembedingt nicht garantiert werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- THREADCREATE existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 gibt THREADCREATE einen ANY PTR zurück.

- Seit FreeBASIC v0.17 ist der Parameter 'Argument', der an die Sub übergeben wird, optional.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADCREATE nicht zur Verfügung.

Siehe auch:
THREADCALL, Multithreading

Letzte Bearbeitung: 19.05.12
Zur Onlinefassung des Eintrags

THREADWAIT

Syntax: THREADWAIT handle
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 ein Wert vom Typ ANY PTR, der von THREADCREATE zurückgegeben wurde.

Beispiel: siehe THREADCREATE

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:

- In der DOS-Version von FreeBASIC steht THREADWAIT nicht zur Verfügung, da Threads nicht unterstützt werden.

- Unter Linux starten Threads in der Reihenfolge in der sie erstellt wurden. Dies kann unter Windows systembedingt nicht garantiert werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- THREADWAIT existiert erst seit FreeBASIC v0.13

- Seit FreeBASIC v0.17 verlangt THREADWAIT einen ANY PTR als Parameter.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht THREADWAIT nicht zur Verfügung.

Siehe auch:
Multithreading

Letzte Bearbeitung: 02.09.11
Zur Onlinefassung des Eintrags

TIME

Syntax: TIME[$]
Typ: Funktion
Kategorie: Zeit

TIME gibt die aktuelle Uhrzeit im Format hh:mm:ss aus.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

DIM t AS STRING = TIME
PRINT "Es ist jetzt "; t; " Uhr."
SLEEP

Ausgabebeispiel:

Es ist jetzt 00:13:37 Uhr.

Unterschiede zu QB:
Um in FreeBASIC eine neue Uhrzeit einzustellen, muss SETTIME verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
DATE, SETDATE, TIMER, SETTIME, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

TIMER

Syntax: TIMER
Typ: Funktion
Kategorie: Zeit

TIMER gibt die Zahl der Sekunden zurück, die seit dem Systemstart (unter DOS/Windows) bzw. seit der Unix-Epoche (unter Unix/Linux) vergangen sind.
Der Rückgabetyp ist ein DOUBLE.

Wenn Ihr Prozessor einen Präzisions-Timer besitzt (wie ihn beispielsweise die Performance Counter Pentium Prozessoren von Intel besitzen), 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.

Beispiel:

DIM zeit AS DOUBLE
PRINT "Sekunden, die seit Systemstart vergangen sind: "; TIMER

PRINT "Warte 3 Sekunden"

zeit = TIMER
DO
LOOP UNTIL TIMER > zeit + 3
PRINT "Abgeschlossen."

Unterschiede zu QB:

- In QB wird die Zeit seit Mitternacht zurückgegeben.

- Die Zeitauflösung ist vom Prozessor abhängig; höhere Auflösungen als 1/18 sek sind möglich.

Plattformbedingte Unterschiede:

- Unter DOS und Windows gibt TIMER die Zeit seit Systemstart zurück.

- Unter unixartigen Betriebssystemen wie Linux wird die Zeit seit der Unix-Epoche (01.01.1970) zurückgegeben.

Siehe auch:
TIME, SETTIME, DATE, SETDATE, SLEEP, Datum und Zeit

Letzte Bearbeitung: 06.09.11
Zur Onlinefassung des Eintrags

TIMESERIAL

Syntax: TIMESERIAL(Stunde, Minute, Sekunde)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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 datetime.bi (oder 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:01:00.

Beispiel:

#INCLUDE  "vbcompat.bi"
DIM a AS DOUBLE
a = DATESERIAL(2005, 11, 28) + TIMESERIAL(19, 3, 26)
PRINT FORMAT(a, "dd.mm.yyyy hh:mm:ss")
SLEEP

Ausgabe:

28.11.2005 19:03:26

Unterschiede zu QB: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, TIMEVALUE, HOUR, MINUTE, SECOND, FORMAT, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

TIMEVALUE

Syntax: TIMEVALUE(Zeit)
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

TIMEVALUE 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 oder h:m:s

- Der Rückgabewert ist ein DOUBLE, der die Serial Number enthält

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: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, TIMESERIAL, DATEVALUE, HOUR, MINUTE, SECOND, FORMAT, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

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.

- einen Bereich einer Datei zu sperren (siehe dazu LOCK).

Beispiel:

DIM AS INTEGER array(1 TO 5)

FOR i AS INTEGER = 1 TO 5
array(i) = i

SELECT CASE array(i)
CASE 1 TO 3
PRINT WSTR("1 bis einschließlich 3")
CASE 4 TO 5
PRINT WSTR("4 bis einschließlich 5")
END SELECT
NEXT

SLEEP

Siehe auch:
DIM, FOR, SELECT CASE

Letzte Bearbeitung: 26.07.11
Zur Onlinefassung des Eintrags

TRANS

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], 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.

Beispiel:

SCREENRES 320, 200, 32
LINE (0, 0)-(319, 199), RGB(0, 128, 255), bf

' Bild mit transparenter Hintergrundfarbe erstellen
DIM img AS ANY PTR = IMAGECREATE( 33, 33, RGB(255, 0, 255) )
CIRCLE img, (16, 16), 15, RGB(255, 255, 0),     ,     , 1, f
CIRCLE img, (10, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
CIRCLE img, (23, 10), 3,  RGB(  0,   0, 0),     ,     , 2, f
CIRCLE img, (16, 18), 10, RGB(  0,   0, 0), 3.14, 6.28

DIM AS INTEGER x = 160 - 16, y = 100 - 16

' Grafik ausgeben
PUT (x, y), img, TRANS

' Bildspeicher freigeben und auf Tastendruck warten
IMAGEDESTROY img
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
PUT (Grafik), DRAW STRING, SCREENRES, AND (Methode), OR (Methode), XOR (Methode), PSET (Methode), PRESET (Methode), ALPHA, ADD, CUSTOM, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

TRIM

Syntax: TRIM[$] (Stringausdruck [, [ANY] zuEntfernen])
Typ: Funktion
Kategorie: Stringmanipulation

TRIM gibt einen String aus, aus dem bestimmte führende oder angehängte Zeichen entfernt werden sollen.

- 'Stringausdruck' ist der STRING, ZSTRING oder WSTRING, der gekürzt werden soll.

- 'zuEntfernen' 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. 'zuEntfernen' darf aus mehreren Zeichen bestehen.

- Wird die ANY-Klausel verwendet, entfernt FreeBASIC jedes Zeichen aus 'zuEntfernen' am Rand von 'Stringausdruck'.

- Der Rückgabewert ist der um die angegebenen Zeichen gekürzte String.

TRIM arbeitet case-sensitive, d. h. die Groß-/Kleinschreibung ist ausschlaggebend.

Das Dollarzeichen ($) als Suffix ist optional.

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")
SLEEP

Ausgabe:

foo bar
da
a da da

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Der Parameter 'zuEntfernen' und die ANY-Klausel existieren seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht TRIM nicht zur Verfügung und kann nur über __TRIM aufgerufen werden.

Siehe auch:
LTRIM, RTRIM, INSTR, String-Funktionen

Letzte Bearbeitung: 19.01.12
Zur Onlinefassung des Eintrags

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

Beim Forward Referencing ist darauf zu achten, dass nur Types zur Deklaration verwendet werden können, die vollständig sind. Ein Type ist dann vollständig, wenn die Größe aller Elemente im Type bekannt sind. Anders gesagt muss die Größe in Byte des gesamten Types bekannt sein. Folgender Code wird den Compilerfehler 'Incomplete type' ergeben:

TYPE einTyp AS forwardTyp

DIM AS einTyp beispiel

TYPE forwardTyp
dummy AS INTEGER
END TYPE

Um das Problem zu lösen muss nun, bevor eine Instanz des Typs erstellt wird, die Größe bekannt sein. Für das kleine Beispiel würde es folgendermaßen aussehen:

TYPE einTyp AS forwardTyp

TYPE forwardTyp
dummy AS INTEGER
END TYPE

DIM AS einTyp beispiel

Benötigt man die Instanz aber aus irgendwelchen Gründen vor dem Forward-Typ, kann das durch einen Pointer gelöst werden. Die Größe eines Pointers ist immer bekannt, folglich auch kein Problem:

TYPE einTyp AS forwardTyp

DIM AS einTyp PTR beispiel

TYPE forwardTyp
dummy AS INTEGER
END TYPE

Beispiel einer Fenster-Klasse mit Button:

TYPE tempButton AS button               'Forward-Type für 'button'

TYPE fenster                            'Fenster-Klasse
beendenknopf AS tempButton PTR      'Beenden-Button der noch unbekannten Klasse
x AS INTEGER
y AS INTEGER
END TYPE

TYPE button                             'Button-Klasse
parent AS fenster PTR               'Eltern-Type der Button-Klasse
x AS INTEGER
y AS INTEGER
END TYPE

'Objekte erstellen
DIM AS fenster PTR meinProgramm

meinProgramm = NEW fenster
meinProgramm->beendenknopf = NEW button

'Daten zuweisen
meinProgramm->x = 500
meinProgramm->y = 200

meinProgramm->beendenknopf->parent = meinProgramm
meinProgramm->beendenknopf->x = 150
meinProgramm->beendenknopf->y = 25

'Fenster erstellen
SCREENRES meinProgramm->x, meinProgramm->y
LINE (0, 0)-(meinProgramm->beendenknopf->x, meinProgramm->beendenknopf->y), 15, BF
DRAW STRING (5, 5), meinProgramm & " = " & meinProgramm->beendenknopf->parent, 0

'Objekte zerstören
DELETE meinProgramm->beendenknopf
DELETE meinProgramm

SLEEP

Unterschiede zu QuickBASIC:
- neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
- bis einschließlich Version 0.21.1 enthält 'Syntax B' einen Fehler, der zu Problemen führen kann

Siehe auch:
TYPE (UDT), TYPE (Funktion)

Letzte Bearbeitung: 26.08.11
Zur Onlinefassung des Eintrags

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 gestalten, 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. Es gibt aber auch noch andere Verwendungsmöglichkeiten.

2. Beispiel: Funktionsaufruf mit Übergabe eines temporären UDTs

TYPE S
AS SINGLE x, y
END TYPE

SUB test ( v AS S )
PRINT "S", v.x, v.y
END SUB

test( TYPE( 1, 2 ) )
test( Type<S>( 1, 2 ) )

Eine ähnliche Funktionalität bietet die Nutzung eines Constructors:

TYPE S
DECLARE CONSTRUCTOR (a AS SINGLE, b AS SINGLE)
AS SINGLE x, y
END TYPE

CONSTRUCTOR S (a AS SINGLE, b AS SINGLE)
x = a
y = b
END CONSTRUCTOR

SUB test ( v AS S )
PRINT "S", v.x, v.y
END SUB

test( S( 1, 2 ) )
SLEEP

Unterschiede zu QuickBASIC:

- neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- Die Verwendung von TYPE als Funktion ist erst seit FreeBASIC v0.16 möglich

Siehe auch:
TYPE (UDT), TYPE (Forward Referencing), WITH

Letzte Bearbeitung: 26.07.11
Zur Onlinefassung des Eintrags

TYPE (UDT)

Syntax A:

TYPE TypenName [EXTENDS Mutterklasse] [FIELD = Zahl]
var1  [AS Datentyp]
[var2 [AS Datentyp] ]
[...]
END TYPE

Syntax B:

TYPE TypenName[EXTENDS Mutterklasse] [FIELD = Zahl]
[ AS Datentyp] var1 [, var2 [, ...] ]
[[AS Datentyp] var3 [, var4 [, ...] ]
[...]
END TYPE

Syntax C:

TYPE TypenName AS Datentyp

Typ: Anweisung
Kategorie: Speicherverwaltung

TYPE wird verwendet, um UDTs (user defined types, also benutzerdefinierte Datentypen) zu erstellen, die mehrere Variablen/Arrays enthalten können.

- '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 Datentypen auch zu Beginn einer Zeile stehen.

- 'Datentyp' ist der Typ, den die Records besitzen sollen. Jeder Record darf einen anderen Datentypen besitzen, sie können jedoch auch denselben Datentyp besitzen. Auch Arrays, Strings fester und variabler Länge, Pointer (Zeiger) und andere UDTs sind erlaubt.

- 'EXTENDS' kann verwendet werden, um den eigenen Datentypen die Records eines anderen UDTs erben zu lassen.

- '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 ausgelassen, 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)).

Beispiel:

TYPE clr
AS UBYTE red, green, blue
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 Bezeichner, über den der Record angesprochen werden kann.

- 'Bits' ist 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 dieselben 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 '...

Die letzte Verwendungsmöglichkeit erlaubt es, eine Variable direkt wie einen eingebauten Datentypen zu verwenden:

TYPE myDatatype AS INTEGER

Der Vorteil dieser Methode ist, dass man den Datentypen nur an einer Stelle ändern muss, statt an jeder Stelle, an der ein Datentyp verwendet wird.

FreeBASIC erlaubt für diese Syntaxform, neben den allgemeinen Datentypen, auch Pointer auf Prozeduren (Callbacks). Dies hat die Vorteile, dass einerseits die Deklaration verkürzt wird, was Schreibaufwand ersparen kann und andererseits, im Gegensatz zur normalen Deklaration, auch Pointer auf Callbackfunktionen ermöglicht werden:

'Beispielfunktionen
FUNCTION testAufruf() AS INTEGER
RETURN 1
END FUNCTION
FUNCTION testAufrufPointer() AS INTEGER PTR
RETURN CAST(INTEGER PTR, 2)
END FUNCTION

'Callbackfunktionen
DIM func AS FUNCTION() AS INTEGER
DIM pointerFunc AS FUNCTION() AS INTEGER PTR

'Pointer für Callbackfunktionen
TYPE pointerFunc_Type AS FUNCTION() AS INTEGER
DIM pointerPointerFunc AS pointerFunc_Type PTR

'Funktionszuweisungen
func = @testAufruf 'Callback auf die erste Funktion
pointerFunc = @testAufrufPointer 'Callback auf die zweite Funktion
pointerPointerFunc = @func 'Pointer auf das Callback der ersten Funktion

PRINT "Funktionsadressen:", func, pointerFunc, pointerPointerFunc
PRINT "Funktionsaufrufe:", func(), pointerFunc(), *pointerPointerFunc()
SLEEP

Objekte in FreeBASIC:
Seit Version 0.17 bietet FreeBASIC objektorientierte Ansätze, die beispielsweise Methoden, Konstruktoren und Destruktoren in UDTs erlauben. Hierzu gibt es im Portal mehrere Tutorials, unter anderem dieses hier: Das UDT-Tutorial.

Beispiel für objektorientierte Programmierung:

'Vektorklasse
TYPE Vector
W AS INTEGER
H AS INTEGER
DECLARE CONSTRUCTOR (nW AS INTEGER, nH AS INTEGER)
END TYPE

CONSTRUCTOR Vector (nW AS INTEGER, nH AS INTEGER)
W = nW
H = nH
END CONSTRUCTOR

'Klasse zur Erstellung eines Objekts
TYPE AObject
PRIVATE:
X AS INTEGER
Y AS INTEGER
Movement AS Vector POINTER
PUBLIC:
'Öffentliche Methoden inklusive eines Konstruktors und eines Destruktors
DECLARE CONSTRUCTOR (nX AS INTEGER, nY AS INTEGER)
DECLARE DESTRUCTOR ()
DECLARE SUB SetMotion (Motion AS Vector POINTER)
DECLARE SUB Move ()
DECLARE PROPERTY GetX AS INTEGER
END TYPE

'Initialwerte setzen
CONSTRUCTOR AObject (nX AS INTEGER, nY AS INTEGER)
X = nX
Y = nY
END CONSTRUCTOR

'Allozierten Speicher freigeben
DESTRUCTOR AObject ()
DELETE Movement
END DESTRUCTOR

'Bewegungsvektor setzen
SUB AObject.SetMotion (Motion AS Vector POINTER)
Movement = Motion
END SUB

'Das Objekt anhand seines Bewegungsvektors bewegen
SUB AObject.Move ()
X += Movement->W
Y += Movement->H
END SUB

'Rückgabe von X, welches sonst nicht zugänglich wäre
PROPERTY AObject.GetX AS INTEGER
RETURN X
END PROPERTY

'Hauptprogramm

'Eine neue Instanz von 'AObject' an den Koordinaten 100, 100 erstellen
DIM Player AS AObject = Type<AObject>(100, 100)

/'Ein neues Vektorobjekt dynamisch allozieren
und dessen Position um 10 nach links und 5 nach unten verschieben'/
Player.SetMotion(NEW Vector (-10, 5))

'Die Position von 'Player' aktualisieren
Player.Move()

'Den neuen Wert von X (90) anzeigen
PRINT Player.GetX

/'Weil 'Player' eine lokale Variable ist, wird sein Destruktor
am Ende des Scopes automatisch aufgerufen'/

'Vor Programmende auf Tastendruck warten
SLEEP

Alle UDTs besitzen Standard-Konstruktoren und -Destruktoren, falls keine anderen definiert wurden, die diese überschreiben. Diese können jederzeit explizit aufgerufen werden. Dies gilt allerdings auch für selbsterstellte Konstruktoren und Destruktoren.

TYPE myType
x AS INTEGER
END TYPE

DIM AS myType PTR myVar = NEW myType

myVar->CONSTRUCTOR
myVar->DESTRUCTOR

DELETE myVar
SLEEP

Unterschiede zu QB:

- Strings fester Länge besitzen im Gegensatz zu QB ein zusätzliches Zeichen am Ende, wodurch UDTs mit diesen Strings nicht kompatibel zu QB sind, wenn es bei Dateioperationen verwendet wird.

- FreeBASIC unterstützt auch Bitfelder.

Plattformbedingte Unterschiede:

- Das Standardpadding unter Linux und DOS ist 4 Byte.

- Das Standardpadding unter Windows ist 8 Byte.

Unterschiede zu früheren Versionen von FreeBASIC:

- Bitfelder existieren erst seit FreeBASIC v0.13.

- Methoden in UDTs existieren erst seit v0.17.

Unterschiede unter den FB-Dialektformen:

- Methoden in UDTs gibt es nur in -lang "fb".

- Das Standardpadding in -lang "fb" und -lang "fblite" hängt von der Plattform ab, während in -lang "qb" kein Padding durchgeführt wird.

Siehe auch:
TYPE (Funktion), TYPE (Forward Referencing), UNION, ENUM, DIM, OPERATOR, LEN, SIZEOF, OFFSETOF, VARPTR, FIELD, WITH, Bitfelder, CONSTRUCTOR, DESTRUCTOR, PROPERTY, OBJECT, EXTENDS

Letzte Bearbeitung: 24.01.12
Zur Onlinefassung des Eintrags

TYPEOF

Syntax: TYPEOF (Variable | Datentyp)
Typ: Anweisung
Kategorie: Speicherverwaltung

TYPEOF ist eine compiler-interne Variable, die nur während des Compilier-Vorgangs zur Verfügung steht. Der Parameter kann sein:

- 'Variable': der Name der Variable, oder

- 'Datentyp', z.B. UBYTE, INTEGER, STRING ..., oder

- ein Literal, z. B. 123 für INTEGER, 55.5 für DOUBLE oder "" für ZSTRING

In der Form DIM AS TYPEOF(INTEGER) foo oder DIM AS TYPEOF(12345) foo wird die Variable foo als INTEGER definiert.

Beispiel:

DIM AS TYPEOF("Text") foo

#PRINT TYPEOF(foo)

#IF TYPEOF(foo) = STRING
PRINT "String"
#ELSEIF TYPEOF(foo) = ZSTRING
PRINT "ZString"
#ENDIF

PRINT foo

SLEEP

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht TYPEOF nicht zur Verfügung und kann nur über __TYPEOF aufgerufen werden.

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
Datentypen, TYPE (UDT), Verschiedenes

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

Startbuchstabe U

UBOUND

Syntax: UBOUND (Array[, Dimension])
Typ: Funktion
Kategorie: Speicherverwaltung

UBOUND gibt den größten 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, deren 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 0 ausgegeben.

Ist das Array bisher nur deklariert, hat aber noch keine Dimensionen, so gibt UBOUND 0 aus. Ob das Array nun den geringsten Index 0 hat oder einfach keine Dimensionen, kann man über die Adresse des ersten Elements erfahren, welche 0 ist sofern es keine Dimensionen gibt.

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)
PRINT @unArray(0)
SLEEP

Ausgabe:

10
15
2
0

0
0

Unterschiede zu früheren Versionen von FreeBASIC:
Bis einschließlich FreeBASIC v0.15 ergaben leere Dimensionen statt 0 den Wert -1.

Siehe auch:
LBOUND, DIM, REDIM, Arrays

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

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.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht UBYTE nicht zur Verfügung und kann nur über __UBYTE aufgerufen werden.

Siehe auch:
DIM, CAST, CUBYTE, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

UCASE

Syntax: UCASE[$] (Stringausdruck)
Typ: Funktion
Kategorie: Stringmanipulation

UCASE wandelt einen Stringausdruck in Großbuchstaben.

- 'Stringausdruck' ist ein STRING, ZSTRING oder WSTRING, der in Großbuchstaben zurückgegeben werden soll.

- Der Rückgabewert ist der in Großbuchstaben gewandelte STRING bzw. WSTRING.

Achtung: UCASE wandelt nur die ASCII-Zeichen "a" - "z" um. Umlaute werden nicht beachtet!

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

PRINT UCASE("Hello World abCDefGHäÄ")
SLEEP

Ausgabe:

"HELLO WORLD ABCDEFGHäÄ"

Umlaute müssen bei Bedarf gesondert umgewandelt werden; siehe dazu Umlaute umwandeln.

Unterschiede zu QB:

- In QB ist das Suffix $ verbindlich.

- Da QB kein Unicode unterstützt, existiert dort auch nicht die Möglichkeit, WSTRING zu verwenden.

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt, deshalb kann dort auch kein WSTRING verwendet werden.

Unterschiede unter den FB-Dialektformen:

- In der Dialektform -lang qb ist das Suffix $ verbindlich.

- In den Dialektformen -lang fblite und -lang fb ist das Suffix optional.

Siehe auch:
LCASE, String-Funktionen

Letzte Bearbeitung: 20.01.12
Zur Onlinefassung des Eintrags

UINTEGER

Typ: Datentyp

UINTEGER-Zahlen sind vorzeichenlose 32-bit-Ganzzahlen. Sie liegen im Bereich von 0 bis (2^32)-1, bzw. von 0 bis 4'294'967'295.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht UINTEGER nicht zur Verfügung und kann nur über __UINTEGER aufgerufen werden.

Siehe auch:
DIM, CAST, CUINT, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

ULONG

Typ: Datentyp

Abhängig von der verwendeten Plattform entspricht ULONG dem Datentyp UINTEGER (32-bit-Systeme) oder ULONGINT (64-bit-Systeme). ULONG hat dieselbe Größe wie SIZEOF(ANY PTR).

Hinweis: Da FreeBASIC zur Zeit nur für 32-bit-Systeme kompiliert, hat ULONG immer die Größe von 32 Bit. Dies kann sich in Zukunft ändern.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ULONG nicht zur Verfügung und kann nur über __ULONG aufgerufen werden.

Siehe auch:
SIZEOF, ANY, PTR, DIM, CAST, CULNG, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

ULONGINT

Typ: Datentyp

ULONGINT-Zahlen sind vorzeichenlose 64-bit-Ganzzahlen. Sie liegen im Bereich von 0 bis (2^64)-1, bzw. von 0 bis 18'446'744'073'709'551'615.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ULONGINT nicht zur Verfügung und kann nur über __ULONGINT aufgerufen werden.

Siehe auch:
DIM, CAST, CULNGINT, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

UNDEF (Metabefehl)

Syntax: #UNDEF Symbol
Typ: Metabefehl
Kategorie: Präprozessoren

#UNDEF löscht eine Definition, die mit #DEFINE erstellt wurde. Dies kann nützlich sein, wenn ein Makro nur in einem bestimmten Codeteil gültig sein soll, ein Symbol später als Variable verwendet werden soll oder der Wert einer Konstanten geändert werden muss. Der Befehle kann außerdem dazu verwendet werden, um von FreeBASIC reservierte Schlüsselwörter freizugeben.

#UNDEF darf nicht benutzt werden, um Variablen- oder Prozedurnamen im aktuellen SCOPE-Block zu entfernen. Diese Namen werden intern vom Compiler benötigt; das Löschen dieser Bezeichner kann zu unerwarteten Ergebnissen führen.

Beispiel:

#DEFINE Add2(a_, b_) ((a_) + (b_))
PRINT Add2(1, 2)

' Makro wird nicht mehr benötigt; es wird entfernt.
#UNDEF Add2

' Jetzt kann das Symbol wieder verwendet werden:
DIM Add2 AS INTEGER

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.17 ersetzt #UNDEF das Schlüsselwort NOKEYWORD.

Siehe auch:
DEFINE (Meta), MACRO (Meta), IF (Meta), IFDEF (Meta), IFNDEF (Meta), DEFINED, Präprozessoren, Präprozessor-Anweisungen

Letzte Bearbeitung: 18.09.11
Zur Onlinefassung des Eintrags

UNION

Typ: Anweisung
Kategorie: Speicherverwaltung
Syntax:

UNION [UnionName] [FIELD = { 1 | 2 | 4 } ]
Element1  [AS Typ]
[Element2 [AS Typ]]
[...]
END UNION

Definiert einen UDT, dessen 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 UDTs sein.

- 'UnionName' ist der Bezeichner der UNION, für den dieselben 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. Dies können auch Constructoren, Destructoren, SUBs, Functions und andere sein, die auch in UDTs erlaubt sind.

- '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 dieselbe 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
' Flag zur Anzeige, was in der Union
' benutzt werden soll
uType AS BYTE
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
' ... ändern sich auch alle anderen Records.
PRINT MyUnion.b
PRINT

MyComposite.s = "Type + Union"
' Anhand dieses Flags könnte das Programm später
' erkennen, dass es den UNION-Wert wie einen
' INTEGER behandeln soll.
MyComposite.uType = IsInteger
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:"
PRINT ".au (UBYTE) "; MyComposite.au
PRINT ".bu (INTEGER)"; MyComposite.bu
PRINT ".cu.LoWord (SHORT) "; MyComposite.cu.LOWORD
PRINT ".cu.HiWord (SHORT) "; MyComposite.cu.HIWORD

SLEEP

Ausgabe:

128

Zusammengesetzter Typ:  1500

Wenn bei der Typenpruefung gemurkst wird:
MyComposite:
.au        (UBYTE)  220
.bu        (INTEGER) 1500
.cu.LoWord (SHORT)   1500
.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 sowieso aufgebracht werden, da auf die eine oder andere Weise erkannt werden muss, wie die Information zu handhaben ist. Praktisch ist auch die Möglichkeit, auf einzelne Bestandteile zuzugreifen, wie es in diesem Beispiel mit dem UDT 'Words' geschieht.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen: In der Dialektform -lang qb steht UNION nicht zur Verfügung und kann nur über __UNION aufgerufen werden.

Siehe auch:
TYPE, FIELD, OPERATOR

Letzte Bearbeitung: 23.02.12
Zur Onlinefassung des Eintrags

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.
Vorsicht:
Offensichtlich funktioniert das UNLOCK-Kommando 'nicht ganz' wie oben beschrieben..

Siehe LOCK für Details zu den Parametern.

Letzte Bearbeitung: 14.04.11
Zur Onlinefassung des Eintrags

UNSIGNED

Syntax: AS UNSIGNED {INTEGER-basierender Datentyp}
Typ: Schlüsselwort
Kategorie: Speicherverwaltung

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

Ausgabe:

4294967295    4294967295

Dieses Schlüsselwort wurde aus Kompatibilitätsgründen beibehalten. Verwenden Sie stattdessen die gleichbedeutenden Typen UBYTE, USHORT, UINTEGER und ULONGINT und ersparen Sie sich damit ein wenig Tipparbeit.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht UNSIGNED nicht zur Verfügung und kann nur über __UNSIGNED aufgerufen werden.

Siehe auch:
DIM, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 15.07.10
Zur Onlinefassung des Eintrags

UNTIL

Syntax A:

DO UNTIL Bedingung
'Anweisungen
LOOP

Syntax B:

DO
'Anweisungen
LOOP UNTIL Bedingung

Typ: Schlüsselwort
Kategorie: Bedingungen

UNTIL wird mit der DO...LOOP Struktur verwendet.

Beispiel:

DIM AS INTEGER a = 1

DO
PRINT "Hallo"
a = a + 1
LOOP UNTIL a > 10

SLEEP

Die Schleife wird so lange ausgeführt, bis a größer ist als 10. Wenn a den Wert 10 überschreitet, dann wird die Schleife verlassen.

Siehe auch:
DO ... LOOP, WHILE, Schleifen

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

USHORT

Typ: Datentyp

Daten vom Typ USHORT sind vorzeichenlose 16-bit-Ganzzahlen. Sie liegen im Bereich von 0 bis (2^16)-1, bzw. von 0 bis 65535.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht USHORT nicht zur Verfügung und kann nur über __USHORT aufgerufen werden.

Siehe auch:
DIM, CAST, CUSHORT, Datentypen, Datentypen und Deklarationen

Letzte Bearbeitung: 14.07.10
Zur Onlinefassung des Eintrags

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

' Ohne den 'Bsp.'-Präfix kann kein Typ 'T'
' gefunden werden.
DIM a AS Bsp.T
' Jetzt ist der komplette Namespace Bsp im globalen
' Space eingebunden. Ausnahme ist der Typ
' 'nichtEingebunden', da ein gleichnamiger
' Bezeichner bereits existiert.
USING Bsp

' Jetzt ist dies eine zulässige Anweisung,
' da Bsp eingebunden wurde.
DIM b AS T

Unterschiede zu QuickBASIC:

- neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen:

- erst seit FreeBASIC v0.16 verfügbar

Siehe auch:
NAMESPACE, PRINT USING

Letzte Bearbeitung: 13.09.10
Zur Onlinefassung des Eintrags

Startbuchstabe V

VA_ARG

Syntax: VA_ARG (Startpointer, Datentyp)
Typ: Funktion
Kategorie: Programmorganisation

VA_ARG gibt den Wert eines Parameters in der Parameterliste einer Prozedur zurück.

- 'Startpointer' ist ein Pointer, der mit VA_FIRST ermittelt bzw. mit VA_NEXT aktualisiert wurde.

- 'Datentyp' ist der Datentyp des Parameters, dessen Wert zurückgegeben werden soll. Siehe Datentypen

Intern wird dieser Befehl so behandelt:

#Define VA_ARG(a,t) Peek( t, a )

Beispiel: siehe VA_FIRST

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VA_ARG nicht zur Verfügung und kann nur über __VA_ARG aufgerufen werden.

Siehe auch:
VA_FIRST, VA_NEXT, DECLARE, SUB, FUNCTION, CDECL, Datentypen, ... (Auslassung[Ellipsis]), Prozeduren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

VA_FIRST

Syntax: VA_FIRST
Typ: Funktion
Kategorie: Programmorganisation

VA_FIRST gibt einen Pointer auf den ersten Parameter einer Prozedur 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 die variable Parameterliste ein.

Bei dieser Form der Übergabe geht aber die Information verloren, um welche Datentypen 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 aktualisiert den von VA_FIRST zurückgegebenen Pointer, sodass er auf das nächste Argument der beliebigen Parameterliste zeigt.

Beispiel (aus dem examples-Ordner des FreeBASIC-Verzeichnisses):

'Beispiel für variable Parameter
DECLARE SUB myPrintf CDECL (BYREF FormatierString AS STRING, ...)

DIM s AS STRING="bar"

myPrintf( "Integer=%i, LongInt=%l, Single=%f, Double=%d, String=%s, String=%s", _
1, 1LL SHL 32, 2.2, 3.3, "foo", s )
SLEEP
';-))
SUB myPrintf CDECL (BYREF FormatierString AS STRING, ...)
DIM AS INTEGER i, c
DIM AS STRING s
DIM AS ANY PTR Arg = VA_FIRST() 'Pointer zum ersten variablen Argument holen
DIM AS ZSTRING PTR p

p = STRPTR( FormatierString )
i = LEN( FormatierString )
DO WHILE i>0 'Für jedes Zeichen in FormatierString..
c = *p
p += 1
i -= 1
'Ist es ein Formatierzeichen?
IF CHR( c ) = "%" THEN 'Typ holen
c = *p
p += 1
i -= 1
'variables Argument ausgeben, abhängig vom Typ
SELECT CASE CHR( c )
CASE "i" ' Integer?
s =s & VA_ARG( Arg, INTEGER )
Arg = VA_NEXT( Arg, INTEGER )
'Anders als in C muss va_next() benutzt werden, da
'va_arg() die Pointer nicht aktualisiert
CASE "l" ' LongInteger? (64-bit)
s =s & VA_ARG( Arg, LONGINT )
Arg = VA_NEXT( Arg, LONGINT )
'Single oder Double? (Beachte: wegen der C-ABI werden alle Singles, die
'übergeben wurden, in Doubles konvertiert)
CASE "f", "d"
s =s & VA_ARG( Arg, DOUBLE )
Arg = VA_NEXT( Arg, DOUBLE )
CASE "s" ' String?
'Strings werden byVal übergeben, also ist ihre Länge unbekannt
s =s & *VA_ARG( Arg, ZSTRING PTR )
Arg = VA_NEXT( Arg, ZSTRING PTR )
END SELECT
ELSE 'normales Zeichen, einfach ausgeben..
s=s & CHR( c )
END IF
LOOP
PRINT s;
END SUB

Beispiel 2 (verkürzte Variante):

SUB myPrint CDECL (FormatierString AS STRING, ...)
DIM AS ANY PTR argument = VA_FIRST()
DIM AS INTEGER i
DIM AS ZSTRING PTR p

FOR i = 1 TO LEN(FormatierString)

SELECT CASE MID(FormatierString, i, 1)
CASE "i"
PRINT "Integer: " & VA_ARG(argument, INTEGER)
argument = VA_NEXT(argument, INTEGER)
CASE "l"
PRINT "LongInt: " & VA_ARG(argument, LONGINT)
argument = VA_NEXT(argument, LONGINT)
CASE "f", "d"
PRINT "Double: " & VA_ARG(argument, DOUBLE)
argument = VA_NEXT(argument, DOUBLE)
CASE "s"
PRINT "String: " & *VA_ARG(argument, ZSTRING PTR)
argument = VA_NEXT(argument, ZSTRING PTR)
END SELECT
NEXT
END SUB

'###############################################################

DIM s AS STRING = "String2"

myPrint( "ilfdss", 1, 4294967296, 1.2, 3.4, "String1", s )
SLEEP

Hinweis:
Eine SUB/FUNCTION muss zwingend mit CDECL deklariert werden, da der Compiler sonst einen Fehler meldet.

Unterschiede zu QB: neu in FreeBASIC

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VA_FIRST nicht zur Verfügung und kann nur über __VA_FIRST aufgerufen werden.

Siehe auch:
VA_ARG, VA_NEXT, DECLARE, SUB, FUNCTION, CDECL, Datentypen, ... (Auslassung[Ellipsis]), Prozeduren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

VA_NEXT

Syntax: VA_NEXT (Startpointer, Datentyp)
Typ: Funktion
Kategorie: Programmorganisation

VA_NEXT dereferenziert den Pointer auf ein Argument einer variablen Parameterliste, sodass er auf das nächste Argument zeigt.

- 'Startpointer' ist ein Pointer, der mit VA_FIRST ermittelt bzw. mit VA_NEXT aktualisiert wurde.

- 'Datentyp' ist der Datentyp des Parameters, auf den 'Startpointer' bisher gezeigt hat. Siehe Datentypen

Intern wird dieser Befehl so behandelt:

#Define VA_NEXT(a,t) (a + Len( t ))

Beispiel: siehe VA_FIRST

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Die Version __VA_NEXT in der Dialektform -lang qb existiert erst seit FreeBASIC v0.24.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VA_NEXT nicht zur Verfügung und kann nur über __VA_NEXT aufgerufen werden.

Siehe auch:
VA_FIRST, VA_ARG, DECLARE, SUB, FUNCTION, CDECL, Datentypen, ... (Auslassung[Ellipsis]), Prozeduren

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

VAL

Syntax: VAL(Stringvariable)
Typ: Funktion
Kategorie: Speicherverwaltung

VAL konvertiert einen STRING zu einer Zahl.

- 'Stringvariable' ist ein STRING, ZSTRING oder WSTRING, welcher den umzuwandelnden Zahlenwert enthält.

- Der Rückgabewert ist ein DOUBLE.

Die Zahl muss am Anfang des STRINGs stehen. Führende Leerzeichen werden jedoch entfernt. Sobald VAL auf ein Zeichen stößt, das nicht zu einer Zahl gehören kann, wird an dieser Stelle abgebrochen und nur der davor stehende Wert umgewandelt. Die wissenschaftliche Notation (z. B. "1.0e+23") wird unterstützt. Wenn der String ungültig ist (keine Zahl enthält oder nicht mit einer Zahl beginnt), wird als Ergebnis 0 ausgegeben.

Wenn Sie einen STRING in eine Ganzzahl umwandeln wollen, nutzen Sie besser VALINT o. ä.; siehe dazu die Zusammenstellung Datentypen umwandeln

VAL verwandelt auch Zahlen anderer Zahlensysteme ins Dezimalsystem zurück. Die STRINGs müssen dazu mit dem entsprechenden Präfix ("Vorsatz") versehen sein:

- &h - Hexadezimal

- &o - Oktal; seit FreeBASIC v0.21.0 funktioniert auch nur &

- &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("&10")      ' Ausgabe 8
PRINT VAL("&b10")     ' Ausgabe 2
PRINT VAL("123a45")   ' Ausgabe 123
PRINT VAL("  10")     ' Ausgabe 10
PRINT VAL(".234")     ' Ausgabe 0.234
PRINT VAL("a321")     ' Ausgabe 0
PRINT VAL("+123")     ' Ausgabe 123
PRINT VAL("2.1E+30")  ' Ausgabe 2.1e+30
SLEEP

"Umkehrfunktionen" zu VAL, die den Wert einer Variablen numerischen Datentyps in eine bestimmte Notation umschreiben und einen STRING zurück liefern, sind u. a.:

- HEX: Wandelt eine als Argument übergebene Zahl (z. B. vom Typ INTEGER) in ihre Hexadezimaldarstellung um.

- BIN: Liefert die Darstellung einer übergebenen Zahl im Dualsystem zurück.

- FORMAT: Formatiert eine übergebene Zahl in Bezug auf Nachkommastellen, führende Nullen usw.

- STR: Wandelt den Wert einer Variablen numerischen Typs in eine Zeichenkette um.

- und weitere; siehe unten

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.21.0 akzeptiert VAL ein führendes "&" für Oktalwerte (z. B. "&123")

Siehe auch:
VALINT, VALUINT, VAL64, VALLNG, VALULNG, BIN, HEX, OCT, STR, WBIN, WHEX, WOCT, WSTR, Datentypen umwandeln

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

VAL64

Syntax: VAL64(Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

VAL64 wandelt einen STRING, ZSTRING oder WSTRING in einen LONGINT um.

Der Befehl existierte nur bis FreeBASIC v0.14. In FreeBASIC v0.15 wurde diese Funktion durch VALLNG ersetzt.

Siehe auch:
VAL, VALINT, VALUINT, VALLNG, VALULNG, Datentypen umwandeln

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

VALINT

Syntax: VALINT(Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

VALINT wandelt einen STRING, ZSTRING oder WSTRING in einen INTEGER um. Die wissenschaftliche Notation wird nicht unterstützt. Ansonsten arbeitet der Befehl wie VAL, nur dass VAL in eine DOUBLE-Gleitkommazahl umwandelt.

Beispiel:

PRINT VALINT(".12345")      ' Ausgabe 0
PRINT VALINT("&h1ABC")      ' Ausgabe 6844
PRINT VALINT("   -42")      ' Ausgabe -42
PRINT VALINT("12.987")      ' Ausgabe 12
PRINT VALINT("133e7")       ' Ausgabe 133

PRINT 'Leerzeile

PRINT "&hFFFFFFFF als INTEGER:  " & VALINT("&hFFFFFFFF")  ' Ausgabe -1
' Vergleiche dazu:
PRINT "&hFFFFFFFF als UINTEGER: " & VALUINT("&hFFFFFFFF") ' Ausgabe 4294967295

SLEEP

Hinweis: VALUINT funktioniert analog zu VALINT, liefert jedoch einen vorzeichenlosen UINTEGER zurück.

Achtung:
VALINT schneidet Nachkommastellen ab, es wird nicht gerundet!

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.21.0 akzeptiert VALINT ein führendes "&" für Oktalwerte (z. B. "&123")

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VALINT nicht zur Verfügung und kann nur über __VALINT aufgerufen werden.

Siehe auch:
VAL, VALLNG, VALUINT, VALULNG, Datentypen umwandeln

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

VALLNG

Syntax: VALLNG(Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

VALLNG wandelt einen STRING, ZSTRING oder WSTRING in einen LONGINT um. Die wissenschaftliche Notation wird nicht unterstützt. Ansonsten arbeitet der Befehl wie VAL, nur dass VAL in eine DOUBLE-Gleitkommazahl umwandelt.

Beispiel:

PRINT VALLNG(".12345")      ' Ausgabe 0
PRINT VALLNG("&H1ABC")      ' Ausgabe 6844
PRINT VALLNG("   -42")      ' Ausgabe -42
PRINT VALLNG("12.987")      ' Ausgabe 12
PRINT VALLNG("133e7")       ' Ausgabe 133

PRINT 'Leerzeile

PRINT "&hFFFFFFFFFFFFFFFF als LONGINT:  ";
PRINT VALLNG("&hFFFFFFFFFFFFFFFFF")  ' Ausgabe -1
' Vergleiche dazu:
PRINT "&hFFFFFFFFFFFFFFFF als ULONGINT: ";
PRINT VALULNG("&hFFFFFFFFFFFFFFFF") ' Ausgabe 18446744073709551615

SLEEP

Hinweis: VALULNG funktioniert analog zu VALLNG, liefert jedoch einen vorzeichenlosen ULONGINT zurück.

Achtung:
VALLNG schneidet Nachkommastellen ab, es wird nicht gerundet!

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- VALLNG existiert seit FreeBASIC v0.15

- Seit FreeBASIC v0.21.0 akzeptiert VALLNG ein führendes "&" für Oktalwerte (z. B. "&123")

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VALLNG nicht zur Verfügung und kann nur über __VALLNG aufgerufen werden.

Siehe auch:
VAL, VALINT, VALUINT, VALULNG, Datentypen umwandeln

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

VALUINT

Syntax: VALUINT(Variable AS STRING)
Typ: Funktion
Kategorie: Speicherverwaltung

VALUINT wandelt einen STRING, ZSTRING oder WSTRING in einen UINTEGER um. Die wissenschaftliche Notation wird nicht unterstützt. Ansonsten arbeitet der Befehl wie VAL, nur dass VAL in eine DOUBLE-Gleitkommazahl umwandelt.

Beispiel:

PRINT VALUINT(".12345")      ' Ausgabe 0
PRINT VALUINT("&h1ABC")      ' Ausgabe 6844
PRINT VALUINT("   -42")      ' Ausgabe 4294967254
PRINT VALUINT("12.987")      ' Ausgabe 12
PRINT VALUINT("133e7")       ' Ausgabe 133
PRINT VALUINT("    -1")      ' Ausgabe 4294967295
PRINT VALUINT("&hFFFFFFFF")  ' Ausgabe 4294967295
SLEEP

Hinweis: VALINT funktioniert wie VALUINT, liefert jedoch einen vorzeichenbehafteten INTEGER zurück.

Achtung:
VALUINT schneidet Nachkommastellen ab, es wird nicht gerundet!

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- VALUINT existiert seit FreeBASIC v0.15

- Seit FreeBASIC v0.21.0 akzeptiert VALUINT ein führendes "&" für Oktalwerte (z. B. "&123")

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VALUINT nicht zur Verfügung und kann nur über __VALUINT aufgerufen werden.

Siehe auch:
VAL, VALINT, VALLNG, VALULNG, Datentypen umwandeln

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

VALULNG

Syntax: VALULNG(Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

VALULNG wandelt einen STRING, ZSTRING oder WSTRING in einen ULONGINT um. Die wissenschaftliche Notation wird nicht unterstützt. Ansonsten arbeitet der Befehl wie VAL, nur dass VAL in eine DOUBLE-Gleitkommazahl umwandelt.

Beispiel:

PRINT VALULNG(".12345")              ' Ausgabe 0
PRINT VALULNG("&h1ABC")              ' Ausgabe 6844
PRINT VALULNG("   -42")              ' Ausgabe 18446744073709551574
PRINT VALULNG("12.987")              ' Ausgabe 12
PRINT VALULNG("133e7")               ' Ausgabe 133
PRINT VALULNG("    -1")              ' Ausgabe 18446744073709551615
PRINT VALULNG("&hFFFFFFFFFFFFFFFF")  ' Ausgabe 18446744073709551615
SLEEP

Hinweis: VALLNG funktioniert wie VALULNG, liefert jedoch einen vorzeichenbehafteten LONGINT zurück.

Achtung:
VALULNG schneidet Nachkommastellen ab, es wird nicht gerundet!

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

- VALULNG existiert seit FreeBASIC v0.15

- Seit FreeBASIC v0.21.0 akzeptiert VALULNG ein führendes "&" für Oktalwerte (z. B. "&123")

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VALULNG nicht zur Verfügung und kann nur über __VALULNG aufgerufen werden.

Siehe auch:
VAL, VALINT, VALUINT, VALLNG, Datentypen umwandeln

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

VAR

Syntax: VAR [SHARED] SymbolName = Ausdruck[, SymbolName = Ausdruck [, ...]]
Typ: Anweisung
Kategorie: Speicherverwaltung

VAR deklariert eine Variable, deren Typ aus dem initialisierenden Ausdruck abgeleitet wird.

Bei einer Deklaration mit VAR ist es nicht erlaubt, explizit einen Variablentyp anzugeben. Stattdessen wird der Typ aus dem initialisierenden Ausdruck ermittelt. Dieser Ausdruck kann eine Konstante oder eine Variable eines beliebigen Typs sein. Einzige Ausnahme bildet der WSTRING, der von VAR nicht unterstützt wird, da es keinen WSTRING-Typ mit variabler Länge gibt. Das wird sich höchstwahrscheinlich auch nicht ändern, wegen der Komplexität, die durch die Behandlung von Unicode hervorgerufen wurde.

Da der Variablentyp daraus abgeleitet wird, was der Variablen zugewiesen wird, ist es hilfreich, zu wissen, wie die Zeichenfolgen bewertet werden. Alle Ziffernfolgen ohne Dezimal-Punkt sind standardmäßig INTEGER. Alle Ziffernfolgen mit Dezimal-Punkt sind standardmäßig DOUBLE.

Alle alphanumerischen Strings sind standardmäßig STRING. Wird eine Variable mit WSTRING und einer Zeichenfolge initialisiert, wird sie "umgewandelt" zu einem String mit variabler Länge.

Bestimmte Suffixe können bei Variablenbezeichnern benutzt werden, um ihren Typ zu festzulegen. Siehe Datentypen zu weiteren Informationen über Suffixe, die nach einer Zeichenfolge erlaubt sind.

Beachte: Suffixe müssen hinter dem Initialisierer erscheinen, nicht hinter der Variablen. Der Versuch, VAR mit einer Variablen zu benutzen, die einen Suffix hat, ruft einen Compiler-Fehler hervor.

Beispiele:

VAR a  = CAST(BYTE, 0)
VAR b  = CAST(SHORT, 0)
VAR c  = CAST(INTEGER, 0)
VAR d  = CAST(LONGINT, 0)
VAR d2 = 0ll  ' LONGINT, festgelegt über das Suffix
VAR au = CAST(UBYTE, 0)
VAR bu = CAST(USHORT, 0)
VAR cu = CAST(UINTEGER, 0)
VAR du = CAST(ULONGINT, 0)
VAR e  = CAST(SINGLE, 0.0)
VAR f  = CAST(DOUBLE, 0.0)
VAR g  = @c      ' Integer Pointer
VAR h  = @a      ' Byte Pointer
VAR s2 = "hello" ' String mit Variabler Länge

VAR ii = 6728   ' impliziter Integer
VAR id = 6728.0 ' impliziter Double

PRINT "Byte: ";LEN(a)
PRINT "Short: ";LEN(b)
PRINT "Integer: ";LEN(c)
PRINT "Longint: ";LEN(d)
PRINT "noch ein Longint: ";LEN(d2)
PRINT "UByte: ";LEN(au)
PRINT "UShort: ";LEN(bu)
PRINT "UInteger: ";LEN(cu)
PRINT "ULongint: ";LEN(du)
PRINT "Single: ";LEN(e)
PRINT "Double: ";LEN(f)
PRINT "Integer Pointer: ";LEN(g)
PRINT "Byte Pointer: ";LEN(h)
PRINT "Variabler String: ";LEN(s2)
PRINT
PRINT "Integer: ";LEN(ii)
PRINT "Double: ";LEN(id)

SLEEP

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.17

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht VAR nicht zur Verfügung und kann nur über __VAR aufgerufen werden.

Siehe auch:
DIM, REDIM, COMMON, STATIC (Anweisung), SHARED, CONST

Letzte Bearbeitung: 16.01.12
Zur Onlinefassung des Eintrags

VARPTR

Syntax: VARPTR(Variable)
Typ: Funktion
Kategorie: Speicherverwaltung

VARPTR gibt die Adresse einer Variable im Speicher zurück. Damit wurden in älteren BASIC-Dialekten Pointer-Funktionen erstellt. In FreeBASIC wird dazu üblicherweise das Zeichen @ verwendet; dort finden Sie weitere Informationen zum Gebrauch.

Beispiel:

DIM AS INTEGER a
DIM AS INTEGER PTR addr
a = 10
addr = VARPTR(a)  ' identisch mit addr = @a
POKE INTEGER, addr, -1000
PRINT a, HEX(a)
POKE BYTE, addr, 1
PRINT a, HEX(a)
SLEEP

Ausgabe:

-1000         FFFFFC18
-1023         FFFFFC01

Wie Sie sehen, wird das letzte Byte (&h18) durch den Wert 1 (&h01) ersetzt. Ob das erste oder letzte signifikante Byte ersetzt wird, hängt von der Byte-Reihenfolge der CPU ab.

Siehe auch:
@, OFFSETOF, SADD, PEEK, POKE, Grundlagen zu Pointern, Zusammenstellung von Pointer-Anweisungen

Letzte Bearbeitung: 24.08.10
Zur Onlinefassung des Eintrags

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 ausgelassen wird, sind alle Koordinaten zukünftiger Grafikanweisungen relativ zur linken oberen Ecke des Darstellungsfeldes anstelle zur linken oberen Ecke des Grafikfensters.

- 'x1', 'y1', 'x2' und 'y2' sind die Koordinaten zweier gegenüberliegenden Eckpunkte des neuen Darstellungsfeldes. Sie sind relativ zur linken oberen Ecke des Grafikfensters.

- 'Farbe' ist eine Farbnummer, mit welcher 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.

VIEW wird benutzt, um neue Clipping-Regionen zu definieren, auch als Darstellungsfeld bezeichnet. Ein neu definiertes Darstellungsfeld ersetzt ein eventuell bereits bestehendes. VIEW hat nur im Grafikscreen eine Auswirkung.

Alle Drawing Primitives sind von der Größe des Darstellungsfeldes abhängig; Grafikanweisungen, die auf Koordinaten außerhalb dieser Grenzen verweisen, haben keine Auswirkungen.

Farben müssen auch bei VIEW im selben Format angegeben werden wie bei COLOR (Anweisung) und ist abhängig von der Farbtiefe, die mit SCREENRES eingestellt wurde. Wenn alle Argumente ausgelassen werden, setzt VIEW alle Grenzen auf den Standard zurück.

Beispiel:

SCREENRES 640, 480
DIM bild AS ANY PTR
DIM AS INTEGER i, j, k

' einfaches Sprite erstellen
bild = IMAGECREATE(64,64)
FOR i = 0 TO 63 : FOR j = 0 TO 63
PSET bild, (i,j), (i\4) XOR (j\4)
NEXT j, i

' blaues Kreuz zur Demonstration:
' Der Bereich außerhalb der Clipping-Grenzen ist später nicht mehr betroffen
LINE (0, 0)-(639, 479), 1
LINE (639, 0)-(0, 479), 1
' Clipping-Grenzen setzen, mit blauem Rand
VIEW (220,140)-(420,340),, 1

' Sprite bewegen
k = 0
DO
i = 100* SIN(k*.02)+50
j = 100* SIN(k*.027)+50
SCREENSYNC
SCREENLOCK
CLS 1  ' löscht nur das Darstellungsfeld
PUT (i, j), bild, PSET
SCREENUNLOCK
k += 1
LOOP UNTIL LEN(INKEY)
IMAGEDESTROY bild

Unterschiede zu früheren Versionen von FreeBASIC:
In Versionen vor v0.16 hatte der Parameter 'Rand' keine Auswirkungen.

Unterschiede zu QB:

- QB behält die Koordinatentransformationen mittels WINDOW auch bei einer Größenänderung des Clipping-Bereichs in gleicher Form bei

- FreeBASIC behält derzeit die Eckkoordinaten bei, wodurch sich die Koordinatentransformation ändert. Dieses Verhalten wird möglicherweise in einer zukünftigen Compilerversion geändert. Derzeit muss jedoch erneut WINDOW mit entsprechenden Parametern aufgerufen werden, um z.B. nach einem VIEW die vorherige Koordinatentransformation in gleicher Form beizubehalten. Andernfalls wird der Koordinatenbereich eventuell verschoben oder skaliert.

Siehe auch:
VIEW (Text), SCREENRES, WINDOW, PMAP, Grafik

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

VIEW (Text)

Syntax A: VIEW PRINT [Startzeile TO Endzeile]
Syntax B: VIEW PRINT()
Typ: Anweisung (A) bzw. Funktion (B)
Kategorie: Konsole

VIEW PRINT setzt die Grenzen des Textanzeigebereichs oder gibt diese zurück.

- 'Startzeile' und 'Endzeile' sind Zeilenangaben, wie sie auch bei LOCATE (Anweisung) verwendet werden. Der Textcursor wird auf den Beginn der Startzeile gesetzt.

- Werden die Parameter in Syntax A ausgelassen, dann wird das gesamte Fenster als Darstellungsbereich verwendet.

- Wird VIEW PRINT als Funktion eingesetzt (Syntax B), dann ist der Rückgabewert ein INTEGER, der die oberste und unterste Zeile des Textanzeigebereichs enthält. Die obere Zeile ist das untere Word (LOWORD), die untere Zeile ist das obere Word (HIWORD).

Der Textanzeigebereich hat Auswirkungen auf Textanweisungen; diese sind nur innerhalb der angegebenen Grenzen wirksam. Seit FreeBASIC v0.15 funktioniert VIEW PRINT auch in Grafikmodi.

Beispiel 1:

SCREENRES 640, 400
DIM AS INTEGER i
WIDTH 80, 25
FOR i = 1 TO 24
PRINT i
SLEEP 200
NEXT

' Textanzeigebereich einschränken
VIEW PRINT 10 TO 15
SLEEP 200
COLOR 15, 1
CLS
FOR i = 1 TO 10
PRINT i
SLEEP 200
NEXT

' Grenzen des Anzeigebereichs ausgeben
DIM AS INTEGER bereich = VIEW PRINT()
PRINT "Angezeigt wurden die Zeilen " & LOWORD(bereich) & " - " & HIWORD(bereich)
SLEEP

Beispiel 2:
Wird versucht, den Cursor mit LOCATE auf eine Zeile außerhalb des Anzeigebereichs zu setzen, dann hat LOCATE keine Auswirkung.

VIEW PRINT 10 TO 15
LOCATE 1, 5
PRINT "Zeile 1, Spalte 5"
LOCATE 13, 5
PRINT "Zeile 13, Spalte 5"
SLEEP

Unterschiede zu QB:
In FreeBASIC kann VIEW PRINT() als Funktion eingesetzt werden.

Unterschiede zu früheren Versionen von FreeBASIC:

- Seit FreeBASIC v0.15 kann VIEW PRINT() als Funktion eingesetzt werden.

- Seit FreeBASIC v0.15 kann VIEW PRINT auch in einem Grafikfenster eingesetzt werden.

Siehe auch:
VIEW (Grafik), CLS, Grafik

Letzte Bearbeitung: 04.08.11
Zur Onlinefassung des Eintrags

Startbuchstabe W

WAIT

Syntax: WAIT Port, AND_Ausdruck[, XOR_Ausdruck]
Typ: Anweisung
Kategorie: Hardware

WAIT 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 ü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.

Bis zu FreeBASIC v0.14 emuliert WAIT das Warten auf die vertikale Bildschirmsynchronisation (VSync). Es funktioniert in diesen Versionen nur mit dem Port &H3DA (Warten auf vertical sync) und sollte nur so eingesetzt werden: WAIT &h3DA, 8
Jede andere Kombination von Port, AND_Ausdruck und XOR_Ausdruck hat in diesen Compilerversionen keine Auswirkung. Ab FreeBASIC v0.14 sollte die vertikale Bildschirmsynchronisation mit der Anweisung SCREENSYNC durchgeführt werden!

Siehe auch:
INP, OUT, SCREENSYNC

Letzte Bearbeitung: 18.08.11
Zur Onlinefassung des Eintrags

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; sie bestehen aus den Zeichen 0 und 1.

- '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; der zurückgegebene Wert ist jedoch nie länger, als maximal für den Datentyp von 'Ausdruck' benötigt wird.
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 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 BIN(54321)  ' Ausgabe: 1101010000110001
PRINT BIN(3, 3)   ' Ausgabe: 011
PRINT BIN(255, 4) ' Ausgabe: 1111

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

DIM binaer AS WSTRING * 7

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

PRINT VAL(binaer)
SLEEP

gibt 9 aus.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WBIN nicht zur Verfügung und kann nur über __WBIN aufgerufen werden.

Siehe auch:
WHEX, WOCT, BIN, VAL, WSTRING (Datentyp), BIT, BITSET, BITRESET

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

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.

WCHR wird z.B verwendet, um Zeichen darzustellen, die nicht auf der Tastatur sind. Es ist das Pendant zu CHR, gibt aber einen WSTRING zurück.

Beispiel:

PRINT "127 ist Unicode-Zeichen: "; WCHR(127)
PRINT "Codes 65, 66 und 67:     "; WCHR(65, 66, 67)

Ausgabe:

127 ist Unicode-Zeichen: Y
Codes 65, 66 und 67:     ABC

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WCHR nicht zur Verfügung und kann nur über __WCHR aufgerufen werden.

Siehe auch:
CHR, ASC, WSTRING (Funktion)

Weitere Informationen:
ASCII-Tabelle anzeigen lassen

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

WEEKDAY

Syntax: WEEKDAY(Serial[, System])
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

WEEKDAY extrahiert den Wochentag einer Serial Number.

- 'Serial' ist ein DOUBLE-Wert, der als Serial Number 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: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren FreeBASIC-Versionen: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, WEEKDAYNAME, DATEDIFF, DATEPART, DATEADD, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

WEEKDAYNAME

Syntax: WEEKDAYNAME(Wochentag [, [Kurzform] [, System]] )
Typ: Funktion
Kategorie: Zeit

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

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.

Beispiele:
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: existiert nur in QBX PDS und in VBDOS.

Unterschiede unter den FB-Dialektformen: existiert erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, YEAR, MONTH, DAY, WEEKDAY, MONTHNAME, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

WEND

Siehe WHILE ... WEND

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

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; der zurückgegebene Wert ist jedoch nie länger, als maximal für den Datentyp von 'Ausdruck' benötigt wird.
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 Hexadezimalformat enthält.

Das Dollarzeichen ($) als Suffix ist optional.

WHEX ist das Pendant zu HEX, gibt aber einen WSTRING zurück.

Beispiel:

PRINT HEX(54321)    ' Ausgabe: D431
PRINT HEX(255, 4)   ' Ausgabe: 00FF
PRINT HEX(70000, 3) ' Ausgabe: 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

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WHEX nicht zur Verfügung und kann nur über __WHEX aufgerufen werden.

Siehe auch:
WBIN, WOCT, HEX, VAL, WSTRING (Datentyp)

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

WHILE

Syntax A:

DO WHILE Bedingung
'Anweisungen
LOOP

Syntax B:

DO
'Anweisungen
LOOP WHILE Bedingung

Typ: Schlüsselwort
Kategorie: Bedingungen

WHILE wird mit der DO ... LOOP Struktur verwendet.

Beispiel:

DIM AS INTEGER a = 1

DO WHILE a < 10
PRINT "Hallo"
a = a + 1
LOOP

SLEEP

Die Schleife wird so lange ausgeführt, wie a kleiner ist als 10. Wenn a den Wert 10 erreicht oder überschreitet, dann wird die Schleife verlassen. Der Code bewirkt genau dasselbe, wenn stattdessen WHILE ... WEND eingesetzt wird:

DIM AS INTEGER a = 1

WHILE a < 10
PRINT "Hallo"
a = a + 1
WEND

SLEEP

Siehe auch:
DO ... LOOP, WHILE ... WEND, UNTIL, Schleifen

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

WHILE ... WEND

Syntax:

WHILE Bedingung
' [...Programmcode...]
WEND

Typ: Anweisung
Kategorie: Schleifen

Die WHILE-Schleife wiederholt einen Anweisungsblock, solange eine Bedingung erfüllt ist. 'Bedingung' ist ein numerischer 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. Die Schleife arbeitet damit exakt genauso wie

DO WHILE Bedingung
' [...Programmcode...]
LOOP

In oben stehendem Code dient WHILE als Schlüsselwort für die DO-Schleifen verwendet, um den Typ der Bedingung festzulegen. Bringen Sie die zusammengehörigen Schlüsselworter DO...LOOP bzw. WHILE...WEND nicht durcheinander!

Wie in allen Schleifen können auch die Konrtrollanweisungen CONTINUE und EXIT verwendet werden.
CONTINUE WHILE bewirkt, dass der Rest des Schleifen-Codes nicht weiter 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.
Mit EXIT WHILE kann die Schleife 'außerplanmäßig' verlassen werden; FreeBASIC fährt dann mit der Codeausführung nach der WEND-Zeile fort.

WHILE...WEND-Blöcke können beliebig oft ineinander und mit anderen Schleifen 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.
Achtung: Eine innerhalb der WHILE-Schleife deklarierte Variable kann auch nicht in 'Bedingung' zur Überprüfung des Schleifenendes verwendet werden werden, da sie an dieser Stelle bereits nicht mehr existiert!

Beispiel:
In diesem Beispiel wird eine WHILE-Schleife eingesetzt, um einen String umzukehren. Benutzt wird dazu die 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 satz, ztas
DIM AS INTEGER index

satz = "The quick brown fox jumps over the lazy dog."
index = LEN(satz) - 1

WHILE index >= 0
ztas &= CHR(satz[index])
index -= 1
WEND

PRINT "original:  """ ; satz ; """"
PRINT "umgedreht: """ ; ztas ; """"
SLEEP

Unterschiede zu QB:
In QB dürfen innerhalb einer Schleife keine Variablen definiert werden.

Unterschiede zu früheren Versionen von FreeBASIC:
Seit FreeBASIC v0.16b wirkt eine WHILE-Schleife wie ein SCOPE-Block

Unterschiede unter den FB-Dialektformen:
In den Dialektformen -lang qb und -lang fblite erzeugt WHILE...WEND keinen eigenen Scope-Block, sondern arbeitet wie in QB.

Siehe auch:
DO ... LOOP, FOR ... NEXT, EXIT, CONTINUE, SCOPE, Schleifen, Bedingungsstrukturen

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

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 25 Zeilen.

- Die Standard-Ausgabebreite des Druckers ist 80.

Anmerkung: Die Syntax-Varianten B und C konnten noch nicht erfolgreich getestet werden.

Beispiel:

WIDTH 40, 25
PRINT "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
PRINT "ein kleines Fenster"
SLEEP
WIDTH 80, 60
PRINT "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 aus 90 Zeichen erzeugen, die alle ASCII-Zeichen
' vom '!' bis zum 'z' enthält.
Zeile += CHR(i)
NEXT
PRINT Zeile
PRINT "Im Fenstermodus kann diese ganz Zeile angezeigt werden."
PRINT "Wechseln Sie nun bitte per [ALT]+[ENTER] in den Vollbildmodus."
PRINT "Druecken Sie dann bitte eine beliebige Taste, um fortzusetzen."
SLEEP
PRINT "Im Vollbildmodus können nur 80x25 Zeichen angezeigt werden."
PRINT "Daher werden von der ersten Zeile nur noch die ersten 80 Zeichen"
PRINT "werden angezeigt."
PRINT "Wechseln Sie nun bitte wieder per [ALT]+[ENTER] in den Fenstermodus."
PRINT "Druecken Sie dann bitte eine beliebige Taste, um fortzusetzen."
SLEEP
PRINT "Die ganze Zeile wird wieder angezeigt."
PRINT "Druecken Sie dann bitte eine beliebige Taste, um fortzusetzen."
SLEEP
CLS
WIDTH 40, 26
PRINT "Das Fenster ist jetzt 40x26 Zeichen gross."
PRINT "Wechseln Sie nun bitte per [ALT]+[ENTER] in den Vollbildmodus"
PRINT "druecken Sie dann eine beliebige Taste, um fortzusetzen."
SLEEP

LOCATE 40, 41
PRINT "Wie Sie sehen, bietet der Vollbild-Modus immer noch genug Platz,"
PRINT "um 80x25 Zeichen darzustellen."
PRINT "Allerdings wird jede Zeile schon nach 40 Zeichen umgebrochen."
PRINT "Wechseln Sie nun bitte per [ALT]+[ENTER] in den Fenstermodus"
PRINT "Druecken Sie dann eine beliebige Taste, um zu beenden."
SLEEP

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

Unterschiede zu früheren FreeBASIC-Versionen
- Funktioniert erst seit FreeBASIC v0.15 bei Dateien, Druckern oder Geräten.

Letzte Bearbeitung: 16.01.10
Zur Onlinefassung des Eintrags

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

Beispiel:

DIM AS INTEGER Zeilen, Spalten
Zeilen = HIWORD(WIDTH)
Spalten = LOWORD(WIDTH)

PRINT "Zeilen & Spalten:"
PRINT "Zeilen: "; Zeilen
PRINT "Spalten: "; Spalten

SLEEP
PRINT

WIDTH 80, 60
Zeilen = HIWORD(WIDTH)
Spalten = LOWORD(WIDTH)

PRINT "Zeilen & Spalten:"
PRINT "Zeilen: "; Zeilen
PRINT "Spalten: "; Spalten

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)

Letzte Bearbeitung: 21.10.07
Zur Onlinefassung des Eintrags

WINDOW

Syntax: WINDOW [[SCREEN] (x1, y1)-(x2, y2)]
Typ: Anweisung
Kategorie: Gfx

WINDOW bestimmt den neuen physischen Darstellungsbereich, also den Bereich, in dem Koordinaten gültig sind.

- 'SCREEN' ist ein optionaler Parameter, der bewirkt, dass die y-Koordinaten von oben nach unten gezählt werden.

- 'x1', 'y1', 'x2' und 'y2' sind die neuen Koordinaten der Eckpunkte des physischen Darstellungsbereichs. Alle Koordinaten können Gleitkommazahlen sein.

WINDOW wird benutzt, um ein neues Koordinatensystem zu definieren. '(x1, y1)' und '(x2, y2) sind 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 den Standard wieder her, der bei der Initialisierung des Grafikfensters (siehe SCREEN (Anweisung)) gegolten hat.

FreeBASIC handhabt die angegeben Koordinaten als Eckkoordinaten des aktuellen Grafikbereichs. Wenn dieser z.B. durch Clipping mittels VIEW (Grafik) eingeschränkt wurde beziehen sich die angegebenen Eckkoordinaten auf den Clipping-Bereich. Die Koordinatentransformation kann sich also ändern, wenn z.B. der Clipping-Bereich mittels VIEW verändert wird.
Die angegebene Koordinatentransformation gilt ebenso für Zeichenoperationen auf Offscreen-Puffer.

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.

Beispiel:

SCREEN 13
VIEW ( 10, 10 ) - ( 310, 150 ), 1, 15   ' Clipping definieren
WINDOW ( -1, -1 ) - ( 1, 1 )            ' Fensterkoordinaten setzen

' x-Achse zeichnen
LINE (-1,0)-(1,0),7
DRAW STRING ( 0.8, -0.1 ), "X"
' y-Achse zeichnen
LINE (0,-1)-(0,1),7
DRAW STRING ( 0.1, 0.8 ), "Y"

DIM AS SINGLE x, y, s

' Schrittweite berechnen
s = 2 / PMAP( 1, 0 )

' Funktion plotten
FOR x = -1 TO 1 STEP s
y = x ^ 3
PSET( x, y ), 14
NEXT x

WINDOW                                  ' Standard-Koordinatensystem
VIEW SCREEN                             ' Clipping deaktivieren
DRAW STRING ( 120, 160 ), "Y = X ^ 3"   ' Titel schreiben
SLEEP

Unterschiede zu QB:

- QB behält die Koordinatentransformation auch bei einer Größenänderung der Zeichenfläche (z.B. mittels VIEW) in gleicher Form bei

- FreeBASIC behält derzeit die Eckkoordinaten bei, wodurch sich die Koordinatentransformation ändert. Dieses Verhalten wird möglicherweise in einer zukünftigen Compilerversion geändert. Derzeit muss jedoch erneut WINDOW mit entsprechenden Parametern aufgerufen werden, um z.B. nach einem VIEW die vorherige Koordinatentransformation in gleicher Form beizubehalten. Andernfalls wird der Koordinatenbereich eventuell verschoben oder skaliert.

Siehe auch:
SCREEN (Anweisung), VIEW (Grafik), PMAP, Grafik

Letzte Bearbeitung: 03.08.11
Zur Onlinefassung des Eintrags

WINDOWTITLE

Syntax: WINDOWTITLE Titel
Typ: Anweisung
Kategorie: Gfx

WINDOWTITLE ändert die Beschriftung eines Grafikfensters.

'Titel' ist ein String, der die neue Beschriftung für das Grafikfenster enthält.

Der neue Titel wird sofort gültig, wenn bereits ein Grafikfenster aktiv ist, oder sobald ein SCREEN- oderSCREENRES-Aufruf erfolgt, der ein Grafikfenster öffnet. Wenn Sie WINDOWTITLE nicht aufrufen, erhält das Grafikfenster den Dateinamen ohne Erweiterung als Beschriftung.

Beispiel:

WINDOWTITLE "FreeBASIC Beispielprogramm"
SCREENRES 400, 300
SLEEP

WINDOWTITLE hat keine Auswirkung auf Konsolen-Fenster. Um unter Windows den Titel des Konsolen-Fensters zu ändern, kann folgender Code genutzt werden:

#INCLUDE "windows.bi"
DIM Titel AS ZSTRING *MAX_PATH
'existiert eine Konsole?
IF GetConsoleTitle (@Titel, MAX_PATH) THEN
SetConsoleTitle "Neuer Konsolentitel"
END IF
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede: wird unter DOS nicht unterstützt

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WINDOWTITLE nicht zur Verfügung und kann nur über __WINDOWTITLE aufgerufen werden.

Siehe auch:
SCREENRES, SCREENCONTROL, Betriebssystem-Anweisungen

Letzte Bearbeitung: 29.01.12
Zur Onlinefassung des Eintrags

WINPUT

Syntax: WINPUT (Anzahl [, [#]Dateinummer])
Typ: Funktion
Kategorie: Eingabe

WINPUT liest 'Anzahl' Zeichen von der Tastatur oder aus einer Datei. Die Funktion arbeitet wie INPUT (Funktion), gibt jedoch einen WSTRING zurück.

- 'Anzahl' ist die Zahl der Zeichen, die eingelesen werden sollen.

- 'Dateinummer' ist die Nummer einer im INPUT-Modus geöffneten Datei.

- Der Rückgabewert ist ein WSTRING, der die eingegebenen Zeichen enthält.

Wird eine Dateinummer angegeben, dann liest der Befehl 'Anzahl' Zeichen aus einer Datei und aktualisiert den Dateicursor. Ansonsten wartet er 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.

Hinweis: Zur Zeit unterstützt FreeBASIC keine Unicode-Eingabe über die Tastatur! Der Befehl kann nur zum Lesen aus einer Datei verwendet werden.

Beispiel:

DIM char AS WSTRING * 2

DIM filename AS STRING, enc AS STRING
DIM f AS INTEGER

LINE INPUT "Bitte den Dateinamen eingeben: ", filename
LINE INPUT "Encoding eingeben (optional):  ", enc
IF enc = "" THEN enc = "ascii"

f = FREEFILE
IF OPEN(filename FOR INPUT ENCODING enc AS #f) = 0 THEN
PRINT "Druecken Sie die Leertaste, um ein Zeichen aus der Datei auszulesen, oder ESC zum Beenden."
DO
SELECT CASE INPUT(1)
CASE " " 'Space
IF EOF(f) THEN
PRINT "Das Dateiende wurde erreicht."
EXIT DO
END IF
char = WINPUT(1, f)
PRINT char & " (Zeichen Nr. " & ASC(char) & ")"
CASE CHR(27) 'Escape
EXIT DO
END SELECT
LOOP
CLOSE #f
ELSE
PRINT "Die Datei konnte nicht geöffnet werden."
END IF
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WINPUT nicht zur Verfügung und kann nur über __WINPUT aufgerufen werden.

Siehe auch:
INPUT (Funktion), WSTRING (Datentyp), OPEN

Letzte Bearbeitung: 06.04.12
Zur Onlinefassung des Eintrags

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 UDTs angegeben werden, nicht aber der UDT-Bezeichner selbst. Dies erspart dem Programmierer einige Tipparbeit.

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

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

Hinweise:
- WITH funktioniert (noch) nicht mit NAMESPACE
- Aufgrund der inneren Struktur sollte nicht mit GOTO in einen WITH-Block gesprungen werden

Unterschiede in den Dialektformen:
- unter -lang qb ist WITH nur als __WITH verfügbar

Unterschiede zu QuickBASIC:
- Neu in FreeBASIC

Siehe auch:
TYPE, UNION, DIM

Letzte Bearbeitung: 13.09.10
Zur Onlinefassung des Eintrags

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; der zurückgegebene Wert ist jedoch nie länger, als maximal für den Datentyp von 'Ausdruck' benötigt wird.
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 WSTRING, 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)      ' Ausgabe: 10
PRINT WOCT(20, 4)  ' Ausgabe: 0024
PRINT WOCT(100, 2) ' Ausgabe: 44

Um eine Oktalzahl in ihre dezimale Form zurückzuverwandeln, wird VAL verwendet:

DIM oktal AS WSTRING * 6

oktal = "100"

'Kennung &O zeigt an, dass der folgende String eine Oktalzahl ist.
oktal = "&O" + oktal

PRINT VAL(oktal)
SLEEP

gibt 64 aus.

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WOCT nicht zur Verfügung und kann nur über __WOCT aufgerufen werden.

Siehe auch:
WHEX, WBIN, OCT, VAL, WSTRING (Datentyp)

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

WRITE (Anweisung)

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 Semikola 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 (Datei), PRINT (Anweisung), PRINT (Datei), LOCATE (Anweisung), COLOR (Anweisung)

Letzte Bearbeitung: 10.02.11
Zur Onlinefassung des Eintrags

WRITE (Datei)

Syntax: WRITE #f, 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 sequentiellen Ausgabemodus (OUTPUT, APPEND) oder im Modus BINARY 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:

DIM Tmp AS STRING, nr AS INTEGER
nr = FREEFILE

OPEN "Adressen.txt" FOR APPEND AS #nr

WRITE #nr, "Karl Mustermann", "12345", "Oberhausen", "Rottstraße 2"
WRITE #nr, "Eva Mustermann", "12345", "Oberhausen", "Rottstraße 2"
WRITE #nr, "Andrea Müller", "12346", "Unterhausen", "Wendeweg 17"
CLOSE #nr

OPEN "Adressen.txt" FOR INPUT AS #nr
DO
FOR Satz AS INTEGER = 1 TO 4
INPUT #nr, tmp
PRINT tmp; " ";
NEXT
PRINT
LOOP UNTIL EOF(nr)
SLEEP

So wie sich die Datensätze in einer Zeile schreiben lassen, können sie natürlich auch mit einer Zeile wieder eingelesen werden. Dazu dient dann aber die Anweisung LINE INPUT #, wie das folgende Beispiel zeigt:

DIM AS STRING tmp, dateiname="Adressen.txt"
DIM AS INTEGER nr=FREEFILE
OPEN dateiname FOR OUTPUT AS #nr

WRITE #nr, "Karl Mustermann", "12345", "Oberhausen", "Rottstraße 2"
WRITE #nr, "Eva Mustermann", "12345", "Oberhausen", "Rottstraße 2"
WRITE #nr, "Andrea Müller", "12346", "Unterhausen", "Wendeweg 17"
CLOSE #nr

OPEN dateiname FOR INPUT AS #nr
DO
LINE INPUT #nr, tmp
PRINT tmp
LOOP UNTIL EOF(nr)
SLEEP

Bei dieser Variante müssen die einzelnen Strings bei Bedarf anhand der Trennzeichen wieder aufgeteilt werden.

Siehe auch:
OPEN (Anweisung), PRINT #, INPUT #, LINE INPUT #, ACCESS, Dateien (Files)

Letzte Bearbeitung: 10.02.11
Zur Onlinefassung des Eintrags

WSPACE

Syntax: WSPACE[$](n)
Typ: Funktion
Kategorie: Stringmanipulation

WSPACE 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 * 7
w = WSPACE(6)
PRINT "nicht eingerückter Text"
PRINT w; "eingerückter Text"
SLEEP

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WSPACE nicht zur Verfügung und kann nur über __WSPACE aufgerufen werden.

Siehe auch:
SPACE, STRING (Funktion), TAB, SPC, WSTRING (Datentyp)

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

WSTR

Syntax A: WSTR[$](numerischer Ausdruck)
Syntax B: WSTR[$](ASCII-String)
Typ: Funktion
Kategorie: Stringmanipulation

WSTR verwandelt einen übergebenen numerischen Ausdruck in einen WSTRING. Es ist die Gegenfunktion zu VAL.

WSTR kann auch verwendet werden, um einen ASCII-String in einen WSTRING zu verwandeln. So verwendet ist es die Gegenfunktion von STR.

Das Dollarzeichen ($) als Suffix ist optional.

Beispiel:

DIM a AS INTEGER
DIM b AS WSTRING * 5
a = 8421
b = WSTR(a)
PRINT a, b, WSTR(&HaB1)
SLEEP

Ausgabe:

8421         8421          2737

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede:
Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WCHR nicht zur Verfügung und kann nur über __WCHR aufgerufen werden.

Siehe auch:
VAL, STR, WSTRING (Datentyp)

Letzte Bearbeitung: 04.11.10
Zur Onlinefassung des Eintrags

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-latein-basierende Alphabete zu unterstützen. Alle STRING-Operatoren und STRING-Funktionen (wie LEFT) funktionieren bereits mit WSTRINGs. In einigen Fällen wurden spezielle WSTRING-Routinen wie WCHR geschrieben.

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 für fünf Zeichen + ein
*wstp = "hello"       ' 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 ge-
' speichert werden.
wstp = REALLOCATE(wstp, 24)   ' zusätzlichen Speicher re-
' servieren, um die Zeichen-
' kette anhängen zu können,
' und dabei das Nullzeichen
' beachten.
*wstp &= " Welt"  ' jetzt kann auch hier ganz normal ver-
' fahren 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

SLEEP

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

Plattformbedingte Unterschiede:
Die Unterstützung von WSTRINGs hängt von der C runtime library ab, die unter den verschiedenen Plattformen variieren kann.

- Unicode wird in der DOS-Portierung von FreeBASIC nicht unterstützt. WSTRINGs verhalten sich wie ASCII-ZSTRINGs

- Unter Win32 werden WSTRINGs in UCS-2 (UTF-16 LE) codiert und ein Zeichen belegt 2 Bytes.

- Unter Linux werden WSTRINGs in UCS-4 codiert und ein Zeichen belegt 4 Bytes.

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC v0.15

Siehe auch:
SIZEOF, VARPTR, STRPTR, CAST, WCHR, ASC, WSTR, VAL, WBIN, WHEX, WOCT, WSPACE, WINPUT, DIM, STRING (Datentyp), ZSTRING, Datentypen, Datentypen und Deklarationen, String-Funktionen

Letzte Bearbeitung: 23.07.10
Zur Onlinefassung des Eintrags

WSTRING (Funktion)

Syntax A: WSTRING[$](n, code)
Syntax B: WSTRING[$](n, char)
Typ: Funktion
Kategorie: Stringmanipulation

Die Funktion gibt einen WSTRING aus 'n' Zeichen aus; jedes Zeichen dieser Kette ist 'char' bzw. WCHR('code').

- 'n' gibt die Länge des WSTRING an, der zurückgegeben wird.

- 'code' ist der Unicode-Wert des Zeichens, aus dem die Rückgabe zusammengesetzt sein soll.

- 'char' ist ein WSTRING mit dem Zeichen, aus dem die Rückgabe zusammengesetzt sein soll. Wenn 'char' aus mehreren Zeichen besteht, wird eine Kette ausgegeben, die nur aus dem ersten Zeichen von 'char' besteht.

Die Funktion WSTRING ist das Pendant zur Funktion STRING (Funktion), gibt aber einen WSTRING zurück. Das Dollarzeichen ($) als Suffix ist optional.

Beispiel: Text unterstreichen:

DIM msg AS STRING
DIM l AS INTEGER
msg = "FreeBASIC ist ein BASIC-Compiler"
l = LEN(msg)
PRINT msg
PRINT WSTRING(l, WCHR(42))

Ausgabe:

FreeBASIC ist ein BASIC-Compiler
********************************

Unterschiede zu QB: neu in FreeBASIC

Plattformbedingte Unterschiede: Unicode wird unter DOS nicht unterstützt

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht WSTRING nicht zur Verfügung und kann nur über __WSTRING aufgerufen werden.

Siehe auch:
STRING (Funktion), WSPACE,WSTRING (Datentyp)

Letzte Bearbeitung: 18.06.10
Zur Onlinefassung des Eintrags

Startbuchstabe X

XOR (Methode)

Syntax: { PUT | DRAW STRING } [Puffer, ] [STEP] (x, y), [ weitere Angaben ... ], XOR
Typ: Schlüsselwort
Kategorie: Gfx

XOR ist ein Schlüsselwort, das im Zusammenhang mit PUT 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.

Beispiel:

'Erstellt ein Grafikfenster
SCREENRES 320, 200, 16

'Erstellt einen Bildbuffer mit Kreis
DIM AS INTEGER r = 32
DIM c AS ANY PTR = IMAGECREATE(r * 2 + 1, r * 2 + 1, 0)
CIRCLE c, (r, r), r, RGBA(255, 255, 255, 0), , , 1, f

'Legt den Bildbuffer dreimal so übereinander, dass sich die Kreise in der Mitte überlappen
PUT (146 - r, 108 - r), c, XOR
PUT (174 - r, 108 - r), c, XOR
PUT (160 - r,  84 - r), c, XOR

'Gibt den Bildbuffer wieder frei (sollte man immer tun)
IMAGEDESTROY c

'Wartet vor dem Beenden des Programms auf einen Tastendruck
SLEEP

Unterschiede zu QB: keine

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

XOR (Operator)

Syntax A: Ergebnis = Ausdruck1 XOR Ausdruck2
Syntax A: Ausdruck1 XOR= Ausdruck2
Typ: Operator
Kategorie: logische Operatoren

XOR kann als einfacher (Syntax A) und kombinierter (Syntax B) Operator eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 XOR Ausdruck2

XOR steht für exklusives 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 ist; wenn jedoch beide 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 Bedingungen verwendet, wenn eine Aussage erfüllt sein muss, jedoch nicht beide erfüllt sein dürfen.

XOR kann mithilfe von OPERATOR überladen werden.

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: Kontravalenz 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)
SLEEP

Ausgabe:

6           0110
10           1010
---           ----
12           1100

Beispiel 3: XOR als kombinierter Operator

DIM AS INTEGER Checkboxen

' Simuliere Anklicken von Checkbox Nr 5:

Checkboxen XOR= (1 SHL 5)

Wie Sie sehen, kann XOR benutzt werden, um ein einzelnes Bit oder mehrere Bits bequem zu invertieren. Der Ausdruck (1 SHL 5) entspricht &B100000. 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.

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
XOR (Methode), AND (Operator), NOT, OR (Operator), IMP, EQV, Bit Operatoren / Manipulationen

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

Startbuchstabe Y

YEAR

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

Anmerkung:
Um diese Funktion nutzen zu können, muss die Datei datetime.bi in Ihren Quellcode eingebunden werden, z.B. mit INCLUDE. Alternativ können Sie auch die Datei vbcompat.bi einbinden, da dadurch auch automatisch datetime.bi eingebunden wird.

YEAR extrahiert das Jahr einer Serial Number.

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

- Der Rückgabewert ist das Jahr, das 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: existiert nur in QBX PDS und in VBDOS

Unterschiede zu früheren Versionen von FreeBASIC: existiert erst seit FreeBASIC 0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, MONTH, DAY, WEEKDAY, HOUR, MINUTE, SECOND, MONTHNAME, WEEKDAYNAME, DATEDIFF, DATEPART, DATEADD, FORMAT, ISDATE, Serial Numbers, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

Startbuchstabe Z

ZSTRING

Typ: Datentyp

Ein ZSTRING 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.

Was unterscheidet STRING und ZSTRING?
STRING- und ZSTRING-Variablen eignen sich beide zur Speicherung von Zeichenketten, also Abfolgen von Buchstaben, Zahlen, Satz- und Sonderzeichen. Arithmetische Operationen (z. B. Substraktion) sind auf sie nicht anwendbar.
Der Unterschied zwischen den beiden Datentypen liegt darin, wie die Länge der gespeicherten Zeichenkette festgelegt wird. Anders als elementare Datentypen wie Integer, Double etc., die jeweils eine genau bestimmte und immer gleiche Anzahl an Bytes im Speicher belegen, können (Z-)Strings praktisch nahezu beliebig lang sein.
Ein FreeBASIC-Programm könnte zum Beispiel sowohl die Zeichenkette "Fest gemauert" als auch das gesamte Lied von der Glocke, das mit diesen Worten beginnt, speichern. Woher weiß das Programm nun aber, wo im Speicher die Zeichenkette aufhört und etwas anderes (zum Beispiel eine andere Zeichenkette) beginnt? Hinter der vom Benutzer angegebenen String-Variable verbirgt sich nämlich intern im Hintergrund zunächst nur die Information, wo die Zeichenkette im Speicher anfängt, ein Zeiger auf ihren Beginn also.
Um nun eindeutig bestimmen zu können, wie lang die Zeichenkette ist, gibt es in FreeBASIC zwei Ansätze:

- Man speichert - für den Nutzer unsichtbar! - vor dem Anfang jedes Strings eine Zahl mit fester Speicherlänge, die Aufschluss darüber gibt, wie viele Stringbytes auf sie folgen:

- (006) WETTER

- (013) WETTERBERICHT

Dieses Verfahren findet bei den "normalen" STRING-Variablen in FreeBASIC Anwendung.

- Alternativ ist es möglich, am Ende der Zeichenkette eine Stopp-Markierung anzuhängen, statt die Länge als Zahl zu speichern. Das Programm liest also, von der Anfangsadresse des Strings an, so lange weiter, bis diese Stopp-Markierung gefunden wurde:

- WETTERBERICHT<STOP>

Dieses Prinzip liegt den ZSTRINGs zugrunde. Die Stopp-Markierung besteht bei ihnen aus dem ASCII-Zeichen mit dem Code 0 ("zero"), was die Bezeichnung ZSTRING erklärt. ZSTRINGs werden daher auch als null-terminierte oder zero-terminated Strings bezeichnet.

Der Nachteil der Längenkennzeichnungsmethode der ZSTRINGs besteht darin, dass CHR(0), also die Stopp-Markierung, niemals in den Zeichenkettendaten auftauchen darf. Taucht die Stopp-Markierung CHR(0) dennoch in den Daten auf (z.B. HALLO <CHR(0)> WELT), so wird die Zeichenkette genau an dieser Stelle abgeschnitten. Im soeben eingeführten Beispiel bliebe also nur "HALLO" übrig. Daten, die Nullbytes enthalten, können mit ZSTRINGs daher nicht gespeichert werden.

Wird einer ZSTRING-Variable ein Wert zugewiesen, wird automatisch das abschließende Nullzeichen angehängt.
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 (Datentyp)). Alternativ kann er auch wie ein dynamisches Array gehandhabt werden; die Speicherverwaltung liegt dann jedoch ganz in den Händen des Benutzers. 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 re-
' serviert werden. Da nur 11 Bytes re-
' serviert wurden, ist 'zstr' jetzt
' voll, eine längere Zeichenkette kann
' nicht gespeichert werden.
zstrp = REALLOCATE(zstrp, 12) ' zusätzlichen Speicher re-
' servieren, um die Zeichen-
' kette anhängen zu können,
' und dabei das Nullzeichen
' beachten.
*zstrp &= " Welt" ' jetzt kann auch hier ganz normal ver-
' fahren 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

SLEEP

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

Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen: existiert erst seit FreeBASIC 0.13

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht ZSTRING nicht zur Verfügung und kann nur über __ZSTRING aufgerufen werden.

Siehe auch:
SIZEOF, VARPTR, STRPTR, CAST, CHR, ASC, STR, VAL, BIN, HEX, OCT, SPACE, INPUT (Funktion), DIM, STRING (Datentyp), WSTRING (Datentyp), Datentypen, Datentypen und Deklarationen, String-Funktionen

Letzte Bearbeitung: 23.07.10
Zur Onlinefassung des Eintrags

BASIC-Grundlagen

Ausdrücke und Operatoren

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 Ausdruck kann aus einem einzelnen Wert 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

- Hierarchie 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, 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 (größer oder kleiner)

Beispiel:

DIM  money AS  INTEGER
INPUT "Wieviel Geld haben Sie? ", money
IF money < 100 THEN
PRINT "Sie haben weniger als $100, lassen Sie mich"
PRINT "Ihnen weitere $100 geben."
money = money + 100
PRINT "Jetzt haben Sie $" & money
ELSE
PRINT "Sie haben genau oder mehr als $100. Das"
PRINT "reicht vorerst."
END IF
SLEEP

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:

- AND - Sind beide Bedingungen erfüllt?

- OR - Ist mindestens eine Bedingung erfüllt?

- NOT - Ist die Bedingung nicht erfüllt?

- XOR - Ist eine Bedingung erfüllt, aber die andere nicht?

- EQV - Sind beide Bedingunen gleich?

- IMP - Folgt die zweite Bedingung auf die ersten? a IMP b entspricht (NOT a) OR b

- ANDALSO - ähnlich wie AND, jedoch wird die zweite Bedingung nur ausgewertet, wenn nötig

- ORELSE - ähnlich wie OR, jedoch wird die zweite Bedingung nur ausgewertet, wenn nötig

Siehe dazu auch Bit Operatoren / Manipulationen

Hierarchie der Operatoren
Mehrere Operatoren in einer Anweisung werden nach einer vordefinierten Reihenfolge abgearbeitet. Ein Operator mit höherer Hierarchie wird vor einem Operator abgearbeitet, der eine niedrigere Hierarchie besitzt. Haben zwei Operatoren die gleiche Hierarchie, werden sie in der Reihenfolge abgearbeitet, wie sie vorkommen.

Die Art der Abarbeitung kann von rechts nach links sein, oder aber von links nach rechts. Ein 'N/A' gibt an, dass keine Richtung aufgrund der Eigenschaften des Operators besteht.

Die folgende Tabelle enthält alle Operatoren absteigend nach ihrer Hierarchie:

Operator

Klassifizierung

Kardinalität

Bedeutung

Assoziativität

19

CAST

Funktion

unär

Typumwandlung

N/A

PROCPTR

Funktion

unär

Adressoperator

N/A

STRPTR

Funktion

unär

Adressoperator

N/A

VARPTR

Funktion

unär

Adressoperator

N/A

18

[]

Zugriffsoperator

/

Stringindex

von links

[]

Zugriffsoperator

/

Pointerindex

von links

()

Indizierung

/

Arrayindex

von links

()

Auswertungsoperator

/

Funktionsaufruf

von links

.

Zugriffsoperator

/

Strukturzugriff

von links

->

Zugriffsoperator

/

Indirektzugriff

von links

17

@

Zugriffsoperator

unär

Adressoperator

von rechts

*

Zugriffsoperator

unär

Dereferenzierung

von rechts

New

Datenoperator

unär

Speicher alloziieren

von rechts

Delete

Datenoperator

unär

Speicher dealloziieren

von rechts

16

^

Exponent

unär

Exponent

von links

15

-

Arithmetischer Operator

unär

Negativ

von rechts

14

*

Arithmetischer Operator

binär

Multiplizieren

von links

/

Arithmetischer Operator

binär

Dividieren

von links

13

\

Arithmetischer Operator

binär

Integerdivision

von links

12

MOD

Arithmetischer Operator

binär

Modulo Division

von links

11

SHL

Bitoperator

binär

Bitverschiebung nach links

von links

SHR

Bitoperator

binär

Bitverschiebung nach rechts

von links

10

+

Arithmetischer Operator

binär

Addieren

von links

-

Arithmetischer Operator

binär

Subtrahieren

von links

9

&

Verknüpfungsoperator

binär

Stringverkettung

von links

8

=

Vergleichsoperator

binär

Gleich

von links

<>

Vergleichsoperator

binär

Ungleich

von links

<

Vergleichsoperator

binär

Kleiner als

von links

<=

Vergleichsoperator

binär

Kleiner oder gleich

von links

>=

Vergleichsoperator

binär

Größer oder gleich

von links

>

Vergleichsoperator

binär

Größer als

von links

7

NOT

Bitoperator

binär

Verneinung

von rechts

6

AND

Logischer und binärer Operator

binär

Und

von links

5

OR

Logischer und binärer Operator

binär

Oder

von links

4

EQV

Logischer und binärer Operator

binär

Äquivalenz

von links

IMP

Logischer und binärer Operator

binär

Implikat

von links

XOR

Logischer und binärer Operator

binär

Exklusives Oder

von links

3

ANDALSO

Logischer und binärer Operator

binär

Verkürztes und

von links

ORELSE

Logischer und binärer Operator

binär

Verkürztes oder

von links

2

=

Zuweisungsoperator

binär

Zuweisung

N/A

&=

Zuweisungsoperator

binär

Verkettung + Zuweisung

N/A

+=

Zuweisungsoperator

binär

Addition + Zuweisung

N/A

-=

Zuweisungsoperator

binär

Subtraktion + Zuweisung

N/A

*=

Zuweisungsoperator

binär

Multiplikation + Zuweisung

N/A

/=

Zuweisungsoperator

binär

Division + Zuweisung

N/A

\=

Zuweisungsoperator

binär

Integerdivision + Zuweisung

N/A

^=

Zuweisungsoperator

binär

Exponent + Zuweisung

N/A

MOD=

Zuweisungsoperator

binär

Modulo + Zuweisung

N/A

AND=

Zuweisungsoperator

binär

Und + Zuweisung

N/A

EQV=

Zuweisungsoperator

binär

Äquivalenz + Zuweisung

N/A

IMP=

Zuweisungsoperator

binär

Implikat + Zuweisung

N/A

OR=

Zuweisungsoperator

binär

Oder + Zuweisung

N/A

XOR=

Zuweisungsoperator

binär

Exklusives oder + Zuweisung

N/A

SHL=

Zuweisungsoperator

binär

Bitverschiebung nach links + Zuweisung

N/A

SHR=

Zuweisungsoperator

binär

Bitverschiebung nach rechts + Zuweisung

N/A

LET

Zuweisungsoperator

binär

Zuweisung

N/A

1

LET()

Zuweisungsoperator

binär

Zuweisung

N/A

Stringoperatoren
Die folgenden Operatoren können bei STRINGs angewandt werden:

- Strings verketten (String1 + String2 bzw. String1 & String2)

- Symbole zu Strings umwandeln und verketten (Symbol1 & Symbol2)

- Prüfen, ob ein String alphabetisch vor einem anderen steht (String1 < String2)

- Prüfen, ob ein String alphabetisch hinter einem anderen steht (String1 > String2)

- Prüfen, ob zwei Strings gleich oder ungleich sind (String1 = String2, 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 kombinierten Operatoren, zum anderen die Variablen-Initiatoren.

Kombinierte Operatoren
Kombinierte Operatoren 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 dasselbe:
a = a + 1
a += 1

Dies funktioniert mit allen Operatoren (+, -, *, /, \, ^, AND, OR, XOR, IMP, EQV, SHL, SHR) bei jedem Datentyp. Auch Arrays und UDTs (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 funktioniert 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 Addition bzw. Subtraktion benutzen, wird der hinzugezählte/abgezogene Wert 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

bzw.

DIM AS Typ Variable1 = Ausdruck [, Variable2 = Ausdruck ...]

Einige kompliziertere Ausdrücke sind bei Variablen-Initiatoren nicht erlaubt. Sollten Sie eine Fehlermeldung erhalten, dann versuchen Sie, die Dimensionierung und die Wertzuweisung in zwei einzelnen Befehlen durchzuführen.

Beispiel:

CONST drei = 3
DIM a AS INTEGER = 5
DIM b AS SINGLE = SIN(drei ^ 0.5) * a

Für Arrays gelten dieselben 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 AS INTEGER 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
SLEEP

Variablen-Initiatoren funktionieren auch mit UDT-Arrays (user-defined Type, siehe TYPE). Siehe dazu die Datei var_initializers.bas im examples-Verzeichnis.

Letzte Bearbeitung: 04.09.10
Zur Onlinefassung des Eintrags

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 Bedingung sein.

- Sinnvoll sind Bedingungen 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 oder als Abbruchbedingung in Schleifen verwendet, können aber auch in Wertzuweisungen bei Variablen auftauchen; siehe dazu BIT und natürlich auch IIF.

Letzte Bearbeitung: 28.08.11
Zur Onlinefassung des Eintrags

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 32 Bit genutzt wird. 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 GesamtStatus AND 1 THEN CheckBox1 = 1
IF GesamtStatus AND 2 THEN CheckBox2 = 1
IF GesamtStatus 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 Notizen nachsehen, wofür welches Bit steht. Beides ist relativ mühselig.

Unter FreeBASIC wurde dieses Problem durch die sogenannten Bitfelder (die Programmierern in C/C++ bereits bekannt sein sollten) gelöst. Ein Bitfeld ist einem UDT ä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 : Bitanzahl AS INTEGER
Bit2Name : Bitanzahl AS INTEGER
Bit3Name : Bitanzahl AS INTEGER
' ...
END TYPE
DIM Variable AS BitFeldName

In Bitfelder aufteilen lassen sich nur die Datentypen Byte (UByte), Short (UShort), Integer (UInteger) bzw. Long (ULong). Alle anderen Datentypen als Bitfeld aufzuteilen erzeugt eine Fehlermeldung des Compilers. Die Namen der Strukturelemente können dabei frei gewählt werden. Es dürfen beliebig viele Records verwendet werden. 'Bitanzahl' 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 PRINT "Bit 1 ist gesetzt."
IF CheckBoxen.CB2 THEN PRINT "Bit 2 ist gesetzt."
IF CheckBoxen.CB3 THEN PRINT "Bit 3 ist gesetzt."
SLEEP

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 die Bitzahl 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
SLEEP

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.

Letzte Bearbeitung: 21.01.12
Zur Onlinefassung des Eintrags

Datentypen

Übersicht über die in FreeBASIC verfügbaren Datentypen:

Name

Bits

Format

kleinster Wert

größter Wert

Suffix*

Genauigkeit**

BYTE

8

vorzeichenbehaftete Ganzzahl

-128

+127

0

UBYTE

8

vorzeichenlose Ganzzahl

±0

+255

0

SHORT

16

vorzeichenbehaftete Ganzzahl

-32.768

+32.767

s

0

USHORT

16

vorzeichenlose Ganzzahl

±0

65.535

0

INTEGER

32

vorzeichenbehaftete Ganzzahl

-2.147.483.648

+2.147.483.647

%

0

UINTEGER

32

vorzeichenlose Ganzzahl

±0

4.294.967.295

0

LONG

32/64***

vorzeichenbehaftete Ganzzahl

-2.147.483.648

+2.147.483.647

&, l

0

ULONG

32/64***

vorzeichenlose Ganzzahl

±0

4.294.967.295

ul

0

LONGINT

64

vorzeichenbehaftete Ganzzahl

-9.223.372.036.854.775.808

+9.223.372.036.854.775.807

ll

0

ULONGINT

64

vorzeichenlose Ganzzahl

±0

+18.446.744.073.709.551.615

ull

0

SINGLE

32

Gleitkommazahl

+/-1.401 298 E-45****

+/-3.402 823 E+38****

! oder f

6

DOUBLE

64

Gleitkommazahl

+/-4.940 656 458 412 465 E-324****

+/-1.797 693 134 862 316 E+308****

# oder d

15

STRING

variable/feste Länge

Zeichenkette*****

0

2GB

$

ZSTRING

feste Länge

nullterminierte Zeichenkette

0

2GB

WSTRING

feste Länge

nullterminierte Zeichenkette

0

2GB

Fußnoten:

- * Suffixe sind standardmäßig, also im Modus -lang fb, nicht mehr zulässig (siehe FB-Dialektformen). Eine Ausnahme sind hierbei konstante Zahlen, z.B. "Dim f As Single = 0.22332f". So kann der Datentyp einer Zahl bestimmt werden.

- ** Angegeben ist die ungefähre Anzahl der Stellen bei Gleitkommazahlen.

- *** Aktuell immer 32 Bit, in späteren Versionen eventuell je nach verwendeter Plattform.

- **** Die angegebenen Werte bei den Gleitkommazahlen sind die Werte die Null bzw. positiver und negativer Unendlichkeit am Nächsten kommen.

- ***** STRING-Variablen enthalten zwar aus Kompatibilitätsgründen zu externen Bibliotheken ein implizites Nullbyte am Ende, werden von diesem jedoch nicht terminiert, d. h. innerhalb des Strings dürfen auch Nullbytes vorkommen, ohne dass der String an der Stelle des ersten Vorkommens von CHR(0) abgeschnitten werden würde. Die Unterschiede zwischen STRING und ZSTRING werden am Anfang des Artikels zu ZSTRING erklärt.

Unterschiede zu QB:

- INTEGERs sind in FreeBASIC 32-Bit-Variablen, die von den heutigen 32-Bit-Prozessoren besser verarbeitet werden können. Im Gegensatz dazu waren INTEGER in QB 16 Bit lang. Wer explizit 16 Bit lange Ganzzahlen benötigt, muss in FreeBASIC auf SHORT- bzw. USHORT-Variablen zurückgreifen.

- LONGs (32-Bit-Ganzzahltyp in QB) werden in FreeBASIC nicht mehr benötigt, wurden aber aus Kompatibilitätsgründen beibehalten.

Siehe auch: Thematische Übersicht: Datentypen und Deklarationen

Letzte Bearbeitung: 11.03.11
Zur Onlinefassung des Eintrags

Gültigkeitsbereich von Variablen

Eine Variable hat immer nur in dem Umfeld Gültigkeit, in dem sie definiert wird. Solche Gültigkeitsbereiche werden als Scope-Blöcke bezeichnet. Variablen, die im Hauptprogramm deklariert werden, sind in der Regel im gesamten Hauptprogramm gültig oder "sichtbar", nicht jedoch in den Prozeduren (SUBs und FUNCTIONs). Eine Varable, die in einer Prozedur deklariert wurde, ist dagegen nur in dieser Prozedur sichtbar. Die genaueren Regeln, welche Variablen wo sichtbar sind, werden im Folgenden aufgeführt.

In FreeBASIC gibt es vier Kategorien von Scope-Blöcken: LOCAL, SHARED, COMMON und COMMON SHARED. Jeder dieser Blöcke hat seine eigenen Sichtbarkeitsregeln.

LOCAL

Variablen, die in einem lokalen Scope deklariert wurden, sind auch nur in diesem sichtbar.

- SUB, FUNCTION, das Hauptprogramm und jeder Befehlsblock (SCOPE...END SCOPE, FOR...NEXT, DO...LOOP, IF...END IF usw.) bildet einen eigenen Scope-Block.

- Explizit mit DIM oder REDIM definierte Variablen gelten im Scope-Block, in dem sie deklariert wurden.

- Wenn in einem Scope-Block eine Variable verwendet wird, die in diesem Block nicht explizit deklariert wurde, dann wird die Variable des umgebenden Scope-Blocks verwendet.

Beispiele:

DIM AS INTEGER a = 0, b = 0
DO
a += 1                     ' Zugriff auf die Variable des Hauptmodus
DIM AS INTEGER b = a^2     ' Dieses b ist nur in der Schleife bekannt
PRINT "In der Schleife: ";
PRINT "a =";a; "   b ="; b
LOOP UNTIL a = 10
PRINT "Ausserhalb: ";
PRINT "a =";a; "   b ="; b

SUB fehlerhafterAufruf
DIM AS INTEGER c
PRINT a                    ' erzeugt einen Fehler
END SUB

In der DO-Schleife wird die Variable a aus dem Hauptmodul verwendet. Deswegen sind Änderungen innerhalb der Schleife anschließend auch im Hauptmodul bekannt. Die Änderungen der Variablen b betreffen jedoch nur die Schleife und haben anschließend keine Auswirkung mehr.
Die in der SUB verwendete Variable ist dort nicht bekannt, weshalb es zu einem Compiler-Fehler kommt. Dasselbe würde passieren, wenn man versuchen würde, die in der SUB deklarierte Variable c im Hauptprogramm aufzurufen.

In der FOR-Schleife kann die Zählvariable direkt als lokale Variable des FOR-Blocks deklariert werden. Sie ist dann außerhalb der Schleife nicht mehr gültig. Ermöglicht wird dies durch die Syntax FOR variable AS datentyp = start TO ende

DIM AS STRING s = "Hallo Welt!"
FOR s AS INTEGER = 1 TO 3
PRINT s
NEXT
PRINT s

SHARED

Globale Variablen, die mit dem Befehl DIM SHARED deklariert wurden, sind im ganzen Modul einschließlich seiner SUBs und FUNCTIONs sichtbar. Das Modul teilt also die Variable mit seinen Prozeduren.
DIM SHARED darf nur auf Modulebene verwendet werden, nicht jedoch in einer SUB, einer FUNCTION oder einem Befehlsblock (wie DO...LOOP). Eine mit DIM SHARED deklarierte globale Variable kann jedoch wieder lokal "überschrieben" werden.

Beispiel:

DECLARE SUB test
DIM SHARED AS INTEGER variable = 1
PRINT "vor der SUB:   "; variable    ' globale Variable
test
PRINT "nach der SUB:  "; variable    ' globale Variable, geändert

SUB test
variable += 1                      ' globale Variable ändern
PRINT "in der SUB (1):"; variable  ' noch die globale Variable
DIM AS STRING variable = "neu"
PRINT "in der SUB (2):"; variable  ' jetzt eine lokale Variable
END SUB

COMMON

COMMON kann zum Einsatz kommen, wenn ein Programm aus mehreren Modulen zusammengesetzt ist, d. h. wenn es aus mehreren einzelnen .bas-Dateien besteht, die zusammen compiliert werden. Wird eine Variable mit der Anweisung COMMON deklariert, dann steht sie nicht nur in diesem Modul zur Verfügung, sondern auch in allen anderen Modulen, welche die Variable ebenfalls mit COMMON deklarieren.

Für folgendes Beispiel müssen Sie beide Code-Teile unter dem jeweils angegebenen Namen speichern und das ganze mit fbc modul1.bas modul2.bas compilieren.

modul1.bas

COMMON m1 AS INTEGER
COMMON m2 AS INTEGER

' Dies wird nach allen anderen Modulen ausgeführt
m1 = 1

PRINT "Modul 1"
PRINT "m1 = "; m1     ' m1 = 1, wie in diesem Modul gesetzt
PRINT "m2 = "; m2     ' m2 = 2, wie im Modul 2 gesetzt

module2.bas

COMMON m1 AS INTEGER
COMMON m2 AS INTEGER

m2 = 2

' Dies wird zuerst ausgeführt
PRINT "Modul 2"
PRINT "m1 = "; m1     ' m1 = 0 (Standardbelegung)
PRINT "m2 = "; m2     ' m2 = 2

SUB unterprogramm
' m1 und m2 sind hier nicht sichtbar. Ein Befehl wie
' PRINT "m1 = "; m1
' würde zu einem Compilier-Fehler führen.
END SUB

Ausgabe:

Modul 2
m1 = 0
m2 = 2
Modul 1
m1 = 1
m2 = 2

COMMON SHARED

Wie unter COMMON steht die mit COMMON SHARED deklarierte Variable in allen Modulen zur Verfügung. Innerhalb eines Moduls sorgt das Schlüsselwort SHARED außerdem dafür, dass die Variable in allen SUBs und FUNCTIONs des betreffenden Moduls sichtbar ist.

Für folgendes Beispiel müssen Sie beide Code-Teile unter dem jeweils angegebenen Namen speichern und das ganze mit fbc modul3.bas modul4.bas compilieren.

modul3.bas

DECLARE SUB unterprogramm
COMMON m1 AS INTEGER
COMMON m2 AS INTEGER

' Dies wird nach allen anderen Modulen ausgeführt
m1 = 1

PRINT "Modul 3"
PRINT "m1 = "; m1     ' m1 = 1, wie in diesem Modul gesetzt
PRINT "m2 = "; m2     ' m2 = 2, wie im Modul 4 gesetzt

unterprogramm

module4.bas

COMMON SHARED m1 AS INTEGER
COMMON SHARED m2 AS INTEGER

m2 = 2

' Dies wird zuerst ausgeführt
PRINT "Modul 4"
PRINT "m1 = "; m1     ' m1 = 0 (Standardbelegung)
PRINT "m2 = "; m2     ' m2 = 2

SUB unterprogramm
PRINT "Modul4.unterprogramm"
PRINT "m1 = "; m1     ' m1 = 1
PRINT "m2 = "; m2     ' m2 = 2
END SUB

Ausgabe:

Modul 4
m1 = 0
m2 = 2
Modul 3
m1 = 1
m2 = 2
Modul4.unterprogramm
m1 = 1
m2 = 2

EXTERN

Der Vollständigkeit halber sei die Möglichkeit erwähnt, EXTERN zu verwenden. Die Funktionsweise entspricht in etwa der von COMMON SHARED. Die Variable wird also in einem Modul deklariert und in einem anderem verwenden. Dabei ist die Variable im Modul automatisch global, auch ohne SHARED.

Doch während COMMON SHARED in jedem Modul eigenen Speicher für die Variable reserviert, zeigt EXTERN immer nur auf den Speicherbereich des Moduls, in dem die Variable auch normal deklariert wurde.

Für folgendes Beispiel müssen Sie beide Code-Teile unter dem jeweils angegebenen Namen speichern und das ganze mit fbc modul5.bas modul6.bas compilieren.

modul5.bas

DECLARE SUB unterprogramm
EXTERN m1 AS INTEGER
EXTERN m2 AS INTEGER
DIM m1 AS INTEGER
DIM m2 AS INTEGER

' Dies wird nach allen anderen Modulen ausgeführt
m1 = 1

PRINT "Modul 5"
PRINT "m1 = "; m1     ' m1 = 1, wie in diesem Modul gesetzt
PRINT "m2 = "; m2     ' m2 = 2, wie im Modul 6 gesetzt

unterprogramm
SLEEP

module6.bas

EXTERN m1 AS INTEGER
EXTERN m2 AS INTEGER

m2 = 2

' Dies wird zuerst ausgeführt
PRINT "Modul 6"
PRINT "m1 = "; m1     ' m1 = 0 (Standardbelegung)
PRINT "m2 = "; m2     ' m2 = 2

SUB unterprogramm
PRINT "Modul6.unterprogramm"
PRINT "m1 = "; m1     ' m1 = 1
PRINT "m2 = "; m2     ' m2 = 2
END SUB

Ausgabe:

Modul 6
m1 = 0
m2 = 2
Modul 5
m1 = 1
m2 = 2
Modul6.unterprogramm
m1 = 1
m2 = 2

Letzte Bearbeitung: 06.08.11
Zur Onlinefassung des Eintrags

Inline-Assembler

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 des Befehls ASM kein Problem, Assembler-Codes direkt einzubinden:

ASM mov eax, ebx
ASM imul eax, ecx

oder

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

FUNCTION Mal(BYVAL x AS INTEGER, BYVAL y AS INTEGER) AS INTEGER
ASM
mov  eax, [x] 'hole x nach eax
imul eax, [y] 'Multipliziere mit y
mov [Function], eax 'Ergebnis als Rückgabewert
END ASM
END FUNCTION

DIM AS INTEGER a = 45, b = 54
PRINT Mal(a, b)

Syntax
FreeBASIC verwendet den GCC Assembler AS, der im bin-Verzeichnis als AS.EXE enthalten ist.
Der Assembler verwendet die einfache Intel-Syntax wie die bekannteren x86 - Assembler MASM, TASM, NASM, YASM und FASM.
Wie in BASIC-Quelltexten wird das Hochkomma als Zeichen für nachfolgenden Kommentar gesetzt, nicht das ";" Zeichen wie sonst in Assemblerquelltexten üblich.
Der Assembler ist in Bezug auf Labelnamen 'case sensitive', d.h. Sie müssen die Groß- und Kleinschreibung beachten.

Registerbezeichnungen

- 4 Byte Integer Register: eax, ebx, ecx, edx, ebp, esp, edi, esi

- 2 Byte Integer Register: ax, bx, cx, dx, bp, sp, di, si (Low Word der 4 Byte e__-Register)

- 1 Byte Integer Register: al, ah, bl, bh, cl, ch, dl, dh (Low(l) oder High(h) Byte der 2 Byte _x-Register)

- Floatingpoint Register: st(0), st(1), st(2), st(3), st(4), st(5), st(6), st(7)

- MMX Register (8-Byte) : mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7

- SSE Register (16-Byte) : xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7

Kritische Assembleranweisungen
Je nach Betriebssystem oder Prozessortyp sind einige Assembleranweisungen nicht anwendbar. Im günstigsten Fall werden sie ignoriert oder mit einem Systemerror angezeigt, aber auch ein Systemcrash ist möglich.
Diese kritischen Assembleranweisungen für jedes Betriebssystem oder unterschiedliche Prozessortypen im Einzelfall aufzulisten ist zu kompliziert.
Wer in Assembler arbeiten möchte, sollte die Einschränkungen der Hardware und des Betriebssystems, für das er Assembleranweisungen schreiben möchte, kennen.

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

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 treten folgende Sprachkonstrukte auf:

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 einige 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 die der Pointer zeigt (Dereferenzierung). Auch komplexe Pointerausdrücke können 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, sodass 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

Letzte Bearbeitung: 12.12.11
Zur Onlinefassung des Eintrags

Präprozessoren

Präprozessor-Anweisungen 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; wird definiert, wenn der Code von der Win32-Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Win32 umgesetzt werden soll

__FB_DOS__

Ohne Wert; wird definiert, wenn der Code von der DOS-Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für DOS umgesetzt werden sollen

__FB_LINUX__

Ohne Wert; wird definiert, wenn der Code von der LINUX-Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für Linux umgesetzt werden sollen

__FB_XBOX__ , __FB_CYGWIN__ , __FB_DARWIN__ , __FB_FREEBSD__ , __FB_OPENBSD__ , __FB_NETBSD__

Ohne Wert; diese Symbole werden definiert, wenn der Code in der jeweiligen Version des Compilers umgesetzt wird; durch #IFDEF ist es möglich, bestimmte Codeteile nur zu kompilieren, wenn der Code für diese bestimmte Version umgesetzt werden soll.

__FB_PCOS__

-1, wenn unter einem PC-artigen Betriebssystem kompiliert wurde (z. B. DOS, Windows, OS/2, Symbian OS); sonst 0

__FB_UNIX__

-1, wenn unter einem UNIX-artigen Betriebssystem kompiliert wurde; sonst 0

__FB_MAIN__

Ohne Wert; wird definiert, sobald die DEFINE-Symbole und Makros des Hauptmoduls übersetzt 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 Compilers größer oder gleich den Spezifikationen ist, bzw. 0, wenn die Version kleiner ist.

__DATE__

ein String, der das Kompilier-Datum im Format mm-dd-yyyy enthält, z.B.: "11-15-2005"

__DATE_ISO__

ein String, der das Kompilier-Datum im Format yyyy-mm-dd enthält. Existiert erst seit 0.24 Git

__TIME__

ein String, der die Kompilier-Uhrzeit im Format hh:mm:ss enthält, z.B.: "16:05:09"

__FB_BUILD_DATE__

ein String, der das Datum, an dem der FB-Compiler erstellt wurde, im Format mm-dd-yyyy enthält

__FILE__

ein String, der den Dateinamen der Quellcode-Datei, die gerade umgesetzt wird, enthält; dies kann zur Fehlersuche eingesetzt werden

__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

__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

__PATH__

ein String, der den Namen des Verzeichnisses enthält, in dem sich die gerade umgesetzte Quellcode-Datei befindet

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

ein Integer, dessen Wert -1 ist, wenn OPTION PRIVATE verwendet wird, bzw. 0, wenn dies nicht der Fall ist

__FB_OPTION_BYVAL__

ein Integer, dessen Wert -1 ist, wenn OPTION BYVAL verwendet wird, bzw. 0, wenn dies nicht der Fall ist

__FB_OPTION_GOSUB__

ein Integer, dessen Wert -1 ist, wenn OPTION GOSUB verwendet wird, bzw. 0, wenn dies nicht der Fall ist

__FB_OUT_OBJ__

ein Integer, dessen Wert -1 ist, wenn der Code zu einer Ressource (*.obj) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird

__FB_OUT_LIB__

ein Integer, dessen Wert -1 ist, wenn der Code zur statischen Bibliothek (lib*.a oder lib*.a.dll für Importbibliotheken) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird

__FB_OUT_DLL__

ein Integer, dessen Wert -1 ist, wenn der Code zur dynamischen Bibliothek (*.dll) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert wird

__FB_OUT_EXE__

ein Integer, dessen Wert -1 ist, wenn der Code zur Executable (*.exe) kompiliert wird, bzw. 0, wenn zu einem anderen Typ kompiliert 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 der in der Kommandozeile aktivierten Fehlerbehandlungsroutine (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

__FB_SSE__

ohne einen Wert; wird definiert, wenn der Compiler 'SSE floating point arithmetics' kompiliert wurde (-fpu SSE)

__FB_FPU__

enthält "sse", wenn mit 'SSE floating point arithmetics' kompiliert wurde, ansonsten "x87"

__FB_FPMODE__

der mittels -fpmode eingestellte Wert ("fast" oder "precise")

__FB_VECTORIZE__

das mittels -vec eingestellte Level (0, 1 oder 2)

__FB_BACKEND__

das mittels -gen eingestellte Backend ("gas" oder "gcc")

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.

Beispiel:

#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 Bogenmass=" &deg2rad(180) ' Ausgabe: 3.141592654
PRINT "Pi in Grad=" &rad2deg(Pi) ' 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
DIM 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.

Letzte Bearbeitung: 01.10.11
Zur Onlinefassung des Eintrags

Schleifen

Schleifen sind Programmteile, die (vielfach) wiederholt werden; die Anzahl der Wiederholungen ist in der Regel an Bedingungen geknüpft (z. B. "Wiederhole, bis a den Wert 10 hat"), sogenannte Endlosschleifen sind aber ebenso möglich.

Verschiedene Schleifentypen:

Einfache Bedingungsschleife: WHILE ... WEND
Der Codeblock zwischen WHILE und WEND wird so lange wiederholt, wie die Bedingung hinter WHILE erfüllt ist. Wenn die Bedingung beim Start eines neuen Schleifendurchlaufs nicht mehr erfüllt ist, wird die Schleife verlassen.

WHILE bedingung
anweisungen
WEND

Die Bedingung wird vor dem Schleifendurchlauf geprüft. Ist die Bedingung schon vor dem ersten Schleifendurchlauf nicht erfüllt, dann wird die Schleife gar nicht erst betreten.

Erweiterte Bedingungsschleife: DO ... LOOP
Ähnlich wie bei WHILE...WEND wird bei jedem Schleifendurchlauf überprüft, ob die Bedingung erfüllt ist und ob die Schleife ein weiteres Mal durchlaufen werden soll. Die Bedingung kann am Beginn oder am Ende der Schleife überprüft werden:

DO {WHILE | UNTIL} bedingung
anweisungen
LOOP

oder

DO
anweisungen
LOOP {WHILE | UNTIL} bedingung

Im ersten Fall ist es möglich, dass die Schleife gar nicht betreten wird, im zweiten Fall wird sie auf jeden Fall mindestens einmal durchlaufen.
Das Schlüsselwort WHILE (zu deutsch "während") gibt an, dass die Schleife so lange durchlaufen wird, wie die Bedingung erfüllt ist. Damit funktioniert DO WHILE bedingung ... LOOP exakt genauso wie WHILE bedingung ... WEND.
Wird stattdessen UNTIL (zu deutsch "bis") verwendet, dann wird die Schleife so lange ausgeführt, bis die Bedingung erfüllt ist. Da es sich bei beiden Varianten genau um die Gegenereignisse handelt, können sie problemlos gegeneinander ausgetauscht werden. Welche Variante bevorzugt wird, hängt weitgehend vom persönlichen Geschmack ab und davon, welche Variante in der aktuellen Situation besser lesbar erscheint.
Ebenso ist es möglich, überhaupt keine Bedingung zu prüfen, und somit eine Endlosschleife zu erzeugen:

DO
staendig_wiederholter_Programmcode
LOOP

Endlosschleifen sollten unbedingt eine andere Möglichkeit zum Verlassen besitzen (s. u.: "Kontrollanweisungen"), da der Benutzer das Programm sonst nicht auf normalem Weg beenden kann.

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.

FOR zaehler [AS datentyp] = startwert TO endwert [STEP schrittweite]
anweisungen
NEXT

Zu Beginn der Schleife wird der Zähler auf den Startwert gesetzt. Sobald der Befehl NEXT erreicht wird, wird der Zähler um die angegebene Schrittweite erhöht - wurde keine Schrittweite angegeben, dann erhöht sich der Zähler um 1. Anschließend wird der Zähler mit dem Endwert verglichen und die Schleife gegebenenfalls verlassen.

Kontrollanweisungen

Für den Fall, dass eine Schleife nicht regulär von Anfang bis Ende durchlaufen werden soll, stehen zwei Kontrollanweisungen zur Verfügung:

In der Schleife fortfahren: CONTINUE
CONTINUE {WHILE | DO | FOR} überspringt den Rest des Schleifeninhalts und springt direkt an das Ende der Schleife. Dort wird wie gewohnt die Überprüfung der Schleifenbedingung vorgenommen. In einer FOR-Schleife wird nach einem CONTINUE FOR auch der Zähler erhöht.

Die Schleife verlassen: EXIT
EXIT {WHILE | DO | FOR} verlässt die Schleife und fährt mit dem nächsten Befehl nach dem Schleifenende fort.

Gültigkeit von Variablen

Schleifen erzeugen eigene SCOPE-Blöcke, d. h. es ist möglich, innerhalb einer Schleife Variablen zu definieren, die dann nur innerhalb dieser Schleife gültig sind. Beachten Sie, dass diese Variablen auch nicht als Schleifenbedingung abgefragt werden können, da sie an dieser Stelle bereits nicht mehr definiert sind (eine Ausnahme bildet der Zähler der FOR-Schleife).

Näheres zu SCOPE-Blöcken und zu den Gültigkeitsbereichen von Variablen finden Sie im zugehörigen Referenzartikel.

Letzte Bearbeitung: 07.08.11
Zur Onlinefassung des Eintrags

Operatoren

... (Auslassung[Ellipsis])

Die drei Auslassungspunkte werden anstelle von Prozedur-Parametern benutzt, um eine variable Anzahl von Argumenten zu übergeben.

Prozeduren
Die Auslassung (drei Punkte "...") wird in Prozedur-Deklarationen und Definitionen benutzt, um eine variable Argumentliste anzugeben. Das erste Argument muss immer angegeben werden, und die Prozedur muss mit der 'C calling convention' CDECL aufgerufen werden.

Beispiel:

DECLARE FUNCTION FOO CDECL (X AS INTEGER, ...) AS INTEGER

Arrays
Seit der Version 0.21 können Auslassungen auch bei der Deklaration von Arrays verwendet werden. So kann die Größe von Arrays durch die Initialisierung festgelegt werden.

Beispiel:

DIM a(1 TO ...) AS INTEGER = {1,2,3,4}

Macros
Seit der SVN-Version 0.22 können Auslassungen in Macros (#DEFINE, #MACRO) verwendet werden, um Macros mit variabler Parameteranzahl zu erstellen. Siehe dazu die entsprechenden Artikel.

Unterschiede zu QuickBASIC:
- neu in FreeBASIC

Siehe auch:
CDECL, VA_ARG, VA_FIRST, VA_NEXT

Letzte Bearbeitung: 17.10.10
Zur Onlinefassung des Eintrags

At

Syntax: @ { Variable | Stringkonstante | Prozedur }
Typ: Operator
Kategorie: Speicherverwaltung

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

@ kann mithilfe von OPERATOR überladen werden.

Beispiel 1:

DIM AS INTEGER a, b
DIM AS INTEGER PTR addr

a = 5
b = 10

PRINT "Der Wert von a ist ";a;
PRINT "; er ist gespeichert an Adresse ";@a
PRINT "Der Wert von b ist ";b;
PRINT "; 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."
PRINT "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
DO
i = VAL(INPUT(1))
LOOP UNTIL i < 3
PRINT
PRINT "Du hast "; *YesNoMaybe(i); " gesagt."
SLEEP

Möglich ist auch die Verwendung dieses Operators mit Prozeduren:

DECLARE SUB Morgen ()
DECLARE SUB Mittag ()
DECLARE SUB Nacht  ()

RANDOMIZE TIMER

SCREENRES 320, 200

DIM Tageszeit(2) AS SUB ()
DIM AS INTEGER i

Tageszeit(0) = @Morgen()
Tageszeit(1) = @Mittag()
Tageszeit(2) = @Nacht()

i = RND * 3
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

Die Verwendung mit Prozeduren stellt auch die Grundlage für Callbacks dar.

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
* (Wert von), [ ] (Pointer-Indizierung), Pfeil, VARPTR, PROCPTR, STRPTR, SADD, Pointer

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Ausrufezeichen

Das Ausrufezeichen ! aktiviert die Verwendung von Escape-Zeichen in Strings. Dadurch werden in FreeBASIC Backslashes ("\", ASCII-Code 92) als Escape-Zeichen verwendet. Der Ausdruck hinter dem Escape-Zeichen wird nicht 1:1 ausgegeben, sondern zuerst interpretiert. Folgt dem Zeichen eine Zahl, so funktioniert das Zeichen wie ein CHR; anstelle der Zahl wird das zugehörige ASCII-Zeichen ausgegeben. Die Zahl kann in jedem beliebigen Zählsystem angegeben werden, wenn das Präfix &? verwendet wird (z.B. &h für hexadezimal).

Außerdem werden folgende Strings von FreeBASIC gesondert behandelt:

- \r wie ein CHR(13) (carriage-return)

- \n und \l wie ein CHR(10) (line-feed). \r\n ergibt also ein CRLF, unter Windows die 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)

- \" wie ein CHR(34) (Doppeltes Anführungszeichen ")

- \' wie ein CHR(39) (Einfaches Anführungszeichen ')

- Alle anderen Zeichen hinter dem Escape-Zeichen werden so interpretiert, wie sie im Ausdruck stehen. \\ wird also zu \.

Beispiel:

#IF __FB_PCOS__
#DEFINE NEWLINE !"\r\n"  ' Windows-Zeilenumbruch
#ELSEIF __FB_UNIX__
#DEFINE NEWLINE !"\n"    ' UNIX/Linux-Zeilenumbruch
#ELSE
#ERROR "Fehler: Plattform nicht unterstützt"
#ENDIF

DIM AS STRING meldung

meldung = !"\45 Das ist die \"erste\" Zeile\r\nDas "
meldung &= !"ist die \"zweite\" Zeile \45"
PRINT meldung

PRINT NEWLINE & "^-- NEWLINE --v" & NEWLINE;
SLEEP

Ausgabe:

- Das ist die "erste" Zeile
Das ist die "zweite" Zeile -

^-- CRLF --v

Das Ausrufezeichen arbeitet als Preprozessor. Es kann nur vor in Anführungszeichen gesetzten Zeichenketten eingesetzt werden, nicht jedoch vor Variablen o. ä. Folgendes Beispiel wird daher einen Compilier-Fehler erzeugen:

DIM AS STRING text = "Text mit einem\r\nZeilenumbruch"
PRINT !text    ' nicht erlaubter Aufruf!!

Bis FreeBASIC v0.16 war es möglich, den Compiler dazu anzuweisen, generell in allen Strings die Escape-Sequenzen zu interpretieren. Dazu wurde die Anweisung OPTION ESCAPE eingesetzt. Um anschließend Strings zu kennzeichnen, deren Inhalt nicht interpretiert werden sollte, wurde vor diese Strings ein Dollarzeichen $ gesetzt. Seit FreeBASIC v0.17 ist OPTION ESCAPE jedoch nur noch in der Dialektform -lang deprecated erlaubt. Das Dollarzeichen kann zwar weiter verwendet werden, hat aber ohne OPTION ESCAPE keine praktische Auswirkung mehr.

Unterschiede zu QB: neu in FreeBASIC

Letzte Bearbeitung: 05.08.11
Zur Onlinefassung des Eintrags

Backslash

Syntax A: Wert = Ausdruck1 \ Ausdruck2
Syntax B: Ausdruck1 \= Ausdruck2
Typ: Operator
Kategorie: mathematische Operatoren

Das Backslash-Zeichen kann in FreeBASIC zur einfachen (Syntax A) oder kombinierten (Syntax B) Integerdivision eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 \ Ausdruck2

Der Backslash bewirkt die Integerdivision zweier Argumente; der Rückgabewert ist der kommastellenlose Quotient aus 'Ausdruck1' und 'Ausdruck2'. Die Argumente dürfen Zahlen, numerische Konstanten, numerische Variablen und numerische Rückgabewerte von Funktionen sein. Der Rückgabewert einer Division ist immer INTEGER, selbst wenn das Ergebnis der Division Nachkommastellen hätte. Die Nachkommastellen werden dabei abgeschnitten (vgl. INT). Bei Berechnungen mit Variablen wird die Integerdivision allerdings wesentlich schneller berechnet als die normale Division; sie sollte daher immer benutzt werden, wenn ohnehin nur mit Integers gerechnet wird.

Wird die Integerdivision mit Fließkommawerten als Argumenten benutzt, so werden diese zuerst mithilfe von CINT mathematisch gerundet.

Die Integerdivision kann mithilfe von OPERATOR überladen werden.

Beispiel:

DIM n AS DOUBLE
n = 7 \ 2.6  '' => 7 \ 3  => 2.33333  => 2
PRINT n
n = 7
n \= 2.4  '' => 7 \ 2 => 3.5 => 3
PRINT n
SLEEP

Ausgabe:

2
3

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
mathematische Funktionen, Slash, MOD, INT

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

Das '#'-Zeichen

Befehle, die mit einem '#' beginnen, werden als Präprozessor-Anweisungen oder auch Meta-Befehle bezeichnet. Präprozessor-Anweisungen werden an den Compiler geschickt, um zu bestimmen, was kompiliert werden soll und wie. Sie können benutzt werden, um einen bestimmten Anweisungsblock nur bei bestimmten Bedingungen auszuführen, damit das Programm plattformunabhängig kompiliert werden kann, inkl. der Header- oder anderen Quell-Dateien. Es können kleine ein- oder mehrzeilige Makros definiert werden, oder es lässt sich ändern, wie der Compiler Variablen behandelt.

Außerdem wird das Zeichen '#' eingesetzt, um festzulegen, dass ein Schreib- bzw. Lesezugriff auf eine Datei stattfinden soll. In diesen Anweisungen steht das '#' jedoch nie am Anfang der Zeile.

Siehe auch:
Präprozessor-Anweisungen, Präprozessoren, PRINT #, INPUT #, OPEN

Letzte Bearbeitung: 04.09.10
Zur Onlinefassung des Eintrags

Das '?'-Zeichen

In den frühen Basic-Versionen gab es zur Eingabevereinfachung die Möglichkeit, den PRINT-Befehl mit dem Zeichen '?' abzukürzen. Das machte auch Sinn, da es meistens Interpreter waren. Seit Version 0.15b ist dies auch in FreeBASIC möglich. Das '?' kann sowohl als normale PRINT-Anweisung als auch in ? #DateiNr,.. benutzt werden.

Beispiel:

PRINT "Hallo"
? "Wie geht es dir?"
SLEEP 'Wartet auf Tastendruck vor dem Beenden

Siehe auch:
PRINT (Anweisung), PRINT (Datei), PRINT USING

Letzte Bearbeitung: 04.09.10
Zur Onlinefassung des Eintrags

Dollarzeichen

Das Dollarzeichen $ deaktiviert die Verwendung von Escape-Zeichen in Strings.

Üblicherweise werden Escape-Sequenzen in Strings nicht interpretiert. Um sie verwenden zu können, muss dem String, der die Escape-Zeichen enthält, ein Ausrufezeichen vorangestellt werden. Näheres zu den Escape-Sequenzen finden Sie im Referenzeintrag Ausrufezeichen.

Bis FreeBASIC v0.16 war es möglich, den Compiler mit OPTION ESCAPE dazu anzuweisen, generell in allen Strings die Escape-Sequenzen zu interpretieren. Um anschließend Strings zu kennzeichnen, deren Inhalt nicht interpretiert werden sollte, wurde vor diese Strings ein Dollarzeichen $ gesetzt. Seit FreeBASIC v0.17 ist OPTION ESCAPE jedoch nur noch in der Dialektform -lang deprecated erlaubt. Das Dollarzeichen kann zwar weiter verwendet werden, hat aber ohne OPTION ESCAPE keine praktische Auswirkung mehr.

Beispiel:

#LANG "deprecated"

OPTION ESCAPE  ' Escape-Sequenzen generell interpretieren
PRINT "Der Pfad lautet \34" $"C:\FREEBASIC\33a" "\34"
SLEEP

Ausgabe:

Der Pfad lautet "C:\FREEBASIC\33a"

In der Pfadangabe wurden die Escape-Sequenzen nicht ausgewertet; ansonsten hätten anstelle der beiden Backslashes im Pfad jeweils doppelte Backslashes stehen müssen, um die gewünschte Ausgabe zu erhalten.

Das Dollarzeichen arbeitet wie das Ausrufezeichen als Preprozessor. Es kann nur vor in Anführungszeichen gesetzten Zeichenketten eingesetzt werden, nicht jedoch vor Variablen o. ä. Folgendes Beispiel wird daher einen Compilier-Fehler erzeugen:

DIM AS STRING text = !"Text mit einem\r\nZeilenumbruch"
PRINT $text    ' nicht erlaubter Aufruf!!

Unterschiede zu QB: neu in FreeBASIC

Letzte Bearbeitung: 05.08.11
Zur Onlinefassung des Eintrags

Doppelpunkt

- Ein Label ist durch einen abschließenden Doppelpunkt gekennzeichnet; siehe GOTO, RESTORE.

- In UDT's wird nach einem Doppelpunkt die Anzahl benutzter Bits der Variable angegeben; siehe Bitfelder.

- Der Doppelpunkt wird verwendet, um Stunden, Minuten und Sekunden voneinander zu trennen, wenn Zeitwerte formatiert werden; siehe FORMAT, SETTIME.

- Ein Doppelpunkt trennt mehrere Basicanweisungen in einer Zeile; siehe unten.

Beispiel für mehrere Basicanweisungen in einer Zeile:

PRINT "Hi, "; : PRINT "ich bin ein Text" : SLEEP

Diese Art der Verwendung kann den Code aber auch sehr unübersichtlich machen. Deswegen sollte man möglichst darauf verzichten und für jede Anweisung eine neue Zeile beginnen.

Letzte Bearbeitung: 25.02.12
Zur Onlinefassung des Eintrags

Eckige Klammern

Die eckigen Klammern können in FreeBASIC für zwei Sprachkonstrukte eingesetzt werden:

- String-Indizierung

- Pointer-Indizierung

String-Indizierung
Syntax: Stringvariable[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(Stringvariable) - 1

reichen; andernfalls können die Ergebnisse nicht vorhergesagt werden, da ein Zugriff auf Speicherbereiche auftritt, der nicht mehr zur STRING-Variable gehört, evtl. sogar nicht mehr zum Speicherbereich des laufenden Programms.

Beispiel:

DIM txt AS STRING = "Hallo, world!"
DIM i AS INTEGER
txt[1] = 101  ' im zweiten Buchstaben a durch e tauschen
FOR i = 0 TO LEN(txt) - 1
PRINT CHR(txt[i]);
NEXT
SLEEP

Ausgabe:

Hello, World!

Pointerindizierung
Syntax: Pointer[index]
Die Pointerindizierung ermöglicht mittels eines Index den Zugriff auf eine Adresse relativ zur Adresse, auf die ein Pointer zeigt. 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 selbst sicherstellen, dass der Pointer auf sinnvolle Adressen zeigt.

Beispiel:

DIM a(10) AS INTEGER
DIM pa AS INTEGER PTR

FOR i AS INTEGER = 0 TO 10
' Das Array mit den Werten von 0 bis 10 befüllen
a(i) = i
NEXT i
pa = @a(0)

' Den Inhalt des Arrays ausgeben:
FOR i AS INTEGER = 0 TO 10
PRINT pa[i]
NEXT i
SLEEP

Ausgabe:

0
1
2
3
4
5
6
7
8
9
10

Unterschiede zu QB: neu in FreeBASIC

Siehe auch: Addition und Subtraktion bei Pointern

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Exp

Syntax A: Wert = Ausdruck1 ^ Ausdruck2
Syntax B: Ausdruck1 ^= Ausdruck2
Typ: Operator
Kategorie: mathematische Operatoren

Das Exponent-Zeichen kann in FreeBASIC zur einfachen (Syntax A) und kombinierten (Syntax B) Potenzrechnung eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 ^ Ausdruck2

Dieser Operator gibt die Potenz mit Basis 'Ausdruck1' und Exponent 'Ausdruck2' zurück. Potenzierung bedeutet, dass 'Ausdruck1' so oft mit sich selbst multipliziert wird, wie in 'Ausdruck2' angegeben ist.

2 ^ 3

entspricht also

2 * 2 * 2

Wenn der Exponent eine Gleitkommazahl ist, wird eine Wurzel gezogen.

2 ^ (1 / 3)

entspricht also der dritten Wurzel ("Kubikwurzel") aus 2. Die Argumente dürfen Zahlen, numerische Konstanten, numerische Variablen und numerische Rückgabewerte von Funktionen sein.
Beachten Sie: Der Operator ^ ist ein sehr rechenintensiver Operator!

Das Exponent-Zeichen kann mithilfe von OPERATOR überladen werden.

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

Hinweis: Es kann nicht garantiert werden, dass die erzielten Ergebnisse in allen Stellen exakt ist. In den letzten signifikanten Bits der Ergebniszahl kann es zu Ungenauigkeiten kommen.

Unterschiede zu QB: Keine

Siehe auch:
mathematische Funktionen, LOG, EXP

Letzte Bearbeitung: 06.07.10
Zur Onlinefassung des Eintrags

Geschweifte Klammern

Geschweifte Klammern werden in FreeBASIC zur Array-Initialisierung verwendet.

Initialisierung von Arrays
Arrays (auch Felder oder Matrizen) werden mit der DIM-Anweisung aufgeteilt. So bezeichnet

DIM AS INTEGER feld(3, 3)

ein 4x4 Elemente großes Array (FreeBASIC benutzt automatisch 0 als Untergrenze).
Die Ober- und Untergrenze kann dabei mit dem Schlüsselwort TO explizit festgelegt werden:

DIM AS INTEGER feldA(1 TO 3, 1 TO 3), feldB(3 TO 7)

'feldA' ist hier ein Array mit 3x3 Elementen, 'feldB' ein Array mit 5 Elementen.
Die einzelnen Feldelemente können mit einer direkten Zuweisung oder mittels DATA-Anweisung(en) initialisiert werden, was aber auf dasselbe Prinzip hinausläuft.
Es geht aber auch anders. Im Beispiel handelt es sich u. a. um ein Array von 3 Zeilen und 3 Spalten. Dies muss dem Compiler lediglich mitgeteilt werden. Dazu dienen die geschweiften Klammern (curly brackets) {}. Jede Zeile wird dabei von geschweiften Klammern begrenzt. In einem mehrdimensionalen Array wird die ganze Matrix ebenfalls von geschweiften Klammern umschlossen. Die einzelnen Einträge sowie die Zeilen werden durch Kommata getrennt.
Soll das Array 'feldA' die Elemente

1 2 3
4 5 6
7 8 8

enthalten und 'feldB' die Zahlen von 1 bis 5, dann sieht die DIM-Anweisung so aus:

DIM AS INTEGER feldA(1 TO 3, 1 TO 3) = { _
{1, 2, 3}, _
{4, 5, 6}, _
{7, 8, 8} _
}
DIM AS INTEGER feldB(3 TO 7) = {1, 2, 3, 4, 5}

(Die Aufteilung auf mehrere Zeilen dient hier zwar nur zur Übersicht, ist aber auch allgemein zu empfehlen.)

Letzte Bearbeitung: 04.08.10
Zur Onlinefassung des Eintrags

Minus

Syntax A: Wert = Ausdruck1 - Ausdruck2
Syntax B: Ausdruck1 -= Ausdruck2
Syntax C: Wert = -Ausdruck2
Typ: Operatoren
Kategorie: mathematische Operatoren / Speicherverwaltung

Das Minus-Zeichen kann in FreeBASIC zur Subtraktion (Syntax A und B) und zur Negation (Syntax C) eingesetzt werden. Bei Syntax B handelt es sich um eine kombinierte Subtraktion; dies ist die Kurzform für

Ausdruck1 = Ausdruck1 - Ausdruck2

Sowohl die Subtraktion als auch die Negation kann mithilfe von OPERATOR überladen werden.

Subtraktion zweier Zahlen
Wert = Ausdruck1 - Ausdruck2
Ausdruck1 -= Ausdruck2
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, numerische Konstanten, numerische Variablen, und numerische Rückgabewerte von Funktionen sein. Subtraktion ist die Gegenfunktion zu Addition.

Beispiel:

DIM AS BYTE n
n = 120 - 119
n -= 10
PRINT n
SLEEP

Ausgabe:

-9

Subtraktion an Pointern
neuerPointer = alterPointer - Wert
Pointer -= Wert
Subtraktion an Pointern ermöglicht, 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:

DIM a(10) AS INTEGER
DIM pa AS INTEGER PTR
DIM i AS INTEGER

FOR i = 0 TO 10
' Das Array mit Werten von 0 bis 10 befüllen
a(i) = i
NEXT

' Einen Pointer auf das Ende des Arrays setzen
pa = @a(10)

FOR i = 0 TO 10
' Den Wert ausgeben, auf den der Pointer gerade zeigt:
PRINT *pa;
' den Pointer um eine INTEGER-Stelle verschieben:
pa -= 1
NEXT

Ausgabe:

10 9 8 7 6 5 4 3 2 1 0

Erläuterung: 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.

Negation
Wert = -Ausdruck
Dieser Operator gibt den negativen Wert des Arguments zurück, ändert also das Vorzeichen. 'Ausdruck' kann eine Zahl, eine numerische Konstante, eine numerische Variable oder ein numerischer 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:

- Kombinierte Operatoren sind neu in FreeBASIC.

- Addition an Pointern ist neu in FreeBASIC.

Unterschiede zu früheren FreeBASIC-Versionen:
Bei der Subtraktion an Pointern wird die automatische Multiplikation erst seit v0.14 durchgeführt; davor musste der Programmierer selbst sicherstellen, dass Pointer weit genug verschoben wurden.

Siehe auch:
mathematische Funktionen, Pointer

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

Pfeil

Syntax: UDT_Pointer->Feldname
Typ: Operator
Kategorie: Speicherverwaltung

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)

Der Operator kann mithilfe von OPERATOR überladen werden.

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

Unterschiede zu früheren Versionen von FreeBASIC:
Die Feld-Dereferenzierung ist erst seit FreeBASIC v0.13 möglich.

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht dieser Operator nicht zur Verfügung.

Siehe auch:
TYPE (UDT), TYPE (Funktion), WITH, OFFSETOF, . (Feldzugriff), @ (Adresse von), * (Wert von)

Letzte Bearbeitung: 20.06.10
Zur Onlinefassung des Eintrags

Plus

Syntax A: Wert = Ausdruck1 + Ausdruck2
Syntax B: Ausdruck1 += Ausdruck2
Typ: Operatoren
Kategorie: mathematische Operatoren / Speicherverwaltung

Das Plus-Zeichen kann in FreeBASIC zur einfachen (Syntax A) und kombinierten (Syntax B) Addition eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 + Ausdruck2

Je nach Datentyp der Ausdrücke bewirkt die Addition unterschiedliches. Zahlen werden wie gewohnt addiert, Strings werden aneinander gehängt. Außerdem gibt es auch die Möglichkeit, zu einem Pointer zu addieren.

Das Plus-Zeichen kann mithilfe von OPERATOR überladen werden.

Addition zweier Zahlen
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, numerische Konstanten, numerische Variablen, und numerische Rückgabewerte von Funktionen sein. Addition ist die Gegenfunktion zu Subtraktion.

Beispiel:

DIM AS SINGLE n
n = 4.54 + 5.46
n += 7.5
PRINT n
SLEEP

Ausgabe:

17.5

Stringverkettung
Verkettet zwei Strings zu einem, in dem auf den Inhalt von String1 der von String2 folgt. Dieses Konstrukt funktioniert mit Strings, ZStrings und WStrings. Zur Stringverkettung kann auch das Zeichen & verwendet werden.

Beispiel:

DIM AS STRING a, c
a = "HELLO,"
a += " WORLD"
c = a + "!"
PRINT c
SLEEP

Ausgabe:

HELLO, WORLD!

Addition an Pointern
Addition an Pointern ermöglicht, 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:

DIM a(10) AS INTEGER
DIM pa AS INTEGER PTR
DIM i AS INTEGER

' Das Array mit Werten von 0 bis 10 befüllen
FOR i = 0 TO 10
a(i) = i
NEXT

' Einen Pointer auf den Beginn des Arrays setzen
pa = @a(0)

FOR i = 0 TO 10
' Den Wert ausgeben, auf den der Pointer gerade zeigt:
PRINT *pa;
' den Pointer um eine INTEGER-Stelle verschieben:
pa += 1
NEXT
SLEEP

Ausgabe:

0 1 2 3 4 5 6 7 8 9 10

Erläuterung: 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:

- Kombinierte Operatoren sind neu in FreeBASIC.

- Addition an Pointern ist neu in FreeBASIC.

Unterschiede zu früheren FreeBASIC-Versionen:
Bei der Addition an Pointern wird die automatische Multiplikation erst seit v0.14 durchgeführt; davor musste der Programmierer selbst sicherstellen, dass Pointer weit genug verschoben wurden.

Siehe auch:
mathematische Funktionen, Und (et-Ligatur), Pointer

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

Punkt

Syntax: UDTBezeichner.Feldname
Typ: Operator
Kategorie: Speicherverwaltung

Der Punkt (Feld-Operator) wählt für die angegebene Operation ein Feld aus einer Variable eines benutzerdefinierten Typs (siehe: TYPE (UDT)).

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:

#LANG "qb"
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

SLEEP

Unterschiede zu QB: keine

Siehe auch:
TYPE (UDT), TYPE (Funktion), WITH, -> (Pointer-Dereferenzierung), @ (Adresse von), * (Wert von)

Letzte Bearbeitung: 20.06.10
Zur Onlinefassung des Eintrags

Runde Klammern

Die runden Klammern werden in FreeBASIC für zwei Sprachkonstrukte verwendet:

- Reihenfolge der Abarbeitung der Glieder eines Ausdrucks

- 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 Hierarchie der Operatoren:

- Klammern ()

- Potenzierung (^)

- Negierung (-)

- Division (/)

- Multiplikation (*)

- Integerdivision (\)

- Addition, Subtraktion (+, -)

- Vergleiche (=, <>, <, >, <=, >=)

- logische Operatoren (NOT, AND, OR, XOR, EQV, IMP)

- ANDALSO, ORELSE

- Wertzuweisung (=)

Dementsprechend kommen folgende Werte zustande:

PRINT (3 + 4) * 5
PRINT -(1 + 1) ^ 2
PRINT (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(1 TO 10)
'     ^           ^       ^
'     |           |       +-- Anzahl der Elemente
'     |           +---------- Bezeichner des Arrays
'     +---------------------- Datentyp des Arrays

Diese Zeile legt das Verhalten des Arrays im Wesentlichen fest.
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 dieselben 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)
SLEEP

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:

RANDOMIZE TIMER

SCREENRES 320, 200

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

SLEEP

Es ist möglich, ganze Arrays an eine Prozedur zu übergeben. Dazu wird als Parameter der Bezeichner des Arrays übergeben, gefolgt von den runden Klammern, jedoch ohne Angabe von Indizes, aber immer mit Typ.

Beispiel 4: Übergabe eines Arrays an eine Prozedur:

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()
SLEEP

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Slash

Syntax A: Wert = Ausdruck1 / Ausdruck2
Syntax B: Ausdruck1 /= Ausdruck2
Typ: Operator
Kategorie: mathematische Operatoren

Das Slash-Zeichen kann in FreeBASIC zur einfachen (Syntax A) oder kombinierten (Syntax B) Division eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 / Ausdruck2

Der Slash bewirkt die Division zweier Argumente; der Rückgabewert ist der Quotient aus 'Ausdruck1' und 'Ausdruck2'. Die Argumente dürfen Zahlen, numerische Konstanten, numerische Variablen, und numerische Rückgabewerte von Funktionen sein. Der Rückgabewert einer Division ist immer DOUBLE. Division ist die Gegenfunktion zu Multiplikation.

Die Division kann mithilfe von OPERATOR überladen werden.

Beispiel 1:

DIM AS SINGLE n, m
n = 24 / 6
m = n / -8
PRINT n, m
SLEEP

Ausgabe:

4            -0.5

Beispiel 2:

DIM n AS DOUBLE
n = 25
n /= 2
PRINT n
SLEEP

Ausgabe:

12.5

Unterschiede zu QB:
Kombinierte Operatoren sind neu in FreeBASIC.

Siehe auch:
mathematische Funktionen, Backslash

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

Stern

Syntax A: Wert = Ausdruck1 * Ausdruck2
Syntax B: Ausdruck1 *= Ausdruck2
Syntax C: *{Pointervariable | Pointerfunction} [ = expression ]
Typ: Operator
Kategorie: mathematische Operatoren / Speicherverwaltung

Das Stern-Zeichen kann in FreeBASIC zur Multiplikation (Syntax A und B) und zur Pointer-Dereferenzierung (Syntax C) eingesetzt werden.

Multiplikation
Wert = Ausdruck1 * Ausdruck2
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, numerische Konstanten, numerische Variablen, und numerische Rückgabewerte von Funktionen sein. Multiplikation ist die Gegenfunktion der Division.

Die kombinierte Multiplikation Ausdruck1 *= Ausdruck2 ist eine Kurzform von Ausdruck1 = Ausdruck1 * Ausdruck2.

Die Multiplikation kann mithilfe von OPERATOR überladen werden.

Beispiel 1:

DIM n AS DOUBLE
n = 4 * 5
PRINT n
SLEEP

Ausgabe:

20

Unterschiede zu QB: Keine

Beispiel 2:

DIM n AS DOUBLE
n = 6
n *= n
PRINT n
SLEEP

Ausgabe:

36

Pointer-Dereferenzierung
*{Pointervariable | Pointerfunction} [ = expression ]
Durch die Pointer-Dereferenzierung wird auf einen Wert im Speicher zugegriffen, auf den ein Pointer zeigt. Der Zugriff kann sowohl zum Lesen als auch zum Schreiben erfolgen. Der '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 *

DIM a AS INTEGER
DIM pa AS INTEGER PTR

' @ wird benutzt, um pa auf a zeigen zu lassen.
' 'a' ist in diesem Fall eine normale Integer-Variable:
pa = @a

a = 9 ' 'a' erhält den Wert 9.

' Den Wert mittels seiner Adresse anzeigen:
PRINT "Der Wert von 'a' ist"; *pa

' An die Adresse des Pointers einen neuen Wert schreiben:
*pa = 1
' Den neuen Wert von 'a' anzeigen:
PRINT "Der neue Wert von 'a' ist"; a

Ausgabe:

Der Wert von 'a' ist 9
Der neue Wert von 'a' ist 1

Unterschiede zu QB:

- Kombinierte Operatoren sind neu in FreeBASIC

- Pointer-Dereferenzierung ist neu in FreeBASIC

Siehe auch:
mathematische Funktionen, At (@), Pointer

Letzte Bearbeitung: 26.06.10
Zur Onlinefassung des Eintrags

Und (et-Ligatur)

Syntax A: Ergebnis = Ausdruck1 & Ausdruck2
Syntax B: Ausdruck1 &= Ausdruck2
Typ: Operator
Kategorie: Stringmanipulation

& kann zur Stringverkettung (Syntax A) und kombinierter Stringverkettung (Syntax B) eingesetzt werden. Syntax B ist eine Kurzform von

Ausdruck1 = Ausdruck1 & Ausdruck2

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, numerische Konstanten, (Z/W)Stringvariablen und numerische Variablen, (Z/W)String- und numerische Rückgabewerte von Funktionen sein. UDTs können nur verwendet werden, wenn sie eine CAST-Methode für Strings bereitstellen (siehe OPERATOR).

Beispiel 1:

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

Beispiel 2:

DIM s AS STRING
s = "HELLO"
s &= " WORLD "
s &= 15
PRINT s
SLEEP

Ausgabe:

HELLO WORLD 15

Anmerkung: Zwischen dem Variablennamen und dem Zeichen '&' bzw. '&=' MUSS ein Leerzeichen
stehen, damit der Compiler das '&' nicht irrtümlicherweise als Suffix für den Variablennamen hält und es bei der Übersetzung bemängelt. Ähnliches gilt auch VOR dem Dateinamen, nur wäre es dann eben ein Prefix(allerdings nicht bei allen Buchstaben, bei "y" z.b. nicht, wohl aber bei "h", "o" und "b")
Unterschiede zu QB: Neu in FreeBASIC

Unterschiede zu früheren FreeBASIC-Versionen: Existiert erst seit FreeBASIC v0.15b

Siehe auch:
Plus

Letzte Bearbeitung: 24.08.10
Zur Onlinefassung des Eintrags

Zeilenfortsetzungszeichen _

In vielen Codes (auch in der Befehlsreferenz) befindet sich das Zeichen '_' am Zeilenende. Damit wird dem Compiler mitgeteilt, dass die folgende Zeile Bestandteil der vorangegangenen ist. Der Vorteil ist, dass lange Zeilen (z.B. bei API-Aufrufen) in übersichtliche Pakete aufgeteilt werden können. So kann ein Funktionsaufruf z.B. ausführlich dokumentiert werden, da nach dem '_' immer noch das REM-Zeichen ' angefügt werden kann (gefolgt von einem Kommentar):

FUNCTION InputLn(BYVAL s AS STRING, _ 'Meldungs-String
BYVAL Sys AS STRING="$", _ 'Mit diesem Zeichen kann der Eingabe-Typ festgelegt werden
BYVAL Upper AS INTEGER=1=0, _ 'Flag, zur automatischen Umwandlung der Eingabe in Großbuchstaben
BYVAL pw AS STRING="", _ 'hier kann ein Zeichen zu Passwortmaskierung stehen
BYVAL AddLf AS INTEGER=1=1, _ 'Flag, um nach der Eingabe ein LF(neue Zeile) einzufügen oder nicht
BYVAL Comma AS STRING=",", _ 'falls gewünscht, alternatives Zeichen für '.' übergeben
BYVAL Edit AS STRING="" _ 'hier kann ein zu editierender String übergeben werden
) AS STRING  '¸2007 by Autor ohne jede Garantie ...

Mal abgesehen davon, dass in einer einzigen Zeile diese auch ziemlich lang wäre, gäbe es keine Möglichkeit, die einzelnen Parameter mittels ' zu kommentieren, da der Compiler alle Zeichen nach dem ' (dieses einschließlich) ignorieren würde. Die Folge wären Syntax-Fehler, da die Zeile nicht syntaxgerecht abgeschlossen wurde.

Letzte Bearbeitung: 04.08.10
Zur Onlinefassung des Eintrags

Prozeduren

Einleitung

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 aus aufgerufen werden. Dadurch ist es möglich, Programmteile, die häufig 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ängig von einer oder mehreren Variablen arbeiten zu lassen. Siehe dazu weiter unten.

Es gibt einige gute Gründe, in Ihrem Programm Prozeduren einzusetzen:

- Reduzierung von redundanten Programmzeilen

- Möglichkeit der Wiederverwendung von Programmzeilen in anderen Projekten

- Leichtere Les- und Wartbarkeit des Programms

- Leichtere Erweiterbarkeit Ihres Programms

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

Letzte Bearbeitung: 30.10.11
Zur Onlinefassung des Eintrags

FUNCTIONs

FUNCTIONs sind ebenso wie SUBs Prozeduren. Die dort aufgeführten Informationen gelten weitgehend auch für FUNCTIONs. 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 denselben Regeln wie bei SUBs. Siehe FUNCTION für weitere Details zum Prozedurheader.

Im Programmcode können andere FUNCTIONs und SUBs aufgerufen werden. Es ist auch möglich, die FUNCTION selbst aufzurufen. Solche sogenannten rekursiven FUNCTIONs können manche Probleme auf sehr elegante Weise lösen, sollten jedoch mit Bedacht eingesetzt werden, da sie oft schwerer 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, die Parameterliste muss in Klammern übergeben werden. 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. Die Funktion wird also mit diesem Befehl verlassen.

Beispiel:

DECLARE FUNCTION twice (x AS UINTEGER) AS INTEGER

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

'Gibt 20 aus, das Doppelte von 10:
PRINT twice(10)
SLEEP

Eine rekursive FUNCTION:

FUNCTION Fakultaet (x AS UINTEGER) AS DOUBLE
IF x = 0 THEN
RETURN 1
ELSE
RETURN x * Fakultaet(x-1)
END IF
END FUNCTION

PRINT Fakultaet(6)
SLEEP

Als Rückgabewert wurde ein DOUBLE gewählt, weil damit wesentlich größere Fakultäten berechnet werden können als mit Ganzzahl-Typen (allerdings wird das Ergebnis ab 19! gerundet). Rekursive Funktionen haben den Nachteil, dass der benötigte Speicherplatz von der Tiefe der Verschachtelung abhängig ist. Im obigen Beispiel liegen die Ergebnisse aber schon lange außerhalb des Speicherbereichs eines DOUBLEs, bevor der Programmspeicherplatz knapp wird.

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

GOTO und GOSUB

Mit beiden Befehlen GOTO und GOSUB wurden in älteren BASIC-Dialekten Prozeduren erstellt. Es ist theoretisch möglich, einer GOTO/GOSUB-Prozedur Parameter zu übergeben. Dazu müssten dann (zusätzliche) Variablen deklariert werden, die dann nur in der Prozedur benutzt werden. Auch durch diesen erhöhten Programmieraufwand werden diese Unterprogramme leicht 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
GOTO "springt" an einen bestimmten Punkt innerhalb des Programms, der sowohl vor als auch hinter der GOTO-Anweisung liegen kann. Die Ausführung des Programms wird dann von dieser Stelle ab fortgesetzt. Der Einsprungpunkt wird durch ein sogenanntes Label markiert. Ein Label ist ein beliebiger Bezeichner, gefolgt von einem Doppelpunkt. In den Dialektformen -lang qb, -lang deprecated und -lang fblite kann als Label auch eine Zahl verwendet werden.

#LANG "qb"
10 PRINT "hello World"
MyLabel:
PRINT "eine zweite Anweisung"

Das Programm merkt sich nicht, von welcher Stelle aus der Sprung durchgeführt wurde. Soll später wieder zurückgesprungen werden, dann muss dieser Rücksprung "manuell" durchgeführt werden, d.h. eine weitere GOTO-Zeile muss das Programm wieder dorthin zurückspringen lassen, von wo es aufgerufen wurde.

Beispiel:

z1: GOTO z4
z2: PRINT "Ciao"
z3: GOTO ende
z4: PRINT "Welcome!"
z5: GOTO z2

ende:
END

Das obige Beispiel ist nicht besonders sinnvoll, sondern soll lediglich das Verhalten des Befehls GOTO demonstrieren. Eingesetzt werden kann GOTO z. B. dann, wenn bestimmte Programmteile unter gewissen Voraussetzungen übersprungen werden sollen oder wenn umgekehrt ein bereits ausgeführter Programmteil nochmal durchlaufen werden soll. Mit GOTO ist es jedoch sehr leicht, sogenannten Spaghetticode zu erzeugen, der sich nur noch schwer warten lässt. Daher sollte man in der Regel versuchen, den Befehl zu vermeiden.

GOTO kann fast immer durch andere Programmstrukturen ersetzt werden. Mit Bedingungsstrukturen wie IF ... THEN und SELECT CASE können auch große Programmteile unter bestimmten Bedingungen übersprungen werden, während Schleifen die mehrfache Ausführung eines Programmabschnitts ermöglichen.

GOSUB
GOSUB springt ähnlich wie GOTO zu einem Label im Programm, merkt sich jedoch die Stelle, von der aus das GOSUB durchgeführt wurde. Sobald das Programm auf die Anweisung RETURN stößt, führt sie einen Rücksprung aus. Der Befehl arbeitet damit sehr ähnlich wie eine Prozedur, nur dass eventuell benötigte Parameter "manuell" übergeben werden müssen. Da GOSUB fast vollständig durch Prozeduren ersetzt werden kann, steht es in der Dialektform -lang fb nicht mehr zur Verfügung.

Beispiel:

#LANG "qb"
GOSUB message
END

message:
PRINT "Welcome!"
RETURN

Das Programm benötigt für jeden GOSUB-Aufruf Speicherplatz, um sich die Rücksprungadresse zu merken. Dieser Speicherplatz wird nach dem RETURN wieder freigegeben. Beenden Sie daher einen mit GOSUB ausgeführten Sprung immer mit RETURN, um einen Speicherüberlauf zu vermeiden.

Letzte Bearbeitung: 23.08.11
Zur Onlinefassung des Eintrags

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: die direkte Übergabe in der Parameterliste der Prozedur oder die 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 Variablen 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
DIM 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
DIM c AS BYTE, d AS INTEGER

foo c, a, b
d = bar(c, a, b)
SLEEP

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

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 derselbe. 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
SLEEP

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

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.

Arrays
Function und Sub können neben Variablen auch Arrays als Parameter verwenden:

'Sub mit einem Integer-Array Parameter
DECLARE SUB unsicher (array() AS INTEGER)
DECLARE SUB sicher (array() AS INTEGER, obergrenze_zweite_dimension AS INTEGER)

'Zweidimenionales Array mit 5 * 8 Feldern (beginnend ab 0!)
DIM AS INTEGER meinArray(8,5)

'Beispielwerte
meinArray(2,2) = 2
meinArray(4,4) = 4

'Aufruf der Sub - beim Array sind die Klammern () nötig um Arrayzugriff zu signalisieren
unsicher(meinArray())

PRINT "----"

'Aufruf der sicheren Sub, bei der auf den Zugriff geachtet wird
sicher(meinArray(), 5)

SLEEP 'Auf Tastendruck warten

SUB unsicher (array() AS INTEGER)

'Mit UBound lässt sich die Obergrenze ermitteln
'Problem dabei: es wird nur die Obergrenze der ersten Dimension angegeben
FOR i AS INTEGER = 0 TO UBOUND(array)
PRINT array(i,i) '*
NEXT

'*  Hier ist Vorsicht geboten, da ein Arrayzugriff außerhalb des
'   gültigen Bereichs unvorhersagbare Werte ergeben und sogar bis
'   zum Programmansturz führen kann
END SUB

SUB sicher (array() AS INTEGER, obergrenze_zweite_dimension AS INTEGER)

'Um Probleme mit der Obergrenze zu umgehen, könnte man die Obergrenze
'für jede weitere Dimension zusätzlich übergeben
FOR i AS INTEGER = 0 TO UBOUND(array)
IF i < obergrenze_zweite_dimension THEN PRINT array(i,i) '*
NEXT

'*  Diese Version ist schon etwas sicherer
'   Es ist aber darauf zu achten, dass ein Array mit 0 beginnt
'   und die Obergrenze also um 1 niedriger liegt, als bei der Deklaration
'   Ausnahme: Dim As Integer array(1 to 5)
END SUB

TYPES (UDTs)
Auch die Übergabe von UDTs ist möglich:

TYPE myType
x AS INTEGER
y AS INTEGER
END TYPE

DECLARE SUB changeMyVar (anyVar AS myType)

DIM AS myType myVar

myVar.x = 5
myVar.y = 7

PRINT "Vorher:"
PRINT myVar.x
PRINT myVar.y

changeMyVar(myVar)

PRINT
PRINT "Nachher:"
PRINT myVar.x
PRINT myVar.y
SLEEP

' UDTs werden automatisch BYREF übergeben
' Durch explizite Angabe von BYVAL kann dies aber auch verhindert werden
SUB changeMyVar (anyVar AS myType)
anyVar.x += 1
anyVar.y -= 1
END SUB

Einen Parameter, der ein Array ist und vom Typ eines eigenen UDTs ist natürlich auch möglich.

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öglich, 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, um diesen Effekt zu erzielen. Weitere Details lesen Sie bitte unter SHARED in der Referenz.

Letzte Bearbeitung: 17.01.12
Zur Onlinefassung des Eintrags

SUBs

SUBs sind die einfachere Version einer Prozedur. Sie bestehen aus dem Prozedurheader, dem Programmcode und der abschließenden Zeile END SUB. Der Prozedurheader enthält die Liste der übergebenen Parameter (siehe Parameterübergabe). Die im Header übergebenen Variablen werden wie bereits dimensionierte Variablen behandelt; sie können innerhalb der SUB nicht redimensioniert werden. Eine Ausnahme bilden dynamische Arrays. Sie können zwar redimensioniert werden, ihr Datentyp (INTEGER, STRING, ...) bleibt aber gleich. Siehe SUB für weitere Details zum Prozedurheader.

Der Programmcode folgt denselben Regeln wie im Hauptmodul. Er darf fast alle Anweisungen enthalten und kann auch andere Prozeduren oder sogar sich selbst aufrufen (rekursiver Aufruf). Nicht verwendet werden dürfen die sogenannten 'nicht ausführbaren Anweisungen', wie DECLARE, COMMON usw. Auch Präprozessoren sind auf Prozedurebene erlaubt. Variablen, die auf Modulebene deklariert wurden, stehen in der Regel innerhalb der Prozedur nicht zur Verfügung; eine Ausnahme bilden die über SHARED, COMMON SHARED oder EXTERN deklarierten Variablen. Beachten Sie dazu den Gültigkeitsbereich von Variablen.

Die Zeile END SUB markiert das Ende der Prozedur. Code, der hinter der Zeile END SUB
steht, wird wie Modulebenen-Code behandelt.

Bevor eine Prozedur verwendet werden kann, muss sie im Programm bekannt sein. Soll eine Prozedur verwendet werden, bevor sie im Quellcode definiert wurde, dann muss sie dem Programm vor der Verwendung mit DECLARE bekannt gemacht werden. CONSTRUCTOR- und DESTRUCTOR-SUBs die tatsächlich nur zu Beginn des Programms bzw. bei dessen Beendigung automatisch aufgerufen werden sollen, müssen nicht deklariert werden.

Eine SUB wird direkt über ihren Bezeichner aufgerufen. Die Parameterliste kann beim Aufruf in Klammern stehen oder ohne Klammern angegeben werden.

Beispiel:

DECLARE SUB colortext (txt AS STRING, clr AS INTEGER)

colortext "blue", 1   ' oder mit Klammern: colortext("blue", 1)

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

SUB colortext (txt AS STRING, clr AS INTEGER)
#DEFINE a 10
COLOR clr
PRINT txt
END SUB

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

FOR i AS INTEGER = 2 TO 15
colortext "COLOR " & STR(i), i
NEXT
PRINT a   ' Fehler: a ist auf Modulebene nicht definiert

Siehe auch: FUNCTIONs

Letzte Bearbeitung: 29.08.11
Zur Onlinefassung des Eintrags

Die Gfxlib

Geschwindigkeit und Größe

Geschwindigkeit: Die interne GFXLib benutzt den normalen RAM als Seitenspeicher. Alle Lese/Schreibzugriffe auf den Seitenpuffer (inklusive Direktzugriffe via SCREENPTR) werden im RAM ausgeführt. Bei Win32 und Linux übernimmt ein eigener Thread die Screenupdates, und verwendet dabei eine separat wählbare Bildschirmwiederholrate (Wenn keine Rate angegeben wird, ermittelt FreeBASIC eine Standardrate; siehe dazu SCREENRES). Die Farbkonversion wird, falls nötig, ebenfalls übernommen. Obwohl dies überflüssig für Vollbild-Modi scheint, ist es nötig für Fenstertechniken. Um die Bibliothek klein und einfach zu halten, wurde dieselbe Methode auch für das Vollbild benutzt, auf Kosten einer kleinen 'Zeitstrafe' wegen der Speicherkopie. MMX wird jedoch, wo immer möglich, in der gesamten GFXLib benutzt, also ist die Bibliothek immer noch ganz schön schnell.

Größe: Eines der Hauptziele der GFXLib war es, unabhängig von externen Bilbiotheken zu sein. Nun, dieses Ziel wurde erreicht: Die Bilbiothek 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 Grafikinitialisierung, 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ängig von den Funktionen, die Sie verwenden (FBC wird nur das linken, was Sie wirklich benutzen). Dafür sind Ihre Programme Standalones, also von Runtime-DLLs unabhängig. Natürlich bedeutet Standalone nicht, dass überhaupt keine Abhängigkeiten bestehen, allerdings nur Abhängigkeiten 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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Interne Pixelformate

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: indizierte 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 (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, 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 Standard-Paletten. 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 genutzt 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 dasselbe 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; dasselbe gilt für Daten, die in GET- und PUT-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 angenommenen 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 einer 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 2 (aktuell)
Diese Version des Bildpuffers ist seit v0.17 verfügbar; das Programm kann ohne oder mit der Kommandozeilenoption -lang fb kompiliert werden. Ebenso wie in der weiter unten aufgeführten 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
_reserved(1 TO 12) AS UBYTE
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 auch für alle Farbtiefen (bpp = 1, 2 oder 4): pitch=(width*bpp+15) AND -16 Wie Sie sehen, wird also jede Bildzeile so aufbereitet, dass die Anzahl der Byte pro Zeile ein Vielfaches von 16 ist. Dies wirkt sich 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 128 Bit - Register (= 16 Byte) die damit optimal angewandt werden können. Einem minimal größeren Speicheraufwand steht also ein spürbar kleinerer Zeitaufwand bei Berechnungen gegenüber.

- '_reserved' 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 ab. 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*bpp+15) AND -16)+(x*bpp)

Dabei ist...

- 'p' ein Pointer, der auf den gewünschten Pixel zeigt. Benutzen Sie bevorzugt einen UBYTE PTR, damit bei der Berechnung des Formelausdrucks keine Fehler auftritt. Wird z.B. an einem INTEGER PTR die Operation +=1 ausgeführt, so erhöht sich sein Wert tatsächlich um vier, da ein INTEGER die Länge 4 BYTE hat.

- '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 * bpp + 15 ) AND -16 )

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

SCREENRES 400, 300, 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
PRINT "Header of the Buffer:"
PRINT "Version ID:      "; .type
PRINT "Bytes per Pixel: "; .bpp
PRINT "Width:           "; .width
PRINT "Height:          "; .height
PRINT "Bytes per Row:   "; .pitch
END WITH

DRAW STRING (0, 100), "The graphic:"
PUT (100, 100), buffer, PSET

OPEN ERR FOR OUTPUT AS #1
PRINT #1, "Pixel Data:"
PRINT #1, ""
FOR i = 0 TO 31
PRINT #1, i, HEX(Colors[i], 2),
IF (i + 1) MOD 4 = 0 THEN ? #1, ""
IF (i    ) MOD 4 = 0 THEN
PRINT #1, HEX(Pixels[i \ 4], 8)
ELSE
PRINT #1, ""
END IF
NEXT

IMAGEDESTROY buffer
CLOSE #1

SLEEP

Beispiel 2:

#INCLUDE "fbgfx.bi"
USING FB

SCREENRES 400, 300, 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

SLEEP

Erkennen des Puffertyps und Bearbeitung
Je nach gewählten Ausgangsbedingungen wird FreeBASIC bei der Erstellung neuer Datenpuffer immer eine bestimmte Version des Puffers benutzen:

- Bedingungen für Version 1:
freeBASIC-Version <= 0.16 oder
freeBASIC-Version >= 0.17 und Kommandozeilenoption -lang qb oder
freeBASIC-Version >= 0.17 und Kommandozeilenoption -lang deprecated

- Bedingungen für Version 2:
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 richtigen Startpunkt aus:

start = buffer + IIF( PEEK(INTEGER, buffer) = 7, 32, 4 ) \ SIZEOF(buffer)

Beachten Sie hierbei, dass Sie separat prüfen müssen, ob die Zeilen gepaddet sind. Dies ist bei Version 2 IMMER der Fall, in Version 1 hingegen NIE.

Version 1 (veraltet)
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:

SCREENRES 400, 300
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
END IF
IF ((i + 1) MOD 4) = 0 THEN PRINT
NEXT
IMAGEDESTROY x
SLEEP

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Interne Treiber

Wie bereits angesprochen benutzt die GFXLib ihre eigenen Treiber, um mit verschiedenen Systemen arbeiten zu können.

Windows:

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

Linux:

- X11: Raw Xlib basierender Treiber. Er funktioniert immer. Wenn Ihr Programm läuft, 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 am besten geeigneten Treiber auf Ihrem System, wenn ein neuer Videomodus per SCREENRES initiiert werden soll. Um diese Wahl zu überbrücken, können Sie vor der Initialisierung des Grafikfensters den Befehl SCREENCONTROL einsetzen:

#INCLUDE "fbgfx.bi"
SCREENCONTROL FB.SET_DRIVER_NAME, "GDI"
SCREENRES 400, 300
' ...

Sie können stattdessen auch die Umgebungsvariable 'FBGFX' setzen, um den Treiber zu benennen, den sie bevorzugt verwenden wollen. Unter Windows kann das z.B. mit der folgenden Anweisung in der Konsole erledigt werden:

SET FBGFX=gdi

oder direkt im Programmcode durch

SetEnviron("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.

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

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

Letzte Bearbeitung: 19.05.12
Zur Onlinefassung des Eintrags

Standard-Paletten

Beim Öffnen eines Ausgabefensters (eines Konsolenfensters 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
Hellgrau
Dunkelgrau
Hellblau
Hellgrün
Hellzyan
Hellrot
Pink
Gelb
Weiß

Hinweis: Im SCREEN 1 ist die Farbzuordnung anders als bei den anderen Bildschirmmodi. Vergleiche dazu COLOR (Anweisung).

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

Dieselbe 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 Farbbands sind Helligkeit und Sättigung der Farbe jeweils dieselbe.

- Jedes Farbband enthält 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
DIM AS INTEGER i

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

SLEEP

Letzte Bearbeitung: 03.08.11
Zur Onlinefassung des Eintrags

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

SCREENRES 320, 200

' Diese Anweisungen haben dieselbe 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 äquivalent 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öglich, 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
SCREENRES 320, 200

' 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 ein Puffer reserviert und initialisiert. Das obige Beispiel könnte dadurch so aussehen:

DIM buffer AS ANY PTR
DIM sprite AS ANY PTR

SCREENRES 320, 200

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 beeinflusst, 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 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: Dieses Beispiel funktioniert nur mit FB-Versionen <= FB0.15
Ab FB-Version 0.16 gibt es die Funktion DRAW STRING
Für neuere FB-Versionen gibt es die DrawString-Routine (Ersatz für GfxPrint)

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

SCREENRES 320, 200
GfxPrint "Hello world!", 112, 96, 15
SLEEP

Achtung: Die GfxLib speichert alle Font- und Paletten-Daten in einem LZW-komprimierten Format, um Ihre EXEs klein zu halten, und dekomprimiert sie erst mit dem ersten SCREENRES-Aufruf. Wenn Sie SCREENRES 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 SCREENRES 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 SCREENRES-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
SCREENRES 400, 300

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

Letzte Bearbeitung: 17.08.11
Zur Onlinefassung des Eintrags

Verschiedene Themen

ASCII-Codes

Die ASCII-Tabellen der Codepages 437 (Standard im GFXLib-Screen) und 850 (Deutsche Codepage, in der Konsole) finden sich im Onlineangebot des FreeBASIC-Portals.

Letzte Bearbeitung: 02.07.08
Zur Onlinefassung des Eintrags

Der Compiler

Die offizielle FreeBASIC-Ausgabe enthält als Compiler den fbc, FreeBASICs Flagschiff. Der fbc ist ein Befehlszeilen-Compiler und kann von der Befehlszeile gestartet werden - von DOS, dem Windows-Befehlszeilenprompt oder einer linux-Shell. IDE-verwöhnte Benutzer können sich eine IDE (z.B. FBEdit, FBIDE, Geany [in alphabetischer Reihenfolge..]) selbst installieren, um nicht mit der Befehlszeile hantieren zu müssen. Der Aufruf von fbc von der Konsole ohne irgendein Argument, liefert eine Liste der vorhandenen Optionen/Befehlszeilen-Schalter, die benutzt werden können, um das Verhalten des Compilers genau einzustellen.
(Im weiteren Teil dienen Anführungszeichen zur Kennzeichnung hier im Text, sie sind nicht für die Optionen erforderlich)
Im einfachsten Fall nimmt fbc eine Quelldatei als Befehlszeilen-Argument und erstellt eine ausführbare Datei. Das erfolgt durch kompilieren der Quelldatei (.bas) in eine Assembler-Datei (.asm), die erst per GAS in eine Objekt-Datei (.o) übersetzt wird und dann vom Linker LD mit anderen Objekt-Dateien und Libraries (diese Programmbibliotheken werden im Allgemeinen und im Folgenden unter linux und Windows "Libraries" genannt), die für den Ablauf erforderlich sind, letztendlich zur ausführbaren Datei gemacht wird. Die Assembler- und kompilierten Objekt-Dateien werden dann normalerweise gelöscht. Zum Beispiel erstellt der folgende Befehl:

fbc foo.bas

die ausführbare Datei foo.exe unter DOS/Windows und ./foo bei linux. Der fbc übernimmt mehrere Quelldateien auf einmal, kompiliert und linkt sie alle in eine ausführbare Datei. Beispielsweise erzeugt der nächste Befehl:

fbc foo.bas bar.bas baz.bas

die Exe-Datei foo.exe unter DOS/Windows und ./foo bei linux. Da foo.bas zuerst in der Liste steht, wird es der Haupteintrittspunkt der Exe-Datei sein und auch den Namen dafür liefern. Um einen anderen Eintrittspunkt zu bestimmen, werden die Schalter "-m" und "-x" benutzt, jenachdem. Soll also, z.B., baz.bas der Haupteintrittspunkt der Exe-Datei foobar.exe sein, würde der Aufruf:

fbc -x foobar.exe -m baz foo.bas bar.bas baz.bas

benutzt werden
Der "-x" Schalter benennt genau die ausführbare Datei, also würde auch unter linux aus dem obigen Befehl die ausführbare Datei ./foobar.exe erstellt werden.
Syntax:

fbc [ Optionen ] [Eingabe_liste ]

Wobei Eingabe_liste eine Liste von Dateinamen ist. Der Compiler entscheidet abhängig von der Erweiterung, wie eine Datei behandelt werden soll. Akzeptiert werden folgende Dateitypen:

Dateierweiterung

Beschreibung

.bas

FreeBASIC Quelldatei zu kompilierende Programmdatei

.a

Bibliothek(Library), statische Sammlung von vorkompilierten SUBs/FUNCTIONs

.o

Objektdatei (Einzelnes vorkompiliertes Modul)

.rc

Ressourcen Script (nur Windows), Ressourcen-Beschreibung (Dialoge, Menüs, Icons, Tastaturkürzel)

.res

Kompilierte Ressourcendatei (nur Windows)

.xpm

X icon pixmap (nur linux)

Die folgenden Parameter können an den FreeBASIC Compiler übergeben werden:

Erzeugung von Bibliotheken mit privaten/öffentlichen SUBs / FUNCTIONs

-export [Name]

Exportiert Symbole für dynamisches Linken. Siehe EXPORT. Der Name einer SUB/FUNCTION wird explizit für andere Module zugänglich gemacht. Ein anderes Modul kann mit Hilfe der DECLARE SUB/FUNCTION Anweisung solche öffentlich deklarierten SUBs / FUNCTIONs benutzen.

-dll, -dylib

Erzeugt eine dynamische Link-Library. So wird eine DLL unter Windows (inklusive der Import-Library(.a) erstellt) oder eine .so unter linux. 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). 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. Dieses wird dynamisches Linken genannt. Auch diese Module müssen dem Programm separat mitgegeben werden.

-lib

Erzeugt eine statische Library
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]

Fügt eine vorkompilierte Objekt-Datei zur Linker-Liste hinzu. Das "-a" ist optional, wenn die vorkompilierte Objektdatei ohne feste Adressen Endung *.o hat, sie wird dann der zu erzeugenden Datei hinzugefügt.

-c

Nur kompilieren (eine Objektdatei erzeugen), nicht linken
Es werden Sammlungen von SUBs / FUNCTIONs vorkompiliert, aber nicht zu einem ausführbaren Programm verbunden.
Werden mehrere Dateien gleichzeitig oder hintereinander kompiliert, so muss die Hauptdatei mit "-m" markiert werden.

-C

Während des Kompilierens werden Objektdateien mit der Endung (*.o) erzeugt und am Ende wieder gelöscht. Mit der Option -C werden die Objektdateien nicht gelöscht.(Seit FBC 0.20)

-l [Name]

Fügt eine Library-Datei zur Linker-Liste hinzu.
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]

Fügt eine Quelldatei zur Kompilierung hinzu. Das "-b" ist optional.
Im Allgemeinen ist diese Option nicht nötig, kann aber benutzt werden, wenn die hinzuzufügende Datei kein .Bas-Erweiterung hat oder aus einem anderen Verzeichnis stammt

-i [Name]

Fügt einen Suchpfad für include-Dateien(*.bi) hinzu. Werden "-i" Schalter mehrfach verwendet, bestimmt die Reihenfolge ihres Auftretens die Reihenfolge, in der die Verzeichnisse durchsucht werden.

-include [Name]

Gibt eine Datei an, die #include't wird, bevor die Quelldateien übersetzt werden. Werden -include Schalter mehrfach verwendet, bestimmt die Reihenfolge ihres Auftretens die Reihenfolge, in der die Dateien #include't werden.
Bewirkt, dass die mit 'Name' angegebenen Dateien an den Anfang des Hauptmoduls eingefügt werden, als wäre dort eine entsprechende INCLUDE-Anweisung.

-g [Name]

Ermöglicht Funktions-Profiling. Nach der Ausführung einer Exe-Datei, die mit dieser Option kompiliert wurde, wird eine Datei gmon.out im Programmverzeichnis erstellt. Damit kann dann mittels GPROF eine Analyse der Programmausführung erfolgen.(bis ~0.13.*, s. -profile)

-forcelang [Parameter]

Diese Option überschreibt #Lang | '$Lang-Anweisungen aus dem Quelltext. Mögliche Parameter:fb (Standard), fblite, qb oder deprecated

-lang [fb|fblite|qb|deprecated]

Um alte GW-BASIC- oder QuickBasick-/QBasic-Quellcodes ohne größere Änderungen zu kompilieren, kann auf der Befehlszeile die '-lang qb' Option benutzt werden. Sie bietet eine verbesserte Kompatibilität zu QuickBasic/QBasic-Code. Um FreeBASIC 0.16b oder noch ältere Quellcodes zu kompilieren, kann die Option '-lang deprecated' benutzt werden. Sie wurde aus Kompatibilitätsgründen beibehalten aber nicht weiterentwickelt.

-[m|entry] [Quelldatei]

Bestimmt den Haupteintrittspunkt einer Quelldatei; das Argument ist der Name einer Quelldatei ohne ihre Erweiterung. Werden "-m" oder "-entry" nicht verwendet, ist die erste angegebene Quelldatei der Haupteintrittspunkt. Wird der "-c" oder "-r" Schalter verwendet, müssen "-m" oder "-entry" angegeben werden, wenn eine Hauptquelldatei kompiliert wird. Die Datei [Quelldatei] wird als Startdatei angenommen. Sie enthält den Programmstart Main. Als Standard wird ohne diese Option die erste angegebene .Bas-Datei als Startdatei angesehen.

-o [Name]

Setzt den Namen der Ausgabedatei der kompilierten Quelldatei oder Objektdatei (.o). Der "-o" Schalter muß unmittelbar nach der Quelldatei stehen, die mit dem "-b" Schalter angegeben wurde. Der Schalter wirkt allerdings nur zusammen mit dem "-c" Schalter, da Objektdateien normalerweise nicht gespeichert werden. Wird der "-o" Schalter für eine übergebene Datei nicht benutzt, erhält die Ausgabedatei denselben Namen, wie die Quelldatei nur mit einer ".o" Erweiterung.
Unabhängig vom Namen der Programmdateien mit der Endung (*.bas) wird ein Programm mit dem [Namen] bzw. [Namen.exe] erzeugt.

Bedingtes Kompilieren und Präprozessor

-d [Name=Wert]

Fügt ein Präprozessor-Makro allen Quelldateien hinzu. Ist dasselbe, wie die Verwendung der Präprozessordirektiven #define oder #macro.
Für bedingtes Kompilieren kann man einen Wert definieren z.B. DEBUG=1, der dann mit #IF oder #IFDEF, #IFNDEF abgefragt werden kann.

-pp

Nur die vorkompilierte('preprocessed') Quelldatei wird ausgegeben; keine komplette Kompilierung!

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 das Programm auf einen Fehler reagieren und es muss nicht zwangsläufig beendet werden.

-exx

Wie -e und -ex, aber mit zusätzlicher Prüfung auf gültige Array-Grenzen und korrekte Verwendung von Zeigeradressen(Nullpointer-Prüfung).

-g

In die Ausgabedateien werden Debugger-Symbole eingefügt, die dann von GDB-kompatiblen Debuggern verwendet werden können.
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

Eine fehlerhafte Stelle im Quellcode nicht anzeigen; nützlich, wenn eine IDE die Fehlermeldungen auswertet.

Programmerstellung

-arch [Typ]

Setzt den Ziel-CPU-Typ (Standard:486 falls nicht angegeben, kann 386,486,586,686,athlon,athlon-xp,athlon-fx,k8-sse3,pentium-mmx,pentium2,pentium3,pentium4,pentium4-sse3 oder native sein)

-fpu [X87|SSE]

Wird die Option nicht oder -fpu X87 angegeben, benutzt FBC die normalen 387-Assembleranweisungen für mathematische Operationen. Bei der Option -fpu SSE werden SSE2-Assembleranweisungen zur Berechnungen von Single und Double - Variablen benutzt (Es wird vorher geprüft, ob der Prozessor fähig ist, SSE2 Anweisungen auszuführen. Wenn nicht wird die Option ignoriert. (Seit FBC 0.20))

-fpmode [FAST | PRECISE]

Nur in Verbindung mit der Option -fpu SSE wirksam.(Seit FBC 0.21)

-gen [gas | gcc]

FBC übersetzt den Quelltext für x86 GAS-Assembler (gas)oder in C für GNU C (gcc).(Seit FBC 0.21)

-r

Nur Assemblerdateien mit der Endung (*.asm) erzeugen, nicht kompilieren.(Seit FBC 0.20). Seit FBC 0.21 und unter Verwendung von -gen gcc werden Dateien mit der Endung (*.c) erstellt.
Werden mehrere Dateien gleichzeitig oder hintereinander kompiliert, so muss die Hauptdatei mit "-m" markiert 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 Präprozessor generiert hat. Diese werden in den Assembler-Kommentaren abgelegt.Präprozessor-Makros in diesen Dateien werden ausgewertet.(Änderung ab FBC 0.20). Seit FBC 0.21 und unter Verwendung von -gen gcc werden Dateien mit der Endung (*.c) erstellt.

-s [gui|console]

(Nur Windows)Gibt an, ob ein Programm im Fenster oder in der Konsole ausgeführt werden soll. Erlaubt sind gui und console (standardmäßig wird console benutzt). Wird als Subsystem gui angegeben, erscheint kein Konsolenfenster hinter dem Programmfenster.

-t [Wert]

(Windows/DOS)Gibt die Größe des verwendeten Stackspeichers in KByte (1024 Byte-Einheiten) an(Standard: 1024 KBytes). Lokale Arrays werden auf dem Stack erzeugt, deshalb ist 1MB möglicherweise nicht immer genug(z.B. für Stack von 8MB: -t 8192).Ausnahmen können auch umfangreiche Programme sein, die reichlich Gebrauch von rekursiven Funktionsaufrufen machen, wie z.B. Raytracer oder Fraktalgenerator.

-target [Name]

(Nur Windows)Name kann "dos"|"linux"|"win32"|"xbox"|"cygwin" sein. Kann bei der Windows-Version des Compilers benutzt werden, um ausführbare Dateien für DOS32, linux oder Xbox zu erstellen. Die bin und lib Verzeichnisse müssen die /dos, /linux oder /xbox Unterverzeichnisse der entsprechenden Distribution haben.
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.)(Ab FB 0.22.0 nur noch cygwin und dos erlaubt)

-mt

Erzwinge Linken mit 'Thread-sicherer' Laufzeit-Library für Applikationen mit mehreren Threads. Normalerweise wird automatisch immer die 'Thread-sichere' Version benutzt, wenn die eingebauten FreeBASIC 'threading'-Funktionen verwendet werden. Deshalb kommt diese Option nur bei eigenen 'Thread'-Routinen zum Einsatz.

-nodeflibs

Keine der Standard-Libraries beim Linken einbinden
Bindet Standard-Bibliotheken nicht ein; alle Lib's müssen manuell mit INCLIB geladen werden, und die Prozeduren darin mit DECLARE deklariert werden.

-O [ Wert ]

Setzt die Optimierungsebene(Standard ist 0); kann sein 0, 1, 2, 3 oder max (=3)

-p [ Librarypfad ]

Füge einen Pfad zum Suchen von Libraries hinzu. Standardmäßig werden Libraries im FreeBASIC-Systemlibraries- Verzeichnis und im aktuellen Verzeichnis gesucht.

-vec [ Wert ]

Setzt die automatische Vektorisierungsebene (Standard ist 0), mögliche Werte [0 | NONE] | 1 | 2.(Verfügbar seit FB 0.21.0)

-Wa [ Optionen ]

Übergabe von Optionen an den Assembler GAS, Optionen müssen durch Komma[ta|s] getrennt werden.

-Wc [ Optionen ]

Übergabe von Optionen an GCC bei Verwendung von -gen gcc; Optionen müssen durch Komma[ta|s] getrennt werden.

-Wl [ Optionen ]

Übergabe von Optionen an den Linker LD, Optionen müssen durch Komma[ta|s] getrennt werden.

-x [Name]

Setzt den Namen der Exe-Datei/Library, mit Erweiterung. Standardmäßig der Name der ersten Quell-Datei, die auf der Befehlszeile übergeben wurde. Beim Kompilieren von Libraries, muß die Datei den "lib"-Prefix im Namen haben, sonst kann der Linker sie vielleicht nicht finden. Beim getrennten Kompilieren und Linken, darf diese Option NUR VOM Linker gesetzt werden.Legt demnach den Namen der Enddatei fest, also den der EXE, LIB oder DLL.

Informationen

-v

Aktiviert den ausführlichen Modus; der Compiler zeigt dann seine Aktionen Schritt für Schritt an.

-version

Zeigt Programmversion des verwendeten Compilers an.

-w [Wert]

-w ["0"|"1"|"all"|"pedantic"] Setzt die Mindest-Warnebene: "-w 0" zeigt alle Compiler-Warnungen(Standard), während "-w 1" sie versteckt.

-prefix [Pfad]

Setzt den Compiler-Pefix (wo der Compiler die bin-, lib- und inc-Verzeichnisse sucht); standardmäßig ist das der Pfad, in dem sich fbc befindet, falls das bestimmt werden kann.

-profile

Der Compiler erstellt nach Beendigung die Datei profile.txt, die alle Timing-Ergebnisse für Funktionsaufrufe enthält. Diese Technik nennt man auch Profiling.

-maxerr [Anzahl|"inf"]

Setzt die Anzahl der Fehler, die der Compiler finden darf, bevor der Vorgang abgebrochen wird; Standard ist 10. Wenn "inf"(unendlich) angegeben wird, macht der Compiler weiter bis zum Ende der Quelldatei; nützlich, wenn eine IDE die Fehlermeldungen auswertet.

-map [Name]

Link-Map als Datei [Name] speichern

Voreinstellungen aus Dateien einlesen

@Dateiname

Häufig benutzte Compiler-Optionen lassen sich als Text-Datei Dateiname abspeichern und können unter Angabe von @Dateiname zum Kompilieren benutzt werden.(Verfügbar seit FB 0.21.0)

Beispiele:

fbc meinprog.bas

(Mit der DOS-Version von fbc: Kompilieren und linken einer ausführbaren DOS-Datei MEINPROG.EXE

fbc -s gui meinprog.bas

(Mit der Windows-Version von fbc: Kompilieren und linken einer ausführbaren Windows-Datei meinprog.exe. Bei diesem Program wird das Konsolenfenster nicht angezeigt ("MS-DOS Prompt"))

fbc -lib modul1.bas modul2.bas modul.bas -x libmeinelib.a

(Kompilieren und linken einer statischen Bibliothek libmeinelib.a aus den drei Quelldateien)

fbc -m haupt_modul -c haupt_modul.bas

(Kompilieren einer Objekt-Datei haupt_modul.o und markieren als Eintrittspunkt)

fbc -c unter_modul.bas

(Kompilieren einer Objekt-Datei unter_modul.o)

fbc -x anwendung.exe haupt_modul.o unter_modul.o

(Linken einer ausführbaren anwendung.exe)

Anmerkungen:
Bei Komplett-Downloads(die nicht vom fb-portal angeboten werden), also Compiler & IDE sollte nach der Installation zuerst geprüft werden, ob auch wirklich der aktuelle Compiler enthalten ist(s.o. fbc -version), sonst kann es böse Überraschungen geben, wenn eine alte Compiler-Version enthalten sein sollte..
Es gibt auch noch die Compiler-Option -z [Wert], diese setzt verschiedene Compiler-Einstellungen. Da es aber keine Garantie gibt, daß diese Option in späteren Versionen noch vorhanden ist, sollte sie mit Bedacht verwendet werden.

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 http://fbc.sf.net ist die englischsprachige Entwicklerseite.
Wird immer noch weiterentwickelt und verbessert!^^

Letzte Bearbeitung: 03.11.11
Zur Onlinefassung des Eintrags

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

"fblite"

Kompatiblität zu FreeBASIC, aber mit einem Programmierstil, der kompatibler zu QBASIC ist

"qb"

QBASIC-Kompatibilität

Seit FreeBASIC v0.20 ist auch die Optionsangabe als Metabefehl #LANG 'Option' am Anfang des Quelltextes möglich.
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 oder viele verschiedene Compiler-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

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

- Suffixe (! # $ % &): Suffixe sind nur noch in numerischen 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.

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

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

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

- Punkte in Symbolnamen: Punkte in Symbolnamen sind nicht mehr zulässig. Benutzen Sie stattdessen NAMESPACE.

- GOSUB/RETURN: Verschachtelte Prozeduren könnten in Zukunft möglich sein.

- ON...GOSUB, ON...GOTO: Benutzen Sie SELECT CASE AS CONST anstelle dieser Anweisungen.

- RESUME: Alle Anweisungen können als Funktionen genutzt werden, um Laufzeitfehler abzufragen. Beispiel: IF OPEN("datei" FOR INPUT AS #1) <> 0 THEN ...

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

- CALL und LET: Entfernen Sie diese Anweisungen einfach.

- nummerische Labels: Labels, die nur aus einer Zahl bestehen, werden nicht mehr unterstützt.

- Globale Symbol, die den Namen eines internen Schlüsselworts besitzen. Möchten Sie diese weiterhin benutzen, müssen Sie diese in einem NAMESPACE deklarieren.

-lang deprecated
Unterstützt

- Alles, das bereits in FreeBASIC v0.16 unterstützt wurde, mit Ausnahme von ON...GOSUB, ON...GOTO und ON...GOSUB (sogar auf dem Modullevel)

nicht mehr unterstützt

- Klassen: Da Punkte in Symbolnamen erlaubt sind, ist es zu schwierig, dieses Feature zu implementieren.

- 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 Entwicklungsversion in die nächste zu upgraden. Sie wird möglicherweise in einem Major-Release wie FreeBasic 1.0 entfernt werden.

-lang fblite
Unterstützt

- Alles, was in -lang deprecated erlaubt ist, außer Scope-Blöcken: Variablen gehören dem aktuellen Scope (Programmblock) an.

-lang qb
Unterstützt

- Alles, das im FB-Modus nicht erlaubt ist. Außerdem:

- CALL kann verwendet werden, um Forward-Referencing bei Funktionen zu realisieren. (Feature in Arbeit...)

- SHARED kann innerhalb von Prozeduren eingesetzt werden. (Feature in Arbeit...)

- Variable Scope: Alle Variablen, ob implizit oder explizit deklariert werden im Scope der Prozedur alloziert, wie in QB.

Nicht unterstützt

- Multi-Threading: Die THREADxxx, MUTEXxxx und CONDxxx-Anweisungen können nicht eingesetzt werden. Siehe THREADCREATE.

- Klassen und Namespaces

- Prozedur- und Operator-Overloading (Siehe OVERLOAD)

- SCOPE-Blöcke (siehe SCOPE)

- EXTERN-Blöcke

- Variablen-Initiatoren: Alle Variablen werden auf den Scope der Prozedur verschoben (wie in QB), sodass lokale Initiatoren schwierig zu implementieren sind.

FB-eigene Befehle im QB-Kompatiblitätsmodus
Befehle, die in FB neu hinzugekommen sind, können mit einem Trick auch im QB-Kompatiblitätsmodus benutzt werden: Versehen Sie diese mit einem doppelten Unterstrich am Wortanfang, um sie zu benutzen. Beispiel: __INSTRREV
Beachten Sie, dass bei Befehlen, deren Verhalten sich in FreeBasic geändert hat (z.B. SLEEP oder INKEY), auch das FB-Verhalten übernommen wird. So wartet __SLEEP 1 im QB-kompatiblitätsmodus eine Millisekunde, während SLEEP 1 - wie aus QB gewohnt - eine Sekunde wartet. Bei __INKEY wird dementsprechend CHR(255) statt CHR(0) als erweitertes Zeichen benutzt.

Hinweis: Die Option

-lang qb

wird in allen Folgeversionen von FreeBASIC erhalten bleiben.

Letzte Bearbeitung: 09.08.11
Zur Onlinefassung des Eintrags

Fehler-Behandlung in FreeBASIC

Behandlung von Laufzeitfehlern

FreeBASIC (FB) kann Fehler auf folgende Arten behandeln:

- Normalerweise macht ein Programm nichts mit den Fehlern - sie werden einfach ignoriert und der Code wird weiter ausgeführt. Das Programm sollte mögliche Fehler über die ERR-Funktion in der nächsten Zeile abfangen.

- Wenn mit den Compileroptionen -e, -ex oder -exx kompiliert wurde, benutzt FB eine QuickBasic(QB)-ähnliche Fehlerbehandlung.

- Zukünftige Versionen von FB könnten über eine Java-ähnliche TRY...CATCH...FINALLY-Ausnahmebehandlung verfügen.

Wichtig: Verursacht ein FreeBASIC-Programm einen allgemeinen Schutzfehler (etwa durch Zugriffe außerhalb des eigenen Speicherbereichs), wird die Programmausführung sofort vom Betriebssystem beendet. Ein solcher Fehler lässt sich mit den Fehlerbehandlungsmethoden ("Error handling") von FreeBASIC nicht abfangen und benutzerdefiniert behandeln.

Standardfehlerbehandlung

Das Standard-Verhalten von FreeBASIC ist, die ERR-Variable zu setzen und fortzufahren.

' Im Folgenden wird davon ausgegangen, dass die angegebene Datei xzxwz.zwz
' nicht existiert. Dann wird nämlich in ERR ein Fehler vermeldet.
OPEN "xzxwz.zwz" FOR INPUT AS #1
PRINT ERR
SLEEP

Das Programm hält, obwohl die Datei nicht existiert, nicht an, sondern setzt die ERR-Variable und macht weiter. Der Fehler könnte in der nächsten Zeile ausgewertet werden.

Einige Ein-/Ausgabe-Funktionen OPEN, PUT... können in FUNCTION-Form benutzt werden (z. B. OPEN (Funktion)) und geben eine Fehlernummer zurück oder Null, wenn alles gut gegangen ist.

PRINT OPEN ("xzxwz.zwz" FOR INPUT AS #1)
SLEEP

QuickBASIC-ähnliche Fehlerbehandlung

Wenn mit den Schaltern -e, -ex oder -exx kompiliert wurde, wird vom Programm erwartet, dass eine QB-ähnliche Fehlerbehandlung geschieht. Erfolgt keine Fehlerbehandlung, stoppt das Programm mit einem Fehler.

Wichtig: Wenn die QB-ähnliche Fehlerbehandlung benutzt wird, muss der Programmierer sicherstellen, dass ALLE Fehlermöglichkeiten abgefangen werden. Beispielsweise erzeugt GETMOUSE einen Fehler, wenn der Cursor das aktuelle Fenster verlässt.

ON ERROR GOTO Ooops
OPEN "xzxwz.zwz" FOR INPUT AS #1
ON ERROR GOTO 0
SLEEP
END

Ooops:
PRINT ERR
SLEEP
END

ON ERROR setzt eine Fehlerbehandlungsroutine, und das Programm ruft sie auf, wenn ein Fehler gefunden wird.
ON ERROR GOTO 0 schaltet diese Fehlerbehandlung ab.

Wenn KEINE Fehlerbehandlungsroutine benutzt wird, falls ein Fehler auftritt, stoppt das Programm einfach und sendet eine Fehlermeldung an die Konsole.

Aborting program due to runtime error 2 (file not found)

(Abbruch wegen Laufzeitfehler 2 (Datei nicht gefunden)

Die "globale" Fehlerbehandlungsroutine kann wie in QB am Programmende stehen. Bei ON LOCAL ERROR kann eine lokale Fehlerbehandlung auf Prozedurebene erfolgen. Dazu muss das Unterprogramm (SUB oder FUNCTION) eine Codesequenz zur Fehlerbehandlung besitzen, die im Fehlerfall mittels GOTO angesprungen wird.

DECLARE SUB foo
foo
SLEEP

SUB foo
DIM filename AS STRING
filename = ""
ON LOCAL ERROR GOTO Ooops
OPEN "" FOR INPUT AS #1
PRINT "Kein Fehler"
ON LOCAL ERROR GOTO 0
EXIT SUB
Ooops:
PRINT("Fehler " &ERR &" in Function " &*ERMN &" in Zeile " &ERL)
END SUB

Erläuterung:
Beim Schalter -e muss die Fehlerbehandlungsroutine das Programm beenden, unabhängig vom verwendeten Dialekt.
Wird das Programm mit der Compileroption -ex und -lang qb compiliert, kann die Error-Handling-Routine mit einer RESUME-Anweisung (wiederholt die letzte Anweisung, die den Fehler hervorrief) oder RESUME NEXT-Anweisung (macht mit der nächsten Anweisung weiter) die Programmausführung nach Behandlung des Fehlers fortsetzen.
Wird compiliert, ohne eine Compileroption zur Fehlerbehandlung zu verwenden, dann wird der Fehler ignoriert.

Fehlernummern

FreeBASIC kennt folgende Laufzeit-Fehlercodes:

Nr.

Meldung

Übersetzung

0

No error

kein Fehler

1

Illegal function call

ungültiger Funktionsaufruf

2

File not found signal

Datei nicht gefunden*

3

File I/O error

Datei-Ein-/Ausgabe-Fehler

4

Out of memory

Zuwenig Speicher

5

Illegal resume

ungültiges RESUME

6

Out of bounds array access

Array-Indexüberschreitung

7

Null Pointer Access

NULL-Pointerzugriff

8

No privileges

fehlende Berechtigungen

9

interrupted signal

Unterbrechung

10

illegal instruction signal

ungültige Anweisung

11

floating point error signal

Gleitkommafehler

12

segmentation violation signal

Speicherzugriffsfehler

13

Termination request signal

Beendigungsanforderung

14

abnormal termination signal

unnormale Beendigung

15

quit request signal

Anfragesignal beendet

16

return without gosub

Return ohne Gosub

17

end of file

Dateiende

*) Der Laufzeitfehler 2 (File not found) kann auch auftreten, wenn z. B. mit ENCODING "UTF-8" eine Datei geöffnet werden soll, die nicht UTF-8-codiert ist oder bei der das Byte Order Mark (BOM) nicht gesetzt ist.

Ein Bereich für Benutzer-Fehlermeldungen ist nicht vorgegeben. Wenn also ERROR benutzt wird, um einen benutzerdefinierten Fehlercode zu setzen, ist es vernünftiger, hohe Werte zu benutzen, um Überschneidungen mit den eingebauten Fehlermeldungen zu vermeiden, falls die obige Liste zukünftig einmal erweitert werden sollte.

Siehe auch:
ON ERROR, ERR (Funktion), ERFN, ERMN, ERROR, Fehlerbehandlung, Debugging

Letzte Bearbeitung: 04.04.12
Zur Onlinefassung des Eintrags

Funktionen der CRT

Funktionen der C Standard Library

FreeBASIC erlaubt das Einbinden der Funktionen der Standard C Bibliothek. Hier eine alphabetische Aufstellung, sowie eine gruppierte nach ihrer Funnktionalität.

Beschreibung:
Die Kommentar-Spalte enthält eine kurze Beschreibung der Funktion. Die Liste ist nicht vollständig, gibt aber einen guten Überblick über die meisten Funktionen der C Runtime Library. Die angegebenen Funktionen werden sicher von FreeBASIC unterstützt. Für weitere Informationen siehe z.B. diese Referenz.

Hinweis: Die folgenden Deklarationen sind nicht die offiziell in FreeBASIC enthaltenen, sie sollten aber genügend Informationen geben, um die Funktionen anwenden zu können.

Die Datei-Spalte beinhaltet den Namen der Datei, die eingebunden werden muss. Dies geschieht mit dem Befehl INCLUDE am Anfang des Programmcodes. Sollte die angegebene Datei nicht eingebunden werden, wird das Programm entweder nicht compilieren, oder normal compilieren, aber danach falsche Werte ausgeben. Alle Header der C Runtime befinden sich im Unterordner crt. So muss, um etwa die math.bi einzubinden, #include "crt/math.bi" bzw. #include "crt/math.bi" angegeben werden. Alternativ kann man mit #include "crt.bi" alle Dateien einbinden.

Die Deklaration-Spalte enthalten folgende Informationen:

- der Name der Funktion;

- die benötigten Parameter der Funktion in Klammern, zusammen mit dem Datentyp des Parameters;

- den Datentyp des Rückgabewerts der Funktion.

So bedeutet z.B. atoi(a as zstring ptr) as integer, dass die Funktion atoi einen Wert vom Typ integer zurückgibt und einen zstring ptr als Parameter benötigt.

Alphabetische Liste

Name

Deklaration (mit Parametern)

Datei

Kommentar

abs_

abs_(n as integer) as integer

stdlib.bi

Gibt den Absolutwert zurück (also den positiven Wert)

acos_

acos_(a as double) as double

math.bi

Gibt den Arkuscosinus zurück (Winkel in Radianten)

asin_

asin_(a as double) as double

math.bi

Gibt den Arkussinus zurück (Winkel in Radianten)

atan_

atan_(a as double) as double

math.bi

Gibt den Arkustangens zurück (Winkel in Radianten)

atan2_

atan2_(y as double, x as double) as double

math.bi

Gibt den Arkustangens zurück (Ankathete als x, Gegenkathete als y)

atoi

atoi(s as zstring ptr) as integer

stdlib.bi

Konvertiert einen ZString mit Ziffern in eine Ganzzahl (Integer).

atof

atof(s as zstring ptr) as double

stdlib.bi

Konvertiert einen ZString mit Ziffern in eine Gleitkommazahl (Double).

calloc

calloc(NumElts as integer, EltSiz as integer) as any ptr

stdlib.bi

Fordert Speicher an. Gibt einen Pointer auf einen Puffer zurück, der Platz für ein Array bestehend aus NumElts Elementen der Größe EltSiz Bytes bietet.

ceil

ceil(d as double) as double

math.bi

Rundet auf die nächsthöhere Ganzzahl.

clearerr

clearerr(s as FILE ptr)

stdio.bi

Setzt den Error-Indikator eines Filestreams (lesen oder schreiben) zurück.

cos_

cos_(ar as double) as double

math.bi

Gibt den Cosinus eines Winkels in Radianten zurück.

cosh

cosh(x as double) as double

math.bi

Gibt den Cosinus Hyperbolicus eines Winkels in Radianten zurück.

div

div(num as integer, denom as integer) as div_t

stdlib.bi

Gibt den Quotienten und Rest einer Division als Struktur div_t zurück.

ecvt

ecvt(x as double) as zstring ptr

math.bi

Konvertiert eine Zahl in einen ZString.

exit_

exit_(status as integer)

stdlib.bi

Beendet das Programm. Dabei werden alle Dateipuffer geleert, offene Dateien geschlossen und von atexit() aufgerufene Funktionen ausgeführt.

exp_

exp_(a as double) as double

math.bi

Gibt den Wert von e hoch a zurück (Umkehrfunktion des natürlichen Logarithmus).

fabs

fabs(d as double) as double

math.bi

Gibt den Absolutwert (d.h. den positiven Wert) einer Double-Zahl zurück.

fclose

fclose(s as FILE ptr) as FILE ptr

stdio.bi

Schließt eine Datei. Gibt bei Erfolg 0 zurück, andernfalls EOF.

feof

feof(s as FILE ptr) as integer

stdio.bi

Gibt den Wert des Dateiende-Indikators zurück. Dieser hat den Wert 0, solange das Dateiende noch nicht erreicht wurde. Der Indikator setzt sich automatisch zurück, aber kann auch manuell mittels clearerr() zurückgesetzt werden.

ferror

ferror(s as FILE ptr) as integer

stdio.bi

Gibt die Fehlernummer für einen Stream zurück (0 wenn kein Fehler aufgetreten ist). Die Fehlernummer wird durch clearerr() oder rewind() zurückgesetzt.

fflush

fflush(s as FILE ptr) as integer

stdio.bi

Leert (z. B. löscht) einen Stream (verwenden Sie stdin, um den Stream der Tastatur zu leeren). Gibt bei Erfolg 0 zurück.

fgetc

fgetc(s as FILE ptr) as integer

stdio.bi

Einzelnes eingelesenes Zeichen (als ASCII-Code) vom übergebenen Stream (stdin zum Lesen von der Tastatur).

fgetpos

fgetpos(s as FILE ptr, c as fpos_t ptr) as integer

stdio.bi

Speichert die Position des Dateizeigers von Stream s an der Stelle, auf die der Pointer c zeigt.

fgets

fgets(b as zstring ptr, n as integer, s as FILE ptr) as zstring ptr

stdio.bi

Liest bis zu n-1 Zeichen von Stream s in den Buffer b.

floor

floor(d as double) as double

math.bi

Gibt die größte ganze Zahl zurück, die kleiner oder gleich d ist. (Abrunden der Zahl d)

fmod

fmod(x as double, y as double) as double

math.bi

Errechnet den Rest der Division x / y.

fopen

fopen(file as zstring ptr, mode as zstring ptr) as FILE ptr

stdio.bi

Öffnet eine Datei. Übergeben wird der DOS-Dateiname und eine Modus-Zeichenkette. Gültige Werte für letztere sind r (read) für lesenden Zugriff, w (write) für schreibenden Zugriff, a (append) für schreibenden Zugriff am Dateiende und r+ (Datei muss existieren) bzw. w+ (Datei wird neu angelegt) für lesenden und schreibenden Zugriff. Zusätzlich kann ein angehängtes b die Verwendung des Binärmodus signalisieren.

fprintf

fprintf(s as FILE ptr, fmt as zstring ptr, ...) as integer

stdio.bi

Prints on stream s as many items as there are single % signs in fmt that have matching arguments in the list.

fputc

fputc(c as integer, s as FILE ptr) as integer

stdio.bi

Gibt ein einzelnes Zeichen c in den Stream s aus.

fputs

fputs(b as zstring ptr, s as FILE ptr) as integer

stdio.bi

Sends the character stream in b to stream s, returns 0 if the operation fails.

fread

fread(buf as any ptr, b as size_t, c as size_t, s as FILE ptr) as integer

stdio.bi

Liest c Daten-Elemente der Größe von b Bytes aus der Datei s in den Buffer buf. Gibt die Anzahl der Elemente an, die tatsächlich gelesen wurden.

free

free(p as any ptr)

stdlib.bi

Gibt den für einen Zeiger p angeforderten Speicher zur anderwertigen Verwendung wieder frei.

freopen

freopen(file as zstring ptr, mode as zstring ptr, s as FILE ptr) as FILE ptr

stdio.bi

Öffnet eine Datei, um einen Stream umzuleiten. Z. B. freopen("myfile", "w", stdout) öffnet die Datei "myfile" und leitet die Standardausgabe dorthin um.

frexp

frexp(x as double, p as integer ptr) as double

math.bi

Berechnet den Wert m so, dass x = m * 2 ^ exponent. p ist ein Pointer auf m; exponent ist der Rückgabewert der Funktion.

fscanf

fscanf(s as FILE ptr, fmt as zstring ptr, ...) as integer

stdio.bi

Reads from stream s as many items as there are % signs in fmt with corresponding listed pointers.

fseek

fseek(s as FILE ptr, offset as integer, origin as integer) as integer

stdio.bi

Locates a file pointer. With origin 0, 1 or 2 for the beginning, offset bytes into and at the end of the stream.

fsetpos

fsetpos(s as FILE ptr, p as fpos_t ptr) as integer

stdio.bi

Sets the file pointer for the stream s to the value pointed to by p.

ftell

ftell(s as FILE ptr) as long

stdio.bi

Locates the position of the file pointer for the stream s.

fwrite

fwrite(buf as any ptr, b as integer, c as integer, s as FILE ptr) as integer

stdio.bi

Writes the number c items of data of size b bytes from the buffer buf to the file s. Returns the number of data items actually written.

getc

getc(s as FILE ptr) as integer

stdio.bi

Macro for single character input (in ASCII) from passed stream. (stdin for keyboard)

getchar

getchar() as integer

stdio.bi

Liest ein einzelnes Zeichen von der Standardeingabe ein

gets

gets(b as zstring ptr) as zstring ptr

stdio.bi

Reads a stream of characters from the standard input until it meets \n or EOF.

hypot

hypot(x as double, y as double) as double

math.bi

Errechnet die Hypotenuse aus den Katheten x und y.

isalnum

isalnum(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um einen Buchstaben oder eine Ziffer handelt.

isalpha

isalpha(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um einen Buchstaben handelt.

iscntrl

iscntrl(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um ein Steuerzeichen handelt.

isdigit

isdigit(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um eine Ziffer handelt.

isgraph

isgraph(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um ein darstellbares Zeichen handelt.

islower

islower(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um einen Kleinbuchstaben handelt.

isprint

isprint(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um ein druckbares Zeichen handelt.

ispunct

ispunct(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um ein Satzzeichen handelt.

isspace

isspace(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um ein Leerzeichen handelt.

isupper

isupper(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um einen Großbuchstaben handelt.

isxdigit

isxdigit(c as integer) as integer

ctype.bi

Gibt einen Wert ungleich 0 zurück, wenn es sich beim Zeichen c um eine Hex-Ziffer handelt (0 bis F oder f).

ldexp

ldexp(x as double, n as integer) as double

math.bi

Gibt das Produkt von x und 2 hoch n zurück.

ldiv

ldiv(num as long, denom as long) as ldiv_t

stdlib.bi

Gibt Quotient und Rest einer Division als Struktur ldiv_t zurück.

log_

log_(a as double) as double

math.bi

Gibt den natürlichen Logarithmus des Parameterwerts zurück.

log10

log10(a as double) as double

math.bi

Gibt den Zehnerlogarithmus des Parameterswerts zurück.

malloc

malloc(bytes as integer) as any ptr

stdlib.bi

Allocates memory. Returns a pointer to a buffer comprising storage for the specified size.

modf

modf(d as double, p as double ptr) as double

math.bi

Gibt den Nachkommateil einer Gleitkommazahl d zurück. nt number d. Der Zeiger p zeigt auf den Ganzzahligen Anteil als Float

perror

perror(mess as zstring ptr)

stdio.bi

Prints on the stream stderr a message passed as the argument.

pow

pow(x as double, y as double) as double

math.bi

Returns x to the power y.

pow10

pow10(x as double) as double

math.bi

Returns 10 to the power x (inverse function to log10()).

printf

printf(fmt as zstring ptr, ...) as integer

stdio.bi

Prints on standard output as many items as there are single % signs in fmt with matching arguments in the list.

putc

putc(c as integer, s as FILE ptr) as integer

stdio.bi

Macro to output the single character c to the stream s.

putchar

putchar(c as integer) as integer

stdio.bi

Macro to output the single character c to the standard output.

puts

puts(b as zstring ptr) as integer

stdio.bi

Sends the character stream in b to the standard output, returns 0 if operation fails.

rand

rand() as integer

stdlib.bi

Returns a pseudo random number. A seed is required. The seed is set with srand.

realloc

realloc(p as any ptr, newsize as size_t) as any ptr

stdlib.bi

Allocates memory. Returns a pointer to a buffer for a change in size of object pointed to by p.

rewind

rewind(s as FILE ptr)

stdio.bi

Clears the error indicators on a file stream (read or write). Necessary before reading an amended file.

scanf

scanf(fmt as zstring ptr, ) as integer

stdio.bi

Reads from standard input as many items as there are % signs in fmt with corresponding listed pointers.

sin_

sin_(ar as double) as double

math.bi

Gibt den Sinus eines Winkels in Radianten zurück.

sinh

sinh(x as double) as double

math.bi

Gibt den Sinus Hyperbolicus eines Winkels in Radianten zurück.

sprintf

sprintf(p as zstring ptr, fmt as zstring ptr, ...) as integer

stdio.bi

Prints on zstring p as many items as there are single % signs in fmt that have matching arguments in the list.

sqrt

sqrt(a as double) as double

math.bi

Gibt die Quadratwurzel des Parameterwerts zurück. Bei einem negativen Wert unter der Wurzel wird ein Domain error ausgelöst.

srand

srand(seed as uinteger)

stdlib.bi

Sets the seed for a random number. A possible seed is the current time.

sscanf

sscanf(b as zstring ptr, fmt as zstring ptr, ...) as integer

stdio.bi

Reads from buffer b as many items as there are % signs in fmt with corresponding listed pointers.

strcat

strcat(s1 as zstring ptr, s2 as zstring ptr) as zstring ptr

string.bi

Concatenates (appends) zstring s2 to s1.

strchr

strchr(s as zstring ptr, c as integer) as zstring ptr

string.bi

Returns a pointer to the first occurrence of c in s or NULL if it fails to find one.

strcmp

strcmp(s1 as zstring ptr, s2 as zstring ptr) as integer

string.bi

Compares zstring s2 to s1. Returns 0 or signed difference in ASCII values of first non matching character.

strcpy

strcpy(s1 as zstring ptr, s2 as zstring ptr) as zstring ptr

string.bi

Copies s2 into s1.

strcspn

strcspn(s1 as zstring ptr, s2 as zstring ptr) as integer

string.bi

Gibt die Zeichenanzahl von s1 zurück, bis zu welcher kein Zeichen aus s2 vorkommt.

strerror

strerror(n as integer) as zstring ptr

string.bi

Returns a pointer to a system error message corresponding to the passed error number.

strlen

strlen(s as zstring ptr) as integer

string.bi

Gibt die Länge eines Null-terminierten Strings in Bytes zurück (ohne Null mitzuzählen).

strncat

strncat(s1 as zstring ptr, s2 as zstring ptr, n as integer) as zstring ptr

string.bi

Concatenates (appends) n bytes from zstring s2 to s1.

strncmp

strncmp(s1 as zstring ptr, s2 as any ptr, n as integer) as integer

string.bi

Compares n bytes of zstring s2 to the same of s1. Returns 0 or signed difference in ASCII values of first non matching character.

strncpy

strncpy(s1 as zstring ptr, s2 as zstring ptr, n as integer) as zstring ptr

string.bi

Copies n bytes from s2 into s1.

strpbrk

strpbrk(s1 as zstring ptr, s2 as zstring ptr) as zstring ptr

string.bi

Returns a pointer to the first character encountered in s1 that is also in s2.

strrchr

strrchr(s as zstring ptr, c as integer) as zstring ptr

string.bi

Returns a pointer to the last occurrence of c in s or NULL if it fails to find one.

strspn

strspn(s1 as zstring ptr, s2 as zstring ptr) as integer

string.bi

Gibt die Zeichenanzahl von s1 zurück, bis zu welcher kein nicht in s2 vorhandenes Zeichen vorkommt.

strstr

strstr(s1 as zstring ptr, s2 as zstring ptr) as zstring ptr

string.bi

Finds the location of the zstring s2 in s1 and returns a pointer to its leading character.

strtod

strtod(s as zstring ptr, p as zstring ptr) as double

stdlib.bi

Converts a zstring to double, provided the zstring is written in the form of a number.

strtok

strtok(s1 as zstring ptr, s2 as zstring ptr) as zstring ptr

string.bi

Returns pointers to successive tokens utilizing the zstring s1. Tokens regarded as separators are listed in s2.

System

System(command as zstring ptr) as integer

stdlib.bi

Executes, from within a program, a command addressed to the operating system written as a zstring (e.g. DIR on Windows and DOS and LS on Linux).

tan_

tan_(ar as double) as double

math.bi

Gibt den Tangens eines Winkels in Radianten zurück.

tanh

tanh(x as double) as double

math.bi

Gibt den Tangens Hyperbolicus eines Winkels in Radianten zurück.

tolower

tolower(c as integer) as integer

ctype.bi

Converts a character from upper case to lower case (uses ASCII code).

toupper

toupper(c as integer) as integer

ctype.bi

Converts a character from lower case to upper case (uses ASCII code).

ungetc

ungetc(c as integer, s as FILE ptr) as integer

stdio.bi

Pushes a character c back into the stream s, returns EOF if unsuccessful. Do not push more than one character.

Puffermanipulation

#include "crt/string.bi"

Deklaration (mit Parametern)

Kommentar

memchr(s as any ptr, c as integer, n as size_t) as any ptr

Search for a character in a buffer.

memcmp(s1 as any ptr, s2 as any ptr, n as size_t) as integer

Compare two buffers.

memcpy(dest as any ptr, src as any ptr, n as size_t) as any ptr

Copy one buffer into another .

memmove(dest as any ptr, src as any ptr, n as size_t) as any ptr

Move a number of bytes from one buffer lo another.

memset(s as any ptr, c as integer, n as size_t) as any ptr

Set all bytes of a buffer to a given character.

Zeichenklassifizierung - konvertierung

#include "crt/ctype.bi"

Deklaration (mit Parametern)

Kommentar

isalnum(c as integer) as integer

TRUE if c is alphanumeric.

isalpha(c as integer) as integer

TRUE if c is a letter.

isascii(c as integer) as integer

TRUE if c is ASCII .

iscntrl(c as integer) as integer

TRUE if c is a control character.

isdigit(c as integer) as integer

TRUE if c is a decimal digit.

isgraph(c as integer) as integer

TRUE if c is a graphical character.

islower(c as integer) as integer

TRUE if c is a lowercase letter.

isprint(c as integer) as integer

TRUE if c is a printable character.

ispunct(c as integer) as integer

TRUE if c is a punctuation character.

isspace(c as integer) as integer

TRUE if c is a space character.

isupper(c as integer) as integer

TRUE if c is an uppercase letter.

isxdigit(c as integer) as integer

TRUE if c is a hexadecimal digit.

toascii(c as integer) as integer

Convert c to ASCII .

tolower(c as integer) as integer

Convert c to lowercase.

toupper(c as integer) as integer

Convert c to uppercase.

Datenkonvertierung

#include "crt/stdlib.bi"

Deklaration (mit Parametern)

Kommentar

atof(string1 as zstring ptr) as double

Convert zstring to floating point value.

atoi(string1 as zstring ptr) as integer

Convert zstring to an integer value.

atol(string1 as zstring ptr) as integer

Convert zstring to a long integer value.

itoa(value as integer, zstring as zstring ptr, radix as integer) as zstring ptr

Convert an integer value to a zstring using given radix.

ltoa(value as long, zstring as zstring ptr, radix as integer) as zstring ptr

Convert long integer to zstring in a given radix.

strtod(string1 as zstring ptr, endptr as zstring ptr) as double

Convert zstring to a floating point value.

strtol(string1 as zstring ptr, endptr as zstring ptr, radix as integer) as long

Convert zstring to a long integer using a given radix.

strtoul(string1 as zstring ptr, endptr as zstring ptr, radix as integer) as ulong

Convert zstring to unsigned long.

Pfadmanipulation

#include "crt/io.bi"

Deklaration (mit Parametern)

Kommentar

_chdir(path as zstring ptr) as integer

Change current directory to given path.

_getcwd(path as zstring ptr, numchars as integer) as zstring ptr

Returns name of current working directory.

_mkdir(path as zstring ptr) as integer

Create a directory using given path name.

_rmdir(path as zstring ptr) as integer

Delete a specified directory.

Dateimanipulation

#include "crt/sys/stat.bi"

#include "crt/io.bi"

Deklaration (mit Parametern)

Kommentar

chmod(path as zstring ptr, pmode as integer) as integer

Change permission settings of a file.

fstat(handle as integer, buffer as type stat ptr) as integer

Get file status information.

remove(path as zstring ptr) as integer

Delete a named file.

rename_(oldname as zstring ptr, newname as zstring ptr) as integer

rename a file.

stat(path as zstring ptr, buffer as type stat ptr) as integer

Get file status information of named file.

umask(pmode as uinteger) as uinteger

Set file permission mask.

Stream I/O

#include "crt/stdio.bi"

Deklaration (mit Parametern)

Kommentar

clearerr(file_pointer as FILE ptr)

Clear error indicator of stream,

fclose(file_pointer as FILE ptr) as integer

Close a file,

feof(file_pointer as FILE ptr) as integer

Check if end of file occurred on a stream.

ferror(file_pointer as FILE ptr) as integer

Check if any error occurred during file I/0.

fflush(file_pointer as FILE ptr) as integer

Write out (flush) buffer to file.

fgetc(file_pointer as FILE ptr) as integer

Get a character from a stream.

fgetpos(file_pointer as FILE ptr, fpos_t current_pos) as integer

Get the current position in a stream.

fgets(string1 as zstring ptr, maxchar as integer, file_pointer as FILE ptr) as zstring ptr

Read a zstring from a file.

fopen(filename as zstring ptr, access_mode as zstring ptr) as FILE ptr

Open a file for buffered I/0.

fprintf(file_pointer as FILE ptr, format_string as zstring ptr, args) as integer

Write formatted output to a file,

fputc(c as integer, file_pointer as FILE ptr) as integer

Write a character to a stream.

fputchar(c as integer) as integer

Write a character to stdout.

fputs(string1 as zstring ptr, file_pointer as FILE ptr) as integer

Write a zstring to a stream.

fread(buffer as zstring ptr, size as size_t count as size_t, file_pointer as FILE ptr) as size_t

Read unformatted data from a stream into a buffer.

freopen(filename as zstring ptr, access as zstring ptr mode, file_pointer as FILE ptr) as FILE ptr

Reassign a file pointer to a different file.

fscanf(file_pointer as FILE ptr, format as zstring ptr zstring, args) as integer

Read formatted input from a stream.

fseek(file_pointer as FILE ptr, offset as long, origin as integer) as integer

Set current position in file to a new location.

fsetpos(file_pointer as FILE ptr, current_pos as fpos_t) as integer

Set current position in file to a new location.

ftell(file_pointer as FILE ptr) as long

Get current location in file.

fwrite(buffer as zstring ptr, size as size_t, count as size_t file_pointer as FILE ptr) as size_t

Write unformatted data from a buffer to a stream.

getc(file_pointer as FILE ptr) as integer

Read a character from a stream.

getchar() as integer

Read a character from stdin.

gets(buffer as zstring ptr) as zstring ptr

Read a line from stdin into a buffer.

printf(format as zstring ptr _string, args) as integer

Write formatted output to stdout.

putc(c as integer, file_pointer as FILE ptr) as integer

Write a character to a stream.

putchar(c as integer) as integer

Write a character to stdout.

puts(string1 as zstring ptr) as integer

Write a zstring to stdout.

rewind(file_pointer as FILE ptr)

Rewind a file.

scanf(format_string as zstring ptr, args) as integer

Read formatted input from stdin.

setbuf(file_pointer as FILE ptr, buffer as zstring ptr)

Set up a new buffer for the stream.

setvbuf(file_pointer as FILE ptr, buffer as zstring ptr, buf_type as integer, buf as size_t size) as integer

Set up new buffer and control the level of buffering on a stream.

sprintf(string1 as zstring ptr, format_string as zstring ptr, args) as integer

Write formatted output to a zstring.

sscanf(buffer as zstring ptr, format_string as zstring ptr, args) as integer

Read formatted input from a zstring.

tmpfile() as FILE ptr

Open a temporary file.

tmpnam(file_name as zstring ptr) as zstring ptr

Get temporary file name.

ungetc(c as integer, file_pointer as FILE ptr) as integer

Push back character into stream' s buffer

Low level I/O

#include "crt/io.bi"

Nur für Windows, da für die anderen Plattformen bis jetzt die Header fehlen.

Deklaration (mit Parametern)

Kommentar

_close(handle as integer) as integer

Close a file opened for unbuffered I/O.

_creat(filename as zstring ptr, pmode as integer) as integer

Create a new file with specified permission setting.

_eof(handle as integer) as integer

Check for end of file.

_lseek(handle as integer, offset as long, origin as integer) as long

Go to a specific position in a file.

_open(filename as zstring ptr, oflag as integer, pmode as uinteger) as integer

Open a file for low-level I/O.

_read(handle as integer, buffer as zstring ptr, length as uinteger) as integer

Read binary data from a file into a buffer.

_write(handle as integer, buffer as zstring ptr, count as uinteger) as integer

Write binary data from a buffer to a file.

Mathematik

#include "crt/math.bi"

Deklaration (mit Parametern)

Kommentar

abs_(n as integer) as integer

Get absolute value of an integer.

acos_(x as double) as double

Compute arc cosine of x.

asin_(x as double) as double

Compute arc sine of x.

atan_(x as double) as double

Compute arc tangent of x.

atan2_(y as double, x as double) as double

Compute arc tangent of y/x.

ceil(x as double) as double

Get smallest integral value that exceeds x.

cos_(x as double) as double

Compute cosine of angle in radians.

cosh(x as double) as double

Compute the hyperbolic cosine of x.

div(number as integer, denom as integer) as div_t

Divide one integer by another.

exp_(x as double) as double

Compute exponential of x.

fabs(x as double) as double

Compute absolute value of x.

floor(x as double) as double

Get largest integral value less than x.

fmod(x as double, y as double) as double

Divide x by y with integral quotient and return remainder.

frexp(x as double, expptr as integer ptr) as double

Breaks down x into mantissa and exponent of no.

labs(n as long) as long

Find absolute value of long integer n.

ldexp(x as double, exp as integer) as double

Reconstructs x out of mantissa and exponent of two.

ldiv(number as long, denom as long) as ldiv_t

Divide one long integer by another.

log_(x as double) as double

Compute log(x).

log10(x as double) as double

Compute log to the base 10 of x.

modf(x as double, intptr as double ptr) as double

Breaks x into fractional and integer parts.

pow(x as double, y as double) as double

Compute x raised to the power y.

rand() as integer

Get a random integer between 0 and 32.

Random(max_num as integer) as integer

Get a random integer between 0 and max_num.

Randomize()

Set a random seed for the random number generator.

sin_(x as double) as double

Compute sine of angle in radians.

sinh(x as double) as double

Compute the hyperbolic sine of x.

sqrt(x as double) as double

Compute the square root of x.

srand(seed as uinteger)

Set a new seed for the random number generator (rand).

tan_(x as double) as double

Compute tangent of angle in radians.

tanh(x as double) as double

Compute the hyperbolic tangent of x.

Speicherallokation

#include "crt/stdlib.bi"

Deklaration (mit Parametern)

Kommentar

calloc(num as size_t elems, elem_size as size_t) as any ptr

Allocate an array and initialise all elements to zero .

free(mem_address as any ptr)

Free a block of memory.

malloc(num as size_t bytes) as any ptr

Allocate a block of memory.

realloc(mem_address as any ptr, newsize as size_t) as any ptr

ReAllocate (adjust size) a block of memory.

Prozesskontrolle

#include "crt/stdlib.bi"

Deklaration (mit Parametern)

Kommentar

abort()

Abort a process.

execl(path as zstring ptr, arg0 as zstring ptr, arg1 as zstring ptr,..., NULL) as integer

Launch a child process (pass command line).

execlp(path as zstring ptr, arg0 as zstring ptr, arg1 as zstring ptr,..., NULL) as integer

Launch child (use PATH, pass command line).

execv(path as zstring ptr, argv as zstring ptr) as integer

Launch child (pass argument vector).

execvp(path as zstring ptr, argv as zstring ptr) as integer

Launch child (use PATH, pass argument vector).

exit_(status as integer)

Terminate process after flushing all buffers.

getenv(varname as zstring ptr) as zstring ptr

Get definition of environment variable,

perror(string1 as zstring ptr)

Print error message corresponding to last system error.

putenv(envstring as zstring ptr) as integer

Insert new definition into environment table.

raise(signum as integer) as integer

Generate a C signal (exception).

system_(string1 as zstring ptr) as integer

Execute a resident operating system command.

Suchen und Sortieren

#include "crt/stdlib.bi"

Hinweis: Die compare Callback-Funktion, die von bsearch und qsort benötigt wird, muss mit CDECL deklariert werden. Sie muss kleiner 0 sein, wenn der Wert des ersten Parameters der Funktion vor dem, des zweiten in der Sortierung liegt und größer 0, wenn der erste Wert hinter dem zweiten liegt. Die Funktion muss 0 zurückgeben, wenn beide Werte gleich sind.

Deklaration (mit Parametern)

Kommentar

bsearch(key as any ptr, base as any ptr, num as size_t, width as size_t, compare as function(elem1 as any ptr, elem2 as any ptr) as integer) as any ptr

Perform binary search.

qsort(base as any ptr, num as size_t, width as size_t, compare as function(elem1 as any ptr, elem2 as any ptr) as integer)

Use the quicksort algorithm to sort an array.

Stringmanipulation

#include "crt/string.bi"

Deklaration (mit Parametern)

Kommentar

stpcpy(dest as zstring ptr, src as zstring ptr) as zstring ptr

Copy one zstring into another.

strcmp(string1 as zstring ptr, string2 as zstring ptr) as integer

Compare string1 and string2 to determine alphabetic order.

strcpy(string1 as zstring ptr, string2 as zstring ptr) as zstring ptr

Copy string2 to string1.

strerror(errnum as integer) as zstring ptr

Get error message corresponding to specified error number.

strlen(string1 as zstring ptr) as integer

Determine the length of a zstring.

strncat(string1 as zstring ptr, string2 as zstring ptr, n as size_t) as zstring ptr

Append n characters from string2 to string1.

strncmp(string1 as zstring ptr, string2 as zstring ptr, n as size_t) as integer

Compare first n characters of two strings.

strncpy(string1 as zstring ptr, string2 as zstring ptr, n as size_t) as zstring ptr

Copy first n characters of string2 to string1.

strnset(string1 as zstring ptr, c as integer, size _t n) as zstring ptr

Set first n characters of zstring to c.

strrchr(string1 as zstring ptr, c as integer) as zstring ptr

Find last occurrence of character c in zstring.

Zeit

#include "crt/time.bi"

Deklaration (mit Parametern)

Kommentar

asctime(time as type tm ptr) as zstring ptr

Convert time from type tm to zstring.

clock() as clock_t

Get elapsed processor time in clock ticks.

ctime(time as time_t ptr) as zstring ptr

Convert binary time to zstring.

difftime(time_t time2, time_t time1) as double

Compute the difference between two times in seconds.

gmtime(time as time_t ptr) as type tm ptr

Get Greenwich Mean Time (GMT) in a tm structure.

localtime(time as time_t ptr) as type tm ptr

Get the local time in a tm structure.

time_(timeptr as time_t ptr) as time_t

Get current time as seconds elapsed since 0 hours GMT 1/1/70.

Siehe auch:

- INCLUDE (Meta)

- CDECL

Letzte Bearbeitung: 29.12.10
Zur Onlinefassung des Eintrags

Obsolete Schlüsselwörter

Liste der nicht unterstützten Schlüsselwörter(Obsolete Keywords)

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

Es folgt eine Liste mit den Schlüsselwörtern, einer Klassifizierung und ggf. einem Grund für ihre Streichung (der engl. Originalquelle entnommen):

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

Letzte Bearbeitung: 05.10.07
Zur Onlinefassung des Eintrags

Serial Numbers

Eine Serial Number ist eine Zahl, die ein Datum und eine Zeit in demselben 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.

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.

Unterschiede zu früheren Versionen von FreeBASIC: erst seit FreeBASIC v0.15

Siehe auch:
NOW, DATESERIAL, DATEVALUE, TIMESERIAL, TIMEVALUE, YEAR, MONTH, DAY, WEEKDAY, HOUR, MINUTE, SECOND, MONTHNAME, WEEKDAYNAME, DATEDIFF, DATEPART, DATEADD, FORMAT, Datum und Zeit

Letzte Bearbeitung: 31.07.10
Zur Onlinefassung des Eintrags

Inhaltsverzeichnis

Themengebiete

Arrays
Benutzereingaben
Betriebssystem-Anweisungen
Bit-Operatoren
Dateien (Files)
Datentypen umwandeln
Datentypen und Deklarationen
Datum und Zeit
Fehlerbehandlung, Debugging
Grafik
Hardware-Zugriffe
Kommentare
Konsole
Mathematik
Module (Library / DLL)
Multithreading
Pointer (Zeiger)
Präprozessor-Anweisungen
Programmablauf
Prozeduren
Speicher
String-Funktionen
Verschiedenes

Schlüsselwörter

__DATE__

__DATE_ISO__

__FB_ARGC__

__FB_ARGV__

__FB_BACKEND__

__FB_BIGENDIAN__

__FB_BUILD_DATE__

__FB_CYGWIN__

__FB_DARWIN__

__FB_DEBUG__

__FB_DOS__

__FB_ERR__

__FB_FPMODE__

__FB_FPU__

__FB_FREEBSD__

__FB_LANG__

__FB_LINUX__

__FB_MAIN__

__FB_MIN_VERSION__

__FB_MT__

__FB_NETBSD__

__FB_OPENBSD__

__FB_OPTION_BYVAL__

__FB_OPTION_DYNAMIC__

__FB_OPTION_ESCAPE__

__FB_OPTION_EXPLICIT__

__FB_OPTION_GOSUB__

__FB_OPTION_PRIVATE__

__FB_OUT_DLL__

__FB_OUT_EXE__

__FB_OUT_LIB__

__FB_OUT_OBJ__

__FB_PCOS__

__FB_SIGNATURE__

__FB_SSE__

__FB_UNIX__

__FB_VECTORIZE__

__FB_VER_MAJOR__

__FB_VER_MINOR__

__FB_VER_PATCH__

__FB_VERSION__

__FB_WIN32__

__FB_XBOX__

__FILE__

__FILE_NQ__

__FUNCTION__

__FUNCTION_NQ__

__LINE__

__PATH__

__TIME__

ABS

ACCESS

ACOS

ADD

ALIAS

ALLOCATE

ALPHA

AND (Methode)

AND (Operator)

ANDALSO

ANY

APPEND

AS

ASC

ASIN

ASM

ASSERT

ASSERTWARN

ATAN2

ATN

BASE

BASE (Vererbung)

BEEP

BIN

BINARY

BIT

BITRESET

BITSET

BLOAD

BSAVE

BYREF

BYTE

BYVAL (Klausel)

BYVAL (Schlüsselwort)

CALL

CALLOCATE

CASE

CAST

CBYTE

CDBL

CDECL

CHAIN

CHDIR

CHR

CINT

CIRCLE

CLASS

CLEAR

CLNG

CLNGINT

CLOSE

CLS

COLOR (Anweisung)

COLOR (Funktion)

COM

COMMAND

COMMON

CONDBROADCAST

CONDCREATE

CONDDESTROY

CONDSIGNAL

CONDWAIT

CONS

CONST

CONST (Klausel)

CONSTRUCTOR (Klassen)

CONSTRUCTOR (Module)

CONTINUE

COS

CPTR

CSHORT

CSIGN

CSNG

CSRLIN

CUBYTE

CUINT

CULNG

CULNGINT

CUNSG

CURDIR

CUSHORT

CUSTOM

CVD

CVI

CVL

CVLONGINT

CVS

CVSHORT

DATA

DATE

DATEADD

DATEDIFF

DATEPART

DATESERIAL

DATEVALUE

DAY

DEALLOCATE

DECLARE

DEFBYTE

DEFDBL

DEFINE (Meta)

DEFINED

DEFINT

DEFLNG

DEFLONGINT

DEFSHORT

DEFSNG

DEFSTR

DEFUBYTE

DEFUINT

DEFULONGINT

DEFUSHORT

DEFxxx

DELETE

DESTRUCTOR (Klassen)

DESTRUCTOR (Module)

DIM

DIR

DO ... LOOP

DOUBLE

DRAW (Grafik)

DRAW STRING

DYLIBFREE

DYLIBLOAD

DYLIBSYMBOL

DYNAMIC (Meta)

DYNAMIC (Schlüsselwort)

ELSE

ELSEIF

ENCODING

END

ENDIF

ENDMACRO (Meta)

ENUM

ENVIRON

EOF

EQV

ERASE

ERFN

ERL

ERMN

ERR (Anweisung)

ERR (Funktion)

ERROR (Anweisung)

ERROR (Meta)

ESCAPE

EXEC

EXEPATH

EXIT

EXP

EXPLICIT

EXPORT

EXTENDS

EXTERN (Module)

EXTERN ... END EXTERN

FIELD

FILEATTR

FILECOPY

FILEDATETIME

FILEEXISTS

FILELEN

FIX

FLIP

FOR

FOR ... NEXT

FORMAT

FRAC

FRE

FREEFILE

FUNCTION

GET (Datei)

GET (Grafik)

GETJOYSTICK

GETKEY

GETMOUSE

GOSUB

GOSUB (Schlüsselwort)

GOTO

HEX

HIBYTE

HIWORD

HOUR

IF (Meta)

IF ... THEN

IFDEF (Meta)

IFNDEF (Meta)

IIF

IMAGECONVERTROW

IMAGECREATE

IMAGEDESTROY

IMAGEINFO

IMP

IMPLEMENTS

IMPORT

INCLIB (Meta)

INCLUDE (Meta)

INKEY

INP

INPUT (Anweisung)

INPUT (Datei)

INPUT (Dateimodus)

INPUT (Funktion)

INSTR

INSTRREV

INT

INTEGER

IS

IS (Vererbung)

ISDATE

KILL

LANG (Meta)

LBOUND

LCASE

LEFT

LEN

LET

LIB

LIBPATH (Meta)

LINE (Grafik)

LINE (Meta)

LINE INPUT

LINE INPUT (Datei)

LOBYTE

LOC

LOCAL

LOCATE (Anweisung)

LOCATE (Funktion)

LOCK

LOF

LOG

LONG

LONGINT

LOOP

LOWORD

LPOS

LPRINT (Anweisung)

LPRINT USING

LPT

LSET

LTRIM

MACRO (Meta)

MID (Anweisung)

MID (Funktion)

MINUTE

MKD

MKDIR

MKI

MKL

MKLONGINT

MKS

MKShort

MOD

MONTH

MONTHNAME

MULTIKEY

MUTEXCREATE

MUTEXDESTROY

MUTEXLOCK

MUTEXUNLOCK

NAKED

NAME

NAMESPACE

NEW

NEXT

NOGOSUB (Schlüsselwort)

NOKEYWORD

NOT

NOW

OBJECT

OCT

OFFSETOF

ON ... GOSUB

ON ... GOTO

ON ERROR

ONCE

OPEN (Anweisung)

OPEN (Funktion)

OPEN COM

OPEN CONS

OPEN ERR

OPEN LPT

OPEN PIPE

OPEN SCRN

OPERATOR

OPTION

Option()

OR (Methode)

OR (Operator)

ORELSE

OUT

OUTPUT

OVERLOAD

PAINT

PALETTE

PALETTE GET

PASCAL

PCOPY

PEEK

PIPE

PMAP

POINT

POINTER

POKE

POS

PRAGMA (Meta)

PRESERVE

PRESET (Grafik)

PRESET (Methode)

PRINT (Anweisung)

PRINT (Datei)

PRINT (Meta)

PRINT USING

PRIVATE (Klausel)

PRIVATE (Schlüsselwort)

PRIVATE (UDT)

PROCPTR

PROPERTY

PROTECTED

PSET (Grafik)

PSET (Methode)

PTR

PUBLIC (Klausel)

PUBLIC (UDT)

PUT (Datei)

PUT (Grafik)

RANDOM

RANDOMIZE

READ

REALLOCATE

REDIM

REM

RESET

RESTORE

RESUME

RETURN

RGB

RGBA

RIGHT

RMDIR

RND

RSET

RTRIM

RUN

SADD

SCOPE

SCREEN (Anweisung)

SCREEN (Funktion)

SCREENCONTROL

SCREENCOPY

SCREENEVENT

SCREENGLPROC

SCREENINFO

SCREENLIST

SCREENLOCK

SCREENPTR

SCREENRES

SCREENSET

SCREENSYNC

SCREENUNLOCK

SCRN

SECOND

SEEK (Anweisung)

SEEK (Funktion)

SELECT CASE

SETDATE

SETENVIRON

SETMOUSE

SETTIME

SGN

SHARED

SHELL

SHL

SHORT

SHR

SIN

SINGLE

SIZEOF

SLEEP

SPACE

SPC

SQR

STATIC (Anweisung)

STATIC (Klausel)

STATIC (Meta)

STATIC (Schlüsselwort)

STATIC (UDT)

STDCALL

STEP

STICK

STOP

STR

STRIG

STRING (Datentyp)

STRING (Funktion)

STRPTR

SUB

SWAP

SYSTEM

TAB

TAN

THEN

THIS

THREADCALL

THREADCREATE

THREADWAIT

TIME

TIMER

TIMESERIAL

TIMEVALUE

TO

TRANS

TRIM

TYPE (Forward Referencing)

TYPE (Funktion)

TYPE (UDT)

TYPEOF

UBOUND

UBYTE

UCASE

UINTEGER

ULONG

ULONGINT

UNDEF (Metabefehl)

UNION

UNLOCK

UNSIGNED

UNTIL

USHORT

USING (Namespace)

VA_ARG

VA_FIRST

VA_NEXT

VAL

VAL64

VALINT

VALLNG

VALUINT

VALULNG

VAR

VARPTR

VIEW (Grafik)

VIEW (Text)

WAIT

WBIN

WCHR

WEEKDAY

WEEKDAYNAME

WEND

WHEX

WHILE

WHILE ... WEND

WIDTH (Anweisung)

WIDTH (Funktion)

WINDOW

WINDOWTITLE

WINPUT

WITH

WOCT

WRITE (Anweisung)

WRITE (Datei)

WSPACE

WSTR

WSTRING (Datentyp)

WSTRING (Funktion)

XOR (Methode)

XOR (Operator)

YEAR

ZSTRING

BASIC-Grundlagen

Ausdrücke und Operatoren
Bedingungsstrukturen
Bitfelder
Datentypen
Gültigkeitsbereich von Variablen
Inline-Assembler
Pointer
Präprozessoren
Schleifen

Operatoren

... (Auslassung[Ellipsis])
At
Ausrufezeichen
Backslash
Das '#'-Zeichen
Das '?'-Zeichen
Dollarzeichen
Doppelpunkt
Eckige Klammern
Exp
Geschweifte Klammern
Minus
Pfeil
Plus
Punkt
Runde Klammern
Slash
Stern
Und (et-Ligatur)
Zeilenfortsetzungszeichen _

Prozeduren

Einleitung
FUNCTIONs
GOTO und GOSUB
Parameterübergabe
SUBs

Die Gfxlib

Geschwindigkeit und Größe
Interne Pixelformate
Interne Treiber
Keyboard Scancodes
Standard-Paletten
Tipps und Tricks

Verschiedene Themen

ASCII-Codes
Der Compiler
FB-Dialektformen
Fehler-Behandlung in FreeBASIC
Funktionen der CRT
Obsolete Schlüsselwörter
Serial Numbers