我正在尝试使用快速排序算法对100000个扩展数字数组进行排序,但是在调用该过程时,我不断收到以下错误消息:
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.
我该如何解决?
答案 0 :(得分:2)
您的代码中有几个语法错误。我没有检查您的quicksort是否正确。您可以调试它。
您正在混淆几件事:
array of double
)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。
请注意,您应该使用Low
和High
。 Lo
和Hi
完全不同:它们分别获得16位字的低字节和高字节。 Low
和High
获得数组,集合和类型的边界。