[fpc-pascal] sorting and merging array of records

michael.vancanneyt at wisa.be michael.vancanneyt at wisa.be
Tue Jan 10 10:09:12 CET 2012



On Tue, 10 Jan 2012, Tomas Hajny wrote:

> On Tue, January 10, 2012 05:14, waldo kitty wrote:
>
>
> Hi,
>
> .
> .
>> are certain enforced limits on these lines... as such, i have defined a
>> record
>>
>> type
>>    sat_name   = string[25];
>>    line_data  = string[69];
>>    two_line   = array [1..2] of line_data;
>>    three_line_data = record
>>                        satname : sat_name;
>>                        satdata : two_line;
>>                      end;
>>
>> const
>>    max_sats = 65536;
>>
>> var
>>    sat_data             : array [1..max_sats] of three_line_data;
>>    abuf                 : two_line;
>>    new_data             : three_line_data;
>>
>> right now i'm loading the array via a simple readln into the array
>> elements...
>>
>> Procedure Input_Satellite(index : word);
>>    begin
>>    if not EOF(fsat) then
>>      begin
>>      Readln(fsat,sat_data[index].satname);
>>      Readln(fsat,sat_data[index].satdata[1]);
>>      Readln(fsat,sat_data[index].satdata[2]);
>>      end; {if}
>>    end; {Procedure Input_Satellite}
>>
>> this is fine for the initial loading but i'm needing to read additional
>> TLE
>> files and insert those records into the above array... my problem is that
>> i need
>> the array sorted on a sectional value from sat_data[index].satdata[1]
>>
>>    sat_catnr    := Copy(abuf[1],3,5);
>> and
>>    new_catnr    := Copy(abuf[1],3,5);
>>
>> which are loaded and compared between sat_data[index].sat_data and
>> new_data.sat_data
>>
>> in the case of collisions (same catnr), i need to choose between the
>> greater of
>> a pair of values from the stored record (sat_data) and the new record
>> (new_data)
>> read from a file...
>>
>> Function Real_Value(buffer : string;
>>                start,length : integer) : double;
>>    var
>>      result : integer;
>>      answer : double;
>>    begin
>>    buffer := Copy(buffer,start,length);
>>    Convert_Blanks(buffer);
>>    if buffer = '' then
>>      buffer := '0';
>>    Val(buffer,answer,result);
>>    if result = 0 then
>>      Real_Value := answer
>>    else
>>      Real_Value := 0.0;
>>    end; {Function Real_Value}
>>
>>
>> via...
>>
>>    sat_epoch    := Real_Value(abuf[1],19,14);
>> and
>>    new_epoch    := Real_Value(abuf[1],19,14);
>>
>>
>> which are loaded and compared between sat_data[index].satdata and
>> new_data.satdata...
>>
>> my problem is that i cannot find any similar examples where an array of
>> records
>> is built, sorted and duplicates are eliminated based on specific factors
>> of the
>> two records being compared...
>>
>> uncle has been failing me for the last several hours and i'm loosing sight
>> of
>> what i'm trying to get done... i've seen references to using a
>> tstringlinst as
>> well as something apparently non-existent called a tarray... in all of the
>> stuff
>> i've seen on tstringlinst, there's nothing that i find that is close to
>> what i'm
>> (thinking i'm) looking for... and here's where i keep getting diverted
>> away from
>> the final goal due to trying to follow everything else :/
>
> I've tried something similar recently. After trying to figure out how to
> use the classes included with FPC and build something on top of them, I
> resorted to using the old TP/BP compatible object model with
> TSortedCollection (as provided in unit objects).

The classes unit also has a TCollection, which can be sorted on any field of
the collection items ?

Michael.



More information about the fpc-pascal mailing list