2014-07-16 1 views
0

Comment puis-je calculer les plages d'un tableau afin que je puisse l'envoyer à plusieurs threads pour le traitement. Cela fonctionne mais seulement pour les plages inférieures. Cela ne correspond pas à la valeur élevée du tableau.Comment calculer les plages de 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. 

Répondre

5

Vous passez High(A) au paramètre de comptage, mais vous devez passer Length(A). High renvoie l'indice le plus élevé, soit un de moins que le nombre d'éléments d'un tableau basé sur zéro.

Le calcul de SliceSize est également erroné. Il doit être comme ceci:

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

Passage élevé (A) est correcte car l'instruction 'SliceSize: = (Taille + tranches) div tranches,' est en fait '("taille réelle" + tranches - 1) div Slices' et en utilisant High (A) donne effectivement "taille réelle" -1. – Kanitatlan

Questions connexes