【问题标题】:setLength change type of TBoundArray when setLength(arr[i] [closed]setLength 更改 TBoundArray 的类型时 setLength(arr[i] [关闭]
【发布时间】:2020-09-05 22:52:55
【问题描述】:

我无法编译这种和平的代码。为什么? 在编译得到 E2010 不兼容的类型:'TBoundArray' 和 'Array'

代码试图通过向 subArray 末尾的每个维度推送相同的值+10000 来更改传入数组。

function Tpt.T(var arr: array of TBoundArray): TBoundArray;
var
  i:Integer;
  j:Integer;
  size:Integer;
  const movObjInd: Integer = 10000;
begin
  for i := Integer(0) to Length(arr) do
  begin
  size:= Length(arr);
  setLength(arr[i],(Length(arr[i])+1)*2);

  j:=0;
    while j < size+1 do
    begin
      if arr[i][j] = 0 then
      begin
        inc(size);
        Continue;
      end;

      Inc(size);
      arr[i][size]:= arr[i][j] + movObjInd;
    end;
  end;
  result:= arr;
end;

【问题讨论】:

  • 您的 for 循环在其最后一次迭代中访问越界。
  • 我怀疑while 循环也存在边界问题。我认为size:= Length(arr) 应该是size:= Length(arr[i])
  • 是的,有问题,我编译后解决了procedure TRptZakaz_AL.addTransObjs(var arr: array of TBoundArray); var i:Integer; j:Integer; size:Integer; const movObjInd: Integer = 10000; begin for i := 0 to Length(arr)-1 do begin if arr[i][0] = 0 then Continue; size:= Length(arr[i]); setLength(arr[i],size*2); j:=0; while j &lt; size do begin if arr[i][j] = 0 then begin inc(j); Continue; end; arr[i][size+j]:= arr[i][j] + movObjInd; Inc(j); end; end; end;

标签: delphi delphi-2010


【解决方案1】:

result:= arr; 正在尝试将TBoundArray 元素的开放数组 分配给单个TBoundArray。这将不起作用,这就是您收到错误的原因。

由于您是直接修改arr 数组的元素,因此无需通过函数的Result 返回任何元素。所以你应该把它改成procedure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多