The rec4 was left over from an earlier attempt.  I had thought that
MemHandleLock was only necessary to copy data from a chunk reserved for a
database record to non-database memory when the copy occurs.  That is the
reason I allocated memory space to multiple rec# variables.  I locked the
database memory space again before writing non-database memory contents to
database memory.

Thank you for your response.


----- Original Message ----- 
From: "Dean Gahlon" <[EMAIL PROTECTED]>
To: "Palm Developer Forum" <[email protected]>
Sent: Thursday, November 17, 2005 3:50 PM
Subject: Re: Database Sorting Problem


> On Thu, 17 Nov 2005, Del Ventruella wrote:
>
> > I am attempting to sort records in a database based upon the magnitude
of a number ("DegreeMatch" in structure "TransStruct").  I developed the
following sort routine because the QuickSort option wasn't working
consistently (even with a sort function).
> >
> > When I try to sort I tend to run into Null pointers if I don't check to
confirm that handle's exist with the sort routine.  If I do check for
handles, and look at the contents of the database in a list box, the entries
for which I search have no names associated in the list box, but there are
spaces for them.  I can click on the blank name spaces and get the records
with names.  My sort routine follows.
> >
> > I'd certainly appreciate any help getting this sort to work.
> >
> > Int16 SortThoseRecord(DmOpenRef dbase)
> > {
> > Int16 N= DmNumRecords(dbase);
> > int minIndex, i, j,test;
> > Err err;
> > MemHandle x;
> > MemHandle y;
> > TransStruct* rec1 = (TransStruct *) MemPtrNew(sizeof(TransStruct));
> > TransStruct* rec2 = (TransStruct *) MemPtrNew(sizeof(TransStruct));
> > TransStruct* rec3 = (TransStruct *) MemPtrNew(sizeof(TransStruct));
> > TransStruct* rec4 = (TransStruct *) MemPtrNew(sizeof(TransStruct));
>
> Why are you doing the above 4 memory allocations? Your code doesn't appear
> to use rec4 at all, and rec1 and rec2 are replaced by the MemHandleLock()
> calls below.
>
> > if (N >= 2)
> > {
> >  for (i = 0; i < N-1; i++)
> >     {
> >         minIndex = i;
> >
> > x = DmGetRecord(gTransformer, i);
> > if (x)
> >         {
> > rec1 = (TransStructType *) MemHandleLock(x);
> > MemHandleUnlock(x);
>
> Why are you locking MemHandle x then immediately unlocking it? This will
> mean that, after the MemHandleUnlock() call, rec1 won't be guaranteed to
> point to anything, and referring to it will likely cause a crash.
>
> > }
> >         // Find the index of the minimum element
> >         for (j = i; j < N-1; j++)
> >         {
> >
> >         y = DmGetRecord(gTransformer, j);
> >         if (y)
> >         {
> > rec2 = (TransStructType *) MemHandleLock(y);
> > MemHandleUnlock(y);
>
> See above comments about locking a MemHandle and immediately unlocking it.
>
> > }
> >
> >             if (rec2->DegreeMatch < rec1->DegreeMatch)
> This statement is likely to crash, as both pointers are pointing to memory
> that may or may not contain data of the type you expect it to. This will
> probably crash, or cause unexpected non-crash behavior if you're lucky.
>
> >             {
> >                 minIndex = j;
> >             }
> >         }
> >
> >         // Swap if i-th element not already smallest
> >         if (minIndex > i)
> >         {
> >
> >             x = DmGetRecord(gTransformer, i);
> >             if (x)
> >         {
> > rec1 = (TransStructType *) MemHandleLock(x);
> >
> > *rec3 = *rec1;
> > err = DmWrite(rec1, 0, rec2, sizeof(rec2));
>
> Again, this is writing whatever rec2 is pointing to, which could be
> anything, into rec1, which is a record in your database. sizeof(rec2)
> probably isn't what you want to be doing here either.
>
> > MemHandleUnlock(x);
> > }
> > y = DmGetRecord(gTransformer, minIndex);
> > if (y)
> >         {
> > rec2 = (TransStructType *) MemHandleLock(y);
> >
> > err = DmWrite(rec2, 0, rec3, sizeof(rec3));
> > MemHandleUnlock(y);
> > }
> >
> >
> >
> >
> >
> > }
> > }
> >
> >     }
> >
> > }
> >
> > --
> > For information on using the PalmSource Developer Forums, or to
unsubscribe, please see http://www.palmos.com/dev/support/forums/
> >
>
> -- 
> For information on using the PalmSource Developer Forums, or to
unsubscribe, please see http://www.palmos.com/dev/support/forums/
>

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

Reply via email to