dos_compilers/Borland Turbo Pascal v6/DOC/HELPME!.DOC

341 lines
12 KiB
Plaintext
Raw Normal View History

2024-07-02 16:11:05 +02:00
Turbo Pascal 6.0
----------------
This file contains answers to commonly asked questions. See the README
file for suggestions on where to get more help. If you're programming
with Turbo Vision, make sure you look at TVISION.DOC for additional
information.
Floppy use
----------
Turbo Pascal 6.0 requires a dual-floppy system (a hard disk is
recommended). If you're using 720 kbyte floppies (or more), you can
put TURBO.EXE and TURBO.TPL on the same disk. If you're using 360
kbyte floppies, you'll need to put TURBO.EXE on Drive B: and TURBO.TPL
on your boot disk. Boot and then type B:TURBO. You can store your
source files on the same disk with TURBO.TPL. You can use TPUMOVER to
make TURBO.TPL smaller by removing units you don't use.
If you use the INSTALL program, make sure your floppies are completely
empty (no system files or COMMAND.COM) before installing. After
running INSTALL, you can copy TURBO.TPL onto a boot disk.
Turbo Pascal's online help system (TURBO.HLP) requires about 700
kbytes of disk storage and cannot be used on a system equipped
only with 360 kbyte floppy drives.
Once you have used INSTALL to build your working diskettes, you
can manually UNZIP other Turbo Pascal components (e.g. BGI, Turbo
Vision or the demo programs) onto other floppy diskettes.
FreePtr and FreeMin
-------------------
These Turbo Pascal 5.x identifiers are no longer needed by the new
heap manager. Simply delete references to FreeMin from your code. If
you're using routines that use FreePtr to compress the heap or perform
other implementation-dependent operations on the heap, you'll need to
update these routines for use with the new heap manager. (If you just
need to lower the top of memory in order to do an Exec, you can call
the SetMemTop procedure from the Turbo Vision Memory unit.) See
Chapter 16 in the Programmer's Guide for more information about how
the new heap manager works.
HeapError
---------
If you are using a HeapError function, make sure it returns
as quickly as possible when passed a Size value of 0:
function HeapError(Size: Word): Integer; far;
begin
if Size > 0 then
begin
{ ... perform HeapError processing here ... }
end;
end;
In version 6.0, HeapError is called with a value of 0 whenever an
allocation moves the HeapPtr upwards.
Mouse Support
-------------
Turbo Pascal's IDE and Turbo Vision require a mouse driver compatible
with Microsoft driver 6.x or later.
286 Code Generation Notes
-------------------------
Programs compiled with {$G+} do not check the processor at runtime to
determine whether it is 286-compatible. Trying to execute 80286
instructions on an 8086 or an 8088 will lock up the computer.
Refer to TEST286.PAS in \TP\DEMOS for an example of how to check
for the presence of a 286-compatible chip at runtime.
$X+ Is Global
-------------
The {$X+} compiler directive is global, so it must appear in the
source code before any declarations or program statements. A $X
directive elsewhere will cause an "Invalid Compiler Directive" error.
Non-static Constuctor Calls
---------------------------
When making inherited constructor calls from inside a method, always
use the TypeName.ConstructorName syntax. This allows the compiler to
statically call the inherited constructor and will not change the
"identity" of the calling object:
Correct:
...
TObject.Init; { always specify type name }
...
WRONG:
...
Init; { may change calling object's "identity" }
...
DOS Critical Error Handling
---------------------------
The IDE and Turbo Vision both provide critical error handling. Due to
problems with some versions of DOS, however, you may need to press ESC
several types to successfully cancel an operation after a critical
error has occurred (e.g. DRIVE NOT READY).
Iterator Methods
----------------
The ForEach, FirstThat and LastThat all take a local (nested), far
procedure or function as a parameter. Refer to Chapter 7 in the Turbo
Vision Guide for details.
Note: never use ForEach to delete items from a collection. The act of
deleting an item moves subsequent items forward and will result in
items being skipped.
Editor Swap File
----------------
The IDE creates a swap file for its virtual editor with the naming
convention of TPxxxx.$$$. Never delete this file while the IDE is
running (e.g. while in a DOS shell). However, if you reboot your
system while the IDE is running, it is safe to delete the swap file
before re-loading the IDE.
Note that the swap file grows but never shrinks while the IDE is
running. If you're editing a large file on a drive without much disk
space available, place the swap file on another drive (ideally a RAM
disk; use the /S command-line option at startup). If there is no other
drive available, and you've done an unusual amount of editing of large
files, you can exit and re-load the IDE and thus reduce the swap file
down to a normal size.
Inline Assembler Notes
----------------------
The built-in assembler works differently than Turbo Assembler in the
following case. In TASM, there is no distinction between an array of
some types and a single variable of this type:
MyVar DW ?
MyArray DW 10 DUP(?)
.
.
MOV AX,MyVar
MOV AX,MyArray[BX]
Using TASM on the above example, the type of both "MyVar" and
"MyArray" is WORD, and either can be loaded into a word-sized
register without a type cast.
This is not the case with Turbo Pascal's built-in assembler. In
Pascal, an array is not the same as a single variable, and a type
cast is required when accessing an element of an array, as
illustrated below:
var
MyVar: Word;
MyArray: array[0..9] of Word;
.
.
asm
MOV AX,MyVar
MOV AX,MyArray[BX].Word
MOV AX,WORD PTR MyArray[BX]
end;
Turbo Pascal 6.0 and the Toolboxes
----------------------------------
With the exception of the Turbo Editor Toolbox, the 4.0 toolboxes
will compile with Turbo Pascal 6.0. The Turbo Editor Toolbox
needs the minor source code changes described below in order to
work with the new heap manager:
MicroStar
---------
In MSVARS.PAS:
1) On line 219 after "var"
Add "FreePtr: Pointer;"
2) On line 295 after "begin"
Add "FreePtr := Ptr(Seg(HeapEnd^) - $1000, 0);"
In INVOKE.PAS:
1) On line 18 after "Dos"
Add ", MsVars"
FirstEd
-------
In EDVARS.PAS:
1) On line 139
Add "FreePtr: Pointer;"
On line 207
Add "FreePtr := Ptr(Seg(HeapEnd^) - $1000, 0);"
In addition, an updated version of BINED.OBJ is required for use
with version 6.0 and is available on CompuServe.
************************************************
Tech Support's Ten Most Commonly Asked Questions
************************************************
1. How do you read and write a file inside a Turbo Pascal
program?
Here's a program that creates a text file and then reads it
back:
program FileDemo;
var
FileVar: Text;
InString, OutString: String;
begin
OutString := 'Write this to a text file';
Assign(FileVar, 'TEST.TXT');
Rewrite(FileVar); { Creates new text file }
Writeln(FileVar, OutString);
Close(FileVar);
Assign(FileVar, 'TEST.TXT');
Reset(FileVar); { Opens existing text file }
Readln(FileVar, InString);
Close(FileVar);
end.
2. What is the GRAPH.TPU file?
GRAPH.TPU is the BGI unit found in BGI.ZIP on your distribution
diskettes. The INSTALL program puts it in \TP\BGI by default.
3. How do you send a program's output to the printer?
program Print;
uses Printer;
begin
Writeln(Lst, 'Hello Printer');
end.
4. Why am I getting a "Unit file format error" when I compile my
program with the new Turbo Pascal compiler?
You are using a unit that has been compiled with an earlier
version of Turbo Pascal. Re-build all your programs with Turbo
Pascal 6.0 using the command-line compiler's /B switch or using
the IDE's Compile|Build command.
Contact third-party vendors for updated TPU's if you don't
have the source code.
5. How do you calculate X to the power of Y?
function Power(X, Y: Real): Real;
begin
Power := Exp(Y * Ln(X));
end.
6. How come my program runs fine in the IDE and locks when run
from the DOS prompt?
This usually happens when you have uninitialized variables (for
another possible reason, refer to the next question).
7. I think my program is trashing memory. Which statements are the
likely culprits?
Here are some of the most common causes for out-of-bounds memory
writes:
Problem Suggestion
------- ----------
Array index out of range Turn on range checking {$R+}.
Uninitialized variable Initialize it, of course.
Pointers out of bounds Make sure you're not using
unallocated pointers or pointers
to blocks that have been
disposed.
Move, FillChar, BlockRead These routines all write to
memory without regard for
Pascal's normal size- and
type-checking. Make sure you're
specifying the correct amount of
data to be moved, filled or
read.
Indexing beyond the size If you're using relaxed var string
of a string checking {$V-}, make sure you're
not writing past the end of a
string (and onto neighboring
data).
8. Why doesn't the Exec procedure run the program I specify?
Make sure you define a maximum heap size using a $M compiler
directive at the beginning of your program. Refer to EXECDEMO.PAS
in \TP\DEMOS.
In addition to omitting a $M compiler directive, two other common
are common errors can be diagnosed easily by looking at the
value of DosError after a call to Exec:
DosError Explanation
-------- -----------
2 File not found. Specify the full path and program
name. If you're trying to execute an internal DOS
command (like DIR), you need to Exec COMMAND.COM
(see the Exec example in online help and the Library
Reference).
8 Not enough memory available to Exec the specified
program. Lower the amount of heap your program is
using (see \TP\DEMOS\EXECDEMO.PAS).
9. What do I do if Turbo Pascal gives an "out of memory" error?
If you're running out of memory using the IDE, you have many
configuration options available. Refer to P-146 in the User's
Guide for a comprehensive checklist.
If you're using the command-line compiler and running out of
memory during a compilation, first try the appropriate
suggestions on P-146 in the User's Guide. If you're still running
out of memory during compilation, you should probably TPCX.EXE,
the extended memory compiler available with Turbo Pascal 6.0
Professional.
10. How come I don't get the results that I expect when I
compare and print real numbers?
Floating point, or real numbers, are an approximation and small
rounding errors will occur during calculations and
transformations between numeric types. For a complete discussion
of this topic, refer to the section on comparing reals in Chapter
14 in the Programmer's Guide.