KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q45483: Incorrect Number of Parameters to Quick Library Can Hang QB

Article: Q45483
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | SR# S890525-13 | mspl13_basic
Last Modified: 20-DEC-1989

When using FUNCTIONs or SUBprograms that are located in a Quick
library under QuickBASIC Versions 4.00, 4.00b, and 4.50 and under
QuickBASIC Extended in BASIC PDS Version 7.00, it is important to
DECLARE all Quick library routines that your program will be CALLing.
If fewer parameters than expected are passed to a SUBprogram in a
Quick library, your machine may hang, sometimes requiring the power to
be cycled to reboot the machine. This problem occurs only within the
environment and only when CALLing a Quick library routine.

If the program is CALLing a routine in another module that is loaded
into the QB.EXE environment, the expected error of "Argument count
mismatch" displays. When compiled to an EXE file, the error "Illegal
function call" displays.

Microsoft does not consider this to be a problem with QuickBASIC or
QBX.EXE of any version. The environment cannot perform parameter
checking without a DECLARE statement for each SUB or FUNCTION.
Therefore a DECLARE statement is required for each routine in a Quick
library in order for a program to function normally.

If SUBprograms are not DECLAREd at the top of the module that makes
the calls, the SUBroutine must be CALLed. If you have a DECLARE SUB
for that SUBroutine, you need only to mention the SUBprograms followed
by any expected parameters.

When using FUNCTIONs, whether in another module or a Quick library,
the FUNCTION must be DECLAREd at the top of the calling module. If the
FUNCTION is not DECLAREd, the QuickBASIC environment interprets the
FUNCTION as an array.

For more information on SUBprograms and FUNCTIONs, consult Chapter 2
of the "Microsoft QuickBASIC 4.5: Programming in BASIC" manual for
Microsoft QuickBASIC Version 4.50 or Chapter 2 of the "Microsoft BASIC
7.0: Programmer's Guide" for Microsoft BASIC PDS Version 7.00.

The code example below illustrates the necessity of the DECLARE
statement. If the FUNCTION and SUBroutine are combined into a Quick
library and only one of the arguments is passed to the SUBprogram, the
computer hangs. If both arguments are passed, it executes as expected.
If the DECLARE FUNCTION is removed, a "Subscript out of range" is
generated when the FUNCTION is referenced.

Code Example
------------

Main Program
------------

DECLARE FUNCTION calculatesomething%(t AS INTEGER)
DEFINT A-Z
t = 100
x = 100                     'to hang machine, change CALL statement to:
CALL printhello(t, x)       'CALL printhello(t)
a = calculatesomething(t)
PRINT a

Quick Library Routines
----------------------

SUB printhello(t AS INTEGER, x AS INTEGER)
    PRINT "Hello from the SUBprogram: "; t, x
END SUB

FUNCTION calculatesomething%(t AS INTEGER)
    calculatesomething% = t + t * t
END FUNCTION

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.