"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