TweetFollow Us on Twitter

Feb 91 Letters
Volume Number:7
Issue Number:2
Column Tag:Letters

Enough Bus Errors

By Kirk Chase, Editor

Mr. Bus Error

David Dunham

Seattle, WA

Aargh! I’ve had it! Enough bus errors! As a developer, I like to reduce my number of bugs, so I keep Mr. Bus Error running (more later). As a user, I like to run programs. I don’t like them generating bus errors, having to reboot without Mr. Bus Error and rerunning the program. I’ve had to do this with software from Aldus, Apple, Ashton-Tate, and Microsoft (to name just a few large companies).

With the Macintosh’s double-pointer memory handles, it’s easy to dereference a NIL handle. Consider this code:

/* 1 */

h = NewHandle(sizeof(dataStruct));
(**h).field = 0;

The problem, as should be obvious, is that NewHandle() may fail if the heap is too full or fragmented. Before we use a handle, we should test it:

/* 2 */

if (h != NIL)  /* Is it valid? */

But we may have a lot of NewHandle()s (or GetResource()s) in our program. It’s easy to miss one. What happens if we do? Both NewHandle() and GetResource() return NIL (0L) if they can’t return a valid handle. We then try to double-dereference this. *h is *(0L), the contents of location 0. We have no way of knowing what’s there (it’s usually set by Finder when an application starts, but of course the Macintosh is a multi-tasking machine, with other applications, drivers, and GetNextEvent() patches, any of which could change it on purpose or through their own bug). **h is **(0L), or whatever location 0 points to. We really have no idea what location 0 points to. So (**h).field = 0; has just trashed some unknown address. This may never hurt us (since there are so many possible addresses), which is why so many errors of this type are released. But this is just gambling that location 0 will always contain some benevolent value. I wouldn’t bet my data on that.

How can we catch dereferencing a NIL handle? We end up using the contents of location 0 as an address, so the simple solution is to put an invalid address value at location 0. Mr. Bus Error is a fine INIT that does just this (once per VBL interrupt, if my memory’s correct). The value it uses is 0xF0F0F1. If used as an address, this generates a bus error on 68020 and 68030 machines. On a 68000, it generates an odd address exception. Simple. Easy. No work on your part (other than to locate Mr. Bus Error; it’s on any developer CD-ROM from Apple and no doubt many other places). No more will you forget to test for NIL handles and make my life miserable (and your own, as you try to find those intermittent crashes -- the ones from f = (**h).field are really fun).

Peter Polash came up with a technique that’s even better, though it does involve actual work. Each time through your event loop, test what’s at location 0. If it’s not what you set it to, you know you’ve changed it. Otherwise, you set it to a value like 0xF0F0F1. This gives you exactly the same error-finding functionality as Mr. Bus Error, with the added bonus of being able to tell you if you ever set something in a purged handle ((**h).field = 0; since *h is NIL for a purged handle) or NIL pointer, and (to within one event) when you set it. You may have minor compatibility problems during testing with this technique, since you’ll probably uncover other tasks changing location 0 on you.

Please use NIL handle discipline (which brings up the point that many debuggers can help you, too). Other error schemes aren’t sufficient (one unrunnable program was written with MacApp).

A Small Error

Allen Stenger

Gardena, CA

Thank you for publishing the interesting and clearly-written article by Dennis R. Cohen on LZW compression (October 1990). MacTutor needs more short articles like this one, that illustrate a technique without trying to develop a full-blown application.

I would like to point out a small error in the code which may trouble your readers: the compression program produces incorrect results if it overwrites an existing file. The format of the output file is a 56-byte header, followed by the compressed data. When opening a new output file, the routine GetOutputFile writes a dummy block for the header, which will later be filled in with the real header data; in the meantime the compressed data will be written following the dummy header. But when opening an existing file, no dummy header is written, so the compressed data is written from the very beginning of the file and then the first part is overwritten with the header.

