In .EXE, PAINT Used in a SUB Can Corrupt Passed Variables (51597)
This article was previously published under Q51597
SYMPTOMS
The PAINT function can corrupt variables that are passed to a SUB when
the program is compiled using BC.EXE 4.00, 4.00b, or 4.50. The PAINT
function works correctly in the QB.EXE environment, and if compiled
using BC.EXE with the /X switch.
STATUS
Microsoft has confirmed this to be a bug in QuickBasic versions
4.00, 4.00b, and 4.50 and in Microsoft Basic Compiler versions 6.00
and 6.00b (buglist6.00 buglist6.00b) for MS-DOS. This problem was
corrected in Microsoft Basic Compiler version 7.00 (fixlist7.00).
MORE INFORMATION
The following program demonstrates this problem. The values of x and y
will be invalid following the PAINT(x, y) statement; however, the
values of x and y are unaffected at the module level code following
the call to "Sub1":
Compile with either: BC Paint; or BC Paint /O;
Link with: Link Paint;
Code Example: PAINT.BAS
DECLARE SUB Sub1(x,y)
x = 300 'Initialize x
y = 100 'Initialize y
CALL Sub1(x,y)
PRINT x; y 'These values will be correct
END
SUB Sub1 (x, y)
SCREEN 12 'Any graphics mode
PRINT x; y 'These values will be correct
CIRCLE (x, y), 50
PAINT (x, y) 'Paint the circle
PRINT x; y '** These values will contain garbage
END SUB
Specifying a definite type for x and y (such as INTEGER, LONG, SINGLE,
or DOUBLE) does not have any effect on the output.
Four possible workarounds for the PAINT problem are as follows:
- Compile with BC /X.
- Copy x and y to variables that are local to the SUB.
- PAINT at the module level instead of at the SUB level.
- Make x and y SHARED or COMMON SHARED.
This problem was corrected in Microsoft Basic Compiler 7.00.
Example 2
The following program also demonstrates the problem in an EXE
program, where PAINT corrupts the SUB argument used as a color value.
This problem is caused by compiler optimizations, and can be worked
around as follows:
- Disable optimizations by using the /X compiler option.
-or-
- Disable optimizations by including the ON ERROR GOTO ... RESUME
combination in the program source code.
-or-
- To avoid the problem without disabling compiler optimizations,
assign the SUB's argument to a local variable that is then passed to
the PAINT statement's color parameter.
DECLARE SUB box (z%)
SCREEN 9 'Note: Also occurs in other graphics modes.
FOR count% = 1 TO 10 'Run through the test with ten colors.
CALL box(count%) 'Do the test.
NEXT count%
SLEEP 'A chance to display the values.
END
SUB box (z%)
'This sub uses z% for positioning as well as the color variable.
x% = 200 + z% * 20
y% = 50 + z% * 20 'Just a location for the box.
LINE (x%, y%)-(x% + 10, y% + 10), z%, B 'The box to paint in.
PRINT z%; 'This value will be correct.
PAINT (x% + 5, y% + 5), z% 'Do the paint.
PRINT z% 'This value will have been corrupted.
END SUB
Modification Type: |
Minor |
Last Reviewed: |
1/8/2003 |
Keywords: |
KB51597 |
|