【问题标题】:Delphi Split a string with CopyMemory in part-strings using an offsetDelphi 使用偏移量在部分字符串中使用 CopyMemory 拆分字符串
【发布时间】:2015-09-18 00:50:56
【问题描述】:

我想在 X 部分字符串中拆分一个字符串。

这是我目前的代码:

procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
  i, Rest, partSize: integer;
  tmp: AnsiString;
begin
  Rest := len mod numberParts;
  SetLength(a, numberParts);
  partSize := (len - Rest) div numberParts;
  numberParts := numberParts - 1;
  for i := 0 to numberParts do
  begin
    // Get access violation here
    CopyMemory(@a[i][1], @filestring[i * partSize], partSize);
  end;
  if Rest <> 0 then
    CopyMemory(@a[numberParts][numberParts*partSize], @filestring[numberParts*partSize], Rest);
end;

我在这一行遇到访问冲突:

CopyMemory(@a[i][1], @filestring[i * partSize], partSize);

我不确定错误究竟是在哪里引起的。 我如何获得 a[i] 的地址,不是 @a[i][1] 吗?当它尝试在第一个循环中访问 @filestring[i* partSize] 时,无论如何都会导致错误,因为它会是 0?

希望有人能解释一下。

谢谢

【问题讨论】:

  • 你为什么要使用 Win32 CopyMemory() 函数,而不是使用 Delphi 自己的 Copy() 函数?您在滥用CopyMemory(),这就是您遇到错误的原因。

标签: delphi split copymemory


【解决方案1】:

您的代码对于您正在尝试的内容过于复杂。试试这个更简单的代码:

// assuming StringArray is "array of (Ansi)String"...
procedure SplitFile(var a: StringArray; len: integer; fileString: AnsiString; numberParts: integer);
var
  i, partSize: integer;
begin
  partSize := len div numberParts;
  SetLength(a, numberParts);
  for i := 0 to numberParts-1 do begin
    a[i] := Copy(filestring, (i * partSize)+1, partSize);
  end;
end;

在最后一次迭代中,如果请求的计数大于请求偏移处的可用字符数,Copy() 将为您截断返回的子字符串。

【讨论】:

    【解决方案2】:

    我看到三个主要问题:

    • 零件计数过多会导致阵列长度确定错误。
    • 您必须加 1 才能正确处理 ansistring 字符:
    • 必须设置目标字符串的长度

      for i := 0 to numberParts {probably - 1} do begin SetLength(a[i], partSize); CopyMemory(@a[i][1], @filestring[i * partSize + 1], partSize); end;

    最后一块处理也是如此

    【讨论】:

    • 哦,非常感谢! @filestring[i * partSize + 1] 那部分我自己注意到了,但我完全忘记了 SetLength()。拯救了我的一天!但是 numberparts 在上面被减去 -1 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多