我的编码出了什么问题?

时间:2014-09-30 13:22:37

标签: arrays delphi dynamic-arrays

这是一个类的片段,用于删除fArr中的重复值。

procedure tArray.removedup; 
var
  K,R : word;
  DArray : array of string;
begin
  SetLength(DArray, max);

  for K := 1 to max do
    if fArr[K] <> '' then
    begin
      fCount := fCount + 1;
      DArray[K - 1] := fArr[K];
    end;//if

  SetLength(DArray, fCount);
  K := 1;
  while K < fCount do
  begin
    for R := K+1 to fCount do
      if DArray[K] = DArray[R] then
      begin
        finalize(DArray[R]);
        if fCount - R > 0 then
          Move(fArr[R + 1], DArray[R], SizeOf(string) * (fCount - R));
        Initialize(DArray[fCount - 1]);
        SetLength(DArray, fCount);
      end; //if

    K := K + 1;
  end;//while

  for K := 1 to fCount do
    fArr[K] := DArray[K-1];
end;

我知道它看起来很乱......但问题实际上是最后的循环。程序炸弹说“无效的指针操作”

1 个答案:

答案 0 :(得分:1)

您的代码有很多问题。很难知道从哪里开始。有过多的复制。对零基数组索引的混淆很多。最糟糕的是,调用编译器后面的Move并复制托管对象,而编译器没有机会正确引用计数。

任何这些问题都可能导致您的运行时错误。我不会尝试调试或修复您的代码。我认为任何有用的东西都不能从中挽救。这是一个删除重复项的函数:

function Deduped(const input: array of string): TStringArray;
var
  i, j, Count: Integer;
  Found: Boolean;
begin
  Count := 0;
  SetLength(Result, Length(input));
  for i := 0 to high(input) do begin
    if input[i] <> '' then begin
      Found := False;
      for j := 0 to Count-1 do begin
        if input[i] = Result[j] then begin
          Found := True;
          break;
        end;
        if not Found then begin
          Result[Count] := input[i];
          inc(Count);
        end;
      end;
    end;
  end;
  SetLength(Result, Count);
end;

我忽略了空字符串,因为我认为你的代码试图这样做。

功能很简单。它分配一个足够大的数组来保存所有值。然后它通过输入值工作,并且每个输入值检查它是否已经存储在输出数组中。如果没有,则将值添加到数组中。最后,输出数组的大小调整为最终长度。这是找到的唯一非空字符串的数量。