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),   <-------
> >         &noteOffset, 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/

Reply via email to