Delphi 如何计算数组的范围?

Delphi 如何计算数组的范围?,delphi,delphi-xe6,Delphi,Delphi Xe6,如何计算数组的范围,以便将其发送给多个线程进行处理。这是有效的,但仅适用于较低的范围。它与数组的高值不匹配 program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TRange = record High: Integer; Low: Integer; end; TRanges = Array of TRange; procedure Split(const S

如何计算数组的范围,以便将其发送给多个线程进行处理。这是有效的,但仅适用于较低的范围。它与数组的高值不匹配

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.
程序项目1;
{$APPTYPE控制台}
{$R*.res}
使用
System.SysUtils;
类型
交易=记录
高:整数;
低:整数;
结束;
TRanges=TRange数组;
过程拆分(常量大小:整数;常量切片:整数;变量范围:TRanges);
变量
切片大小:整数;
切片开始:整数;
I:整数;
开始
切片大小:=(大小+切片)div切片;
设置长度(范围、切片);
切片开始:=0;
对于I:=0到切片-1 do
开始
范围[I]。低:=开始;
切片开始:=切片开始+切片大小;
如果开始>大小,则
切片开始:=大小;
范围[I]。高:=SliceStart-1;
结束;
结束;
变量
答:柏油;
范围:TRanges;
开始
设定长度(A,71);
分割(高(A)、7、范围);//将阵列拆分为七个范围
//范围中缺少70个。。
ReadLn;
结束。
您正在将
高(A)
传递给count参数,但您应该传递
长度(A)
。 High返回最高索引,该索引比基于零的数组中的元素计数少一个

此外,
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;
过程拆分(常量大小:整数;常量切片:整数;
风险值范围:交易);
变量
切片大小:整数;
切片开始:整数;
剩余:整数;
I:整数;
开始
切片大小:=大小div切片;
剩余部分:=大小模块切片;
设置长度(范围、切片);
切片开始:=0;
对于I:=0到切片-1 do
开始
范围[I]。低:=开始;
切片开始:=切片开始+切片大小;
如果我剩下的话
公司(启动);
范围[I]。高:=SliceStart-1;
结束;
结束;
您正在将
高(A)
传递给count参数,但您应该传递
长度(A)
。 High返回最高索引,该索引比基于零的数组中的元素计数少一个

此外,
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;
过程拆分(常量大小:整数;常量切片:整数;
风险值范围:交易);
变量
切片大小:整数;
切片开始:整数;
剩余:整数;
I:整数;
开始
切片大小:=大小div切片;
剩余部分:=大小模块切片;
设置长度(范围、切片);
切片开始:=0;
对于I:=0到切片-1 do
开始
范围[I]。低:=开始;
切片开始:=切片开始+切片大小;
如果我剩下的话
公司(启动);
范围[I]。高:=SliceStart-1;
结束;
结束;
传递High(A)是正确的,因为语句
SliceSize:=(Size+Slices)div-Slices
实际上是
(“real size”+slices-1)div-slices
,使用High(A)有效地给出了“real size”-1。传递High(A)是正确的,因为语句
SliceSize:=(size+slices)div-slices
实际上是
(“实际大小”+切片-1)div切片
,使用High(A)有效地给出了“实际大小”-1。