Pascal - 不兼容的类型:"Array Of Extended",预期"QWord"/错误



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

  • source.pas(69,26(错误:参数1的类型不兼容:得到"扩展的数组[1..100000]",应为"QWord">
  • source.pas(69,36(错误:参数1的类型不兼容:得到"扩展的数组[1..100000]",应为"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.
    

    我该怎么解决这个问题?

您的代码中有几个语法错误。我没有检查你的快速排序是否真的正确。你可以调试它。

数组类型

你混淆了几个不同的东西:

  • 动态阵列(例如类型array of double(
  • 静态数组(例如类型array[a..b] of double(,并且可能
  • 开放数组参数(参数array of double(

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

为了能够传递动态和静态数组,您可以使用前面提到的开放数组参数(请注意,它们看起来像,但与动态数组不同(。

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

关于开放数组参数的更多信息,请参阅我的一篇文章:开放数组参数和常量数组。

Var(参考(参数

但还有另一个问题:var参数必须具有确切的类型(或基类型(。不会进行转换。因此,您的abc参数也必须包含Double

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.

但请注意,上面的代码没有多大意义。可能apod中的所有值都将为0,因为abc等尚未初始化(因此a[i]等可能都为0(。

我不知道你从哪里得到的代码,但在你开始把它翻译成Pascal之前,你可能想试着理解一下

Lo和Hi

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

最新更新