QB64.com

QB64 is a modern extended BASIC programming language that retains QBasic/QuickBASIC 4.5 compatibility and compiles native binaries for Windows, Linux, and macOS.

TYPE definitions are used to create variables that can hold more than one element.

Syntax

TYPE typename

element-name1 AS type

element-name2 AS type

(…)

element-nameN AS type

END TYPE

TYPE typename

AS type element-list1

AS type element-list2

(…)

AS type element-listN

END TYPE

Description

Numerical Types

Type Name Symbol Minimum Value Maximum Value
_BIT ` -1 0
_BIT * n `n -128 127
_UNSIGNED _BIT ~` 0 1
_BYTE %% -128 127
_UNSIGNED _BYTE ~%% 0 255
INTEGER % -32,768 32,767
_UNSIGNED INTEGER ~% 0 65,535
LONG & -2,147,483,648 2,147,483,647
_UNSIGNED LONG ~& 0 4,294,967,295
_INTEGER64 && -9,223,372,036,854,775,808 9,223,372,036,854,775,807
_UNSIGNED _INTEGER64 ~&& 0 18,446,744,073,709,551,615
SINGLE ! or none -2.802597E-45 +3.402823E+38
DOUBLE # -4.490656458412465E-324 +1.797693134862310E+308
_FLOAT ## -1.18E−4932 +1.18E+4932
_OFFSET %& -9,223,372,036,854,775,808 9,223,372,036,854,775,807
_UNSIGNED _OFFSET ~%& 0 18,446,744,073,709,551,615
_MEM none combined memory variable type N/A

Note: For the floating-point numeric types SINGLE (default when not assigned), DOUBLE and _FLOAT, the minimum values represent the smallest values closest to zero, while the maximum values represent the largest values closest to ±infinity. OFFSET dot values are used as a part of the _MEM variable type in QB64 to return or set the position in memory.

String Text Type

Type Name Symbol Minimum Length Maximum Length Size (Bytes)
STRING $ 0 2,147,483,647 Use LEN
STRING * n $n 1 2,147,483,647 n

Note: For the fixed-length string type STRING * n, where n is an integer length value from 1 (one) to 2,147,483,647.

Examples

Creating a mouse INTERRUPT TYPE definition. Each INTEGER value is 2 bytes.


TYPE RegType
  AX AS INTEGER    ' mouse function to use
  BX AS INTEGER    ' mouse button
  CX AS INTEGER    ' mouse graphic column position
  DX AS INTEGER    ' mouse graphic row position
  BP AS INTEGER    ' not used by mouse, but required *
  SI AS INTEGER    ' not used by mouse, but required *
  DI AS INTEGER    ' not used by mouse, but required *
  Flags AS INTEGER ' not used by mouse but required *
  DS AS INTEGER    ' used by INTERRUPTX only
  ES AS INTEGER    ' used by INTERRUPTX only
END TYPE

DIM SHARED InRegs AS RegType, OutRegs AS RegType ' create dot variables

InRegs.AX = 3 ' sets the mouse function to read the mouse buttons and position.

CALL INTERRUPT(&H33, InRegs, OutRegs)

column% = OutRegs.CX ' returns the current mouse column position

Explanation: InRegs and OutRegs become the DOT variable prefix name for the TYPE definition’s variables.

Each TYPE variable is designated as the DOT variable’s suffix.

* Note: Omitting variables in the RegType definition can change other program variable values.

Simplifying the TYPE from Example 1 using the alternative TYPE syntax.


TYPE RegType
  AS INTEGER AX, BX, CX, DX, BP, SI, DI, Flags, FS, ES
END TYPE

Explanation: By using AS type element-list you reduce typing in your TYPE definition, while achieving the same results.

Creating an addressbook database for a RANDOM file.


TYPE ContactInfo
  First AS STRING * 10
  Last AS STRING * 15
  Address1 AS STRING * 30
  Address2 AS STRING * 30
  City AS STRING * 15
  State AS STRING * 2
  Zip AS LONG   ' (4 bytes)
  Phone AS STRING * 12
END TYPE

DIM Contact AS ContactInfo 'create contact record variable for RANDOM file 
RecordLEN% = LEN(Contact) ' 118 bytes
' define values
Contact.First = "Ted" ' the fixed string length value will contain 7 extra spaces
Contact.Zip = 15236 ' LONG value that can be used to search certain zip code numbers.

PUT #1, 5, Contact  'place contact info into fifth record position

Explanation: Use the assigned type variable to find the RANDOM record length which is 118 bytes.

Defining a TYPE variable as another variable type from a previous TYPE definition in QB64.


TYPE bar
  b AS STRING * 10
END TYPE

TYPE foo
  a AS SINGLE
  c AS bar          'define variable as a bar type
END TYPE

DIM foobar AS foo   'create a variable to use the foo type
foobar.a = 15.5
foobar.c.b = "this is me"

PRINT foobar.a, foobar.c.b 
END 

A bitmap header information TYPE $INCLUDE File.


' ********
'Bitmap.BI can be included at start of program

 TYPE BMPHeaderType        ' Description                  Bytes      **QB64**
  ID AS STRING * 2        ' File ID is "BM"                2 
  Size AS LONG            ' Size of the data file          4 
  Res1 AS INTEGER         ' Reserved 1 should be 0         2 
  Res2 AS INTEGER         ' Reserved 2 should be 0         2 
  Offset AS LONG          ' Start position of pixel data   4 
  Hsize AS LONG           ' Information header size        4 
  PWidth AS LONG          ' Image width                    4       _WIDTH (QB64) 
  PDepth AS LONG          ' Image height                   4       _HEIGHT
  Planes AS INTEGER       ' Number of planes               2 
  BPP AS INTEGER          ' Bits per pixel(palette)        2       _PIXELSIZE
  Compress AS LONG        ' Compression                    4
  ImageBytes AS LONG      ' Width * Height = ImageSIZE     4
  Xres AS LONG            ' Width in PELS per metre        4
  Yres AS LONG            ' Depth in PELS per metre        4
  NumColors AS LONG       ' Number of Colors               4
  SigColors AS LONG       ' Significant Colors             4
END TYPE                  '          Total Header bytes = 54  


'$INCLUDE: 'Bitmap.BI'  'use only when including a BI file 

DIM SHARED BMPHead AS BMPHeaderType 

GET #1, , BMPHead  'get the entire bitmap header information

Explanation: Use one GET to read all of the header information from the start of the bitmap file opened AS BINARY. It reads all 54 bytes as STRING, INTEGER and LONG type DOT variable values.

NOTE: BPP returns 4(16 colors), 8(256 colors) or 24(16 million colors) bits per pixel in QBasic. 24 bit can only be in greyscale.

Then use the DOT variable name values like this GET (graphics statement) after you load the bitmap image to the screen:


GET (0, 0)-(BMPHead.PWidth - 1, BMPHead.PDepth - 1), Image(48) 'indexed for 4 BPP colors

The bitmap image is now stored in an array to BSAVE to a file. The RGB color information follows the file header as ASCII character values read using ASC. The color values could be indexed at the start of the Array with the image being offset to: index = NumberOfColors * 3. As determined by the SCREEN mode used. In SCREEN 13(256 colors) the index would be 768.

See Also