Feb 95 Top 10
Volume Number: 11
Issue Number: 2
Column Tag: Think Top 10
Think Top 10 
This monthly column, written by Symantec’s 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 orsource 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.
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.
Here’s 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."<
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."<
delete [] myStr; // deallocate memory
}
Q. Where can I get the Quickdraw GX headers?
A. APDA has a Quickdraw GX Developer’s 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 I’m converting from DOS and would like to be able to draw
some simple graphics to the console window. How can I do that?
A. Don’t do it. If you draw to the console window, you will not receive update events.
However, if you just can’t help yourself from going down this path, here is how to do
it.
WindowPtr myWindow; // To be used for the console window.
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. Symantec’s 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.