"recordDBEntry" refers to the memory that is being written to. "*packed" is not written to. "packed" is written to but it isn't a memory chunk, of course.
Looking at my copy of "Palm OS Programming Bible" I see PackRecord() being called from LibNewRecord() in another example. The code looks like: packed = MemHandleLock(recordH); PackRecord(record, packed); so "recordDBEntry" IS being locked, but by the caller instead of in the PackRecord() function. BTW: There is an "offsetof" macro and it is even described in the "Palm OS Programming Bible". I don't know why the author didn't use it. Dennis Leas ----------- [EMAIL PROTECTED] -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Behalf Of DongDong Sent: Thursday, June 26, 2003 10:23 AM To: Palm Developer Forum Subject: Re: Question on a routine But every memory chunk should be locked before use. There is no code to lock that memory chunk. How can it be used? <[EMAIL PROTECTED]> ??? news:[EMAIL PROTECTED] ???... > > Yes, I remember staring at that code myself. It's kind of grungy. > > In: > > LibPackedDBRecord *packed=0; > > "packed" is simply a pointer (32-bits for Palm platform) so this just > initializes it to zero. Typically, you would say it as: > > LibPackedDBRecord *packed=NULL; > > but the author (I think) is intentionally using zero instead of NULL. Think > of *packed as pointing to a LibPackedDBRecord whose base address is zero. > > Then the expression: > > &packed->status > > is the offset of the "status" member from the base address of a > LibPackedDBRecord. Note that &packed->status does not reference the value > of "status" but only yields the offset of "status". DmWrite requires the > offset. > > To me it's kind of kludgy. I probably would code it differently, or at > least comment it better. > > Hope this helps... > > Dennis Leas > ----------- > [EMAIL PROTECTED] > > > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] Behalf Of > DongDong > Sent: Thursday, June 26, 2003 8:46 AM > To: Palm Developer Forum > Subject: Question on a routine > > > I'm reading the book "Palm OS Programming Bible" Chatper 10. I met some > question on the following routine. I've studied it again and again but I > don't know what missed. > > Here is the question: > (A) 'packed' is declared as pointer to LibPackedDBRecord. Why it can be used > after just initialization to zero? Also, the fields of structure can be > accessed without assignment of address of structure to it. I'm confused. > > Welcome to any advice. > > ======================== type definition in concern > > typedef struct { > LibStatusType status; > LibDBRecordFlags flags; > unsigned char lastNameOffset; > unsigned char firstNameOffset; > unsigned char yearOffset; > unsigned char noteOffset; > char firstField; > } LibPackedDBRecord; > > ======================== routine with question > > static void PackRecord( LibDBRecordType *record, MemPtr recordDBEntry ) > { > UInt32 offset; > Int16 index; > UInt16 length; > MemPtr p; > LibDBRecordFlags flags; > LibPackedDBRecord *packed=0; <------------ (A) > Char lastNameOffset=0, firstNameOffset=0, > yearOffset=0, noteOffset=0; > > flags.allBits = 0; > > DmWrite( recordDBEntry, (UInt32) &packed->status, <--------- > &record->status, sizeof( record->status )); > offset = (UInt32)&packed->firstField; > > for (index=0; index<libFieldsCount; index++) { > if (record->fields[index] != NULL ) { > p = record->fields[index]; > length = StrLen(p) + 1; > > DmWrite( recordDBEntry, offset, p, length ); > offset += length; > SetBitMacro( flags.allBits, index); > } > } > . > . <----- no 'packed' variable appears in-between > . > DmWrite( recordDBEntry, (UInt32)(&packed->lastNameOffset), <------- > &lastNameOffset, sizeof( lastNameOffset)); > DmWrite( recordDBEntry, (UInt32)(&packed->firstNameOffset), <------- > &firstNameOffset, sizeof(firstNameOffset)); > DmWrite( recordDBEntry, (UInt32)(&packed->yearOffset), <------- > &yearOffset, sizeof( yearOffset)); > DmWrite( recordDBEntry, (UInt32)(&packed->noteOffset), <------- > ¬eOffset, sizeof(noteOffset)); > } > > ======================== > > > > -- > For information on using the Palm Developer Forums, or to unsubscribe, > please see http://www.palmos.com/dev/support/forums/ > > > > -- For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/ -- For information on using the Palm Developer Forums, or to unsubscribe, please see http://www.palmos.com/dev/support/forums/