"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/