Hi there,

I'm baffled by some problems I'm having with the following pack & unpack 
routines. As near as I can tell from watching memory in the debugger, 
the packing works correctly, but the unpacking doesn't. Specifically, 
though the Index, Type, Weight, QuestionareID, and Question values are 
all unpacked correctly, the Minimum, Maximum, Default, and Answer values 
are all set to 0. It looks like it's only paying attention to the first 
of the two bytes that are supposed to make up each of those values.

Here's the code. Any insight is very much appreciated.

Sean

----- CODE BEGINS -----
typedef struct {
     UInt16    Index;
     UInt16    Type;
     UInt16    Weight;
     UInt32    QuestionaireID;
     const Char *Question;
     UInt16  Minimum;
     UInt16     Maximum;
     UInt16     Default;
     UInt16     Answer;

}    QuestionSlider;

typedef struct {
UInt16    Index;
UInt16    Type;
UInt16    Weight;
UInt32    QuestionaireID;
Char QuestionData[1];
}    QuestionsPacked;

static void UnpackQuestionsAsSlider(QuestionSlider *unpackedRecord, 
const QuestionsPacked *packedRecord)
{
     const char *s = packedRecord->QuestionData;
     UInt16 offset = 0;

        offset = sizeof( packedRecord->Index ) + sizeof
( packedRecord->Type ) + sizeof( packedRecord->Weight ) + sizeof
( packedRecord->QuestionaireID );
     unpackedRecord->Index = packedRecord->Index;
     unpackedRecord->Type = packedRecord->Type;
     unpackedRecord->Weight = packedRecord->Weight;
     unpackedRecord->QuestionaireID = packedRecord->QuestionaireID;

     unpackedRecord->Question = s;
     offset += StrLen( s ) + 1;
     s += StrLen( s ) + 1;

     unpackedRecord->Minimum = *s;
     offset += sizeof( unpackedRecord->Minimum );
     s += sizeof( unpackedRecord->Minimum );

     unpackedRecord->Maximum = *s;
     offset += sizeof( unpackedRecord->Maximum );
     s += sizeof( unpackedRecord->Maximum );

     unpackedRecord->Default = *s;
     offset += sizeof( unpackedRecord->Default );
     s += sizeof( unpackedRecord->Default );

     unpackedRecord->Answer = *s;
     offset += sizeof( unpackedRecord->Answer );
     s += sizeof( unpackedRecord->Answer );
}

static void PackSlider(QuestionSlider* unpackedRecord, MemHandle 
packedRecord)
{
     UInt16    length = 0;
     Char*    s;
     UInt16    offset = 0;
     const char*    srcP;
     UInt16    len = 0;

     length =         sizeof( unpackedRecord->Index ) +
         sizeof( unpackedRecord->Type ) +
         sizeof( unpackedRecord->Weight ) +
         sizeof( unpackedRecord->QuestionaireID ) +
         StrLen( unpackedRecord->Question ) + 1 +
         sizeof( unpackedRecord->Minimum ) +
         sizeof( unpackedRecord->Maximum ) +
         sizeof( unpackedRecord->Default ) +
         sizeof( unpackedRecord->Answer );



     if ( MemHandleResize( packedRecord, length ) == 0 ) {
         s = MemHandleLock( packedRecord );

         DmWrite( s, offset, &unpackedRecord->Index, sizeof
( unpackedRecord->Index ) );
         offset = offset + sizeof( unpackedRecord->Index );
         DmWrite( s, offset, &unpackedRecord->Type, sizeof
( unpackedRecord->Type ) );
         offset = offset + sizeof( unpackedRecord->Type );
         DmWrite( s, offset, &unpackedRecord->Weight, sizeof
( unpackedRecord->Weight ) );
         offset = offset + sizeof( unpackedRecord->Weight );
         DmWrite( s, offset, &unpackedRecord->QuestionaireID, sizeof
( unpackedRecord->QuestionaireID ) );
         offset = offset + sizeof( unpackedRecord->QuestionaireID );

         srcP = unpackedRecord->Question;
         len = StrLen( srcP ) + 1;
         DmWrite( s, offset, srcP, len );
         offset = offset + len;

         DmWrite( s, offset, &unpackedRecord->Minimum, sizeof
( unpackedRecord->Minimum ) );
         offset = offset + sizeof( unpackedRecord->Minimum );
         DmWrite( s, offset, &unpackedRecord->Maximum, sizeof
( unpackedRecord->Maximum ) );
         offset = offset + sizeof( unpackedRecord->Maximum );
         DmWrite( s, offset, &unpackedRecord->Default, sizeof
( unpackedRecord->Default ) );
         offset = offset + sizeof( unpackedRecord->Default );
         DmWrite( s, offset, &unpackedRecord->Answer, sizeof
( unpackedRecord->Answer ) );
         offset = offset + sizeof( unpackedRecord->Answer );


         MemHandleUnlock( packedRecord );

     }
}
----- CODE ENDS -----
------
Sean McMains ([EMAIL PROTECTED])
AIM: SeanMcTex
http://www.mcmains.net/ruminations/



-- 
For information on using the Palm Developer Forums, or to unsubscribe, please see 
http://www.palmos.com/dev/support/forums/

Reply via email to