Solved

# Converting Turbo Pascal 7.0 structures with real to C++

Posted on 1998-11-09
Medium Priority
433 Views
I am writing a Visual C++ program which converts data which was stored in a Turbo Pascal 7.0 structure containing character data and reals and written directly to disk.  How do you convert the 6-bytes real Pascal number to a usable C++ floating point number?

Turbo pascal structure stored on disk :

memrec = record
ItWht : real
end;

Visual C++ record using CFile to read

typedef struct test
{
BYTE ItWht[6];
};
0
Question by:blevine
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 2
• 2

LVL 12

Accepted Solution

rwilson032697 earned 800 total points
ID: 1177393
Hi,

Below are some pascal declarations and code that will transform a 6 byte TP real to an 8 byte IEEE real.

Translating this into C should be pretty simple...

Cheers,

Raymond.

treal6 = record
case boolean of
true  : (value : real);
false : (exp : byte ; mant2 : byte5);
end;

real8 = record
case boolean of
true  : (byteval : byte8);
false : (mant1 : integer; mant2 : byte5; exp : byte);
end;

turbo86 = record
case boolean of
true : (tval : byte6);
false :(rval : real);
end;
turbo87 = record
case boolean of
true : (tval : byte8);
false: (rval : real);
end;

procedure conv86_87(real86 : turbo86;var real87 : turbo87);
{ convert a turbo86 real number to a turbo87 real number }
var
i,j,newexp : integer;
sign : byte;
begin
{\$IFOPT R+} {\$DEFINE Rchk2} {\$R-} {\$ENDIF}

if real86.tval[1] = 0 then newexp := 0
else
newexp := (real86.tval[1] + 894) shl 4;
sign := real86.tval[6] and 128; { extract sign bit }
real87.tval[8] := sign or (hi(newexp) and 127);
real87.tval[7] := (lo(newexp) and 240) or ((real86.tval[6] shr 3) and 15);
for i := 5 downto 2 do
real87.tval[i+1] := (real86.tval[i+1] shl 5) or (real86.tval[i] shr 3);
real87.tval[2] := (real86.tval[2] shl 5) and \$ff;
real87.tval[1] := 0;
{\$IFDEF Rchk} {\$UNDEF Rchk2} {\$R+} {\$ENDIF}
end;

{------------------------------------------------------------------------}
PROCEDURE real_to_double(the_real : system.real; VAR the_double : byte8);
VAR
turbo86_buffer    : turbo86 ABSOLUTE the_real;
turbo87_buffer    : turbo87 ABSOLUTE the_double;

BEGIN
conv86_87(turbo86_buffer, turbo87_buffer);
END;

0

Author Comment

ID: 1177394
Pardon my stupidity, but are you saying that I should use the turb86 conversion of the value real86 and the real87 number resulting from it will be an 8-byte C++ float representation?  Then I can just cast it as a float and get the number?

if real86.tval[1] = 0 then newexp := 0
else
newexp := (real86.tval[1] + 894) shl 4;
sign := real86.tval[6] and 128; { extract sign bit }
real87.tval[8] := sign or (hi(newexp) and 127);
real87.tval[7] := (lo(newexp) and 240) or ((real86.tval[6] shr 3) and 15);
for i := 5 downto 2 do
real87.tval[i+1] := (real86.tval[i+1] shl 5) or (real86.tval[i] shr 3);
real87.tval[2] := (real86.tval[2] shl 5) and \$ff;
real87.tval[1] := 0;

0

LVL 12

Expert Comment

ID: 1177395
Yes.

real87 will contain the 8 byte IEEE representation of the 6 byte TP real. Casting it to a double will do what you want.

Raymond.
0

Author Comment

ID: 1177396
Hi, I just added another question for you about the code you supplied me.......
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.
###### Suggested Courses
Course of the Month13 days, 21 hours left to enroll