This may touch on a question of style. The compression and decompression programs use an “economical” approach of reusing an existing file, rather than the “brute force” approach of deleting an existing file and always starting from scratch. Which is better? Because the economical approach splits the processing into two paths, it may be more error-prone (as shown by the error that did occur, above; also note that the file creator and file type of the existing file are left unchanged, rather than being set to the values for new files). Does the economical approach have any advantages?

Revised DrawMyStuff.c

Chip Zempel

Fair Oaks, CA

Note: Source code files accompanying this letter are located on MacTech CD-ROM or source code disks.

Thanks for Mark B. Kauffman’s introduction to using the THINK C Class Library in the September ‘90 issue. It finally made me get off my butt and get my feet wet in OOP, if I can mix my metaphors a bit.

I made some changes to his code that illustrate one of OOP’s best features -- polymorphism, or the ability of a subclass to override an ancestor’s methods -- and I thought you might like to share them with your other readers who are just learning OOP.

Kauffman’s DrawMyStuff() sets up a line, an array of four rectangles, and an array of four ovals. Then he sends them various messages to set their locations and draw and erase themselves. In a “real world” drawing program, of course, you wouldn’t know beforehand what type of objects the user would want to create. Your program would probably allocate a big array of pointers to CShapes (the parent class) and then stuff in whatever specific shapes the user selected at run time.

My revised DrawMyStuff() has just one big generic array of CShapes, and sends them all generic locate, draw, and erase messages. Note that the only part of my code that “knows” whether each shape is a rectangle, line, or oval is the section that initializes each object. (The user would do this in a real program.) Everything else -- setting locations, drawing, erasing, and deleting -- is done “blind.” My version doesn’t know what object is there, and it doesn’t need to. It just says “draw yourself,” or whatever, and the object responds to the message it receives with the method implemented for its subclass.

The final result looks identical to the original when the screen is drawn. (Note however, that I drew and erased the line object in a different order, so that I could send all nine objects their Draw() message in the same “for” loop.) Here’s the code (and please keep running more THINK Class Library tutorials!):

/* 3 */

/*
 * Source  - DrawMyStuff.c
 * based on Mark B. Kauffman’s article
 * in the 9/90 MacTutor
 *
 * revised to demonstrate polymorphism
 * -- the way a subclass can override
 * its ancestor’s methods  
 */
#include “oops.h”
#include “CShape.h”

void DrawMyStuff()
{
   int  i;
 
   /* set up a big generic array */
   CShape *myShape[9];
   
   /* let’s create 4 rectangles... */
   for (i=0; i<4; i++)
   myShape[i] = new(CRectangle);
   /* ... one line...     */
   myShape[4] = new(CLine);
   /* ... and 4 ovals     */
   for (i=5; i<9; i++)
   myShape[i] = new(COval);

   /* place the rectangles  */
   myShape[0]->SetShapeLoc(200,100,300,200);
   myShape[1]->SetShapeLoc(210,110,290,190);
   myShape[2]->SetShapeLoc(220,120,280,180);
   myShape[3]->SetShapeLoc(230,130,270,170);

   /* place the line */
   myShape[4]->SetShapeLoc(100,50,300,50);

   /* place the ovals     */
   myShape[5]->SetShapeLoc(100,100,200,200);
   myShape[6]->SetShapeLoc(110,110,190,190);
   myShape[7]->SetShapeLoc(120,120,180,185);
   myShape[8]->SetShapeLoc(130,130,170,170);

   /* here’s the fun part! send each shape */
   /* a Draw() message, generically         */
   for (i=0; i<9; i++)
   myShape[i]->Draw();
   
   /* relocate the line and Erase() */
   myShape[4]->SetShapeLoc(210,110,290,110);
   myShape[4]->Erase();
   
   /* delete everything, again generically */
   for (i=0; i<9; i++)
   {
   delete(myShape[i]);
   }
}
/* end of listing - DrawMyStuff.c */

