Thank you very much. I have more understanding now.
<[EMAIL PROTECTED]> ??? news:[EMAIL PROTECTED] ???... > > "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/