KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q40188: FRE(-2) Returns Fixed Lowest Value Even After Stack Shrinks

Article: Q40188
Product(s): See article
Version(s): 4.00 4.00b 4.50
Operating System(s): MS-DOS
Keyword(s): ENDUSER | buglist4.00 buglist4.00b buglist4.50 B_BasicCom | mspl13_basic
Last Modified: 20-SEP-1990

The FRE(-2) function returns in bytes the amount of unused stack space
available for the program.

However, when the stack-space allocation decreases, the value returned
by FRE(-2) stays fixed at the smallest size that was unused by the
stack up to that point of program execution. In other words, the
values successively returned by FRE(-2) never increase -- they either
decrease or stay the same.

Microsoft has confirmed this to be a problem in QuickBASIC in versions
4.00, 4.00b, and 4.50; in Microsoft BASIC Compiler versions 6.00 and
6.00b for MS-DOS and MS OS/2 (buglist6.00, buglist6.00b); and in
Microsoft BASIC Professional Development System (PDS) versions 7.00
and 7.10 for MS-DOS and MS OS/2 (buglist7.00, buglist7.10). We are
researching this problem and will post new information here as it
becomes available.

The sample program below demonstrates this behavior. The example given
is a recursive subprogram that reports the value of FRE(-2) on the way
down and back up through 10 levels of subprogram recursion. As the
stack space increases with the level of recursion, the value of
FRE(-2) decreases as expected. However, as the stack space decreases
with lower levels of recursion, the value reported by FRE(-2) stays
"bottomed out" at the lowest value reached during recursion.

The only way to reset the "bottomed-out" value returned by FRE(-2) is
to end the program or execute a CLEAR statement. Note: CLEAR erases
all variables and closes all files. In some cases, as shown in Example
2, adding an INPUT statement before the FRE(-2) allows FRE(-2) to go
back up. Adding INPUT does not help Example 1.

Example 1
---------

The following code example demonstrates a case in which FRE(-2) goes
down and stays down:

   DECLARE SUB test (num)
   CLS
   PRINT "Before any calls, FRE(-2):"; FRE(-2)
   CALL test(0)
   END
   SUB test (num)
     PRINT "Call number"; num; "on the way DOWN, FRE(-2):"; FRE(-2)
     IF num < 9 THEN
       CALL test(num + 1)
     ELSE
       PRINT "Bottom of recursion reached."
     END IF
     PRINT "Call number"; num; "on the way UP, FRE(-2):"; FRE(-2)
   END SUB

Example 2
---------

The following example demonstrates a case in which adding an INPUT
statement lets the value returned by FRE(-2) go back up:

   DECLARE SUB foo ()
   DEFINT A-Z
   CLS
   'INPUT k   ' Adding this INPUT statement makes FRE(-2) go back up.
   PRINT FRE(-2)
   a$ = "Test string"
   CALL foo
   PRINT FRE(-2)
   END

   SUB foo
   SHARED a$
   PRINT "hello "; a$
   END SUB

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.