P.S. I found a terrific book on OOP -- Object Oriented Program Design, With Examples in C++ by Mark Mullin, from Addison-Wesley. The reader gets to look over his shoulder as he develops a inventory-personnel-accounting database application using object-oriented techniques. He explains why he makes the choices he makes, presents the special features of OOP languages (such as abstraction, encapsulation, and polymorphism) as they become useful, and lays out general rules (and some exceptions!) for good OOP practice. Definitely worth a look!

HyperDA II and HyperEngine 2.0

Symmetry Software

SCOTTSDALE, AZ

HyperDA II , Symmetry Software’s HyperCard stack access desk accessory, begins shipping in December. HyperDA II will support major HyperCard™ 2.0 features such as stylized text, multiple, scrollable, resizable windows, “Hot Text”, visual effects and sound. Support for selection tools that allow users to copy graphics and text to the clipboard are built in also. HyperDA II will support either HyperCard 1.x or 2.0 file formats, and you can even have both running in seperate windows on the desktop at the same time.

Using HyperDA II, the enduser gains immediate access to stacks via the Apple DA menu, while bypassing the large memory requirements of MultiFinder and HyperCard. Users enjoy the same browse, edit and print tools found in HyperCard.

Registered users of HyperDA version 1.x can obtain an update for $29 (includes s/h) by calling Symmetry’s Customer Service department. The upgrade is FREE (with proof of purchase plus $5 shipping), if HDA 1.x was purchased on or after November 10, 1990. HyperDA II’s manufacturer’s suggested retail is $129.

Supporting the enhanced HyperCard™ 2.0 command set, HyperEngine 2.0, Symmetry Software’s stack access development tool, is due for release Q1’91. HyperEngine will support major features such as stylized text, multiple, scrollable, resizable windows, “Hot Text”, visual effects and sound. Support for selection tools that allow users to copy graphics and text to the clipboard are built in also. The technology is based on Symmetry’s HyperDA II Software and has been licensed to other developers since 1988.

Supporting MPW, Think C and Assembly languages, HyperEngine allows the developer to build stack access into their applications. The enduser gains immediate access to stacks while bypassing the large memory requirements of MultiFinder and HyperCard.

A HyperEngine developer’s tool kit is sold by Symmetry that provides developers with the resources to add stack access in their own applications. Help, tutorial or reference stacks can be designed with the HyperCard environment, saving developers the need to use valuable programming resources. You can obtain the developer kit for $125 USD, plus shipping and handling direct from Symmetry Software.

Symmetry Software Corporation can be reached at 8603 East Royal Palm Road, Ste 110, Scottsdale, Arizona, 85258. 602-998-9106.

TextWare Technology Now Available

TextWare Corporation

P.O. Box 3267

Park City, UT 84060

(801) 645-9600

(801) 645-9610 (FAX)

TextWare Corporation has now released its technology for the Macintosh. TextWare brings full text indexing and retrieval capabilities to the Macintosh. It is fully compatible with TextWare for PC and LAN platforms for those working in a mixed environment. TextWare is ideal for indexing large volumes of information such as those found on servers or CD-ROMs. The TextWare Toolkit is available to developers for those wishing to add TextWare capability to their products. Contact TextWare for more information.

 
AAPL
$471.35
Apple Inc.
+3.99
MSFT
$32.41
Microsoft Corpora
-0.47
GOOG
$877.86
Google Inc.
-7.65

MacTech Search:
Community Search:

Software Updates via MacUpdate

