在 Pascal 中遇到一个非法类型转换的孩子
Meet a Illegal Type conversion prolem in Pascal
program ideone;
const m = 7;
const n = 5;
var x:Real;
var y:Real;
var z:Real;
var q:Real;
var r:Real;
procedure multiply();
var a:Real;
var b:Real;
begin a := x; b := y; z := 0;
while b > 0 do
begin
if odd(Qword(b)) then z := z + a;
writeln('x');
a := 2*a;
b := b/2;
end
end;
begin
x := m; y := n;
multiply();
writeln(z);
end.
程序“multiply”是用来计算两个的乘积的number.But当程序运行时,似乎会出现死循环并保持打印"x"。
可能是因为"b"的类型是"Real",所以"b = b/2"这行永远不会导致var"b"小于等于0,而"b <= 0" 是循环的出口。
所以我改变了b的类型ti Integer希望b/2能在b为Integer的时候使b变为0
program ideone;
const m = 7;
const n = 5;
var x:Integer;
var y:Integer;
var z:Integer;
var q:Integer;
var r:Integer;
procedure multiply();
var a:Integer;
var b:Integer;
begin a := x; b := y; z := 0;
while b > 0 do
begin
if odd(Qword(b)) then z := z + a;
writeln('x');
a := 2*a;
b := b/2;
end
end;
begin
x := m; y := n;
multiply();
writeln(z);
end.
然后又遇到一个问题:
test.pas(19,13) Error: Incompatible types: got "Extended" expected "SmallInt"
为了解决这个问题,我在行 "b = b/2"
中添加了一个转换
b := Integer(b/2);
但出现另一个错误:
test.pas(19,12) Error: Illegal type conversion: "Extended" to "SmallInt"
我应该怎么做才能解决这个系列问题。
对于第一个问题,你必须意识到 Real
数字并不精确,当你使用它们时,你总是必须使用 tolerance value
或数学上的 round
他们
const tolerance:Real = 0.001;
while b > tolerance do
或
while Round(b) > 0 do
对于转换问题,也请使用 Round()
。
program ideone;
const m = 7;
const n = 5;
var x:Real;
var y:Real;
var z:Real;
var q:Real;
var r:Real;
procedure multiply();
var a:Real;
var b:Real;
begin a := x; b := y; z := 0;
while b > 0 do
begin
if odd(Qword(b)) then z := z + a;
writeln('x');
a := 2*a;
b := b/2;
end
end;
begin
x := m; y := n;
multiply();
writeln(z);
end.
程序“multiply”是用来计算两个的乘积的number.But当程序运行时,似乎会出现死循环并保持打印"x"。
可能是因为"b"的类型是"Real",所以"b = b/2"这行永远不会导致var"b"小于等于0,而"b <= 0" 是循环的出口。
所以我改变了b的类型ti Integer希望b/2能在b为Integer的时候使b变为0
program ideone;
const m = 7;
const n = 5;
var x:Integer;
var y:Integer;
var z:Integer;
var q:Integer;
var r:Integer;
procedure multiply();
var a:Integer;
var b:Integer;
begin a := x; b := y; z := 0;
while b > 0 do
begin
if odd(Qword(b)) then z := z + a;
writeln('x');
a := 2*a;
b := b/2;
end
end;
begin
x := m; y := n;
multiply();
writeln(z);
end.
然后又遇到一个问题:
test.pas(19,13) Error: Incompatible types: got "Extended" expected "SmallInt"
为了解决这个问题,我在行 "b = b/2"
中添加了一个转换 b := Integer(b/2);
但出现另一个错误:
test.pas(19,12) Error: Illegal type conversion: "Extended" to "SmallInt"
我应该怎么做才能解决这个系列问题。
对于第一个问题,你必须意识到 Real
数字并不精确,当你使用它们时,你总是必须使用 tolerance value
或数学上的 round
他们
const tolerance:Real = 0.001;
while b > tolerance do
或
while Round(b) > 0 do
对于转换问题,也请使用 Round()
。