Pascal-不兼容的类型:“扩展数组”,预期为“ QWord” /错误

时间:2018-12-08 01:26:48

标签: sorting types quicksort pascal procedure

我正在尝试使用快速排序算法对100000个扩展数字数组进行排序,但是在调用该过程时,我不断收到以下错误消息:

  • source.pas(69,26)错误:参数编号不兼容的类型。 1:获得“ Array [1..100000] of Extended”,应为“ QWord”
  • source.pas(69,36)错误:参数编号不兼容的类型。 1:获得“ Array [1..100000] of Extended”,应为“ QWord”

    program test;
    
    type
    TVector = array of double;
    
    var
    N,M,i,x:longint;
    a,b,c,apod,af: Array[1..100000] of extended;
    
    procedure QuickSort(var apod: TVector; iLo, iHi: Integer) ;
    var Lo, Hi: Integer;
    pivot,t: double;
    begin
    if (iHi-iLo) <= 0 then exit;
    
    Lo := iLo;
    Hi := iHi;
    Pivot := apod[(Lo + Hi) div 2];
    
    repeat
    while A[Lo] < Pivot do Inc(Lo);
    while A[Hi] > Pivot do Dec(Hi);
    
    if Lo <= Hi then
    begin
     T := apod[Lo];
     apod[Lo] := apod[Hi];
     apod[Hi] := T;
     Inc(Lo) ;
     Dec(Hi) ;
    end;
    until Lo > Hi;
    if Hi > iLo then QuickSort(apod, iLo, Hi) ;
    if Lo < iHi then QuickSort(apod, Lo, iHi) ;
    end;
    
    begin
            {a[i],b[i],c[i],af[i],N,M are initialiazed here}      
            apod[i]:=(a[i]-((a[i]*b[i])/3000)-((c[i]*a[i])/40));
    end;
    
    begin
    QuickSort(apod, Lo(apod), Hi(apod)) ;    
    end;
    end.
    

    我该如何解决?

1 个答案:

答案 0 :(得分:2)

您的代码中有几个语法错误。我没有检查您的quicksort是否正确。您可以调试它。

数组类型

您正在混淆几件事:

  • 动态数组(例如 type array of double
  • 静态数组(例如 type array[a..b] of double),并且可能
  • 打开数组参数(参数 array of double)。

您的参数是动态数组类型(TVector),但是您传递了静态数组。这些不兼容。

要能够传递动态数组和静态数组,可以使用上述开放数组参数(请注意,它们看起来像,但与动态数组不同)。 / p>

procedure QuickSort(var apod: array of Double; iLo, iHi: Integer);

我的文章Open array parameters and array of const中提供了有关开放数组参数的更多信息。

各种(参考)参数

但是还有另一个问题: var 参数必须具有确切的类型(或基本类型)。不会进行任何转换。因此,您的 a b c apod af 参数必须包含< em>也是双打:

var
  a, b, c, apod, af: array[1..100000] of Double;

未绑定的块

然后,QuickSort函数之后的松散begin end块没有意义。那不是帕斯卡。宁可在主要代码块(最后一个begin ... end.-注意最后一个.)中执行以下操作:

begin
  for i := Low(apod) to High(apod) do
    apod[i] := (a[i] - ((a[i] * b[i]) / 3000) - ((c[i] * a[i]) / 40));
  QuickSort(apod, Low(apod), High(apod));
end.

但是请注意,上面的代码没有多大意义。由于 a b c 等尚未初始化,因此 apod 中的所有值可能均为0。 (因此a[i]等可能全为0)。

我不知道您的代码在哪里,但是您可能想尝试理解它,然后再将其翻译为Pascal。

Lo and Hi

请注意,您应该使用LowHighLoHi完全不同:它们分别获得16位字的低字节和高字节。 LowHigh获得数组,集合和类型的边界。