479 lines
18 KiB
Plaintext
479 lines
18 KiB
Plaintext
|
TURBO C 2.0: ANSWERS TO COMMON QUESTIONS
|
|||
|
|
|||
|
|
|||
|
G e t t i n g S t a r t e d
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. How do I install Turbo C?
|
|||
|
A. Run the INSTALL program from the INSTALL/HELP disk. To start
|
|||
|
the installation, change your current drive to the one that
|
|||
|
has the install program on it and type INSTALL. You will be
|
|||
|
given instructions in a box at the bottom of the screen for
|
|||
|
each prompt. For example, if you will be installing from
|
|||
|
drive A:, type:
|
|||
|
|
|||
|
A:
|
|||
|
INSTALL
|
|||
|
|
|||
|
At this point, the INSTALL program will appear with menus
|
|||
|
selections and descriptions to guide you through the installation
|
|||
|
process.
|
|||
|
|
|||
|
Q. How do I run Turbo C?
|
|||
|
A. After you have installed Turbo C, type "TC" from the DOS
|
|||
|
prompt and you're ready to go. Chapter 2 (Getting Started)
|
|||
|
of the Turbo C User's Guide will guide you through your
|
|||
|
first Turbo C program.
|
|||
|
|
|||
|
Q. What is the difference between TC.EXE and TCC.EXE?
|
|||
|
A. The Turbo C package comes with two compilers, an Integrated
|
|||
|
Environment named TC.EXE and a command-line compiler named
|
|||
|
TCC.EXE. The Integrated Environment is essentially
|
|||
|
the command-line compiler with an integrated editor,
|
|||
|
linker, and debugger. Please refer to the Turbo C
|
|||
|
User's Guide for details on using both systems.
|
|||
|
|
|||
|
Q. What is a configuration file?
|
|||
|
A. A configuration file tells Turbo C what options to default to
|
|||
|
and where to look for its library and header files. TC.EXE
|
|||
|
looks for a configuration file named TCCONFIG.TC, and
|
|||
|
TCC.EXE looks for a file named TURBOC.CFG. See the User's
|
|||
|
Guide, pages 40 and 143 for more information.
|
|||
|
|
|||
|
Q. How do I create a configuration file?
|
|||
|
A. When you run the INSTALL program it creates a configuration
|
|||
|
file named TURBOC.CFG for TCC.EXE. This file is just an
|
|||
|
ASCII file which you can change with any text editor. It
|
|||
|
contains the path information for the library and header
|
|||
|
files for TCC.EXE to use. The INSTALL program does not
|
|||
|
create a TCCONFIG.TC file for TC.EXE because it installs
|
|||
|
the directory information directly into TC.EXE. You can
|
|||
|
create a configuration file for TC.EXE by running TC,
|
|||
|
setting your options however you want to set them, and
|
|||
|
typing Alt-O/S.
|
|||
|
|
|||
|
I n t e g r a t e d E n v i r o n m e n t
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. Why is Turbo C not able to find any of my #include files?
|
|||
|
A. The compiler searches for include files in the Turbo C Include
|
|||
|
Directories. This option is specified under the Options/Directories
|
|||
|
menu. The INSTALL program initially sets this option to the
|
|||
|
directory where it copied all the Turbo C *.h files.
|
|||
|
|
|||
|
|
|||
|
Q. Why do I get the message:
|
|||
|
Linker Error: Unable to open input file 'C0x.OBJ'
|
|||
|
A. The linker searches for Turbo C start-up and library files in the
|
|||
|
Turbo C Library Directories. This option is specified under the
|
|||
|
Options/Directories menu. The INSTALL program initially sets this
|
|||
|
option to a directory where it copied the start-up and library
|
|||
|
files.
|
|||
|
|
|||
|
|
|||
|
Q. How do I get Turbo C to link in my own libraries or use multiple
|
|||
|
source files?
|
|||
|
A. Turbo C's Project facility is designed to allow you to work with
|
|||
|
multiple files. Refer to Chapter 3 of the Turbo C User's Guide,
|
|||
|
under "Projects: Using Multiple Source Programs".
|
|||
|
|
|||
|
|
|||
|
Q. Why does the linker tell me that all the graphics library
|
|||
|
routines are undefined?
|
|||
|
A. The Options/Linker/Graphics Library item must be set ON, if
|
|||
|
you are using any Turbo C graphics functions and have not
|
|||
|
specifyed GRAPHICS.LIB in a project file.
|
|||
|
|
|||
|
|
|||
|
Q. Why does Turbo C report "Unable to open include file 'stdarg.h'"
|
|||
|
when I try to #include <stdio.h>?
|
|||
|
A. The most probable reason is that you have exceeded the number
|
|||
|
of files that DOS can have open simultaneously. Add the line
|
|||
|
|
|||
|
FILES=20
|
|||
|
|
|||
|
to your DOS CONFIG.SYS file. This allows DOS to open up to 20
|
|||
|
files at the same time. CONFIG.SYS will only be effective
|
|||
|
after you have rebooted your computer. See the IBM DOS Reference
|
|||
|
Manual for details on the CONFIG.SYS file.
|
|||
|
|
|||
|
|
|||
|
Q. How do I change the colors of the editor and menus in TC?
|
|||
|
A. The utility TCINST.EXE allows you to customize your colors.
|
|||
|
|
|||
|
|
|||
|
Q. How do I get a listing of my source code to my printer?
|
|||
|
A. From within the Turbo C editor hit <Ctrl><K><P>. This will
|
|||
|
print a marked block to the printer. If no block is marked
|
|||
|
this key sequence will print the entire file in your editor.
|
|||
|
|
|||
|
|
|||
|
Q. When I Make, Run, or Trace a program Turbo C sometimes goes
|
|||
|
through the compile and link process even when the object files
|
|||
|
are up-to-date.
|
|||
|
A. Turbo C's MAKE logic works solely on a file's date and time
|
|||
|
stamp. If one of your source files is marked with a date
|
|||
|
that's sometime in the future, the object files that are
|
|||
|
created from it will always be older than the source file,
|
|||
|
and Turbo C will always try to rebuild the file. You can fix
|
|||
|
this by using TOUCH.COM to set the file to the current date
|
|||
|
and time. You should also make sure that your system's date
|
|||
|
and time are always properly set.
|
|||
|
|
|||
|
|
|||
|
C o m m a n d - L i n e C o m p i l e r
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. Why is Turbo C not able to find any of my #include files?
|
|||
|
A. The compiler searches for include files in the Turbo C Include
|
|||
|
Directories. This option is specified by the -I switch. The INSTALL
|
|||
|
program initially writes a configuration file (TURBOC.CFG) that
|
|||
|
sets this to the directory where it copied all the Turbo C *.h
|
|||
|
files.
|
|||
|
|
|||
|
|
|||
|
Q. Why do I get the message:
|
|||
|
Linker Error: Unable to open input file 'C0x.OBJ'
|
|||
|
A. The linker searches for Turbo C start-up and library files in the
|
|||
|
Turbo C Library Directories. This option is specified by the -L
|
|||
|
switch. If you allow TCC to invoke the linker, it will search the
|
|||
|
directories in the configuration file (TURBOC.CFG) written by the
|
|||
|
INSTALL program. If you run TLINK, the configuration file is not read.
|
|||
|
|
|||
|
Q. Why does the linker tell me that all the graphics library
|
|||
|
routines are undefined?
|
|||
|
A. TCC will not search the graphics library unless you tell it to.
|
|||
|
You should specify the graphics library on the command line. For
|
|||
|
example, to compile BGIDEMO, type
|
|||
|
|
|||
|
TCC BGIDEMO.C GRAPHICS.LIB<Enter>
|
|||
|
|
|||
|
|
|||
|
G e n e r a l I / O
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. The '\n' in cprintf() does not return the cursor to the
|
|||
|
beginning of the line. It only moves the cursor down one line.
|
|||
|
A. cprintf() no longer interprets '\n' as a Carriage Return/
|
|||
|
Line Feed combination. The '\n' only outputs a Line Feed. To
|
|||
|
force the cursor to the beginning of the line, manually
|
|||
|
insert a Carriage Return:
|
|||
|
|
|||
|
cprintf("\n\r");
|
|||
|
|
|||
|
|
|||
|
Q. How do I print to the printer from a Turbo C program?
|
|||
|
A. Turbo C uses a FILE pointer (stdprn) defined in the STDIO.H
|
|||
|
file. You do not need to open stdprn before using it:
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
main()
|
|||
|
{
|
|||
|
fprintf(stdprn, "Hello, world\n");
|
|||
|
}
|
|||
|
|
|||
|
Note that if your printer is line-buffered, the output is
|
|||
|
flushed only after a '\n' is sent.
|
|||
|
|
|||
|
|
|||
|
Q. I am reading and writing binary files. My program is
|
|||
|
translating the Carriage Return (0x0D) and Line Feed (0x0A)
|
|||
|
characters. How do I prevent this from happening?
|
|||
|
A. Files opened in text mode will translate these characters for
|
|||
|
DOS. To read a file in binary mode, open it in binary mode.
|
|||
|
For example
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
main()
|
|||
|
{
|
|||
|
FILE *binary_fp;
|
|||
|
char buffer[100];
|
|||
|
|
|||
|
binary_fp = fopen("MYFILE.BIN", "rb");
|
|||
|
|
|||
|
fread(buffer, sizeof(char), 100, binary_fp);
|
|||
|
|
|||
|
:
|
|||
|
}
|
|||
|
|
|||
|
The default file mode is text.
|
|||
|
|
|||
|
|
|||
|
Q. Why don't printf() and puts() print text in color?
|
|||
|
A. Use the console I/O functions cprintf() and cputs() for color output.
|
|||
|
|
|||
|
#include <conio.h>
|
|||
|
main()
|
|||
|
{
|
|||
|
textcolor(BLUE);
|
|||
|
cprintf("I'm blue.");
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
Q. How do I print a long integer?
|
|||
|
A. Use the "%ld" format:
|
|||
|
|
|||
|
long int l = 70000L;
|
|||
|
printf("%ld", l);
|
|||
|
|
|||
|
|
|||
|
Q. How do I print a long double?
|
|||
|
A. Use the "%Lf" format.
|
|||
|
|
|||
|
long double ldbl = 1E500;
|
|||
|
printf("%Lf", ldbl);
|
|||
|
|
|||
|
|
|||
|
E x a m p l e P r o g r a m s
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. How do I compile the MICROCALC spread sheet?
|
|||
|
A. See Appendix G of the Turbo C Reference Manual.
|
|||
|
|
|||
|
|
|||
|
Q. How do I compile the BGIDEMO program?
|
|||
|
A. 1. Make sure that the following Turbo C files are in your
|
|||
|
current directory:
|
|||
|
|
|||
|
BGIDEMO.C
|
|||
|
*.BGI
|
|||
|
*.CHR
|
|||
|
|
|||
|
2. Run TC.
|
|||
|
|
|||
|
3. Load BGIDEMO.C into the Editor by hitting F3 then typing
|
|||
|
BGIDEMO<Enter>
|
|||
|
|
|||
|
3. Go to the Run menu and choose the Run item.
|
|||
|
|
|||
|
|
|||
|
Q. How do I create a COM file?
|
|||
|
A. DOS versions 3.2 and earlier include an EXE2BIN utility that
|
|||
|
converts EXE files to COM files. For users who do not have
|
|||
|
EXE2BIN, the Turbo C command-line linker, TLINK will create
|
|||
|
a COM file instead of an EXE file if the /t option is
|
|||
|
specified. For example:
|
|||
|
|
|||
|
tcc -mt -lt tiny
|
|||
|
|
|||
|
will create TINY.COM instead of TINY.EXE.
|
|||
|
|
|||
|
There are certain limitations in converting an EXE file to a COM
|
|||
|
file. These limitations are documented in the IBM Disk Operating
|
|||
|
System manual under EXE2BIN.
|
|||
|
|
|||
|
Turbo C's TINY model is compatible with the COM format, but programs
|
|||
|
that use Turbo C's floating point routines cannot be converted to a
|
|||
|
COM file.
|
|||
|
|
|||
|
|
|||
|
G r a p h i c s
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. Why do I get the error message:
|
|||
|
|
|||
|
BGI Error: graphics not initialized (use 'initgraph')
|
|||
|
|
|||
|
when I use a graphics function? My program has already
|
|||
|
called initgraph().
|
|||
|
A. For some reason initgraph() failed. To find out why, check
|
|||
|
the return value of graphresult(). For example:
|
|||
|
|
|||
|
#include <graphics.h>
|
|||
|
main()
|
|||
|
{
|
|||
|
int gerr; /* graphics error */
|
|||
|
int gdriver = DETECT, gmode;
|
|||
|
|
|||
|
/* Initialize graphics using auto-detection and look
|
|||
|
for the .BGI and .CHR files in the C:\TURBOC directory.
|
|||
|
*/
|
|||
|
initgraph(&gdriver, &gmode, "C:\\TURBOC");
|
|||
|
|
|||
|
if ((gerr = graphresult()) != grOk)
|
|||
|
{
|
|||
|
printf("Error : %s\n", grapherrormsg(gerr));
|
|||
|
exit(1);
|
|||
|
}
|
|||
|
|
|||
|
:
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
M a t h / F l o a t i n g P o i n t
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. Why do I get incorrect results from all the math library
|
|||
|
functions like cos() and tan()?
|
|||
|
A. You must #include <math.h> before you call any of the standard
|
|||
|
Turbo C math functions. In general, Turbo C assumes that a function
|
|||
|
that is not declared returns an int. In the case of math functions,
|
|||
|
they usually return a double. For example
|
|||
|
|
|||
|
/* WRONG */ /* RIGHT */
|
|||
|
#include <math.h>
|
|||
|
main() main()
|
|||
|
{ {
|
|||
|
printf("%f", cos(0)); printf("%f", cos(0));
|
|||
|
} }
|
|||
|
|
|||
|
|
|||
|
Q. How do I "trap" a floating point error?
|
|||
|
A. See the signal() and matherr() functions in the Turbo C Reference
|
|||
|
Guide. The signal() function may be used to trap errors in the
|
|||
|
80x87 or the 80x87 emulator. The matherr() function traps errors
|
|||
|
in the Math Library functions.
|
|||
|
|
|||
|
|
|||
|
L i n k e r E r r o r s
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. Why do I get the message:
|
|||
|
Linker Error: Unable to open input file 'C0x.OBJ'
|
|||
|
A. See "Integrated Environment" section above.
|
|||
|
|
|||
|
|
|||
|
Q. Why do I get the message:
|
|||
|
Linker Error: Undefined symbol '_main' in module C0
|
|||
|
A. Every C program must contain a function called main(). This
|
|||
|
is the first function executed in your program. The function
|
|||
|
name must be all in lower case. If your program does not
|
|||
|
have one, create one. If you are using multiple source files,
|
|||
|
the file that contains the function main() must be one of
|
|||
|
the files listed in the Project.
|
|||
|
|
|||
|
Note that an underscore character '_' is prepended to all
|
|||
|
external Turbo C symbols.
|
|||
|
|
|||
|
|
|||
|
Q. Why does the linker tell me that all the graphics library
|
|||
|
routines are undefined?
|
|||
|
A. See the "Integrated Environment" and "Command-line Compiler"
|
|||
|
sections above.
|
|||
|
|
|||
|
|
|||
|
Q. What is a 'Fixup overflow'?
|
|||
|
A. See the listing of TLINK error messages in Appendix D of the
|
|||
|
Turbo C Reference Guide.
|
|||
|
|
|||
|
|
|||
|
Q. I am linking my own assembly language functions with Turbo C.
|
|||
|
The linker reports that all of my functions are undefined.
|
|||
|
A. Make sure that you have put an underbar character '_' in front of all
|
|||
|
assembly language function names to be called by Turbo C. Your assembly
|
|||
|
language program should be assembled with Case Sensitivity. See
|
|||
|
the Chapter 12, "Advanced Programming," in the Turbo C User's Guide
|
|||
|
for details.
|
|||
|
|
|||
|
|
|||
|
O t h e r Q u e s t i o n s
|
|||
|
----------------------------------------------------------------------
|
|||
|
Q. How do I change the stack size?
|
|||
|
A. The size of the stack of a Turbo C program is determined at
|
|||
|
run-time by the global variable _stklen. To change the size
|
|||
|
to, for example 10000 bytes, include the following line in
|
|||
|
your program:
|
|||
|
|
|||
|
extern unsigned _stklen = 10000;
|
|||
|
|
|||
|
This statement must not be inside any function definition.
|
|||
|
The default stack size is 4096 bytes (4K).
|
|||
|
|
|||
|
Q. I'm getting a 'Stack Overflow!' message when I run my program.
|
|||
|
How can I work around this?
|
|||
|
A. You may increase the stack size by following the procedure above. Stack
|
|||
|
overflows are usually caused by a large amount of local data or
|
|||
|
recursive functions. You can decrease the amount of stack space
|
|||
|
used by declaring your local variables static:
|
|||
|
|
|||
|
main() main()
|
|||
|
{ {
|
|||
|
char x[5000]; --> static char x[5000];
|
|||
|
: :
|
|||
|
} }
|
|||
|
|
|||
|
Of course, you should be aware that there are other effects
|
|||
|
that the "static" keyword has, as applied here.
|
|||
|
|
|||
|
Q. My program comes up with the message 'Null pointer assignment'
|
|||
|
after it terminates. What does this mean?
|
|||
|
A. Before a small-data model Turbo C program returns to DOS, it will
|
|||
|
check to see if the beginning of its data segment has been corrupted.
|
|||
|
This message is to warn you that you have used uninitialized pointers
|
|||
|
or that your program has corrupted memory in some other way.
|
|||
|
|
|||
|
Q. Why are .EXE files generated by TC.EXE larger than those
|
|||
|
generated by TCC.EXE?
|
|||
|
A. In the default configuration, TC.EXE includes debugging
|
|||
|
information in the .EXE files that it creates, and TCC.EXE
|
|||
|
does not. If you don't want to produce this debugging
|
|||
|
information, you can shut it off in the Integrated
|
|||
|
Development Environment by selecting Alt-D/S/N.
|
|||
|
|
|||
|
|
|||
|
Q. Why do I get "declaration syntax error" messages on DOS.H?
|
|||
|
A. You have set the "Ansi keywords only" option ON. Keep this option
|
|||
|
OFF when using any keywords specific to Turbo C .
|
|||
|
|
|||
|
|
|||
|
Q. I have a working program that dynamically allocates memory
|
|||
|
using malloc() or calloc() in small data models (tiny, small,
|
|||
|
and medium). When I compile this program in large data models
|
|||
|
(compact, large, and huge) my program hangs.
|
|||
|
A. Make sure that you have #include <alloc.h> in your program.
|
|||
|
|
|||
|
|
|||
|
Q. I am linking my own assembly language functions with Turbo C.
|
|||
|
But the linker reports that all of my functions are undefined.
|
|||
|
A. See answer above in the "Linker" section.
|
|||
|
|
|||
|
|
|||
|
Q. My far pointers "wrap around" when they are incremented over 64K.
|
|||
|
How do I reference a data object that is greater than 64K?
|
|||
|
A. Use huge pointers.
|
|||
|
|
|||
|
|
|||
|
Q. Can I declare more than 64K of global variables?
|
|||
|
A. You may have a total of up to 64K global and static data in
|
|||
|
the Tiny, Small, Medium, Compact and Large memory models. In
|
|||
|
the Huge model, the maximum is 64K per source module.
|
|||
|
|
|||
|
|
|||
|
Q. How do I declare an array that's greater than 64K?
|
|||
|
A. Arrays greater than 64K must be allocated off the heap. If,
|
|||
|
for example you wanted a two-dimensional array of characters
|
|||
|
that was 1024 by 128, the declaration you would expect to
|
|||
|
write would be:
|
|||
|
|
|||
|
char array[1024][128];
|
|||
|
|
|||
|
But since the size of this array is greater than 64K, it must
|
|||
|
be allocated off the heap. An example of this is:
|
|||
|
|
|||
|
#include <alloc.h>
|
|||
|
|
|||
|
char (huge *array)[128];
|
|||
|
:
|
|||
|
main()
|
|||
|
{
|
|||
|
:
|
|||
|
array = farcalloc(sizeof(*array), 1024);
|
|||
|
:
|
|||
|
}
|
|||
|
|
|||
|
The array can be accessed with the same code as an array not
|
|||
|
allocated off the heap. For example:
|
|||
|
|
|||
|
i = array[30][56];
|
|||
|
|
|||
|
will assign "i" the value stored at the 31st by 57th element
|
|||
|
in "array".
|
|||
|
|
|||
|
The use of the "huge" keyword is necessary in the declaration
|
|||
|
of "array" since only a huge pointer can address objects
|
|||
|
greater than 64k. For further discussion of huge pointers,
|
|||
|
refer to the User's Guide.
|
|||
|
|
|||
|
|
|||
|
Q. How do I interface Turbo C routines to a Turbo Pascal program?
|
|||
|
A. See the example programs CPASDEMO.PAS and CPASDEMO.C on disk.
|
|||
|
These files are packed in the file EXAMPLES.ARC and you will
|
|||
|
need to UNPACK them before using them.
|
|||
|
|
|||
|
|
|||
|
Q. How do I get Clipper to link with Turbo C?
|
|||
|
A. If you are having trouble, contact Nantucket Technical Support.
|
|||
|
|
|||
|
|