在Pascal中遇到非法类型转换问题

时间:2016-01-03 08:02:59

标签: pascal freepascal

    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.

程序“乘法”用于计算两个数的乘积。但似乎会出现死循环并保持打印" x"当程序运行时。

也许是因为&#34; b&#34;是&#34; Real&#34;,所以行&#34; b = b / 2&#34;永远不会导致var&#34; b&#34;小于或等于0,而&#34; b <= 0&#34;是循环的退出。

所以我改变了b ti Integer的类型,希望当b是整数时b / 2可以使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"

为了解决这个问题,我将一个强制转换添加到行&#34; b = b / 2&#34;

 b := Integer(b/2);

但发生了另一个错误:

test.pas(19,12) Error: Illegal type conversion: "Extended" to "SmallInt"

我该怎么做才能解决这一系列问题。

1 个答案:

答案 0 :(得分:2)

对于第一个问题,您必须知道Real数字不准确,当您使用它们时,您始终必须使用tolerance value或数学round它们

const tolerance:Real = 0.001;
while b > tolerance do

while Round(b) > 0 do

对于演员表问题,请同时使用Round()