VueScan 9.2.23 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Acorn 4.1 - Bitmap image editor. (Demo)
Acorn is a new image editor built with one goal in mind - simplicity. Fast, easy, and fluid, Acorn provides the options you'll need without any overhead. Acorn feels right, and won't drain your bank... Read more
Mellel 3.2.3 - Powerful word processor w...
Mellel is the leading word processor for OS X, and has been widely considered the industry standard since its inception. Mellel focuses on writers and scholars for technical writing and multilingual... Read more
Iridient Developer 2.2 - Powerful image...
Iridient Developer (was RAW Developer) is a powerful image conversion application designed specifically for OS X. Iridient Developer gives advanced photographers total control over every aspect of... Read more
Delicious Library 3.1.2 - Import, browse...
Delicious Library allows you to import, browse, and share all your books, movies, music, and video games with Delicious Library. Run your very own library from your home or office using our... Read more
Epson Printer Drivers for OS X 2.15 - Fo...
Epson Printer Drivers includes the latest printing and scanning software for OS X 10.6, 10.7, and 10.8. Click here for a list of supported Epson printers and scanners.OS X 10.6 or laterDownload Now Read more
Freeway Pro 6.1.0 - Drag-and-drop Web de...
Freeway Pro lets you build websites with speed and precision... without writing a line of code! With it's user-oriented drag-and-drop interface, Freeway Pro helps you piece together the website of... Read more
Transmission 2.82 - Popular BitTorrent c...
Transmission is a fast, easy and free multi-platform BitTorrent client. Transmission sets initial preferences so things "Just Work", while advanced features like watch directories, bad peer blocking... Read more
Google Earth Web Plug-in 7.1.1.1888 - Em...
Google Earth Plug-in and its JavaScript API let you embed Google Earth, a true 3D digital globe, into your Web pages. Using the API you can draw markers and lines, drape images over the terrain, add... Read more
Google Earth 7.1.1.1888 - View and contr...
Google Earth gives you a wealth of imagery and geographic information. Explore destinations like Maui and Paris, or browse content from Wikipedia, National Geographic, and more. Google Earth... Read more

