On 1/12/2012 12:42, Tomas Hajny wrote:
On Thu, January 12, 2012 17:23, waldo kitty wrote:
[TRIM]
but the the problem still comes of how do i know if the record was
inserted into the list or not? insert doesn't seem to return a true
or false on success... i guess this is where it is required(?) to
override the insert method? does everyone have to override the
insert method if they are in duplicates := FALSE mode? how do they
handle the throwing away of the unneeded data??

There are multiple options. You can search before (as suggested by you)
and only call Insert if not finding the result, you can override the
Insert call as suggested by me,

this is what i've done and it works as per my previous message in this thread... however, i have found another problem... the program mostly works.. i mean that if a dupe catnbr with an epoch >= to the existing record is found it is thrown out but when another dupe catnbr is found it, too, is also inserted... this seems to only be happening with entries that have more than one duplicate... it doesn't make sense... i'm suspecting the compare routine to be the problem... epochs are read from the file and converted to a double by this original routine from TSKelso's SGP4-26A source code archive...

Function Real_Value(buffer : string; start,length : integer) : double;
    Takes the segment of {buffer} beginning at {start} and having length
    {length} and converts it to a double precision real number.


Function Real_Value(buffer : string; start,length : integer) : double;
var
  MyResult : integer;
  answer   : double;

begin
  buffer := Copy(buffer,start,length);
  Convert_Blanks(buffer);
  if buffer = '' then
    buffer := '0';
  Val(buffer,answer,MyResult);
  if MyResult = 0 then
    Real_Value := answer
  else
    Real_Value := 0.0;
end; {Function Real_Value}


but yet i find this in my debug output...

03597   5.04184917406000E+003   .....................   ** inserting record
[...]
03597   1.20109577665600E+004   .....................   ** inserting record


here's my compare and insert routines... i'm suspecting my use of CompareValue is in error :/


Function CompareReal(num1,num2 : double) : integer;
begin
  CompareReal := CompareValue(num1, num2);
end;


procedure TTLEColl.Insert (Item: Pointer);
var
  I: Sw_Integer;
  old: Pointer;
  foo: integer;
begin
   If NOT Search(KeyOf(Item), I) OR Duplicates Then   { Item valid }
     begin
       {$IFDEF DEBUG}
       write(PTLERec(Item)^.catnbr^);
       write('  ');
       write(PTLERec(Item)^.epoch);
       write('   ');
       write('.....................');
       writeln('   ** inserting record');
       {$ENDIF}
       AtInsert(I, Item);                             { Insert the item }
     end
   else                                               // otherwise
     begin
       {$IFDEF DEBUG}
       write(PTLERec(At(i))^.catnbr^);
       write('  ');
       write(PTLERec(At(i))^.epoch);
       write('  ');
       write(PTLERec(Item)^.epoch);
       {$ENDIF}
       // compare the epochs
       foo := CompareReal(PTLERec(At(i))^.epoch,PTLERec(Item)^.epoch);
       case foo of
         -1 : begin                       // replace existing record
                {$IFDEF DEBUG}
                writeln('   ** replacing record');
                {$ENDIF}
                old := At(i);             // save existing pointer first!
                AtPut(i, Item);           // now put in the new record
                PTLERec(old)^.Done;       // time to remove the old data
                dispose(old);             // and finally dispose it
              end;
          0 : begin                       // we're tossing this one out
                {$IFDEF DEBUG}
                writeln('   ** epochs are same');
                {$ENDIF}
                PTLERec(Item)^.Done;      // so remove the data first
                dispose(Item);            // and then dispose the item
              end;
          1 : begin                       // we're tossing this one out
                {$IFDEF DEBUG}
                writeln('   ** existing is newer');
                {$ENDIF}
                PTLERec(Item)^.Done;      // so remove the data first
                dispose(Item);            // and then dispose the item
              end;
         end; {case}
     end;
end;



[TRIM]
  .
  .
yeah, that went over like a lead balloon... i'm digging into the insert
method
override, instead... just gotta figure out how to access the epoch in the
current record and the one in the passed record for the decision making
comparison...

PROCEDURE TTLECollection.Insert (Item: Pointer);
VAR I: Sw_Integer;
BEGIN
    If NOT Search(KeyOf(Item), I) OR Duplicates Then   { Item valid }
      AtInsert(I, Item)                                { Insert the item }
    else
      if PTLERec (At (I))^.Epoch>  PTLERec (Item)^.Epoch then
        begin
          FreeItem (At (I));
          AtPut (I, Item);
        end
      else
       FreeItem (Item); (* or "Dispose (PTLERec (Item), Done)" instead *)
END;

that's pretty close to what i did (see above) :lol: i might be able to tighten mine up a bit instead of doing the .done and then a dispose... or does that matter?

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to