Nov 96 Top 10
Volume Number: | | 12
|
Issue Number: | | 11
|
Column Tag: | | Symantec Top Ten
|
Symantec Top Ten
By Scott Morison, Symantec Technical Support
Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.
Q: After upgrading my Mac from 64M to 136MB of RAM the Symantec Project Manager (v8.1) now barks at me with -37 error, saying, The application Symantec Project Manager cannot start up because of an unknown error. What gives?
A: This error will occur while launching the Symantec Project Manager on any Macintosh possessing more than 110MB of RAM. There are two ways to fix this:
1) Call or send e-mail to Symantec Technical Support and request the SPM -37 patch.
Phone: (541) 465-8470
E-mail: support@devtools.symantec.com
2) You can make the necessary changes to the Symantec Project Manager yourself using ResEdit:
Make a copy of the Symantec Project Manager and open it in ResEdit.
Open the STR# ID 203 in the STR# resource.
Change the 2nd string of STR# 203 to read, <Options>
Change the 3rd string of STR# 203 to read, <Prefs>
Q: How do I send and receive data from the a serial port on my Mac?
A: This code sample walks through the basics of sending and receiving character data from a serial port:
[Thanks to Mark Y. Geschelin for the original code this is based on.]
#include <console.h>
#include <Serial.h>
#include <Devices.h>
#include <stdio.h>
#include <console.h>
#include <stdlib.h>
#include <Serial.h>
#include <Devices.h>
#define SERBUFSIZ 1024 // Define the Input buffer size to use
char *inbuf;// pointer to input character buffer
short inRefNum, outRefNum;// Device driver Reference Number holders
/////////////////////////////////////////
// Initialize the Serial Port //
/////////////////////////////////////////
OSErr InitializeSerialPort()
{
OSErr err;
SerShk flags;
Ptr buf;
// Open Serial Drivers (note: Use .BIn and .BOut for Printer port)
// assign Output and Input driver reference numbers
if (err = OpenDriver(\p.AOut,&outRefNum)) return err;
if (err = OpenDriver(\p.AIn, &inRefNum)) return err;
// Initialize input and output drivers, and
// assign basic communication protocols
if (err = SerReset(outRefNum,baud57600 + data8 + stop10+noParity))
return err;
if (err = SerReset(inRefNum,baud57600 + data8 + stop10+noParity))
return err;
// Set up the serial input driver to use a buffer of size SERBUFSIZ
if(!(buf = NewPtr(SERBUFSIZ))) return MemError();
if (err = SerSetBuf(inRefNum, buf, SERBUFSIZ)) return err;
// Specify handshaking and cotrol info for the input driver
flags.fXOn = false; // XOn/Xoff Output enabled?
flags.fCTS = true;// Using Clear To Send harware handshaking?
flags.xOn = 0x11; // Character for XOn
flags.xOff = 0x13;// Character for XOff
flags.errs = false; // Abort Input requests if: Parity error
// or: Hardware overrun
// or: Franing error
flags.evts = false; // Post event on CTS or Break status change
flags.fInX = false; // XOn/Xoff Input enabled?
flags.fDTR = false; // Using Data Terminal Ready flow control
// Set driver to reflect settings
if ( err = SerHShake(outRefNum,&flags)) return err;
// Allocate input buffer; return reason on failure
if (!( inbuf = (char *) NewPtr(SERBUFSIZ))) return MemError();
return noErr; // noErr = 0
}
////////////////////////////////////////////////////////
// Send a String to the Serial Port //
////////////////////////////////////////////////////////
void SendSerial(char *outString, long strLen)
{
FSWrite(outRefNum, &strLen, outString);
}
[ Thanks to Andrew McFarland, Noah Lieberman and Levi Brown for their contributions. ]
/////////////////////////////
// Main //
/////////////////////////////
int main(void)
{
OSErr err;
long count;
char keyChar;
csetmode(C_RAW,stdin); // disable echo and line buffering for input
if (err = InitializeSerialPort()) // Check for failure to initialize port
printf(Serial initialization failed. Error = %d\n,err);
else
{
SendSerial(ATX\r,5); // Send ubiquitous Hayes reset
keyChar = getchar();// Get a character from stdin
while (keyChar != 0x1B) // Loop until escape key is pressed
{
if (keyChar > 0)// Is there a character to send?
SendSerial(&keyChar,1); // Call SendSerial to send it.
SerGetBuf(inRefNum, &count);
// Is there anything in the Input buffer
if (count)
{
FSRead(inRefNum,&count,inbuf);
// Read all chars from Input driver
// Send to console
for (long i=0; i < count; putchar(inbuf[i++]));
}
keyChar = getchar();// Get another character from stdin
}
}
// Clean up: Reset Ports, return pointer
if(outRefNum) CloseDriver(outRefNum);
if(inRefNum) CloseDriver(inRefNum);
if (inbuf) DisposPtr(inbuf);
return EXIT_SUCCESS;
}
Q: How do I load and play a sound from a snd resource in my Symantec C/C++ or Pascal application?
A: Heres an example of how to do just that, in both C and Pascal.
#include <Sound.h>
void CallSndPlay(void); // Function Prototype
void CallSndPlay()
{
Handle mySndHandle; // handle to an snd resource
SndChannelPtr mySndChan; // pointer to a sound channel
OSErr myErr;
void DoError(OSErr);// prototype for your DoError function
mySndChan = nil; // Initialize channel ptr for error checking
mySndHandle = GetResource(snd , mySndID);
// Read in snd resource from resource
if ( mySndHandle != NULL ) // Check for NULL handle
{
myErr = SndPlay (mySndChan, mySndHandle, TRUE);
if ( myErr )
DoError(myErr); // You define the function, DoError.
}
}
int main()
{
InitToolbox(); // Function you get to define.
CallSndPlay(9000);// Play snd resource ID 9000
}
And the same snippet in Pascal would look like this:
program mySound;
uses Sound;
procedure CallSndPlay (mySndID: integer);
{ Be sure to add the file sound.p to your project }
var
mySndHandle: Handle;{ handle to an snd resource }
mySndChan: SndChannelPtr;{ pointer to a sound channel }
myErr: OSErr;
begin { CallSndPlay }
mySndChan := nil; { Initialize channel ptr for error checking }
mySndHandle := GetResource(snd , mySndID);
{ Read in snd resource from resource }
if (mySndHandle <> nil) then { check for a nil handle }
begin
myErr := SndPlay(mySndChan, mySndHandle, true);
if (myErr <> noErr) then
DoError(myErr); { You define the procedure, DoError. }
end;
end; { CallSndPlay }
begin { Main }
InitToolbox; { You need to add this procedure yourself. }
CallSndPlay(9000);{ Play snd resource ID 9000 }
end. { Main }
Q: How do you view the contents of an array in the Symantec v8.1 Debugger?
A: Highlight the array in the debugger source window and hit Command-D, or just type the name of the array into the data view window.
Select Address rather than Pointer from the Data menu.
Turn down the hierarchical arrow to display array contents.
Q: How do I disable the debugging call outs that are embedded in the native Exception handling routines in Symantec C++?
A: Comment out the debugging #defines in, TCL #includes.cpp. Then re-precompile your headers.
Find the lines:
#define TCL_DEBUG// include debugging code, TCL_ASSERT, etc.
#define BR_DEBUG // if debugging BEL
#define TCL_BREAK_CATCH // enter debugger on catch_all_()
#define TCL_BREAK_FAILURE // enter debugger on Failure()
#define TCL_BREAK_ASSERT
// enter debugger on TCL_ASSERT fail (2.0.5) and comment them out:
#define TCL_DEBUG// include debugging code, TCL_ASSERT, etc.
#define BR_DEBUG // if debugging BEL
#define TCL_BREAK_CATCH // enter debugger on catch_all_()
#define TCL_BREAK_FAILURE // enter debugger on Failure()
#define TCL_BREAK_ASSERT // enter debugger on TCL_ASSERT fail (2.0.5)
Q: How do I convert projects that use MetroWerks proprietary .lib format libraries such as AEGizmos.lib, with Symantec C++.
A: We have recently built a MW .lib library format translator that allows you to simply drop a CodeWarrior v8 .lib format library into your Symantec C/C++ project allowing you to call any routines defined therein. This new translator will be available on our 8.0r6 CD coming this Fall.
If you would like to obtain this translator prior to the release of the CD, feel free to contact Symantec Technical Support:
Phone: 541/465-8470
E-mail: support@devtools.symantec.com
Q: Using Cafe, I have derived class B from class A. Since class B does not have a constructor, how do I pass the parameters to class A?
A: Whenever a class is instantiated, a default constructor (no parameters) is implicitly called if you do not create one explicitly. You need give class B a constructor which will receive the parameters and then pass them on to A via the super keyword.
class B extends A
{
public B(double aParameter)
{
super(aParameter);
}
}
Q: Using Cafe how can I make a Component that is drawn to the screen observable since I cannot derive from both Component and Observable?
A: Say you want to make the cells in a Java spreadsheet both Observable and Observers so that you can perform distributed calculations based only on the items that changed, however, the items in your table need to be text fields so that the user can input the data. You need to do the following: 1) Create a Cell class that derives from Observable and implements Observer. 2) Create a SmartTextField class that derives from TextField, and make a data member that is a Cell. Now when data is entered in your SmartTextField you can process events in the SmartTextField and set variables in the Cell data member, call its notifyObservers method, etc.
Note: you can also have a reference in the Cell to the SmartTextField that contains it so that you can set the text:
class Cell extends Observable implements Observer
{
double curValue;
double oldValue;
double delta;
SmartTextField theText;
public Cell(SmartTextField aText)
{
theText = aText;
}
public void Update(Observable o, Object arg)
{
oldValue = curValue;// We are using a model where the cell is both an
// observing and observed so if this method is being
// called then a cell that this object
// observes has changed.
curValue += ((Cell)o).delta; // calculate delta
theText.setText(+curValue);
// set the SmartTextField to the new Value
super.setChanged();
notifyObservers();
super.clearChanged();
}
}
class SmartTextField extends TextField
{
Cell theCell;
public SmartTextField(String someText, int width)
{
super(someText, width);
theCell = new Cell(this);
}
////------ handleEvent ------/////
public boolean handleEvent(Event evt)
{
// when the cell gets the focus, save its value
// so we can check if it has changed when it loses the focus
if(evt.id == evt.GOT_FOCUS)
{
((SmartTextField)evt.target).selectAll();
((SmartTextField)evt.target).theCell.oldVal =
Double.valueOf(((SmartTextField)evt.target)
.getText()).doubleValue();
return false;
}
//lost the focus check to see if the value changed and deal with it
if(evt.id == evt.LOST_FOCUS)
{
//get the value of the current cell
((SmartTextField)evt.target).theCell.curVal =
Double.valueOf(((SmartTextField)evt.target)
.getText()).doubleValue();
//calculate the delta
((SmartTextField)evt.target).theCell.delta =
((SmartTextField)evt.target).theCell.curVal -
((SmartTextField)evt.target).theCell.oldVal;
//if the delta is non zero, i.e. the value was changed
if ( ((SmartTextField)evt.target).theCell.delta != 0 )
{
((SmartTextField)evt.target).theCell.setChanged();
((SmartTextField)evt.target).theCell.notifyObservers();
return true;
}
else
return false;
}
else
return false;
}
}