home *** CD-ROM | disk | FTP | other *** search
- program HeapTest(input, output);
-
- {This program demonstrates a bug in Turbo Pascal, version 2.
- I put 10 integers on the stack, then release the stack and put
- 10 integers on the stack again. In v. 1.0 we get the same results
- each time, as we should. In v. 2.0 we get different answers. Apparently
- the procedure Release(HeapTop) is not working properly.}
-
- {The procedure ReleaseHeap is a replacement for Release(HeapTop) and
- seems to work correctly}
-
- type
- IntegerPointer = ^integer;
-
- var
- Number : ^integer;
- HeapTop : ^integer;
- Mem : real;
-
- procedure ReleaseHeap (AHeapPointer : IntegerPointer);
- var i : integer;
- begin
- i := ((seg(heapptr^) - seg(AHeapPointer^)) shl 4) +
- (ofs(heapptr^) - ofs(AHeapPointer^));
- FreeMem(AHeapPointer,i);
- end;
-
- procedure report; {report memory available}
- begin
- Mem := MemAvail;
- if (Mem < 0) then Mem := 65536.0+MemAvail;
- write('MemAvail = ',Mem:7:0, ' paragraphs ', Mem*16.0:9:0, ' bytes');
- end;
-
- procedure FillTheHeap(xc,yc,Depth : integer); {fill the heap to Depth}
- var
- n : integer;
- begin
- for n := 1 to Depth do
- begin
- New(Number) ;
- Number^ := n;
- gotoxy(xc,yc);
- report;
- end
- end;
-
- begin
- Mark(HeapTop); {Mark the top of the heap}
- gotoxy(5,20);
- report; {1: Report memory available}
- FilltheHeap(5,21,10); {2: Fill the heap with 10 integers}
- releaseheap(HeapTop); {Release the heap using the fix}
- gotoxy(5,22);
- report; {3: Report memory available; should be same as in 1}
- FilltheHeap(5,23,10); {4: Put 10 integers on again; should be same as in 2}
- end.
-