Wel...

    Try be more specific... What exacly is your problem ? Where the
compiler gives you an error message? Did the compiler give you a
Warning message about pointers? What i would suggest you is to take
some C tutorials and to know how to use the Debugger, view the memory
and know the difference between pointers and variables (the memory
viewer from pods helps on this). Know what you do when you pass & and
* in front of a variable.

     By the name of the variables, i would tell that you speak
portuguese... So here is a link for a good C tutorial(in portuguese):
http://www.mtm.ufsc.br/~azeredo/cursoC/c.html

Cheers

Marcelo van Kampen
Unesp, Bauru, Brazil


On 5/3/05, Andre Augusto <[EMAIL PROTECTED]> wrote:
> Ok! Let's see if I can explain myself. I put some Pascal code to C, but
> I have some problems when using an offset value, because i don't know
> very well how to use pointers....
> 
> ===>In pascal I have a struct like this:
> type
>   TEmptyRecord = record
>     Rating : UInt16; // is beeing use to draw a bitmap, but i don't need
> it...
>     Name   : PChar;
>     Notes  : PChar;
>   end;
> 
> In C I put like this (note that there are more attributes...but this is
> not important right now...)
> typedef struct DBRecord
> {
>     char NumPat[10];
>     char Unidade[36];
>     char Responsavel[20];
>     char Data[10];
> } DBRecord;
> static DBRecord        record;
> typedef DBRecord* DBRecordPtr;
> 
> ==>Now, after initialize a Table.... a use a drawback function to draw (
> :) )
> .........
> // Set the callback routines to draw the cells
>   TblSetCustomDrawProcedure(Table,NameColumn,DrawRecord);
>   TblSetCustomDrawProcedure(Table,RatingColumn,DrawRecord);
> 
> (PASCAL)
> procedure DrawRecord(Table : Pointer;Row,Column : Int16;
>                      var Bounds : RectangleType);
>   var
>     BitmapHandle : MemHandle;
>     Bitmap       : BitmapPtr;
>     RecordNumber : Integer;
>     RecordHandle : MemHandle;
>     RecordPtr    : PChar;
>     Rating       : UInt16;
>     i            : UInt16;
> begin
>   RecordNumber := TblGetRowID(Table,Row);
>   // Look at record without marking it as busy
>   RecordHandle := DmQueryRecord(BeerDb,RecordNumber);
>   RecordPtr    := MemHandleLock(RecordHandle);
> 
>   case Column of
>     NameColumn   : WinDrawTruncChars(@RecordPtr[SizeOf(UInt16)],
> <==============
>                                      StrLen(@RecordPtr[SizeOf(UInt16)]),
> <==============
>                                      Bounds.TopLeft.x,Bounds.TopLeft.y,
> <==============
>                                      TblGetColumnWidth(Table,NameColumn));
>     ........
> ............
> MemHandleUnlock(BitmapHandle);
>       DmReleaseResource(BitmapHandle);
>     end;
>   end;
> 
>   MemHandleUnlock(RecordHandle);
> end;
> 
> (in C)
> void DrawRecord(void *table, Int16 row, Int16 Column, RectangleType *bounds)
> {
>   UInt16    RecordNumber;
>   MemHandle RecordHandle;
>   DBRecordPtr  RecordPtr;
> 
>   RecordNumber = TblGetRowID((TablePtr) table, row);
> 
>   // Look at record without marking it as busy
>   RecordHandle = DmQueryRecord(db, RecordNumber);
>   RecordPtr =  (DBRecordPtr) MemHandleLock(RecordHandle);
> 
>   switch (Column)
>   {
>     case 0: //NumPatColumn
>         WinDrawTruncChars( RecordPtr->NumPat, StrLen(
> RecordPtr->NumPat),bounds->topLeft.x,bounds->topLeft.y,TblGetColumnWidth((TablePtr)table,
> NumPatColumn)); <========================
> 
>         // RecordPtr->NumPat
>     break;
> 
> case 1:
> ......................
> ......................
>    }
> 
>   MemHandleUnlock(RecordHandle);
> }
> 
> ====>Now there is a function that uses Memset, I think that this
> function is ok, as when it is called, I can see that a new record
> appears, but without any information, as it is written with another
> function....
> (PASCAL)
> procedure AddRecord;
>   var
>     RecordIndex : UInt16;
>     EmptyRecord : TEmptyRecord;
>     RecordPtr   : Pointer;
> begin
>   // Normally would want to sort the database somehow, and allow deleted and
>   // archived records, in which case this technique is dangerous
>   RecordIndex   := dmMaxRecordIndex;
>   CurrRecHandle := DmNewRecord(BeerDb,RecordIndex,SizeOf(EmptyRecord));
> 
>   if CurrRecHandle = nil then begin
>     FrmCustomAlert(ErrorAlert,'Can''t create a new record','','');
>     Exit;
>   end;
> 
>   // Initialize the new record
>   RecordPtr := MemHandleLock(CurrRecHandle);
>   // Set contents of empty record to all zeroes
>   MemSet(@EmptyRecord,SizeOf(EmptyRecord),0);
>   // Write empty record to start of record - cannot have zero length records
>   DmWrite(RecordPtr,0,@EmptyRecord,SizeOf(EmptyRecord));
>   MemHandleUnlock(CurrRecHandle);
> 
>   // Using temporary variable in case of failure to create a record
>   CurrRecNumber := RecordIndex;
> 
>   // Load the editing form
>   FrmGotoForm(BeerTasterEditForm);
> end;
> 
> (In C)
> void AddRecord()
> {
>   UInt16 RecordIndex;
>   DBRecord EmptyRecord; //????????????
>   DBRecordPtr  RecordPtr;
> 
>   // Normally would want to sort the database somehow, and allow deleted and
>   // archived records, in which case this technique is dangerous
>   RecordIndex = dmMaxRecordIndex;
>   CurrRecHandle = DmNewRecord(db, &RecordIndex, sizeof(DBRecord));
>   if (CurrRecHandle == NULL)
>   {
>     FrmCustomAlert(ErrorAlert, "Can't create a new record", "", "");
>     return;
>   }
>   // Initialize the new record
>   RecordPtr = (DBRecordPtr) MemHandleLock(CurrRecHandle);
>    // Set contents of empty record to all zeroes
>   MemSet(&EmptyRecord, sizeof(DBRecord), 0);
>   // Write empty record to start of record - cannot have zero length records
>   DmWrite(RecordPtr, 0, &EmptyRecord, sizeof(DBRecord));
>   MemHandleUnlock(CurrRecHandle);
>   // Using temporary variable in case of failure to create a record
>   CurrRecNumber = RecordIndex;
>   // Load the editing form
>   FrmGotoForm(InfoRecordForm);
> }
> 
> ====> Now, i use a function to insert values in the record. The problem
> is when I use offset values...
> (PASCAL)
> procedure SaveRecord;
>   var
>     NameFieldPtr  : FieldPtr;
>     NotesFieldPtr : FieldPtr;
>     Offset        : UInt16;
> begin
>   // Find field objects
>   NameFieldPtr  := GetObjectPtr(BeerTasterEditNameField);
>   NotesFieldPtr := GetObjectPtr(BeerTasterEditNotesField);
> 
>   // Resize record to hold new data
>   CurrRecHandle := DmResizeRecord(BeerDb,CurrRecNumber,
>                                   SizeOf(Uint16) +
>                                   GetFieldLength(NameFieldPtr) +
>                                   GetFieldLength(NotesFieldPtr));
> 
>   // Write data to record
>   Offset := 0;
>   SaveGroupSelection(RatingGroup,Offset);
>   SaveFieldValue(NameFieldPtr,Offset);
>   SaveFieldValue(NotesFieldPtr,Offset);
> 
>   // Not setting dirty bit as not worrying about HotSyncs
>   DmReleaseRecord(BeerDb,CurrRecNumber,False);
>   CurrRecHandle := nil;
> end;
> 
> (In C)
> void SaveRecord()
> {
>     FieldPtr NameFieldPtr;
>     FieldPtr UnidadeFieldPtr;
>     FieldPtr ResposavelFieldPtr;
>     FieldPtr DataFieldPtr;
> 
>     UInt16 Offset;
> 
>    // Find field objects
>   NameFieldPtr = GetObjectPtr <FieldType>(Field_NumPAT);
>   UnidadeFieldPtr = GetObjectPtr <FieldType>(Field_Unidade);
>   ResposavelFieldPtr = GetObjectPtr <FieldType>(Field_Responsavel);
>   DataFieldPtr = GetObjectPtr <FieldType>(Field_Data);
> 
>   // Resize record to hold new data
>   CurrRecHandle = DmResizeRecord(db, CurrRecNumber,
>       sizeof(UInt16) + GetFieldLength(NameFieldPtr) +
> GetFieldLength(UnidadeFieldPtr)
>                      + GetFieldLength(ResposavelFieldPtr) +
> GetFieldLength(DataFieldPtr));
> 
>   // Write data to record
>   SaveFieldValue(NameFieldPtr, Offset); <==============
>   SaveFieldValue(UnidadeFieldPtr, Offset); <=============
>   SaveFieldValue(ResposavelFieldPtr, Offset); <============
>   SaveFieldValue(DataFieldPtr, Offset); <===============
> 
>   // Not setting dirty bit as not worrying about HotSyncs
>   DmReleaseRecord(db, CurrRecNumber, false);
>   CurrRecHandle = NULL;
> }
> 
> ===>
> (PASCAL)
> function GetFieldLength(Field : FieldPtr) : UInt16;
>   var
>     FieldTextHandle : MemHandle;
>     FieldText       : PChar;
> begin
>   Result          := 0;
>   FieldTextHandle := FldGetTextHandle(Field);
> 
>   if FieldTextHandle = nil then begin
>     Exit;
>   end;
> 
>   FieldText       := MemHandleLock(FieldTextHandle);
>   Result          := StrLen(FieldText) + 1;
>   MemHandleUnlock(FieldTextHandle);
> end;
> 
> (In C)
> UInt16 GetFieldLength(FieldPtr field)
> {
>   MemHandle FieldTextHandle;
>   FieldPtr FieldText;
>   UInt16 result=0;
> 
>   FieldTextHandle = FldGetTextHandle(field);
> 
>   if (FieldTextHandle == NULL)
>     return result;
> 
>   FieldText = (FieldPtr) MemHandleLock(FieldTextHandle);
>   result = StrLen(FieldText) + 1; <===================
> 
>   MemHandleUnlock(FieldTextHandle);
> 
>   return result;
> }
> 
> ===>
> (PASCAL)
> procedure SaveFieldValue(Field : FieldPtr;var Offset : UInt16);
>   var
>     FieldText,
>     RecordPtr  : PChar;
> begin
>   FieldText := FldGetTextPtr(Field);
> 
>   if FieldText = nil then begin
>     FieldText := '';
>   end;
> 
>   RecordPtr := MemHandleLock(CurrRecHandle);
>   DmWrite(RecordPtr,Offset,FieldText,StrLen(FieldText) + 1);
>   Offset    := Offset + StrLen(FieldText) + 1;  // Allow for null byte
>   MemHandleUnlock(CurrRecHandle);
> end;
> 
> (In C)
> void SaveFieldValue(FieldPtr field, UInt16 Offset)
> {
>   FieldPtr FieldText;
>   DBRecordPtr RecordPtr;
> 
>   FieldText = (FieldPtr) FldGetTextPtr(field);
> 
>   RecordPtr = (DBRecordPtr) MemHandleLock(CurrRecHandle);
> 
>   DmWrite(RecordPtr, Offset, FieldText, StrLen(FieldText) + 1);
> <===================
>   Offset += StrLen(FieldText) + 1;   // Allow for null byte
> <========================
> 
>   MemHandleUnlock(CurrRecHandle);
> }
> 
> ====>
> (PASCAL)
> procedure SetFieldValue(Field : FieldPtr;FieldLen : UInt16;var Offset :
> UInt16);
>   var
>     FieldTextHandle : MemHandle;
>     FieldText       : PChar;
>     RecordPtr       : PChar;
> begin
>   FieldTextHandle := FldGetTextHandle(Field);
>   // Clear any existing text first
>   FldSetTextHandle(Field,nil);
> 
>   if FieldTextHandle = nil then begin
>     FieldTextHandle := MemHandleNew(FieldLen);
>   end else begin
>     MemHandleResize(FieldTextHandle,FieldLen);
>   end;
> 
>   FieldText := MemHandleLock(FieldTextHandle);
>   RecordPtr := MemHandleLock(CurrRecHandle);
> 
>   StrCopy(FieldText,@RecordPtr[Offset]); <=========
>   Offset := Offset + StrLen(@RecordPtr[Offset]) + 1; <======
> 
>   MemHandleUnlock(CurrRecHandle);
>   MemHandleUnlock(FieldTextHandle);
> 
>   FldSetTextHandle(Field,FieldTextHandle);
> end;
> 
> (In C)
> void SetFieldValue( FieldPtr field, UInt16 fieldLen, UInt16 Offset)
> ///Problema em ler o valor Offset
> {
>   MemHandle FieldTextHandle;
>   FieldPtr  FieldText;
>   DBRecordPtr RecordPtr;
> 
>   FieldTextHandle = FldGetTextHandle(field);
>   // Clear any existing text first
>   FldSetTextHandle(field, NULL);
> 
>   if (FieldTextHandle == NULL)
>   {
>     FieldTextHandle = MemHandleNew(fieldLen);
>   }
>   else
>   {
>     MemHandleResize(FieldTextHandle, fieldLen);
>   }
> 
>   FieldText = (FieldPtr) MemHandleLock(FieldTextHandle);
>   RecordPtr = (DBRecordPtr) MemHandleLock(CurrRecHandle);
> 
>   StrCopy( FieldText, &RecordPtr[Offset]); <==============
>   Offset += StrLen(RecordPtr[Offset]) + 1; <==============
> 
>   MemHandleUnlock(CurrRecHandle);
>   MemHandleUnlock(FieldTextHandle);
>   FldSetTextHandle(field, FieldTextHandle);
> }
> 
> ====>
> (PASCAL)
> procedure LoadRecord;
>   var
>     Offset : UInt16;
> begin
>   Offset := 0;
>   SetGroupSelection(RatingGroup,OffSet); // I don't use this
> function...........
>   SetFieldValue(GetObjectPtr(BeerTasterEditNameField),40,Offset);
>   SetFieldValue(GetObjectPtr(BeerTasterEditNotesField),200,Offset);
> end;
> 
> (In C)
> void LoadRecord()
> {
>   UInt16 Offset = 0;
> 
>   SetFieldValue (GetObjectPtr<FieldType>(Field_NumPAT),  10, Offset);
>   SetFieldValue (GetObjectPtr<FieldType>(Field_Unidade), 35, Offset);
>   SetFieldValue (GetObjectPtr<FieldType>(Field_Responsavel), 19, Offset);
>   SetFieldValue (GetObjectPtr<FieldType>(Field_Data),    10, Offset);
> }
> 
> I can send all the code of my project in attachment! Only need to ask!!
> Thanks a lot to everybody!
> Andrï Augusto
> 
> --
> 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