TURBO C


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.


HTML Comment Box is loading comments...


Related Posts Plugin for WordPress, Blogger...