[fpc-pascal] Turbo Pascal/legacy data file issue.
Lowell C. Savage
savage at lanl.gov
Mon Sep 19 20:56:13 CEST 2005
Has anyone come up with a set of routines for converting between Turbo
Pascal's 6-byte "real" format and FPC's real number format?
I am trying to use FPC to update a legacy TP 5.5 program. I've got most of
the "major" issues solved and am now finding that I'm having trouble
reading legacy data files. Many of these data file are "file of XXXRec"
where "XXXRec" is a rather large and complex Record containing strings,
integers, bytes, enumerated types, and reals.
My problem is that I am going to need to be able to read these existing
files (without modification) into the new version of the program.
I've been able to use the "{$PACKRECORDS 1}" and "{$PACKENUMS 1}"
directives to take care of everything else. But now I realize that Turbo
Pascal used a 6-byte real representation while FPC uses either a 4 or 8-bit
representation.
It appears that I'm going to need to make some kind of a special type,
perhaps a packed record with a "byte", a "smallint" and a 4-byte
"longword". Then, I read this value from the existing file and convert it
into a "real". Then, when I want to write the file (or another file) I
convert back to this record type when I fill the record I'm going to write.
Here's a simple program to demonstrate the issue. In Turbo Pascal 5.5
(Downloaded from http://bdn.borland.com/article/0,1410,20803,00.html) this
code generates a 12-byte file. FPC generates a 16-byte file. (Actually,
the preprocessor directives shown appear to have no effect on this
code--not complaining since the docs don't make it appear that it should,
just pointing it out.)
Program testrec;
{$IFDEF FPC}
{$MODE TP}
{$PACKRECORDS 1}
{$ENDIF}
type
realrec = record
t1 : real;
t2 : real;
end;
var
realfile : file of realrec;
r : realrec;
begin
r.t1 := 1.0;
r.t2 := 2.0;
assign ( realfile, 'c:\r.rfl' );
rewrite ( realfile );
write ( realfile, r );
close ( realfile );
end.
Any ideas appreciated!
Thanks,
Lowell C. Savage
savage at lanl.gov
505-667-6964 (office/msg)
360-961-8965 (cell/msg)
505-667-4341 (shared fax)
More information about the fpc-pascal
mailing list