Article ID: 57711
Article Last Modified on 8/16/2005
APPLIES TO
- Microsoft QuickBasic 4.0
- Microsoft QuickBASIC 4.0b
- Microsoft QuickBasic 4.5 for MS-DOS
- Microsoft BASIC Compiler 6.0
- Microsoft BASIC Compiler 6.0b
- Microsoft BASIC Professional Development System 7.0
- Microsoft BASIC Professional Development System 7.1
This article was previously published under Q57711
SYMPTOMS
The program below demonstrates a problem with the QuickBasic (QB.EXE) and QuickBasic Extended (QBX.EXE) editors in which the environment runs out of stack space when passing a large user-defined TYPE variable to a SUBprogram.
STATUS
Microsoft has confirmed this to be a bug in QB.EXE in Microsoft QuickBasic versions 4.00, 4.00b, and 4.50 for MS-DOS; in QB.EXE shipped with Microsoft Basic Compiler 6.00 and 6.00b (buglist6.00, buglist6.00b) for MS-DOS; and in the QBX.EXE editor that comes with Microsoft Basic Professional Development System (PDS) versions 7.00 and 7.10 for MS-DOS (buglist7.00, buglist7.10). We are researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.
This problem does not occur in .EXE programs compiled with BC.EXE.
MORE INFORMATION
The minimum code to duplicate this "Out of stack space" error is as follows:
- Create a TYPE that is near the size of, or larger than, the available stack space. (A TYPE with 2400 bytes is adequate to show the problem in both QB.EXE and QBX.EXE. QB.EXE has a default program stack size of 2K, and QBX.EXE has a default program stack size of 3K).
- DIMension an array of that TYPE. An array of one element is all that is necessary to reproduce the problem. The array can be either $DYNAMIC or $STATIC.
- Create a SUBprogram that takes a single element of this TYPE as a parameter. The SUB does not have to contain any code at all.
- CALL the SUB and pass one element of this array.
- Run the program by pressing SHIFT+F5 in the environment.
Attempting to run this program in the editor produces an "Out of stack space" error followed by an "Out of memory" error before the program even begins to execute. The errors do NOT occur at the time of the CALL because the program is pushing information onto the stack. This can be shown by putting a breakpoint on the CALL and then attempting to execute the program. The CALL is never reached; the problem occurs during the binding and final memory allocation steps.
This problem does not occur when the program is compiled with the BC.EXE compiler.
To work around this problem, dimension the TYPEd array with DIM SHARED or put it in a COMMON SHARED statement.
The following is the minimum amount of code needed to reproduce the problem:
DECLARE SUB sub1 (boot AS ANY) TYPE rec1 jump1 AS STRING * 2400 END TYPE DIM var1(1) AS rec1 CALL sub1(var1(1)) END SUB sub1 (boot AS rec1) END SUB
The following code example shows one workaround:
DECLARE SUB sub1 () TYPE rec1 jump1 AS STRING * 2400 END TYPE DIM SHARED var1(1) AS rec1 CALL sub1 END SUB sub1 END SUB
Additional query words: BasicCom buglist4.00 buglist4.00b buglist4.50 B_BasicCom
Keywords: KB57711