home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / Dloads / OTHERUTI / TCPP30-3.ZIP / DOC.ZIP / HELPME!.DOC < prev    next >
Text File  |  1992-02-18  |  36KB  |  816 lines

  1.   
  2.               Turbo C++: ANSWERS TO COMMON QUESTIONS 
  3.   
  4.   
  5.  G e t t i n g     S t a r t e d 
  6.  ---------------------------------------------------------------------- 
  7.  Q. How do I install Turbo C++? 
  8.  A. Run the INSTALL program from DISK 1. To start the installation, change 
  9.     your current drive to the one that has the install program on it and 
  10.     type INSTALL. You will be given instructions in a box at the bottom of 
  11.     the screen for each prompt. For example, if you will be installing from 
  12.     drive A:, type: 
  13.   
  14.        A: 
  15.        INSTALL 
  16.   
  17.     At this point, the INSTALL program will appear with menu selections 
  18.     and descriptions to guide you through the installation process. 
  19.   
  20.  Q. How do I run Turbo C++? 
  21.  A. After you have installed Turbo C++, be sure to add the path to 
  22.     the 'BIN' subdirectory of your TC++ installation (e.g., C:\TC\BIN) 
  23.     to your DOS path. Now you can type "TC" at the DOS prompt and from any 
  24.     directory and you're ready to go. 
  25.   
  26.  Q. What is a configuration file? 
  27.  A. A configuration file tells Turbo C++ what options to default to 
  28.     and where to look for its library and header files. TC.EXE looks 
  29.     for a configuration file named TCCONFIG.TC, and TCC.EXE looks for 
  30.     a file named TURBOC.CFG. 
  31.   
  32.  Q. How do I create a configuration file? 
  33.  A. When you run the INSTALL program it creates a configuration 
  34.     file named TURBOC.CFG for TCC.EXE. This file is just an 
  35.     ASCII file, which you can change with any text editor. It 
  36.     contains the path information for the library and header 
  37.     files for TCC.EXE to use. The INSTALL program does not 
  38.     create a TCCONFIG.TC file for TC.EXE because it installs the 
  39.     directory information directly into TC.EXE. You can create a 
  40.     configuration file for the IDE by running TC.EXE, 
  41.     setting your options however you want to set them, and typing 
  42.     Alt-O/S. 
  43.   
  44.  C o m m o n   C + +   Q u e s t i o n s 
  45.  ---------------------------------------------------------- 
  46.   
  47.  Q. When linking C or Assembly language modules with C++ modules I get 
  48.     undefined symbol errors at link time.  It appears that none of the C 
  49.     or Assembly public symbols can be found. 
  50.  A. C++ is a strongly typed language.  In order to support the language 
  51.     to its fullest, Turbo C++ must attach information to the symbols 
  52.     generated for function names and variables.  When this is done, the 
  53.     symbol will no longer match the standard C style function name.  In 
  54.     order to link correctly, the compiler must be notified that the symbol 
  55.     is declared in an external module without type information tacked on 
  56.     to the symbol.  This is done by prototyping the function as type 
  57.     extern "C".   Here is a quick example: 
  58.        extern "C" int normal_c_func( float, int, char );  // name not altered 
  59.        void cplusplus_function( int );  // name altered 
  60.     See related comments under Linker Errors and in the Paradox Engine 
  61.     question in this section.  
  62.   
  63.  Q. Classes with static data members are getting linker errors ("undefined"). 
  64.  A. This code is built into Turbo C++ 1.0 but not in version 3.0. 
  65.     In the 1.0 compiler, static members without definitions were given a 
  66.     default value of 0.  This default definition will no longer be made in the 
  67.     compiler.  The programmer must now give an explicit definition for each 
  68.     static member.  Here is a quick example: 
  69.        class A 
  70.        { 
  71.           static int i; 
  72.        }; 
  73.     A linker error saying that A::i is not defined will result unless the 
  74.     source also contains a line such as: 
  75.        int A::i = 1; 
  76.   
  77.  Q. What potential problems can arise from typecasting a base class pointer 
  78.     into a derived class pointer so that the derived class's member functions 
  79.     can be called? 
  80.  A. Syntactically this is allowable. There is always the possibility of 
  81.     a base pointer actually pointing to a base class. If this is 
  82.     typecast to a derived type, the method being called may not exist 
  83.     in the base class. Therefore, you would be grabbing the address of 
  84.     a function that does not exist. 
  85.   
  86.  Q: What's the difference between the keywords STRUCT and CLASS? 
  87.  A: The members of a STRUCT are PUBLIC by default, while in CLASS, 
  88.     they default to PRIVATE. They are otherwise functionally equivalent. 
  89.   
  90.  Q: I have declared a derived class from a base class, but I can't access any 
  91.     of the base class members with the derived class function. 
  92.  A: Derived classes DO NOT get access to private members of a base class. 
  93.     In order to access members of a base class, the base class members must 
  94.     be declared as either public or protected. If they are public, then 
  95.     any portion of the program can access them. If they are protected, they 
  96.     are accessible by the class members, friends, and any derived classes. 
  97.   
  98.  Q: How can I use the Paradox Engine 1.0 with C++?, 
  99.  A: Because the Paradox Engine functions are all compiled as C functions, 
  100.     you will have to assure that the names of the functions do not get 
  101.     "mangled" by the C++ compiler. To do this you need to prototype the 
  102.     Engine functions as extern "C". In the pxengine.h header file insert 
  103.     the following code at the lines indicated. 
  104.   
  105.        /* inserted at line # 268 */ 
  106.        #ifdef __cplusplus 
  107.        extern "C" { 
  108.        #endif 
  109.   
  110.        /* inserted at line # 732, just before the final #endif */ 
  111.        #ifdef __cplusplus 
  112.        } 
  113.        #endif 
  114.   
  115.     Paradox Engine version 2.0 is "aware" of C++ and thus does not require 
  116.     any modifications to its header file. 
  117.   
  118.  Q: I have a class that is derived from three base classes. Can I insure that 
  119.     one base class constructor will be called before all other constructors? 
  120.  A: If you declare the base class as a virtual base class, its constructor 
  121.     will be called before any non-virtual base class constructors. Otherwise 
  122.     the constructors are called in left-to-right order on the declaration 
  123.     line for the class. 
  124.     
  125.  Q: Are the standard library I/O functions still available for use with 
  126.     the C++ iostreams library? 
  127.  A: Yes, using 
  128.   
  129.        #include <stdio.h> 
  130.   
  131.     functions such as printf() and scanf() will continue to be 
  132.     available. However, using them in conjunction with stream oriented 
  133.     functions can lead to unpredictable behaviour. 
  134.   
  135.  Q. In C++, given two variables of the same name, one local and one global, 
  136.     how do I access the global instance within the local scope? 
  137.  A. Use the scope (::) operator. 
  138.   
  139.        int x = 10; 
  140.        for(int x=0; x < ::x; x++) 
  141.        { 
  142.            cout << "Loop # " << x << "\n"; // This will loop 10 times 
  143.        } 
  144.   
  145.  Q. Will the following two functions be overloaded by the compiler, or 
  146.     will the compiler flag it as an error? Why? 
  147.         void test( int x, double y);  &  int test( int a, double b); 
  148.  A. The compiler will flag this as a redeclaration error because 
  149.     neither return types nor argument names are considered when determining 
  150.     unique signatures for overloading functions. Only number and type 
  151.     of arguments are considered. 
  152.   
  153.  Q. If I pass a character to a function which only accepts an int, 
  154.     what will the compiler do? Will it flag it as an error? 
  155.  A. No. The compiler will promote the char to an int and use the integer 
  156.     representation in the function instead of the character itself. 
  157.   
  158.  Q. I was trying to allocate an array of function pointers using the new 
  159.     operator but I keep getting declaration syntax errors using the following 
  160.     syntax:  new int(*[10])();   What's wrong? 
  161.  A. The new operator is a unary operator and binds first to the int keyword 
  162.     producing the following:  (new int) (*[10])(); 
  163.     You need to put parentheses around the expression to produce the 
  164.     expected results:  new (int (*[10]()); 
  165.   
  166.  Q. What are inline functions? What are their advantages? How are they 
  167.     declared? 
  168.  A. An inline function is a function which gets textually inserted by 
  169.     the compiler, much like macros. The advantage is that execution time 
  170.     is shortened because linker overhead is minimized. They are declared 
  171.     by using the inline keyword when the function is declared: 
  172.   
  173.        inline void func(void) { cout << "printing inline function \n"; } 
  174.   
  175.     or by including the function declaration and code body within a class: 
  176.   
  177.        class test 
  178.        { 
  179.        public: 
  180.        void func(void) { cout << "inline function within a class.\n"} 
  181.        }; 
  182.   
  183.  Q. If I don't specify either public or private sections in a class, 
  184.     what is the default? 
  185.  A. In a class, all members are private by default if neither public nor 
  186.     private sections are declared. 
  187.   
  188.  Q. What does the _seg modifier do? 
  189.  A. Using _seg causes a pointer to become a storage place for a 
  190.     segment value, rather than an offset ( or a segment/offset ). 
  191.     For instance, if "int _seg *x" contains the value 0x40, 
  192.     then when you use "*x", the value pointed to will be at 
  193.     segment 0x40, offset 0. If you add a value to the pointer, 
  194.     the value is multiplied by the size of the pointer type. That 
  195.     new value is used as an offset, and is combined with the segment 
  196.     value contained in the pointer. For instance, 
  197.   
  198.        int _seg *x; 
  199.        int value; 
  200.   
  201.        x = (int _seg *)0x40; 
  202.        value = *(x + 20); 
  203.   
  204.     value is assigned the value of the integer at 0x40:0x28 
  205.     (Remember, 20 * sizeof(int) = 40 = 0x28). 
  206.   
  207.   
  208.  Q. Can I statically allocate more than 64K of data in a single module? 
  209.  A. Yes. Far data items are now supported: 
  210.   
  211.        ... 
  212.        char far array1[60000L]; 
  213.        char far array2[60000L]; 
  214.        ... 
  215.   
  216.     For arrays larger than 64k use: 
  217.   
  218.        char huge array3[100000L]; 
  219.   
  220.  Q. What is a friend member function? 
  221.  A. Declaring a friend gives non-members of a class access to the 
  222.     non-public members of a class. 
  223.   
  224.  Q. Why do I get a "Type name expected" error on my definition of a 
  225.     friend class in my new class? 
  226.  A  You need to let the compiler know that the label you use for your 
  227.     friend class is another class. If you do not want to define your 
  228.     entire class, you can simply have "class xxx", where xxx is your 
  229.     label. 
  230.   
  231.  Q: How can I output hex values in upper case using the iostream libraries? 
  232.  A: You need to set the state of the stream using setf(). For example, 
  233.   
  234.        #include <iostream.h> 
  235.   
  236.        int main(void) 
  237.        { 
  238.           cout << hex; 
  239.           cout << "\nNot upper-case : " << 255; 
  240.           cout.setf(ios::upper-case); 
  241.           cout << "\nUppercase     : " << 255; 
  242.           return 0; 
  243.         } 
  244.   
  245.  Q. What is the "this" pointer? 
  246.  A. "this" is a local variable in the body of a non-static member function. 
  247.     It is a pointer to the object for which the function was invoked. It 
  248.     cannot be used outside of a class member function body. 
  249.   
  250.  Q. Why does a binary member function only accept a single argument? 
  251.  A. The first argument is defined implicitly. 
  252.   
  253.  Q. Looking through the class libraries there are definitions in classes 
  254.     which look like: 
  255.        class test { 
  256.            int funct( void ) const; 
  257.        }; 
  258.     What is the const keyword doing here? 
  259.  A. There is a pointer to the object for which a function is called 
  260.     known as the 'this' pointer.  By default the type of 'this' 
  261.     is  X *const ( a constant pointer).  The const keyword changes the 
  262.     type to const X *const ( a constant pointer to constant data ). 
  263.   
  264.  Q: I want to use _new_handler and set_new_handler. 
  265.  A: Turbo C++ supports _new_handler and set_new_handler. The type of 
  266.     _new_handler is as follows. 
  267.         typedef void (*vfp)(void); 
  268.         vfp _new_handler; 
  269.         vfp set_new_handler( vfp ); 
  270.   
  271.  Q: I would like to use C++ fstreams on a file opened in binary mode, 
  272.     how is this done? 
  273.  A: Use ios::binary as the open mode for the file: 
  274.         #include <fstream.h> 
  275.         ifstream binfile; 
  276.         binfile.open("myfile.bin", ios::binary); 
  277.   
  278.  Q: How can I get at the DOS file handle associated with my iostream? 
  279.  A: Using a combination of member functions fd() and rdbuf() you can 
  280.     get at the file handle. 
  281.         #include <fstream.h> 
  282.         #define fstrno(s)  (((s).rdbuf())->fd()) 
  283.         ifstream test("test.txt"); 
  284.         cout << "handle is " << fstrno(test) << '\n'; 
  285.   
  286.   
  287.   
  288.  I n t e g r a t e d    E n v i r o n m e n t 
  289.  ---------------------------------------------------------------------- 
  290.  Q: Why doesn't my mouse work well with Turbo C++? 
  291.  A: The most likely cause is that you are using an older mouse driver. You'll 
  292.     need to get a newer version.  Driver versions required for full 
  293.     compatibility include: 
  294.         Logitech driver 5.01+, Microsoft 7.04+, Genius 9.06+. 
  295.   
  296.   
  297.  Q. Why is Turbo C++ not able to find any of my #include files? 
  298.  A. The compiler searches for include files in the Turbo C++ Include 
  299.     Directories path. You can specify this path through the 
  300.     Options|Directories menu. The INSTALL program initially sets this 
  301.     path to the directory where it copied all the Turbo C++ *.h files. 
  302.   
  303.  Q. Why do I get the message: 
  304.        Linker Error: Unable to open input file 'C0x.OBJ' 
  305.  A. The linker searches for Turbo C++ start-up and library files in the 
  306.     Turbo C++ Library Directories path. You can specify this path through 
  307.     the Options|Directories menu. The INSTALL program initially sets this 
  308.     path to the directory where it copied the start-up and library files. 
  309.     Also be sure that you installed the memory model that the linker 
  310.     is looking for. The 'x' in the error message corresponds to the memory 
  311.     model, e.g. 's' for small, 'l' for large, etc. 
  312.   
  313.  Q. How do I get Turbo C++ to link in my own libraries or use multiple 
  314.     source files? 
  315.  A. Turbo C++'s Project facility is designed to allow you to work with 
  316.     multiple files. 
  317.   
  318.  Q. Why does the linker tell me that all the graphics library routines 
  319.     are undefined? 
  320.  A. The Options|Linker|Libraries|Graphics Library item must be set ON 
  321.     if you are using any Turbo C++ graphics functions and have not 
  322.     specified GRAPHICS.LIB in a project file. 
  323.   
  324.  Q. Why does Turbo C++ report "Unable to open include file 'stdarg.h'" 
  325.     when I try to #include <stdio.h>? 
  326.  A. The most probable reason is that you have exceeded the number 
  327.     of files that DOS can have open simultaneously. Add the line 
  328.   
  329.        FILES=20 
  330.   
  331.     to your DOS CONFIG.SYS file. This allows DOS to open up to 20 
  332.     files at the same time. CONFIG.SYS will only be effective after 
  333.     you have rebooted your computer. See the IBM DOS Reference 
  334.     Manual for details on the CONFIG.SYS file. 
  335.   
  336.  Q. Where is the TCINST.EXE utility I have used in previous versions 
  337.     of the compiler? 
  338.  A. The capabilities of TCINST have been incorporated into other areas 
  339.     of the product and thus TCINST is no longer necessary.  To remap 
  340.     key bindings, use the Turbo Editor Macro Compiler (TEMC).  Colors 
  341.     can be changed from within the IDE under Options | Environment | Colors. 
  342.   
  343.  Q. When I Make, Run, or Trace a program, Turbo C++ sometimes goes 
  344.     through the compile and link process even when the object files 
  345.     are up-to-date. 
  346.  A. Turbo C++'s MAKE logic works solely on a file's date and time 
  347.     stamp. If one of your source files is marked with a date 
  348.     that's sometime in the future, the object files that are 
  349.     created from it will always be older than the source file, 
  350.     and Turbo C++ will always try to rebuild the file. You can fix 
  351.     this by using TOUCH.COM to set the file to the current date 
  352.     and time. You should also make sure that your system's date 
  353.     and time are always properly set. TOUCH.COM is documented in 
  354.     the file UTIL.DOC. 
  355.   
  356.  Q. How come my old Turbo C project files don't work anymore? 
  357.  A. Project files now contain much more information about a project now, 
  358.     and hence are no longer stored in ASCII format. To create a project 
  359.     file, select PROJECT from the main menu, and follow the menus. To 
  360.     convert your old project files to the new format, use the supplied 
  361.     utility file PRJCNVT.EXE (documented in UTIL.DOC). 
  362.   
  363.  Q. How can I convert my Turbo C 2.0 project files to the new 
  364.     format? 
  365.  A. There is a conversion utility in your Turbo C++ BIN directory 
  366.     called PRJCNVT.EXE. This program will perform the conversion. 
  367.   
  368.  Q. How come my project file is automatically loaded when I start Turbo C++? 
  369.     I want to work on a different program. 
  370.  A. If there is only one project file in the current directory, Turbo C++ 
  371.     will load and use that one file. If there are no project files, or 
  372.     if there are multiple project files, Turbo C++ does not automatically 
  373.     load one. Go ahead and create a new project. To use a specific project 
  374.     file you can specify the name of that project file on the command 
  375.     line used to start Turbo C++. For example, 'tc farley.prj' would 
  376.     start up TC++ and load the 'farley' project. 
  377.   
  378.  Q. My right mouse button appears to do nothing. Can I change this so it 
  379.     will set breakpoints? 
  380.  A. Yes, under the menu for Options|Environment|Mouse there is a 
  381.     dialog box for the right mouse button. You can change it to set 
  382.     breakpoints, or to do many other things. 
  383.   
  384.  Q. How can I find out where my "null pointer assignment" is occurring? 
  385.  A. Set a watch on the following expressions: 
  386.   
  387.             *(char *)0,4m 
  388.             (char *)4 
  389.   
  390.     Step through the program. When the values change, the just-executed line 
  391.     is the one that is causing the problem. 
  392.   
  393.  Q. When I compile my program, I get the following error: 
  394.   
  395.        Error: C:\TC\INCLUDE\STDIO.H: Overlays only supported in 
  396.        medium, large, and huge memory models 
  397.   
  398.     What is happening? 
  399.  A. The Overlay Support option has been selected and does not work 
  400.     in the tiny, small, or compact memory models. You can turn this option 
  401.     off with: 
  402.       Options | Compiler | Code Generation | Overlay Support 
  403.   
  404.     
  405.  Q. When I try to load a new file after editing a file, the first 
  406.     file remains on the screen. How do I close the first file? 
  407.  A. Use Alt-F3 to close the current file. Also, use F6 to move 
  408.     from one file to the next, if there is more than one file 
  409.     open at a time. 
  410.   
  411.  Q. I'm doing a search and replace operation, and the editor prompts me for 
  412.     each replacement. I've selected "Change All", but it still does it. 
  413.  A. To disable the prompting, you must unselect the "Prompt on replace" 
  414.     option on the left side of the dialog box. 
  415.   
  416.  Q. When I try to use the any of the pseudo registers, like _AX, I 
  417.     get the error message "Undefined symbol '_AX' in function..." 
  418.     when I compile. Why? 
  419.  A. You are only allowed to use the pseudo registers in the Turbo 
  420.     C++ and ANSI modes of the compiler. You can change this setting 
  421.     in the Options | Compiler | Source menu. 
  422.   
  423.  Q. Since I don't have a mouse, can I still copy blocks of code 
  424.     from one file to another? 
  425.  A. Yes. You can mark the beginning and end of a block by moving 
  426.     to the appropriate area and pressing Ctrl-K-B (mark beginning) and 
  427.     Ctrl-K-K (mark end). You can then use the copy and paste commands 
  428.     in the Edit menu. 
  429.   
  430.  Q: How do I stop all of the files I have ever edited from constantly 
  431.     being open when I bring up Turbo C++? 
  432.  A: By default, Turbo C++ saves what is called the desktop configuration. 
  433.     This configuration is saved in a file with a .DSK extension.  By deleting 
  434.     any files of this type, then entering Options/Environment/Preferences 
  435.     and removing the check from 'auto save desktop', you will begin with a 
  436.     clean desktop each time you invoke Turbo C++. 
  437.   
  438.   
  439.  C o m m a n d  -  L i n e    C o m p i l e r 
  440.  ---------------------------------------------------------------------- 
  441.  Q. Why is Turbo C++ not able to find any of my #include files? 
  442.  A. The compiler searches for include files in the Turbo C++ Include 
  443.     Directories path. You specify this path with the -I option. The INSTALL 
  444.     program initially writes a configuration file (TURBOC.CFG) that 
  445.     sets this path to the directory where it copied all the Turbo C++ 
  446.     *.h files. 
  447.   
  448.  Q. Why do I get the message: 
  449.        Linker Error: Unable to open input file 'C0x.OBJ' 
  450.  A. The linker searches for Turbo C++ start-up and library files in the 
  451.     Turbo C++ Library Directories path. You can specify this path with 
  452.     the -L option. If you allow TCC to invoke the linker, it will search 
  453.     the directories in the configuration file (TURBOC.CFG) written by the 
  454.     INSTALL program. If you run TLINK, the configuration file is not read. 
  455.     TLINK does use the configuration file TLINK.CFG, so you can specify 
  456.     library paths in this file. 
  457.   
  458.  Q. Why does the linker tell me that all the graphics library routines are 
  459.     undefined? 
  460.  A. TCC will not search the graphics library unless you tell it to. 
  461.     You should specify the graphics library on the command line. For 
  462.     example, to compile BGIDEMO, type 
  463.   
  464.        TCC BGIDEMO.C GRAPHICS.LIB<Enter> 
  465.   
  466.  Q. I run TCC.EXE and get the error message: 
  467.        Fatal: <filename>.def (<line #>): syntax error 
  468.  A. Check your DATA statement on line number # in <filename>.def for the 
  469.     correct code (that is, DATA PRELOAD). 
  470.   
  471.   
  472.  G e n e r a l     I / O 
  473.  ---------------------------------------------------------------------- 
  474.  Q. The '\n' in cprintf() does not return the cursor to the 
  475.     beginning of the line. It only moves the cursor down one line. 
  476.  A. cprintf() interprets '\n' as a Line Feed. To force the cursor to 
  477.     the beginning of the line, manually insert a Carriage Return: 
  478.   
  479.       cprintf("\n\r"); 
  480.   
  481.  Q. How do I print to the printer from a Turbo C++ program? 
  482.  A. Turbo C++ uses a FILE pointer (stdprn) defined in the STDIO.H 
  483.     file. You do not need to open stdprn before using it: 
  484.   
  485.        #include <stdio.h> 
  486.        int main(void) 
  487.        { 
  488.            fprintf(stdprn, "Hello, printer!\n"); 
  489.        } 
  490.   
  491.     Note that if your printer is line-buffered, the output is 
  492.     flushed only after a '\n' is sent. 
  493.   
  494.  Q. I am reading and writing binary files. My program is translating 
  495.     the Carriage Return (0x0D) and Line Feed (0x0A) characters. How do 
  496.     I prevent this from happening? 
  497.  A. Files opened in text mode will translate these characters for 
  498.     DOS. To read a file in binary mode, open it in binary mode. 
  499.     For example, 
  500.   
  501.       #include <stdio.h> 
  502.       int main(void) 
  503.       { 
  504.          FILE *binary_fp; 
  505.          char buffer[100]; 
  506.   
  507.          binary_fp = fopen("MYFILE.BIN", "rb"); 
  508.   
  509.          fread(buffer, sizeof(char), 100, binary_fp); 
  510.   
  511.                     : 
  512.       } 
  513.   
  514.     The default file mode is text. 
  515.   
  516.  Q. Why don't printf() and puts() print text in color? 
  517.  A. Use the console I/O functions cprintf() and cputs() for color output. 
  518.   
  519.       #include <conio.h> 
  520.       int main(void) 
  521.       { 
  522.           textcolor(BLUE); 
  523.           cprintf("I'm blue."); 
  524.       } 
  525.   
  526.  Q. How do I print a long integer? 
  527.  A. Use the "%ld" format: 
  528.   
  529.       long int l = 70000L; 
  530.       printf("%ld", l); 
  531.   
  532.  Q. How do I print a long double? 
  533.  A. Use the "%Lf" format. 
  534.   
  535.       long double ldbl = 1E500; 
  536.       printf("%Lf", ldbl); 
  537.   
  538.   
  539.  E x a m p l e   P r o g r a m s 
  540.  ---------------------------------------------------------------------- 
  541.  Q. How do I compile the BGIDEMO program? 
  542.  A. 1. Make sure that the following Turbo C++ files are in your 
  543.        current directory: 
  544.   
  545.          BGIDEMO.C 
  546.          *.BGI 
  547.          *.CHR 
  548.   
  549.     2. Run Turbo C++. 
  550.   
  551.     3. Load BGIDEMO.C into the Editor by pressing F3, then typing 
  552.        BGIDEMO<Enter> 
  553.   
  554.     3. Go to the Run menu and choose the Run item. 
  555.   
  556.  Q. How do I create a COM file? 
  557.  A. DOS versions 3.2 and earlier include an EXE2BIN utility that 
  558.     converts EXE files to COM files. Users who do not have EXE2BIN can 
  559.     use TLINK, the Turbo C++ command-line linker, to create a COM file 
  560.     instead of an EXE file. Use the /t option. For example: 
  561.   
  562.        TCC -mt -lt tiny 
  563.   
  564.     will create TINY.COM instead of TINY.EXE. The -l switch passes 
  565.     the /t argument to the linker in this case. 
  566.   
  567.     There are certain limitations in converting an EXE file to a COM 
  568.     file. These limitations are documented in the IBM Disk Operating 
  569.     System manual under EXE2BIN. 
  570.   
  571.     Turbo C++'s TINY model is compatible with the COM format, but programs 
  572.     that use Turbo C++'s floating-point routines cannot be used in a 
  573.     TINY model application. 
  574.   
  575.   
  576.  G r a p h i c s 
  577.  ---------------------------------------------------------------------- 
  578.  Q. Why do I get the error message: 
  579.   
  580.        BGI Error: graphics not initialized (use 'initgraph') 
  581.   
  582.     when I use a graphics function? My program has already 
  583.     called initgraph(). 
  584.  A. For some reason initgraph() failed. To find out why, check 
  585.     the return value of graphresult(). For example: 
  586.   
  587.       #include <graphics.h> 
  588.       int main(void) 
  589.       { 
  590.         int gerr;   /* graphics error */ 
  591.         int gdriver = DETECT, gmode; 
  592.   
  593.         /* Initialize graphics using auto-detection and look 
  594.            for the .BGI and .CHR files in the C:\TC\BGI directory. 
  595.         */ 
  596.         initgraph(&gdriver, &gmode, "C:\\TC\\BGI"); 
  597.   
  598.         if ((gerr = graphresult()) != grOk) 
  599.         { 
  600.             printf("Error : %s\n", grapherrormsg(gerr)); 
  601.             exit(1); 
  602.         } 
  603.                : 
  604.       } 
  605.   
  606.   
  607.  M a t h  /  F l o a t i n g    P o i n t 
  608.  ---------------------------------------------------------------------- 
  609.  Q. Why do I get incorrect results from all the math library 
  610.     functions like cos(), tan() and atof()? 
  611.  A. You must #include <math.h> before you call any of the standard 
  612.     Turbo C++ math functions. In general, Turbo C++ assumes that a function 
  613.     that is not declared returns an int. In the case of math functions, 
  614.     they usually return a double. For example 
  615.   
  616.         /* WRONG */                       /* RIGHT */ 
  617.                                           #include <math.h> 
  618.         int main(void)                    int main(void) 
  619.         {                                 { 
  620.           printf("%f", cos(0));             printf("%f", cos(0)); 
  621.         }                                 } 
  622.   
  623.  Q. How do I "trap" a floating-point error? 
  624.  A. See the signal() and matherr() functions in the online help. The 
  625.     signal() function may be used to trap errors in the 80x87 or the 
  626.     80x87 emulator. The matherr() function traps errors in the Math 
  627.     Library functions. 
  628.   
  629.   
  630.  L i n k e r    E r r o r s 
  631.  ---------------------------------------------------------------------- 
  632.  Q. I am linking C functions with C++ functions.  The linker reports that 
  633.     all of my C functions are undefined.  Why? 
  634.  A. Linking C++ modules with C modules requires the use of a linkage 
  635.     specification.  Prototypes for C functions within C++ modules must 
  636.     be in one of the following forms: 
  637.   
  638.         extern "C" declaration 
  639.         extern "C" { declarations } 
  640.   
  641.     For example, if a C module contains functions 
  642.     "char *SCopy(char*, char*);" and "void ClearScreen(void)", they 
  643.     must be declared in a C++ module in one of the following ways: 
  644.   
  645.         extern "C" char *SCopy(char*, char*); 
  646.         extern "C" void ClearScreen(void); 
  647.   
  648.     or 
  649.   
  650.         extern "C" { 
  651.             char *SCopy(char*, char*) 
  652.             void ClearScreen(void); 
  653.         } 
  654.   
  655.     For further examples, see the standard header files.  For additional 
  656.     comment, see Common C++ Questions. 
  657.   
  658.  Q. Why do I get the message: 
  659.       Linker Error: Unable to open input file 'C0x.OBJ' 
  660.  A. See the "Integrated Environment" section above. 
  661.   
  662.  Q. Why do I get the message: 
  663.       Linker Error: Undefined symbol '_main' in module C0 
  664.  A. Every C program must contain a function called main(). This 
  665.     is the first function executed in your program. The function 
  666.     name must be all in lower case. If your program does not 
  667.     have one, create one. If you are using multiple source files, 
  668.     the file that contains the function main() must be one of 
  669.     the files listed in the Project. 
  670.   
  671.     Note that an underscore character '_' is prepended to all 
  672.     external Turbo C++ symbols. 
  673.   
  674.  Q. Why does the linker tell me that all the graphics library 
  675.     routines are undefined? 
  676.  A. See the "Integrated Environment" and "Command-line Compiler" 
  677.     sections above. 
  678.   
  679.  Q. What is a 'Fixup overflow'? 
  680.  A. See the listing of TLINK error messages in the Turbo C++ 
  681.     User's Guide. 
  682.   
  683.  Q. I am linking my own assembly language functions with Turbo C++. 
  684.     The linker reports that all of my functions are undefined. 
  685.  A. Make sure that you have put an underbar character '_' in front of all 
  686.     assembly language function names to be called by Turbo C++. Your 
  687.     assembly language program should be assembled with Case Sensitivity. 
  688.     If compiling as C++ (rather than C), see the "Common C++ Questions" 
  689.     section above which discusses the use of extern "C". 
  690.   
  691.  Q: I am getting an error out of the linker "segment group exceeds 64K : 
  692.     _text". 
  693.  A: If you are using the BGIOBJ utility, the default segment into which 
  694.     the objects will be place is _text.  You should try using BGIOBJ with 
  695.     the /f option to place the resultant objects into a separate segment. 
  696.     You will then need to use the functions registerfarbgidriver and 
  697.     registerfarbgifont to register the objects for the graphics system. 
  698.     See UTIL.DOC for instructions on using these functions. 
  699.   
  700.  Q: I am attempting to link Turbo C 2.0 objects into my Turbo C++ programs, 
  701.     but continually get unresolved external symbols at link time. 
  702.  A: The names of many of the "helper" functions have changed from what they 
  703.     were in Turbo C 2.0. If you are getting undefined symbols like _LXLSH and 
  704.     _FMUL, this is the problem you are running into.  Your best solution is to 
  705.     get the source code to the old object modules and recompile with Turbo C++. 
  706.     The only other possibility would be to extract the helper function objects 
  707.     from the Turbo C 2.0 libraries and link them into the Turbo C++ program. 
  708.   
  709.  Q. I'm porting an application that uses communal variables to C++. 
  710.     I've set up the compiler to recognize them, but I still get linker 
  711.     errors: 
  712.   
  713.       Error: <name> defined in module <a> is duplicated in module <b> 
  714.   
  715.  A. C++ doesn't support explicit COMDEFs; you must use static 
  716.     variables or switch to C. 
  717.   
  718.  O t h e r    Q u e s t i o n s 
  719.  ---------------------------------------------------------------------- 
  720.  Q. I get a "floating point formats not linked" message when I run 
  721.     my program. What can I do about it? 
  722.   
  723.  A. Floating point formats (for scanf() and related functions) are 
  724.     not always linked, for savings in executable size. To force their 
  725.     inclusion, put the following somewhere in your source files: 
  726.   
  727.       extern unsigned _floatconvert; 
  728.       #pragma extref _floatconvert 
  729.   
  730.  Q. How do I change the stack size? 
  731.  A. The size of the stack of a Turbo C++ program is determined at 
  732.     run time by the global variable _stklen. To change the size 
  733.     to, for example, 10,000 bytes, include the following line in 
  734.     your program: 
  735.   
  736.       extern unsigned _stklen = 10000; 
  737.   
  738.     This statement must not be inside any function definition. 
  739.     The default stack size is 4,096 bytes (4K). 
  740.   
  741.  Q. I'm getting a 'Stack Overflow!' message when I run my program. 
  742.     How can I work around this? 
  743.  A. You may increase the stack size by following the procedure above. Stack 
  744.     overflows are usually caused by a large amount of local data or 
  745.     recursive functions. You can decrease the amount of stack space 
  746.     used by declaring your local variables static: 
  747.   
  748.          int main(void)                int main(void) 
  749.          {                             { 
  750.              char x[5000];     -->          static char x[5000]; 
  751.                  :                                : 
  752.          }                             } 
  753.   
  754.     Of course, you should be aware that there are other effects 
  755.     that the "static" keyword has, as applied here. 
  756.   
  757.  Q. My program comes up with the message 'Null pointer assignment' 
  758.     after it terminates. What does this mean? 
  759.  A. Before a small-data model Turbo C++ program returns to DOS, it will 
  760.     check to see if the beginning of its data segment has been corrupted. 
  761.     This message is to warn you that you have used uninitialized pointers 
  762.     or that your program has corrupted memory in some other way. 
  763.   
  764.  Q. Why are .EXE files generated by TC.EXE larger than those generated by 
  765.     TCC.EXE? 
  766.  A. In the default configuration, TC.EXE includes debugging information in 
  767.     the .EXE files that it creates, and TCC.EXE does not. If you don't want 
  768.     to produce this debugging information, you can shut it off in the 
  769.     Integrated Development Environment by selecting Alt-O|B|N. 
  770.   
  771.  Q. Why do I get "declaration syntax error" messages on dos.h? 
  772.  A. You have set the "ANSI keywords only" option ON. Keep this option OFF 
  773.     when using any keywords specific to Turbo C++. 
  774.   
  775.  Q. I have a working program that dynamically allocates memory 
  776.     using malloc() or calloc() in small data models (tiny, small, 
  777.     and medium). When I compile this program in large data models 
  778.     (compact, large, and huge), my program hangs. 
  779.  A. Make sure that you have #include <alloc.h> in your program. 
  780.   
  781.  Q. I am linking my own assembly language functions with Turbo C++. 
  782.     But the linker reports that all of my functions are undefined. 
  783.  A. See answer above in the "Linker" section. 
  784.   
  785.  Q. My far pointers "wrap around" when they are incremented over 64K. 
  786.     How do I reference a data object that is greater than 64K? 
  787.  A. Use huge pointers. 
  788.   
  789.  Q. How do I interface Turbo C++ routines to a Turbo Pascal program? 
  790.  A. See the example programs CPASDEMO.PAS and CPASDEMO.C. 
  791.   
  792.  Q. How do I get Clipper to link with Turbo C++? 
  793.  A. If you are having trouble, contact Nantucket Technical Support. 
  794.   
  795.  Q. I'm trying to build an app based on one of Borland's libraries 
  796.     (Turbo Vision, the container classes in the CLASSLIB directory, 
  797.     or the Runtime Library),  and I get linker errors, or it won't 
  798.     run right. What's going wrong? 
  799.   
  800.  A. You may be using a switch that affects linkage in your files, 
  801.     that was not used when the library itself was compiled, or you 
  802.     need to change the library in question. Here are some examples: 
  803.   
  804.     - If you use far vtables (-Vf or Options|Compiler|C++|Far 
  805.       virtual tables) to compile a file you developed which 
  806.       includes iostream.h, it won't build correctly until you 
  807.       rebuild the iostream library with the same option. 
  808.   
  809.     - If you use word alignment (-a or Options|Compiler|Code 
  810.       Generation|Word alignment) in building a Turbo Vision 
  811.       application, you must build the Turbo Vision library from 
  812.       source with the same option. 
  813.  
  814.  
  815.  
  816.