home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / open / qbqrk489.lzh / QUIRKS.DOC
Text File  |  1989-04-06  |  56KB  |  1,251 lines

  1.                       ┌───────────────────┐
  2.                       │   Bugs & Quirks   │
  3.                       │                   │
  4.                       │        in         │
  5.                       │                   │
  6.                       │QuickBASIC v2 - 4.5│
  7.                       └───────────────────┘
  8.  
  9.  
  10. (Source:  QB/PRO Volume 5 - NOVA SCREEN program disk, by MicroHelp Inc.)
  11.  
  12.  
  13.  
  14. This file contains information about bugs, quirks, and general points
  15. of interest to programmers working with compiled BASIC. It is divided
  16. into three parts:
  17.  
  18.   Part 1 - Description of bugs, quirks, etc.
  19.   Part 2 - General points of interest
  20.   Part 3 - Sample programs
  21.  
  22. If you want to find one of the above quickly, use your text editor to
  23. search for the text shown above. i.e., Search for "Part 1 -".
  24.  
  25. As of 12/3/88, all new or changed entries will be marked with the date
  26. that the information as added or changed. The date will appear in the
  27. entry in the format (yy/mm/dd).
  28.  
  29. As of 2/8/89, all references to problems with QB4.00 and QB4.00a have
  30. been removed from this file. It is presumed that all QB programmers
  31. have upgraded either to QB4.50 or QB4.00b. If you are still using
  32. QB4.00 or 4.00a, call Microsoft at 206-882-8089 and ask for a free
  33. upgrade to 4.00b.
  34.  
  35. This file is maintained by Mark Novisoff of MicroHelp, Inc. Much of the
  36. information was contributed by members of MicroHelp's BASIC Users Group,
  37. users of the MSSYS forum on Compuserve and users of Mach 2, Stay-Res,
  38. The MicroHelp Toolbox and the QB/Pro Professional series.
  39.  
  40. If you have additional information that should be added, please send it
  41. to:
  42.      Mark Novisoff
  43.      MicroHelp, Inc.
  44.      4636 Huntridge Drive
  45.      Roswell GA 30075
  46.      Compuserve ID 73047,3706 in MSSYS (Microsoft Systems Forum)
  47.      
  48. If possible, please include a *small* sample program that will demonstrate
  49. the problem and cause it to happen whenever the program is run.     
  50.  
  51. Part 1 - Description of bugs, quirks, etc.
  52.  
  53. Note:   QB 4 under "Compilers" refers to ALL versions of QB4. This includes
  54.         4.00b and 4.50 (formerly included 4.00 and 4.00a).
  55.         
  56.     ` Next to a QB 4 entry indicates that the problem has been
  57.         fixed in QB 4.50 and/or the accompanying BC program.
  58.  
  59. Command/Error  Compilers       Description
  60. -------------- --------------- --------------------------------------------
  61. $INCLUDE       QB 4            If you have a DEFINT statement in an include
  62.                                file and you wish to use it within subprograms/
  63.                    functions in a module, you must $INCLUDE it
  64.                    within each sub/function structure. If you
  65.                    simply include it in the mainline code, the
  66.                    DEFINT statement is not recognized. However,
  67.                    if you have a statement DEFINT in your mainline
  68.                    code (as opposed to $INCLUDE), it will work ok.
  69. CALL (asm)     QB 4            If you pass a static string array as a 
  70.                                parameter to a subprogram, and the string
  71.                    array represents FIELDed data (as in a
  72.                    random file), AND you call an assembly
  73.                    subroutine that displays the data, your
  74.                    position in the file can be wiped out!
  75.                    See sample program #22. The fix is to place
  76.                    the string array in a COMMON SHARED statement
  77.                    and remove it from the parameter list.
  78.                    
  79.                    Added (88/12/19). Even if the string array
  80.                    is NOT a FIELDed array, the data can become
  81.                    corrupt. The new solution is to move all
  82.                    CALL or CALLS statements that have string
  83.                    arrays as parameters to the MAIN program
  84.                    and remove them from SUBs.
  85. CALL           QB 4            If you want to pass a single element from a
  86.                                string array to a subprogram, be sure to put
  87.                    an extra pair of parentheses around the
  88.                    variable name in the parameter list. For 
  89.                    example, you may have a problem with:
  90.                       CALL MySub(A,B,C$(3),D)
  91.                    However, the following should work:
  92.                       CALL MySub((A,B,(C$(3)),D)
  93. CALL (asm)     QB 4            Effective with QB 4, assembly
  94.                                language subroutines must preserve
  95.                                the SI and DI registers and make
  96.                                sure the direction flag is cleared
  97.                                before returning to BASIC.
  98.                    In addition, you must not have a label name
  99.                    after the END statement in your assembler code.
  100. CALL INIT      QB 2-3          Do not name a precompiled subprogram "INIT".
  101.                                If you do, the compiler will go into never-
  102.                    never land when your user library is loaded.
  103. CALL vs GOSUB  All             If you have many calls to the same
  104.                                asm routine or subprogram, you'll
  105.                                use less memory if you set
  106.                                variables and GOSUB to a routine
  107.                                that performs the CALL instead of
  108.                                having the CALL "in line". CALL is
  109.                                much faster using variables than
  110.                                using "literals".
  111. CALLS          QB 4            If you are passing string arrays to an
  112.                                assembler subroutine, make sure that
  113.                    $Static is in effect (not $Dynamic) when
  114.                    you dimension your array. If
  115.                    you do not, the data are not pushed onto
  116.                    the stack correctly by BC. This affects
  117.                    the use of MhBasStringSort in Mach 2.
  118. CALLS          QB 4            When CALLS (note the "S") is used and you
  119.                                compile with "/D" (debug), the segment of
  120.                    of a string element descriptor does not get
  121.                    passed on the stack. In other words, if you
  122.                    have an assembly language subroutine that
  123.                    uses CALLS, you should not compile with "/d".
  124. CINT           QB 4            If the number you want to convert is exactly
  125.                                halfway between two integers (i.e., .5), the
  126.                    rounding is done incorrectly when the number
  127.                    that would normally be the result is an odd
  128.                    number. See example program #30. (89/01/03)
  129. CIRCLE         QB 4            The start and end angles must be
  130.                                LESS than 2*pi. Previously they could
  131.                    be less than or equal to.
  132. CLEAR          QB 4            If you use SETMEM to free up memory for
  133.                                use by other routines or modules, the CLEAR
  134.                    statement does not force the compiler to give
  135.                    up that memory. In other words, you must
  136.                    explicitly do a SETMEM(640*1024), or 
  137.                    other large number. (Also see RUN.)
  138.                    Added 89/02/08: If you have an assembler
  139.                    routine that has allocated memory from
  140.                    the pool created by SETMEM (Mach 2's huge
  141.                    string arrays, for example), using
  142.                    SETMEM(640*1024) will still not release
  143.                    the memory. That's because the underlying
  144.                    program has may have done its own allocation
  145.                    of memory via DOS. In this case, you must
  146.                    force the assembler routine to free up
  147.                    the memory. In the case of Mach 2's huge
  148.                    string arrays, this is done by telling
  149.                    Mach 2 to release the memory.
  150. CLEAR,,Size    QB 3,4          If you receive an out of stack
  151.                                space message. The stack size is
  152.                                not reset between CHAIN'ing but if
  153.                                you CHAIN back to your original
  154.                                program, be sure to skip the CLEAR
  155.                                instruction.
  156.                    Added 89/02/08: This is very important
  157.                    in QB4 if you have recursive subprograms
  158.                    and/or functions. "Recursive" means that
  159.                    the procedure can be invoked from inside
  160.                    the procedure.
  161. COMMON and     QB 2-4          All statements that use COMMON or variations
  162.   COMMON SHARED                thereon with CHAIN must use parameter lists
  163.                                that match exactly. Best done with $INCLUDE.
  164. COMMON with TYPE
  165.                QB 4            The TYPE statement must appear before
  166.                            the COMMON statement and must appear in
  167.                    all programs that use it. The COMMON
  168.                    statement must contain "AS". See sample
  169.                    program #1 at the end of this file.
  170. Compile to EXE QB 4`           QB issues an unusual LINK command in the
  171.                                form of:
  172.                      LINK Prog+YourLib.Lib;
  173.                    This causes LINK to bring the entire
  174.                    library into your program! The solution is
  175.                    to exit QB, and run BC and LINK yourself.
  176.                    Note also that the LIB environment variable
  177.                    is not used to search for libraries in this
  178.                    context, since the library name is in
  179.                    the object module field.
  180. CONST          QB 4            Must be included in all program modules
  181.                                that use the constant. Place in the file
  182.                    at the top, rather than inside SUB's.
  183. DATA           QB 4            When a DATA statement is encountered inside
  184.                                a SUB...END SUB structure, QB moves it
  185.                    into the "mainline" portion of the code when
  186.                    you are in the environment. 
  187. DECLARE        QB 4            QB4 allows you to use a procedure name as a
  188.                                label. See example program #32. (89/02/10)
  189. DEFINT         QB 4            See $INCLUDE.
  190. DEF FN         All             Functions are local to the module
  191.                                in which the DEF FN appears. Use
  192.                                QB 4's FUNCTION..END FUNCTION for
  193.                                global functions.
  194. DIM            QB 3            See sample program #4. QB3 apparently has
  195.                                a limit of 123 dynamic arrays.
  196. DIM            QB 4            Any array that is DIMmed inside of a subprogram
  197.                                that does not have the STATIC keyword is a
  198.                    DYNAMIC array.                   
  199. DIM            QB 4            In order to take advantage of the /AH switch
  200.                                with TYPE..END TYPE records, the record
  201.                    length must be a power of 2 (4,8,16,32, etc.)
  202. DIM            QB 4            Static numeric arrays are stored on the
  203.                                "heap" when you are inside the QB 4
  204.                    environment. BC programs store them in the
  205.                    default DS.
  206. DIM (TYPE)     QB 4            See sample program #1 for dimensioning
  207.                                arrays of TYPE'd variables.
  208. Division       All             Using integer division "\" when an
  209.                                integer result is desired is much
  210.                                faster than normal division "/".
  211. DRAW           QB 2-4          Does not respect the boundaries designated
  212.                                by WINDOW.
  213. Duplicate Definition
  214.                QB 4            If you receive an otherwise unjustified
  215.                            "Duplicate definition" error, check to see
  216.                    if your program has variables called
  217.                    F$ or F%. When programs reach an undefined
  218.                    "critical mass" (in terms of size), variables
  219.                    using those names will cause the error. The
  220.                    solution is to find and replace all occurrences
  221.                    of those names with other names. (88/12/03)
  222.                    Added 89/02/08: These variable names can
  223.                    also cause "FUNCTION not defined" errors.
  224. ENVIRON        QB 2-4          If you attempt to create a new environment
  225.                                variable inside a program, you are likely
  226.                    to get an "out of memory" error, because the
  227.                    amount of environment space available when
  228.                    your program runs is very small. To get around
  229.                    this problem, create a good sized dummy
  230.                    variable in your AUTOEXEC.BAT, then inside your
  231.                    program, eliminate it before attempting to
  232.                    setup new variables. Eliminate the variable
  233.                    by using the semicolon:  ENVIRON "DUMMY=;".
  234. /FPA           BASCOM 6        If you use the /FPA switch (alternate
  235.                                floating point math library) when compiling
  236.                    one or more modules, you must use the
  237.                    same switch in ALL modules in the same
  238.                    program.
  239. FIELD          QB 4            We've had a report that if you use array
  240.                                elements for FIELD'ing a Btrieve file, and
  241.                    you don't DIM the string array (i.e., you
  242.                    default to 10 elements) that you can get
  243.                    string space corrupt errors. The solution
  244.                    is always to DIM the arrays.
  245. File not found All             See KILL (Network).
  246. FILES          QB 3            There is a bug in the QB3-8087 compiler that
  247.                                causes FILES not to work correctly.
  248. FOR/NEXT       QB 4            If you use an integer for a loop counter,
  249.                                and the top of the loop is 32767 (when
  250.                    STEP is positive) or the bottom of the
  251.                    loop is -32768 (when STEP is negative),
  252.                    you'll get an overflow when inside the QB
  253.                    environment or when compiled with BC using
  254.                    "/d". With BC,if you don't use "/d", the loop 
  255.                    does not stop at the top/bottom - it wraps 
  256.                    around and executes your loop indefinitely.
  257. FRE(-2)        All             Fre(-2) is unreliable in all versions
  258.                                of QuickBASIC 2-4. See sample program #26.
  259. FUNCTION       QB 4            Provides global functions for all
  260.                                modules in a program. All that is
  261.                                needed is a DECLARE statement in
  262.                                any module that needs to use the
  263.                                function. In addition, this type
  264.                                of function can be recursive. See DEF FN.
  265. FUNCTION       QB 4            Cannot be used in $INCLUDE files.
  266. GOTO           QB 4`           See sample program #17.
  267. HEX$           QB 4            Be careful when using with non-integer
  268.                                values. For example, the output from
  269.                    the two lines shown is "FFFF8002".
  270.                      E&=&H8002
  271.                      PRINT HEX$(E&)
  272. IF..THEN..ELSE QB 3            More than two nestings for ELSE on a single
  273.                                line will not compile properly.
  274. IF..THEN..ELSE QB 4 `          See Sample program #9.
  275. INPUT          QB 4 `          Using INPUT directly to an array element that
  276.                                should generate a "subscript out of range"
  277.                    error causes a hard crash. LINE INPUT
  278.                    generates the error just fine. Note that
  279.                    this error occurs only inside the environment.
  280.                    See Sample program #10.
  281. INT            QB 4            See Sample Program #29. (88/12/19)
  282. Internal Error QB 4`           More problems with long integers. See sample
  283.   in BC                        program #25. 
  284. KILL (Network) All             If you get a "file not found" error when
  285.                                attempting to KILL a file on a network drive,
  286.                    and you know the file exists, the problem is
  287.                    most likely due to the user not having
  288.                    "delete" rights in the network. In this case,
  289.                    the network will issue an "access denied" 
  290.                    error, which BASIC will translate to
  291.                    "file not found".
  292. LIB.EXE        n/a             LIB cannot recognize the name of a library
  293.                                if you precede the library name with a path
  294.                    that contains a hyphen "-". For example, if
  295.                    you enter the following, LIB will fail:
  296.                       LIB Test-Dir\MyLib <Enter>
  297. LINK with /PAC                 See sample program #31. Note that the /PAC
  298.                                switch is supported only by the latest 
  299.                    versions of LINK. (89/02/10)
  300. LINK           All             Use the /EXEPACK switch to condense the
  301.                                file. Can be used on any program except
  302.                    programs that are CHAIN'ed to using
  303.                    all compilers except QB 4. All QB 4
  304.                    programs can use this switch. Syntax:
  305.                      LINK /EXE Progname (etc.)
  306. LINK           QB 4            When building a Quick Library, be sure
  307.                                to specify BQLB40 in the library field. Example:
  308.                      LINK /QU ObjMods,Lib,,BQLB40;
  309.                    This also applies to BQLB41 if using BC6
  310.                    or QB 4.00b and BQLB45 when using QB4.50.
  311. LOAD           QB 4            If you receive an "out of memory"
  312.                                error, try breaking your program
  313.                                into logical pieces (using
  314.                                subprograms). Then use COMMON
  315.                                SHARED for all variables that you
  316.                                need in the entire program. The
  317.                                exact same COMMON SHARED
  318.                                declaration must appear in all the
  319.                                modules in the program that need
  320.                                access to the variables.
  321. LOAD            QB 4           If you download a QB 4 program in "fast load"
  322.                                format, many modem transfer protocols
  323.                    pad the file out using a number of
  324.                    CHR$(0)'s. This will cause QB 4 to
  325.                    crash when you attempt to load the program.
  326.                    Use DEBUG to view the file, then write
  327.                    the program to disk after changing the
  328.                    CX register to shorten the length of the
  329.                    file so that the trailing CHR$(0)'s are
  330.                    not included. The other solution is to
  331.                    download this type of file using an ARC
  332.                    program that restores the original length
  333.                    of the file.
  334. LOCK            QB 4           If you LOCK records, then perform a
  335.                                SHELL, then you try to UNLOCK the same
  336.                    records, you may get a "permission
  337.                    denied" error (error 70). (88/12/19)
  338. ON ERROR        QB 4`          See "RESUME" for QB 4.
  339. ON ERROR        QB 2-4         Error handler routines must be located
  340.                                outside SUB...END SUB structures. You
  341.                    can RESUME to a line number/label that
  342.                    is outside SUB...END SUB structures 
  343.                    (using /E) or to code inside the sub
  344.                    using plain RESUME or RESUME 
  345.                    NEXT (/X). Much better is to $INCLUDE
  346.                    subroutines that perform error trapping
  347.                    instead of having them in subprograms.
  348.                    This allows the use of RESUME line number/
  349.                    label and avoids the /X.
  350.                    Note - with BASCOM 6 and QB 4.00b, error
  351.                    handling has been improved. See the docs.
  352. OPEN COM        QB 4`          If you compile with /S, and use OPEN COM
  353.                                with a literal string, the statement will
  354.                    generate "Device Unavailable".
  355.                    See sample program #18.
  356. OPEN            All            With Novell NetWare, using OPEN on a file that
  357.                                does not exist does not always create the file.
  358.                    Novell has acknowledged the problem but they 
  359.                    don't have a solution available as of 12/19/87.
  360.                    A workaround for the problem when using
  361.                    Btrieve is to open the NUL device on the local
  362.                    system instead of the network. For example,
  363.                    OPEN "R",1,"A:NUL".
  364. Overflow        All            BASIC uses integer types for all
  365.                                calculations and processes the
  366.                                right side of the equal sign
  367.                                before the left side. To force
  368.                                BASIC to use a different numeric
  369.                                type, place a type identifier on
  370.                                the right of the equal sign.
  371.                                Example: A=Peek(2)+256!*Peek(3)
  372. Periods in variable names
  373.                 QB 4           We have found numerous problems using periods
  374.                        in variable names. We believe the problems
  375.                    are somehow associated with TYPE..END TYPE
  376.                    user defined records. Because of these problems,
  377.                    we recommend that you do NOT use periods in
  378.                    variable names. See sample program #28 for
  379.                    one example of this problem. (88/12/03)
  380. PRINT           All            Try this program in QB: (89/02/10)
  381.                                  FOR N = 29 TO 31
  382.                      PRINT N, CHR$(N)
  383.                  NEXT
  384.                    The number "N" will print just fine, but
  385.                    the characters will not. In order to display
  386.                    these characters, use an assembler subroutine,
  387.                    such as MhScr in Mach 2.     
  388. PRINT #         QB 4           In order to print a blank line using QB 4,
  389.                                use the syntax:
  390.                      PRINT #, 
  391.                    Note the absence of the null string after
  392.                    the comma. We've had an unconfirmed report
  393.                    that if the print buffer is filled, using
  394.                    the null string causes characters to be
  395.                    dropped.
  396. PRINT USING     QB 4           With previous compilers, you could place TAB
  397.                                statements, variable names, or most anything
  398.                    else between PRINT and USING. With QB 4, 
  399.                    nothing should come between PRINT and USING.
  400. PUT             4.00b          See sample program #21. When using the
  401.                                syntax PUT Filenumber,RecordNumber,Variable
  402.                    you'll get a "bad record length".
  403. READ            QB 4`          If you want a REMark on a line that contains
  404.                                DATA statements, be sure to put a colon on
  405.                    the line between the end of your data and
  406.                    the REM or '.
  407. REDIM           QB 2.01        In EXE programs (not in the environment),
  408.                                the following logic will cause your FIELDed
  409.                    variables to go haywire:
  410.                    
  411.                      REM $DYNAMIC
  412.                  DIM StringArray$(SomeNumber)
  413.                  FIELD #SomeFile....
  414.                  ...
  415.                  ERASE StringArray$
  416.                  REDIM StringArray$(ADifferentNumber)
  417.                  SomeVariable = FRE("")
  418.                    
  419.                    The solution to the problem is to reFIELD
  420.                    the file after a REDIM and a FRE("").
  421. REDIM           QB 3           If you have a subprogram that REDIM's arrays,
  422.                                and you get a "string space corrupt" message
  423.                    after calling the subprogram several times,
  424.                    try using ERASE on the array before you do
  425.                    the REDIM.
  426. REM $INCLUDE    QB 4`          See sample program #24.
  427. REM $TITLE      QB1-4          When you use the REM $TITLE metacommand,
  428.                                you are limited to 60 chars of title. If
  429.                    the title is longer, you'll get an error
  430.                    message "Metacommand error". Note that QB2.01
  431.                    does not print an error message, but still
  432.                    shows "1 severe error".
  433. RESUME          All            If you always use RESUME
  434.                                <linenumber> or RESUME <label> you
  435.                                can use the "/e" switch instead of
  436.                                "/x". Makes programs smaller!
  437.                                This is not practical for
  438.                                subprograms, so error trapping is
  439.                                better handled in mainline code.
  440.                    See ON ERROR.
  441. RESUME          QB 4`          If you compile to an EXE from
  442.                                inside the environment, a "/X" is
  443.                                generated by QB even though it's
  444.                                not needed. Be sure to recompile
  445.                                with "/E" outside of the
  446.                                environment if your program
  447.                                doesn't need "/X".
  448. RUN             QB 4           See CLEAR (QB 4)
  449. SADD            QB 4           When using SADD-188 for Btrieve,
  450.                                be sure to make this calculation
  451.                                EACH TIME you are going to CALL
  452.                                Btrieve. This is because QB 4 can
  453.                                move the FIELD'ed strings around
  454.                                in memory.
  455. SAVE            QB 4           If you edit a new program and save it,
  456.                                QB defaults to "fast load" format. The
  457.                    file cannot be handled by a text editor.
  458.                    Fix by using "save as".
  459. SCREEN (Page)   QB 3           If you have a VGA, your system is in 40
  460.                                column mode, and you use a video page
  461.                                other than 0, you will find that QB3 stores
  462.                    the pages beginning at an offset that is
  463.                    &H100 (decimal 256) higher than it should.
  464.                    Instead of beginning page 1 at offset 2048,
  465.                    (&H800) it starts at offset 2304 (&H900).
  466. SCREEN          QB 3           If you have a VGA and run the following
  467.                                program, you'll find that your screen
  468.                    has 28 lines!
  469.                      SCREEN 2
  470.                  SCREEN 0
  471.                  PRINT "Hello world"
  472.                  
  473.                    The solution is to use MhDos2 (Mach 2) or
  474.                    CALL INTERRUPT (or one of its variations),
  475.                    with the AH register set to 0 and the AL
  476.                    register set to 3. After that, do another
  477.                    SCREEN 0, and you will have 25 lines.
  478. SCREEN          All ?          When reading characters from the screen using
  479.                                SCREEN (X,Y), if the character on the screen
  480.                    is CHR$(0), 32 (blank space) is returned as
  481.                    the result from this function. Using Mach 2's
  482.                    MHRSCR will overcome this problem.
  483. SELECT CASE     QB 3           Much less forgiving than QB 4. For example,
  484.                                when using a string, you can't say:
  485.                      CASE CHR$(3)
  486.                    However, you can embed the literal character
  487.                    with an ASCII value of 3 in quotes!     
  488. SELECT CASE     QB 4`          If you set a breakpoint (using F9) on a CASE
  489.                                statement, the logic of the SELECT CASE...
  490.                    END SELECT fails. See sample program #19.
  491.                    QB 4.50 tells you that you cannot set a
  492.                    breakpoint on a CASE or END SELECT statement.
  493.                    Some fix!!!
  494. SELECT CASE     QB 4           You cannot have a line number or label 
  495.                                between the SELECT CASE and the first CASE.
  496. SHARED          QB 4.00b & 4.50
  497.                                See sample program #23.
  498. SOUND           QB 3/87        Generates error 6 in all forms when the
  499.                                emulator is used on non-87 machines.
  500. STACK OVERFLOW  4.00b          You may get this problem when compiling
  501.                                with BC or BASCOM 6. This is a compiler
  502.                    bug, not an error in your program. Contact
  503.                    MS at 206-882-8089 if you have this problem.
  504. STATIC          QB 4           When used with a subprogram, makes
  505.                                the subprogram faster, since local
  506.                                variables are not initialized on
  507.                                each call.
  508. STR$(Value)     QB 4           Considerably slower than in QB 3. See 
  509.                                benchmarks in sample program #7.
  510. String Space    QB 4           Drops you out to DOS without saving
  511.   Corrupt                      your program. The solution is to save
  512.                                often!
  513. STRING$         All            A$=String$(5,65) takes less code than
  514.                                A$=String$(5,"A") and both are smaller
  515.                    than A$="AAAAA".
  516. SUB...END SUB   QB 4           Cannot be used in $INCLUDE files. Cannot
  517.                                have the same name as a variable (regardless
  518.                    of the variable type).
  519. Too Many Files  ???            A QB user has reported a problem that we are
  520.                                unable to duplicate. He says that the "Too
  521.                    many files" error can occur when a disk is
  522.                    full or there are too many files in the root
  523.                    directory. (89/02/10)
  524. Too Many Files  4.00b          When you use QB to make an EXE program, if
  525.                                you get this error, it usually indicates that
  526.                    a module's complete file spec (i.e., drive,
  527.                    path and filename) is longer than 60 chars.
  528.                    60 is the longest name that QB can handle.
  529.                    The solution is to shorten the file name.
  530. TYPE..END TYPE  QB 4           There has been an unverified problem reported
  531.                                in QB when the record length is an odd number.
  532.                    A "FAR HEAP CORRUPT" error is generated.
  533.                    The problem does not seem to appear in BC,
  534.                    only QB. If you have an unusual, otherwise 
  535.                    unexplained problem, try changing the record
  536.                    length to an even number.
  537. TYPE..END TYPE  QB 4           See "DIM" for QB 4.
  538. TYPE..END TYPE
  539.  (with COMMON)  QB 4           See COMMON (with TYPE) and sample program #1.
  540. UBOUND          QB 2-3         If you ERASE an array, UBOUND will return the
  541.                                upper bound of the array BEFORE it was erased.
  542.                    This works OK in QB 4.
  543. UNLOCK          QB 4           See LOCK QB 4 (88/12/19)
  544. VAL             QB 4           Generates an error (rather than value of 0)
  545.                                when "%" is the first character in the string.
  546. VAL             QB 4           When you use VAL("&"), you get 203 instead of 0.
  547. WINDOW          QB 2-4         Does not affect DRAW statements.
  548. ----------------------------------------------------------------------------
  549. Part 2 - General points of interest
  550. ----------------------------------------------------------------------------
  551. Wyse PC Keyboard Problem
  552.  
  553. Some early versions of the BIOS used by Wyse incorrectly set a byte in the
  554. BIOS data area that tells QB that an enhanced keyboard is present. This
  555. causes a lockup, since QB is using an "enhanced" BIOS call to read the 
  556. keyboard and is not getting a response.
  557. ----------------------------------------------------------------------------
  558. ATI EGA Wonder Cards
  559.  
  560. If you find that you are unable to set EGA modes on a system with one
  561. of these cards, call ATI for a free BIOS upgrade.
  562.  
  563. ----------------------------------------------------------------------------
  564. Editor problem in QB 4.50
  565.  
  566. If the QB 4.50 editor seems to be "changing" your programs, including
  567. placing "garbage" characters on the screen, it may be due to your
  568. math "coprocessor" (80x87 chip). Two solutions:
  569.  
  570. 1. Check to make sure that the coprocessor chip is firmly seated.
  571. 2. Make sure that the motherboard switch indicating the presence of the
  572.    coprocessor is set correctly.
  573. ----------------------------------------------------------------------------
  574. Keeping DTR High QB 4 
  575.  
  576. According to Microsoft, you can keep DTR high when exiting from QB 4.x by
  577. performing the following steps:
  578.  
  579. 1. Close the serial port.
  580. 2. Immediately perform one of the following statements:
  581.    a. For COM1:  OUT &H3FC,3
  582.    b. For COM2:  OUT &H2FC,3
  583.    
  584. The OUT command will force pin 20 (DTR) to stay high. DTR will actually
  585. be dropped for an instant between the CLOSE and the OUT, but it should
  586. be too short for the modem to care. If this does cause a problem, try
  587. adjusting the "S" register (see your modem manual) to allow a larger
  588. time-out period before dropping the carrier.   
  589. ----------------------------------------------------------------------------
  590. Logitech Mouse Info QB 4.50 (88/12/19)
  591.  
  592. When running QB 4.5, if DOS is in 25 line mode and the QB editor
  593. is started with the /h option for 43 line mode, a Logitech
  594. Hi-Rez Bus mouse cursor disappears below line 25.  Solution: use
  595. the Microsoft vers.  6.24 mouse driver that came with QB4.5 or
  596. get the Logitech vers.  3.43 or later driver.  Contact Logitech
  597. at 1-415-795-8500.  Another solution is to use MODE43.COM from
  598. earlier QB versions to put the screen in 43 line mode before
  599. starting QB4.5.
  600.  
  601. ----------------------------------------------------------------------------
  602. Non-IBM EGA cards QB4.50 (88/12/19)
  603.  
  604. After running a program that uses the 25 line mode and a return
  605. is made to the editor, press F4 to review the Output screen and
  606. then press any key to return to the editor.  The screen will
  607. return to 43 line mode but the lines below line 25 will be
  608. blacked out.  The problem was found to be the Tseng EVA-480 EGA
  609. card.  A temporary fix is to do 'Alt-F' and then 'D' to execute
  610. a shell to DOS and immediately return or else press F5 to rerun
  611. the loaded program to restore the full 43 lines.  The better
  612. solution is to just not use the F4 key until the Tseng card's
  613. rom is updated or QB is fixed.
  614.  
  615. ----------------------------------------------------------------------------
  616. Cut and Paste Problems QB 4.50 (88/12/19)
  617.  
  618. On some "clone" computers, the Cut and Paste keys (Ctrl-Ins) and (Shift-Ins)
  619. do not work correctly. There are two things you can try:
  620.  
  621. 1. Turn off Caps Lock, Num Lock and Scroll Lock.
  622. 2. Run FIXSHIFT.COM with the "/I" switch to force installation.
  623.  
  624. If neither of the above work, contact Microsoft and let them know what
  625. your hardware configuration is.
  626. ----------------------------------------------------------------------------
  627. Avoiding unwanted line feeds when printing to LPT         
  628.  
  629. When you LPRINT a CHR$(13), QB4 automatically appends a CHR$(10) character
  630. causing "unwanted" line feeds. To avoid this problem:
  631.  
  632.   OPEN "LPT1:BIN" FOR OUTPUT AS #1
  633.  
  634. Then instead of using LPRINT, use PRINT #1,String. This causes the output
  635. to the printer to be "unfiltered".  
  636. ----------------------------------------------------------------------------
  637. DOS 4.00
  638.  
  639. On August 29, 1988, Infoworld reported several known problems with IBM DOS
  640. 4.0. Their suggestions include:
  641.  
  642. 1. If you use the DOS "Shell", run it in text mode to avoid conflicts with
  643.    TSR programs.
  644. 2. Disk un-fragment programs, such as Norton Utilities, Mac Utilities, 
  645.    VOPT, etc. don't work.
  646. 3. Lotus Metro doesn't work.
  647. 4. Don't use the EMS driver that comes with DOS if you have a third-party
  648.    memory board. Instead, use the driver that came with the board.
  649. 5. Don't try to install IBM DOS 4.0 on a hard disk that already has a
  650.    non-IBM version of DOS 3.x.
  651. 6. Don't use the "/X" switch with any itmes in CONFIG.SYS.
  652.  
  653. In the same issue, Cringely reports that IBM is working on DOS 4.1.   
  654. ----------------------------------------------------------------------------
  655. Problems when moving SUBs between modules in the environment.
  656.  
  657. The following is unedited text uploaded by a Compuserve user. The
  658. problems described have not been confirmed - this is included for your
  659. info and so that you can avoid doing what he did.
  660.  
  661. On SOME occations, QB will not let you save your program,
  662. giving instead an "Out of Memory" error.  Automatically, you
  663. lose everything you've done since you last saved.  But upon
  664. exiting, you also find that the file was erased from the disk!
  665. GONE!  Using Norton can RARELY bring it back (usually trying to
  666. load the resurected file causes a complete system hang).  This
  667. has happened at least 10 times to me.  The program is VERY large
  668. (over 1200 lines) with many Subprograms.  The most notable cause
  669. (but not ONLY) is when moving a SUBprogram from one program to
  670. another (i.e. copying it).  When deleting the original SUB line
  671. in the target program and substituting the one to be copied
  672. (with <Sift><Ins>), everything appears fine until the next save.
  673. This does not always happen, but USUALLY.  If I do not remove
  674. the original SUB line, it doesn't seem as likely to happen.
  675. These are all the clues I have on this one.  Also, jumping
  676. between programs using <F>ile <O>pen tends to aggrivate the
  677. problem.  If I do this frequently, a <F>ile <N>ew is likely to
  678. give me a "string space corrupt" or "far heap corrupt" error and
  679. dump me back to DOS.  Remember, these are large programs, with
  680. large arrays (the /AH switch).
  681.  
  682. ----------------------------------------------------------------------------
  683. Embedded Ctrl Characters (QB 4)
  684.  
  685. Pressing Ctrl-P, followed by CHR$(12) (regardless of how you enter it),
  686. does not embed a CHR$(12) in the text. However, if you use another text
  687. editor to embed the CHR$(12), QB will display it just fine.
  688.  
  689. ----------------------------------------------------------------------------
  690. Using DECLARE (QB 4) without a CALL
  691.  
  692. The following code demonstrates a quirk after a SUB has been DECLAREd and
  693. you invoke it without a CALL:
  694.  
  695.   DECLARE SUB XSUB (A!)
  696.   start=0
  697.   XSUB (start-1)\20+1            ' This does not work. QB cannot parse it.
  698.   XSUB ((start - 1) \ 20 + 1)    ' This works. Note that the entire
  699.                   ' expression is enclosed in parentheses.
  700. ----------------------------------------------------------------------------
  701. QB4 editor and marked blocks
  702.  
  703. If you mark a block, using the SHIFT and cursor keys, and then you type
  704. a space (while still pressing the SHIFT key), your marked block will
  705. disappear.
  706. ----------------------------------------------------------------------------
  707. Scan Codes for F11-F12 and Variations:
  708.  
  709.         F11=133
  710.         F12=134
  711.   Shift-F11=135
  712.   Shift-F12=136
  713.   Ctrl -F11=137
  714.   Ctrl -F12=138
  715.   Alt  -F11=139
  716.   Alt  -F12=140
  717. ----------------------------------------------------------------------------
  718. Long integers with QB 4
  719.  
  720. When you have a long integer array with two dimensions, BC may not handle
  721. the zeroth elements correctly on machines without a math coprocessor
  722. unless you use the "/d" switch. QB handles the situation OK because "debug"
  723. is always on when working in the environment.
  724.  
  725. Secondly, if you dimension the same two-dimensional array using a variable
  726. name instead of a numeric constant, BC may not handle your array at all! The
  727. fix is to use only constant numbers in dimensioning the array. Another fix
  728. that DOES work with dynamic arrays, is to use the /R switch when compiling.
  729. ----------------------------------------------------------------------------
  730. More on long integers
  731.  
  732. If you pass a long integer array to a subprogram, QB will work OK, but
  733. BC does not. See Sample Program #2.
  734. ----------------------------------------------------------------------------
  735. Long Integers and Calculations QB 4 `
  736.  
  737. Calculations using long integers should be tested thoroughly after compilation
  738. with BC. Sample Program #6 demonstrates the problem.
  739. ----------------------------------------------------------------------------
  740. LIB environment variable
  741.  
  742. If you set the LIB environment variable, you will find that QB, BC, BUILDLIB
  743. and LINK will all search the specified path whenever a User Lib, Quick Lib or
  744. LINK lib is needed. The syntax is similar to the DOS Path syntax:
  745.  
  746.   SET LIB=C:\Libs;C:\DOS;C:\QB
  747.   
  748. Note that this does not have any effect when you are compiling from 
  749. within the QB4` environment, and QB sticks the name of a library in the
  750. object module field.
  751. ----------------------------------------------------------------------------
  752. Undocumented switches in QuickBASIC 3
  753.  
  754. QB ProgramName/F compiles the specified program to an EXE file without 
  755. starting up the QB editor.
  756.  
  757. QB ProgramName/Z tells QB to load and execute ProgramName and exit to DOS
  758. when the program ends.
  759. ----------------------------------------------------------------------------
  760. Response files
  761.  
  762. BUILDLIB and LINK both accept input from response files. This is exactly the
  763. same as redirection of input, but the programs will continue running when
  764. the end of the file is reached prematurely. Example:
  765.  
  766. Response file contains:
  767.   Prog1+Prog2+Prog3+
  768.   Prog4+Prog5+Prog6 Rem Don't include ANY additional blank lines
  769.   
  770. Buildlib batch file contains:
  771.   Buildlib @Response.Fil,MyLib.Exe;
  772.   
  773. Buildlib will take its input from the response file because the "@" sign
  774. tells it to!      
  775. ----------------------------------------------------------------------------
  776. BUILDLIB and "too many segments" error
  777.  
  778. Where "nnnn" is a number from 1 to 1024, use:
  779.  
  780.    BUILDLIB /SEG:nnnn
  781.  
  782. That increases (or decreases) the number of allowable segments. Default=255.
  783. ----------------------------------------------------------------------------
  784. Entering unusual ASCII values.
  785.  
  786. If you're not familiar with WordStar, you may not know that you can enter
  787. unusual characters into the QB4 editor by doing the following:
  788.  
  789.   Hold the Ctrl key and press "P" once (nothing will happen).
  790.   Release the Ctrl key.
  791.   Press and hold the Alt key.
  792.   Using the keypad number keys (not the keys on the top of the keyboard),
  793.     enter the ASCII value for the key you want. For example, the 'Esc' key
  794.     is ASCII 27, so press the "2", then the "7".
  795.   Release the Alt key, and your special character will appear!  
  796. ----------------------------------------------------------------------------
  797. Part 3 - Sample programs
  798. ----------------------------------------------------------------------------
  799. Sample program #1. How to use COMMON with TYPE'd variables.
  800.  
  801.        ' Prog1.bas
  802.  
  803.          TYPE Namerec
  804.            LastName AS STRING * 20
  805.            FirstName AS STRING *15
  806.          END TYPE
  807.          COMMON Filename() AS Namerec
  808.          DIM Filename(5) AS Namerec
  809.          Filename(1).LastName="Novisoff"
  810.          Filename(1).FirstName="Mark"
  811.          CHAIN "Prog2"
  812.  
  813.        ' Prog2.bas
  814.        
  815.          TYPE Namerec
  816.            LastName AS STRING * 20
  817.            FirstName AS STRING * 15
  818.          END TYPE
  819.          COMMON Filename() AS Namerec
  820.          PRINT Filename(1).LastName, Filename(1).FirstName
  821.  
  822. ----------------------------------------------------------------------------
  823. Sample program #2. Demonstrates problem with long integers in subprograms.
  824.  
  825. DECLARE SUB TestLong (LongArray&())
  826. 'Demonstration to show difference between return values of long integers
  827.  
  828. 'Returns desired value if compiled in the environment, but not if compiled
  829. 'by BC.
  830.  
  831. 'This fault only appears if the code is in a subprogram and compiled with BC
  832. REM $Dynamic
  833. DIM LongArray&(10)
  834. DIM MainArray%(10)
  835.  
  836. CLS
  837. LongArray&(1) = 100
  838. MainArray%(1) = 10
  839.  
  840. FOR x% = 1 TO 2
  841.     LongArray&(1) = MainArray%(1) + LongArray&(1)
  842.     ' Note: if you change the above into the following two lines, this part
  843.     '       of the program will run correctly.
  844.     'Temp& = MainArray%(1)
  845.     'LongArray&(1) = Temp& + LongArray&(1)
  846. NEXT
  847.  
  848. PRINT "TestLong should = 120"
  849. PRINT "Long Array from MAIN = "; LongArray&(1)
  850. PRINT : PRINT "Same code in a subprogram"
  851. PRINT
  852.  
  853. CALL TestLong(LongArray&())
  854.  
  855. PRINT "TestLong should return 120"
  856. PRINT "Long Array from TestLong sub = "; LongArray&(1)
  857.  
  858. SUB TestLong (LongArray&())
  859. DIM IntArray%(10)
  860.  
  861. LongArray&(1) = 100
  862. IntArray%(1) = 10
  863.  
  864. FOR x% = 1 TO 2
  865.     LongArray&(1) = IntArray%(1) + LongArray&(1)
  866.     ' Note: if you change the above into the following two lines, this part
  867.     '       of the program will run correctly.
  868.     'Temp& = IntArray%(1)
  869.     'LongArray&(1) = Temp& + LongArray&(1)
  870. NEXT
  871. END SUB
  872.  
  873. ----------------------------------------------------------------------------
  874. Sample program #4. Demonstrates the limit on dynamic numeric
  875. arrays in QB 3.  This program generates a program called
  876. ARRAY.BAS. Compile ARRAY.BAS with the "/d" switch, LINK it and
  877. RUN it. The sole function of ARRAY.BAS is to generate arrays.
  878. Regardless of the value of I%, and regardless if you use "#",
  879. "%" or "!" as the array type, the program gives an "Out of
  880. memory" error when the 124th array is DIMmed.
  881.  
  882. OPEN "O",#1,"ARRAY.BAS"
  883. PRINT #1,"I%=1"
  884. FOR J=1 TO 126
  885.   L=L+10:PRINT #1,MID$(STR$(L),2);" DIM A";MID$(STR$(J),2);"#(I%):PRINT FRE(-1)"
  886. NEXT 
  887. CLOSE
  888. END
  889. ----------------------------------------------------------------------------
  890. Sample program #6. Demonstrates long integer calculation problem. This 
  891. program will run in QB 4.00 and 4.00a, but it gives incorrect results
  892. using BC or BC 6. This problem has been fixed in the BC that comes with
  893. QB 4.50.
  894.  
  895. DEFINT J: DEFLNG T
  896.  
  897. DIM tum(2), ttm(2), th(2)
  898.  
  899. ttm(2) = 100000: th(2) = 1000000: j = 2
  900.  
  901. PRINT th(j) * VAL("9") + ttm(j) * VAL("9")
  902.  
  903. '    Result should be "9900000"
  904.  
  905. '    Substituting th(2) for th(j) (etc). makes it work.  So does using
  906. '    CLNG(VAL("9")).  It also works when the array tum(2) isn't there.
  907. '    Compiling with "/d" may fix the problem in some cases. Substituting
  908. '    a single precision number seems to work.
  909. ----------------------------------------------------------------------------
  910. Sample program #7. Demonstrates slowdown in STR$ function in QB 4.
  911.  
  912.   defint a-z
  913.   a!=timer
  914.   for n=1 to 5000
  915.       a$=str$(n)
  916.   next
  917.   print "elapsed:" timer-a!
  918. ----------------------------------------------------------------------------
  919. Sample program #9. Demonstrates a problem with IF..THEN..ELSE. Using any
  920. compiler except QB4.00 and QB4.00a, the string "THIS IS AN ERROR" is
  921. never printed. Using these two environments causes the string to print
  922. whenever X<>2.
  923.  
  924.   10 INPUT "TYPE A NUMBER ", X
  925.   20 IF X = 2 THEN 50 : PRINT "THIS IS AN ERROR"
  926.   30 PRINT "AT LINE 30"
  927.   40 GOTO 10
  928.   50 PRINT "AT LINE 50"
  929.   60 GOTO 10
  930. ----------------------------------------------------------------------------
  931. Sample program #10. Demonstrates a problem when INPUT is used directly
  932. to an array element that is beyond the maximum dimension of the array.
  933. When run inside the QB 4 environment, this program will cause a hard crash.
  934. This problem does not apply to LINE INPUT.
  935.  
  936. This problem has been fixed in QB 4.50.
  937.  
  938.   DIM A$(20)
  939.   FOR I = 1 TO 20
  940.       A$(I) = STR$(I)
  941.   NEXT
  942.   INPUT "Enter something: ", A$(I)     ' At this point, I=21
  943.  
  944. ----------------------------------------------------------------------------
  945. Sample program #17. Demonstrates a problem using GOTO inside an
  946. IF..THEN..ELSE block. This program will work fine in the QB4.00 and QB4.00a
  947. environment, but will fail when compiled with BC or BASCOM 6. By "fail",
  948. I mean that both PRINT statements are executed. The problem has been fixed
  949. in the BC that comes with QB 4.50.
  950.  
  951.    x% = 1
  952.    IF x% = x% THEN
  953.      PRINT "1 equals 1"
  954.      GOTO 10
  955. 10   x% = x%
  956.    ELSE
  957.      PRINT "1 does not equal 1"
  958.    END IF
  959.  
  960. ----------------------------------------------------------------------------
  961. Sample program #18. Demonstrates a problem using /S in conjunction with
  962. /O and communications, where a string literal (in quotes) is used for the
  963. COM parameters. This problem has been fixed in the BC that comes with QB 4.50.
  964.  
  965.    ' compile with BC:
  966.    '        BC prog/s/o;  (produces device unavailable error but runs
  967.    '                       fine in the environment)
  968.    '            and
  969.    '        BC prog/o; (runs fine)
  970.    CLS
  971.    OPEN "COM1:1200,O,7,1,CS,DS,CD" FOR RANDOM AS #1 LEN = 256
  972.    PRINT #1, "ATM1X2E1 S11=72DT 999-9999;"
  973.    PRINT "Press any key to continue..."
  974.    DO WHILE LEN(INKEY$) = 0: LOOP
  975.    PRINT #1, "ATH"
  976.    CLOSE
  977.    END
  978.  
  979. The solution to the above is to assign the COM specifications to a string
  980. before doing the OPEN:
  981.  
  982.    A$ = "COM1:1200,O,7,1,CS,DS,CD"
  983.    OPEN A$ FOR RANDOM AS #1 LEN = 256
  984. ----------------------------------------------------------------------------
  985. Sample program #19. Demonstrates a problem where If a breakpoint
  986. is set on a CASE line of a SELECT CASE ... END SELECT
  987. statement, the SELECT CASE structure is not executed properly.
  988. QB 4.50 tells you that you cannot set a breakpoint on a CASE or
  989. END SELECT statement.  Some fix!!!
  990.  
  991. 'Set a breakpoint (F9) on the 'CASE 1' line, and RUN the program (F5)
  992.  
  993. DEFINT A-Z
  994. A = 2
  995. SELECT CASE A
  996.        CASE 1
  997.             PRINT "A equals 1"
  998.        CASE 2
  999.             PRINT "A equals 2"
  1000.        CASE ELSE
  1001.             PRINT "A is not equal to 1 or 2"
  1002. END SELECT
  1003. ----------------------------------------------------------------------------
  1004. Sample program #21. Demonstrates a problem with PUT and QB4.00b
  1005.  
  1006.    OPEN "test.dat" FOR RANDOM AS 1 LEN = 140
  1007.    t$ = STRING$(140, "A")
  1008.    LSET buffer$ = t$
  1009.    PUT #1, , t$
  1010.    CLOSE 1
  1011.  
  1012. This program will work with QB4.00a but not with QB4.00b
  1013.  
  1014. The solution is to use the "old-style" FIELD statement:
  1015.  
  1016.    OPEN "test.dat" FOR RANDOM AS 1 LEN = 140
  1017.    FIELD 1,140 as Buffer$
  1018.    LSET Buffer$ = STRING$(140, "A")
  1019.    PUT #1,1
  1020.    CLOSE 1
  1021. ----------------------------------------------------------------------------
  1022. Sample program #22. Demonstrates a problem with CALL:
  1023.  
  1024. Note that this program requires TEST.DAT, which is part of the ARC file.
  1025. It also requires that you use an assembly subroutine to display a
  1026. string from the array.
  1027.  
  1028. The fix is to place A$() in a COMMON SHARED statement and take it out
  1029. of the parameter list in the CALL and the SUB statements.
  1030.  
  1031.  DEFINT A - Z
  1032.  DIM A$(3)
  1033.  CLS
  1034.  OPEN "R", 1, "TEST.DAT", 128
  1035.  FIELD 1, 32 AS A$(1), 6 AS A$(2), 90 AS A$(3)
  1036.  PRINT "Getting Record One"
  1037.  GET 1, 1
  1038.  PRINT "A$(1) Contains: "; A$(1)
  1039.  PRINT "A$(2) Contains: "; A$(2)
  1040.  CALL AnotherWay (A$())
  1041.  PRINT
  1042.  PRINT "Getting Record Two"
  1043.  GET 1, 2
  1044.  PRINT "A$(1) Contains: "; A$(1)
  1045.  PRINT "A$(2) Contains: "; A$(2)
  1046.  CALL AnotherWay (A$())
  1047.  CLOSE
  1048.  END
  1049.  
  1050. SUB AnotherWay (A$()) STATIC
  1051.  
  1052. stop
  1053.  ' Insert a call to an assembler routine to display A$(1)
  1054.  ' The following 2 lines are included for the benefit of Mach 2 users.
  1055.  ' R%=CSRLIN:C%=POS(0)
  1056.  ' CALL MhScr(A$(1),0%,R%,C%,7%)
  1057.  PRINT
  1058.  PRINT A$(2)
  1059. END SUB
  1060. ----------------------------------------------------------------------------
  1061. Sample program #23. Demonstrates a problem with SHARED in QB4.00b. The
  1062. problem did not exist in QB4.00.
  1063.  
  1064. If you change the name of db to something else, or you place db and db()
  1065. in the parameter list, all is well. The problem seems to be that if
  1066. you have a scalar with the same name as an array, and you name it in the
  1067. SHARED statement, QB thinks that the scalar and the array are one in the
  1068. same.
  1069.  
  1070. DIM db(10)
  1071. db(1) = 1
  1072. db = 2
  1073. CALL Test(db)
  1074.  
  1075. SUB Test (db)
  1076.     SHARED db()      '<= duplicate definition error
  1077.     PRINT db, db(1)
  1078. END SUB
  1079. ----------------------------------------------------------------------------
  1080. Sample program #24. Demonstrates a problem with '$Include in all versions
  1081. of QB 4.00x:
  1082.  
  1083. ' Load this program into QB, move the cursor to the end of the first
  1084. ' rem $include line and press the Del key. You will get "string space
  1085. ' corrupt" and when you go to run another program, you are hung!
  1086.  
  1087. REM $INCLUDE: 'c:\subprogs\done\ssinput.cal'
  1088. REM $INCLUDE: 'c:\subprogs\done\vinput.cal'
  1089. ----------------------------------------------------------------------------
  1090. Sample program #25. Demonstrates a problem with long integers used
  1091. in user defined types. When you attempt to compile the following program
  1092. with BC, you'll get an "Internal error" message from the compiler. The
  1093. problem has been fixed in the BC that is included with QB4.50.
  1094.  
  1095.    DEFINT A-Z
  1096.    TYPE Bt
  1097.       a   AS INTEGER
  1098.       b   AS LONG
  1099.       c   AS LONG
  1100.    END TYPE
  1101.    DIM Bt(1) AS Bt
  1102.    Bt(y).b = x&
  1103.    Bt(y).c = Bt(y).b
  1104.  
  1105. There are several ways of "fixing" the above:
  1106.  
  1107. 1. Swap the last two lines.
  1108. 2. Change a variable subscript (y) to literal subscript (1)
  1109. 3. Change the order of the variables a,b,c.
  1110. 4. Add a line between the last two lines, like "j=k*3"
  1111. 5. Break the last line up into: 
  1112.      temp&=Bt(y).b
  1113.      Bt(y).c=temp&
  1114.  
  1115. The problem apparently has to do with optimization of the last two
  1116. lines of code.
  1117. ----------------------------------------------------------------------------
  1118. Sample program #26. Demonstrates a problem with FRE(-2) in all versions
  1119. of QuickBASIC 2-4.
  1120.  
  1121. DEFINT A-Z
  1122. PRINT "before call", FRE(-2)
  1123. CALL test
  1124. PRINT "after call", FRE(-2)
  1125.  
  1126. ' For QB2/3, add the STATIC keyword after SUB test
  1127. SUB test 
  1128.  
  1129.     PRINT "entering sub", FRE(-2)
  1130.     REDIM a$(100)
  1131.     FOR i = 0 TO 100
  1132.     a$(i) = "this is a test"
  1133.     NEXT i
  1134.     PRINT "before erase", FRE(-2)
  1135.     ERASE a$
  1136.     PRINT "after erase", FRE(-2)
  1137. END SUB
  1138. ----------------------------------------------------------------------------
  1139. Sample program #28. Demonstrates a problem with periods in variable names.
  1140.  
  1141. ' Note - name this program TEST1.BAS
  1142.  
  1143.      DEFINT A-Z
  1144.      DIM STG$(10), DBLP#(10), INTG(10)
  1145.      COMMON SHARED STG$(), DBLP#(), INTG(), message$
  1146.      message$ = "Hello there."
  1147.      CHAIN "TEST2"
  1148.  
  1149. ' Note - name this program TEST2.BAS
  1150.      DEFINT A-Z
  1151.      DIM STG$(10), DBLP#(10), INTG(10)
  1152.      COMMON SHARED STG$(), DBLP#(), INTG(), message$
  1153.      DIM er.Mem(1024)             'Bad Guy
  1154.      TYPE item
  1155.         store AS STRING * 1
  1156.         item AS STRING * 5
  1157.      END TYPE
  1158.      DIM itemrec AS item          'Contributor to the problem
  1159.      PRINT "OK, This is the message...  "; message$
  1160.      END
  1161.  
  1162. Note that the error occurs in QB 4.00b and QB 4.50. The second DIM in
  1163. TEST2.BAS combined with the DIM of an array with a period, causes the
  1164. problem.
  1165.  
  1166. ----------------------------------------------------------------------------
  1167. Sample program #29. Demonstrates a problem with INT in all versions of QB 4.
  1168. (88/12/19).
  1169.  
  1170. 'This bug only happens using BC and QB4.50. It works fine in the environment
  1171. 'using earlier versions of QB4.
  1172. 'The INT(numeric expression) statement does not always return the
  1173. 'correct value if the numeric expression is a calculation.  The
  1174. 'following example will illustrate:
  1175.  
  1176.     A = .9
  1177.     B = 10
  1178.     C = INT(A * B)   'This will produce a result of 8 instead of 9.
  1179.     PRINT "All numbers shown should be 9"
  1180.     PRINT C
  1181.     D = A * B
  1182.     PRINT D
  1183.     C = INT(D)       'This will produce the correct result.
  1184.     PRINT C
  1185.     C = INT(.9 * 10) 'This will also produce the correct result.
  1186.     PRINT C
  1187. ----------------------------------------------------------------------------
  1188. Sample program #30. Demonstrates a problem with CINT in all versions of QB 4.
  1189. (88/01/03)
  1190.  
  1191. FOR I = -10.5 TO 10.5
  1192.   PRINT I, CINT(I)
  1193. NEXT
  1194. ----------------------------------------------------------------------------
  1195. Sample program #31. Demonstrates two problems when you LINK with /PAC.
  1196. (89/02/10)
  1197.  
  1198. If you use the /PAC switch, strange things can happen to your
  1199. programs. Compile the code shown below into two object modules using
  1200. the /X switch.
  1201.  
  1202. ' This is TEST1.BAS
  1203. CALL Test2
  1204. DATA "This is string 1"
  1205. DATA "This is string 2"
  1206.  
  1207.  
  1208. ' This is TEST2.BAS
  1209. Ehandler:
  1210.   RESUME NEXT
  1211. Test2Data:
  1212.   DATA "This is string 3"
  1213.   DATA "This is string 4"
  1214.  
  1215. SUB Test2
  1216.   ON ERROR GOTO Ehandler
  1217.   RESTORE Test2Data
  1218.   READ A$
  1219.   PRINT A$
  1220.   READ A$
  1221.   PRINT A$
  1222.   PRINT "Error was handled ok."
  1223. END SUB
  1224.  
  1225. If you LINK the programs normally, the strings are printed correctly
  1226. and the error is handled properly. If you LINK the same modules with
  1227. /PAC, the data are not read and the error is not handled!
  1228.  
  1229. ----------------------------------------------------------------------------
  1230. Sample program #32. Demonstrates a problem with DECLARE.
  1231. (89/02/10)
  1232.  
  1233. In the following program, "MySub1" is not executed. Instead, QB
  1234. treats the invocation of the SUB as a label. Note that this happens
  1235. only when there are no parameters, and you omit the CALL keyword
  1236. (requiring that you DECLARE the procedure). In addition, there must
  1237. obviously be a colon on the line after the name of the SUB.
  1238.  
  1239. DECLARE SUB MySub1 ()
  1240. DECLARE SUB MySub2 ()
  1241.  
  1242.     MySub1: MySub2
  1243.  
  1244. SUB MySub1
  1245.     PRINT "Hello"
  1246. END SUB
  1247.  
  1248. SUB MySub2
  1249.     PRINT "Goodbye"
  1250. END SUB
  1251.