Feb 95 Top 10
Volume Number: | | 11
|
Issue Number: | | 2
|
Column Tag: | | Think Top 10
|
Think Top 10
This monthly column, written by Symantecs Technical Support Engineers, aims to provide you with technical information based on the use of Symantec products.
By Mark B. Baldwin and Steve Howard, Symantec Technical Support
Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.
Q. Why do I get bus errors when I create a CStyleText object by using the constructor with arguments?
A. In the process of upgrading the TCL, constructors with arguments were added to the classes. In this case, constructors with arguments do not create a new handle to a TERec, the macTE data member of the CStyleText object. To work around this, call the constructor with no arguments and call the IStyleTextX() method.
Q. I am having trouble using sizeof() with printf(). For example:
printf("char size is %d.", sizeof(char));
outputs "char size is 0." Why do I get the wrong result?
A. The output is wrong because the return value of the sizeof() function is a size_t (an unsigned long). Use an %ld rather than a %d as a format specifier. Thus, the correct syntax is
"printf ("The size of a char is %ld.", sizeof(char));"
Q. How can I avoid problems deleting heap objects whose references are on the stack when using exception handling? The pointer (which is on the stack) to the object becomes invalid when the stack unwinds and only the destructors for automatic objects are guaranteed to be called when an exception is thrown.
A. To handle this, declare pointers as volatile. Last month we explained why you should use the volatile type. Below is a practical example. Use volatile file pointers so that stack unwinding does not reset the value of the pointer (prohibiting the file from being closed).
funClass * volatile funClassPtr; // Syntax for volatile declaration
funClassPtr = NULL; // Pointer to NULL guarantees delete as safe.
int myInt = 1; // Watch in debugger to see
// the stack unwind.
try_ {
funClassPtr = TCL_NEW(funClass, ());//macro for new operator
myInt = 2; //put new value on stack
Failure (2, 100); // Force exception
}
catch_all_() { //catch block
delete funClassPtr; //this calls destructor.
// myInt is reset to 1, delete removes the object from the heap
}
end_try_ //end of try block
Q. How can I use exception handling without using the Think Class Library?
A. To use exception handling without the Think Class Library, include BRLib and Exceptions.cp in your project. Also, compile with the directive #define NO_TCL
The four macros used to make exception handling work correctly are:
AUTO_DESTRUCT_OBJECT
TCL_NEW
TCL_END_CONSTRUCTOR
TCL_START_DESTRUCTOR
The macro AUTO_DESTRUCT_OBJECT will guarantee that the destructor is called for an automatic object on the stack. A destructor will only work on a completely constructed object. TCL_END_CONSTRUCTOR helps the compiler to determine the complete construction of an object.
Heres an example that shows how the macros are used.
class funClass TCL_AUTO_DESTRUCT_OBJECT //macro in class header
{
public:
funClass() { // no arg constructor
cout<< "In constructor."<<endl;
char * myStr = new char[64]; // allocate memory
TCL_END_CONSTRUCTOR // End of the constructor
}
virtual ~funClass() { // virtual destructor
TCL_START_DESTRUCTOR // Beginning of the destructor
cout<< "In destructor."<<endl;
delete [] myStr; // deallocate memory
}
};
Q. Where can I get the Quickdraw GX headers?
A. APDA has a Quickdraw GX Developers Kit which contains a CD with the electronic versions of Inside Macintosh for GX, headers, required system software components, and excellent examples which are compilable under THINK C or Symantec C++. For ordering information, call (800) 282-2732. [If all you need is the header files, check out the MacTech Magazine online sites. See page 2 for details - Ed stb]
Q. When I build an application with the TCL, the application does not seem to be scriptable. How can I make it scriptable?
A. The default flags for the SIZE Resource of the application are set to not receive Background NULL Events. Make sure that the flags for your application have this bit turned on.
Q. I have a program that Im converting from DOS and would like to be able to draw some simple graphics to the console window. How can I do that?
A. Dont do it. If you draw to the console window, you will not receive update events. However, if you just cant help yourself from going down this path, here is how to do it.
#include <iostream.h>
WindowPtr myWindow; // To be used for the console window.
void main (void) {
cout << " "; //A simple way to show the console.
myWindow = FrontWindow(); //Get a pointer to the console.
SetPort(myWindow); //Set the port for drawing.
PenNormal(); //Set the pen for drawing.
LineTo(100,47); //Draw a line.
}
Q. If I am mixing C and C++ code, should I turn on the option to use Native Floating Point format?
A. Yes. Symantecs C++ compiler is using the Native Floating Point format. To make sure that your floating point calculations give you the expected results, turn on Use Native Floating Point in the options for the C compiler.
Q. Will Symantec be updating the THINK Reference Databases?
A. Yes. THINK Reference is undergoing a massive overhaul. It will be updated for the Universal Headers and the Think Class Library, and will include new databases for C++ Error Messages. As before, references will be hyperlinked for easy access to information.
Special thanks to: Craig Conner, Colen Garoutte-Carson, Rick Hartmann, Michael Hopkins, Scott Morison, Celso Barriga, Kevin Irlen, Yuen Li, and Chris Prinos.