我正试图使用快速排序算法对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参数必须具有确切的类型(或基类型(。不会进行转换。因此,您的a、b和c参数也必须包含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,因为a、b和c等尚未初始化(因此a[i]
等可能都为0(。
我不知道你从哪里得到的代码,但在你开始把它翻译成Pascal之前,你可能想试着理解一下
Lo和Hi
请注意,您应该使用Low
和High
。Lo
和Hi
完全不同:它们分别获得16位字的低字节和高字节。Low
和High
得到了数组、集合和类型的边界。