这是一个类的片段,用于删除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;
我知道它看起来很乱......但问题实际上是最后的循环。程序炸弹说“无效的指针操作”
答案 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;
我忽略了空字符串,因为我认为你的代码试图这样做。
功能很简单。它分配一个足够大的数组来保存所有值。然后它通过输入值工作,并且每个输入值检查它是否已经存储在输出数组中。如果没有,则将值添加到数组中。最后,输出数组的大小调整为最终长度。这是找到的唯一非空字符串的数量。