Q63272: Single-Line DEF FN Can Cause Program to Rerun ON ERROR
Article: Q63272
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | B_BasicCom buglist4.00 buglist4.00b buglist4.50 SR# S900606- | mspl13_basic
Last Modified: 8-NOV-1990
A program will incorrectly return from an error-handling routine if an
error occurs in a single-line DEF FN function. If the error occurs
during the execution of a single-line DEF FN function, when the error
handler executes a RESUME or RESUME NEXT, the program will resume on
the line after the DEF FN definition instead of on the line or line
after where the DEF FN function was invoked. This usually results in
an infinite loop that eventually causes an "Out of stack space" error
after the FN function invocations have been nested too many times.
Microsoft has confirmed this to be a problem in QuickBASIC versions
4.00, 4.00b, and 4.50; in Microsoft BASIC Compiler versions 6.00 and
6.00b (buglist6.00, buglist6.00b); and in Microsoft BASIC Professional
Development System (PDS) versions 7.00 and 7.10 for MS-DOS
(buglist7.00, buglist7.10). This problem occurs in both the
QB.EXE/QBX.EXE editor environment and the BC.EXE compiler. We are
researching this problem and will post new information here as it
becomes available.
The following code example demonstrates this problem:
10 ON ERROR GOTO handler
20 REM For the following program:
30 CLS
40 DEF fnx (x%) = 1 / x%
45
50 PRINT "line after the DEF FN": PRINT
60 PRINT fnx(0)
70 END
80 handler:
90 RESUME NEXT
In the example above, an error will occur on the PRINT fnx(0). In the
error handler, the RESUME NEXT should cause the program to RESUME on
line 70 after the PRINT fnx(0), but instead the program will resume on
the line after the DEF FN definition (line 45). This will cause the
PRINT fnx(0) on line 60 to be executed again, causing another error,
which effectively is an infinite loop. The program will eventually run
out of stack space and quit with a run-time error.
To work around this problem, simply expand the single-line DEF FN to a
multiple-line DEF FN ... END DEF. To correct the example above, you
would make the following changes:
10 ON ERROR GOTO handler
20 REM For the following program:
30 CLS
40 DEF fnx (x%)
fnx = 1 / x%
END DEF
45
50 PRINT "line after the DEF FN": PRINT
60 PRINT fnx(0)
70 END
80 handler:
90 RESUME NEXT
This program will execute correctly. The FN function will return a 0
and the program will resume on the line after the PRINT fnx(0)
statement.
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.