Premier League Kicks Off This Week; Watc...
Premier League Kicks Off This Week; Watch Every Single Match Live Via NBC Sports Live Extra and Your iPhone or iPad Posted by Jeff Scott on August 13th, 2013 [ permalink ] | Read more »
Meet Daniel Singer, the Thirteen-Year-Ol...
Ever had the idea for an app, but felt like the lack of programming and design ability was a bit of a non-starter? Well, 13-year-old Daniel Singer has made an app. He’s the designer of Backdoor, a chat app that lets users chat with their friends... | Read more »
Flashout 2 Gets Revealed, Offers Up An E...
Flashout 2 Gets Revealed, Offers Up An Enhanced Career Mode and Exciting New Circuits Posted by Andrew Stevens on August 13th, 2013 [ permalink ] | Read more »
Mickey Mouse Clubhouse Paint and Play HD...
Mickey Mouse Clubhouse Paint and Play HD Review By Amy Solomon on August 13th, 2013 Our Rating: :: 3-D FUNiPad Only App - Designed for the iPad Color in areas of the Mickey Mouse Clubhouse with a variety of art supplies for fun 3-... | Read more »
Strategy & Tactics: World War II Upd...
Strategy & Tactics: World War II Update Adds Two New Scenarios Posted by Andrew Stevens on August 12th, 2013 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Expenses Planner Review
Expenses Planner Review By Angela LaFollette on August 12th, 2013 Our Rating: :: PLAIN AND SIMPLEUniversal App - Designed for iPhone and iPad Expenses Planner keeps track of future bills through due date reminders, and it also... | Read more »
Kinesis: Strategy in Motion Brings An Ad...
Kinesis: Strategy in Motion Brings An Adaptation Of The Classic Strategic Board Game To iOS Posted by Andrew Stevens on August 12th, 2013 [ | Read more »
Z-Man Games Creates New Studio, Will Bri...
Z-Man Games Creates New Studio, Will Bring A Digital Version of Pandemic! | Read more »
Minutely Review
Minutely Review By Jennifer Allen on August 12th, 2013 Our Rating: :: CROWDSOURCING WEATHERiPhone App - Designed for the iPhone, compatible with the iPad Work together to track proper weather conditions no matter what area of the... | Read more »
10tons Discuss Publishing Fantasy Hack n...
Recently announced, Trouserheart looks like quite the quirky, DeathSpank-style fantasy action game. Notably, it’s a game that is being published by established Finnish games studio, 10tons and developed by similarly established and Finnish firm,... | Read more »

Price Scanner via MacPrices.net

Snag an 11-inch MacBook Air for as low as $74...
 The Apple Store has Apple Certified Refurbished 2012 11″ MacBook Airs available starting at $749. An Apple one-year warranty is included with each model, and shipping is free: - 11″ 1.7GHz/64GB... Read more
15″ 2.3GHz MacBook Pro (refurbished) availabl...
 The Apple Store has Apple Certified Refurbished 15″ 2.3GHz MacBook Pros available for $1449 or $350 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free. Read more
13″ 2.5GHz MacBook Pro on sale for $150 off M...
B&H Photo has the 13″ 2.5GHz MacBook Pro on sale for $1049.95 including free shipping. Their price is $150 off MSRP plus NY sales tax only. B&H will include free copies of Parallels Desktop... Read more
iPod touch (refurbished) available for up to...
The Apple Store is now offering a full line of Apple Certified Refurbished 2012 iPod touches for up to $70 off MSRP. Apple’s one-year warranty is included with each model, and shipping is free: -... Read more
27″ Apple Display (refurbished) available for...
The Apple Store has Apple Certified Refurbished 27″ Thunderbolt Displays available for $799 including free shipping. That’s $200 off the cost of new models. Read more
Apple TV (refurbished) now available for only...
The Apple Store has Apple Certified Refurbished 2012 Apple TVs now available for $75 including free shipping. That’s $24 off the cost of new models. Apple’s one-year warranty is standard. Read more
AnandTech Reviews 2013 MacBook Air (11-inch)...
AnandTech is never the first out with Apple new product reviews, but I’m always interested in reading their detailed, in-depth analyses of Macs and iDevices. AnandTech’s Vivek Gowri bought and tried... Read more
iPad, Tab, Nexus, Surface, And Kindle Fire: W...
VentureBeat’s John Koetsier says: The iPad may have lost the tablet wars to an army of Android tabs, but its still first in peoples hearts. Second place, however, belongs to a somewhat unlikely... Read more
Should You Buy An iPad mini Or An iPad 4?
Macworld UK’s David Price addresses the conundrum of which iPAd to buy? Apple iPad 4, iPad 2, iPad mini? Or hold out for the iPad mini 2 or the iPad 5? Price notes that potential Apple iPad... Read more
iDraw 2.3 A More Economical Alternative To Ad...
If you’re a working graphics pro, you can probably justify paying the stiff monthly rental fee to use Adobe’s Creative Cloud, including the paradigm-setting vector drawing app. Adobe Illustrator. If... Read more

Jobs Board

Sales Representative - *Apple* Honda - Appl...
APPLE HONDA AUTOMOTIVE CAREER FAIR! NOW HIRING AUTO SALES REPS, AUTO SERVICE BDC REPS & AUTOMOTIVE BILLER! NO EXPERIENCE NEEDED! Apple Honda is offering YOU a Read more
*Apple* Developer Support Advisor - Portugue...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more than Read more
RBB - *Apple* OS X Platform Engineer - Barc...
RBB - Apple OS X Platform Engineer Ref 63198 Country USA…protected by law. Main Function | The engineering of Apple OS X based solutions, in line with customer and Read more
RBB - Core Software Engineer - Mac Platform (...
RBB - Core Software Engineer - Mac Platform ( Apple OS X) Ref 63199 Country USA City Dallas Business Area Global Technology Contract Type Permanent Estimated publish end Read more
*Apple* Desktop Analyst - Infinity Consultin...
Job Title: Apple Desktop Analyst Location: Yonkers, NY Job Type: Contract to hire Ref No: 13-02843 Date: 2013-07-30 Find other jobs in Yonkers Desktop Analyst The Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.