Getting Started
Introduction
Sample Programs
QBasic IDEs
History
Advice
Tools
Mini-Tutorial
Tutorial
Code Snippets

Resources
Web Sites
More Tutorials
Vendors
Books
Magazines
NewsLetters
NewsGroups
Forums
User Groups
Talk Shows
Blogs

GBIC >> QBasic >> Advice

QBasic vs GW-BASIC
One good thing about GW-BASIC is that it is very, very simple and is an excellent tool for teaching programming to a complete beginner. It's very, very simple. The problem is that it lacks virtually all features of a modern language, making it a poor choice for any long term programming needs.

QBasic, while also very simple, does not provide many of the features you'll find in modern languages. For that reason, I highly recommend QBasic over GW-BASIC. This page documents the differences between the two languages, clarifying the advantages of using QBasic.

You may also want to read these articles from the Microsoft Knowledge Base on feature and behavior, differences between QBasic and GW-BASIC.

Behavioral Differences
Some keywords, though supported by both QBasic and GW-Basic, do not behave the same in both languages. Here are the differences.

  • BSAVE, BLOAD
    QBasic does not support the cassette device with BSAVE and BLOAD, and memory locations may be different.

  • CALL ABSOLUTE
    Assembly language programs invoked from BASICA that have string arguments must be revised for QBasic because QBasic string descriptors are 4 bytes long. The 4 bytes are the low byte and high byte of the string length followed by the low byte and high byte of the string address.

  • CHAIN
    QBasic does not allow you to specify a line number with CHAIN and does not support the ALL, MERGE, or DELETE options in BASICA.

  • COMMON, DECLARE
    QBasic does not allow executable statements to appear before COMMON and DECLARE statements.

  • DEFtype
    If BASICA encounters a variable without an explicit type (indicated by !, #, &, $, or %), it uses the default type set by the most recent DEFtype statement. For example, the type of the variable IFLAG changes from integer to single precision in the following BASICA code fragment:
        10  DEFINT I
        20  PRINT IFLAG
        30  DEFSNG I
        40  GOTO 20
    
    In QBasic, a variable's type cannot be changed after it appears in a program.

  • DIM
    All arrays in BASICA are dynamic because BASICA always allocates array storage while a program runs. In QBasic, DIM can declare either a static or dynamic array.

  • DRAW, PLAY
    DRAW and PLAY statements in BASICA that use variables or other command strings within command strings must be modified for QBasic. Use the VARPTR$ function, which returns a string representation of the variable's address:

        BASICA Statement     QBasic Equivalent
        ----------------     -----------------
        DRAW "Xcmdstring$"   DRAW "X" + VARPTR$ (cmdstring$)
        DRAW "TA = angle"    DRAW "TA =" + VARPTR$(angle)
    

  • EOF
    When you direct input from a file to a BASICA program, EOF(0) returns true at the end of the input file. In QBasic, EOF(0) returns true after the next record is read past the end of the input file. For example, the following program runs in BASICA, but generates an "Input past end of file" error message in QBasic:
         5  WHILE NOT EOF(0)
        10 LINE INPUT ; A$
        15 WEND
    

  • FIELD
    When a random-access file is closed in BASICA with a CLOSE or RESET statement, field variables retain the last value assigned to them by a GET statement. In QBasic, all field variables are reset to null strings.