2014-07-16 41 views
0

如何計算數組的範圍,以便我可以將它發送到多個線程進行處理。這隻適用於較低的範圍。它不匹配數組的高值。如何計算Array的範圍?

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils; 

type 
    TRange = record 
    High: Integer; 
    Low: Integer; 
    end; 
    TRanges = Array of TRange; 

procedure Split(const Size: Integer; const Slices: Integer; var Ranges: TRanges); 
var 
    SliceSize: Integer; 
    SliceStart: Integer; 
    I: Integer; 
begin 
    SliceSize := (Size + Slices) div Slices; 
    SetLength(Ranges, Slices); 
    SliceStart := 0; 
    for I := 0 to Slices - 1 do 
    begin 
     Ranges[I].Low := SliceStart; 
     SliceStart := SliceStart + SliceSize; 
     if SliceStart > Size then 
     SliceStart := Size; 
     Ranges[I].High := SliceStart - 1; 
    end; 
end; 

var 
    A: TArray<Integer>; 
    Ranges: TRanges; 
begin 
    SetLength(A, 71); 
    Split(High(A), 7, Ranges); // split array in to seven ranges 
    // 70 is missing from Ranges.. 
    ReadLn; 
end. 

回答

5

你傳入High(A)到計數參數,但你應該通過Length(A)。 高返回的最高索引是比基於零的數組中的元素數少一個。

另外計算SliceSize是錯誤的。 它需要是這樣的:

procedure Split(const Size: Integer; const Slices: Integer; 
    var Ranges: TRanges); 
var 
    SliceSize: Integer; 
    SliceStart: Integer; 
    LeftOver: Integer; 
    I: Integer; 
begin 
    SliceSize := Size div Slices; 
    LeftOver := Size mod Slices; 
    SetLength(Ranges, Slices); 
    SliceStart := 0; 
    for I := 0 to Slices - 1 do 
    begin 
    Ranges[I].Low := SliceStart; 
    SliceStart := SliceStart + SliceSize; 
    if I < LeftOver then 
     Inc(SliceStart); 
    Ranges[I].High := SliceStart - 1; 
    end; 
end; 
+0

傳遞高(A)是正確的,因爲聲明'SliceSize:=(面積+切片)的div片;'其實'( 「真實尺寸」 +切片 - 1 )div Slices'並使用High(A)有效地給出「實際大小」-1。 – Kanitatlan