Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi使用偏移量在部分字符串中拆分具有CopyMemory的字符串_Delphi_Split_Copymemory - Fatal编程技术网

Delphi使用偏移量在部分字符串中拆分具有CopyMemory的字符串

Delphi使用偏移量在部分字符串中拆分具有CopyMemory的字符串,delphi,split,copymemory,Delphi,Split,Copymemory,我想把一个字符串拆分成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);

我想把一个字符串拆分成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;
我不确定错误到底是从哪里产生的。 我怎样才能得到a[I]的地址,是不是@a[I][1]?并在第一个循环中尝试访问@filestring[i*partSize]时导致错误,因为它将是0

我希望有人能给我解释一下


谢谢

我看到了三个主要问题:

  • 角度过大的部件计数会导致阵列长度确定错误
  • 您必须添加1才能正确寻址ansistring字符:
  • 必须设置目标字符串的长度

    i:=0到numberParts{maybuly-1}do的
    
    开始
    设定长度(a[i],零件尺寸);
    CopyMemory(@a[i][1],@filestring[i*partSize+1],partSize);
    结束


最后一块治疗也是如此

我发现了三个主要问题:

  • 角度过大的部件计数会导致阵列长度确定错误
  • 您必须添加1才能正确寻址ansistring字符:
  • 必须设置目标字符串的长度

    i:=0到numberParts{maybuly-1}do的
    
    开始
    设定长度(a[i],零件尺寸);
    CopyMemory(@a[i][1],@filestring[i*partSize+1],partSize);
    结束


最后一块治疗也是如此

我发现了三个主要问题:

  • 角度过大的部件计数会导致阵列长度确定错误
  • 您必须添加1才能正确寻址ansistring字符:
  • 必须设置目标字符串的长度

    i:=0到numberParts{maybuly-1}do的
    
    开始
    设定长度(a[i],零件尺寸);
    CopyMemory(@a[i][1],@filestring[i*partSize+1],partSize);
    结束


最后一块治疗也是如此

我发现了三个主要问题:

  • 角度过大的部件计数会导致阵列长度确定错误
  • 您必须添加1才能正确寻址ansistring字符:
  • 必须设置目标字符串的长度

    i:=0到numberParts{maybuly-1}do的
    
    开始
    设定长度(a[i],零件尺寸);
    CopyMemory(@a[i][1],@filestring[i*partSize+1],partSize);
    结束


最后一次治疗也是如此

您的代码对于您正在尝试的内容来说过于复杂。请尝试以下更简单的代码:

// 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()
将为您截断返回的子字符串。

对于您正在尝试的操作,您的代码过于复杂。请尝试以下更简单的代码:

// 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()
将为您截断返回的子字符串。

对于您正在尝试的操作,您的代码过于复杂。请尝试以下更简单的代码:

// 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()
将为您截断返回的子字符串。

对于您正在尝试的操作,您的代码过于复杂。请尝试以下更简单的代码:

// 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()
将为您截断返回的子字符串。

为什么要使用Win32
CopyMemory()
函数,而不是使用Delphi自己的
Copy()
函数?您误用了
CopyMemory()?您误用了
CopyMemory()?您误用了
CopyMemory()?您误用了
CopyMemory()
,这就是您出错的原因。噢,非常感谢@filestring[i*partSize+1]我注意到了我自己,但我完全忘了设置长度()。救了我一天!但是numberparts会被减除(上面的-1;)哦,非常感谢@filestring[i*partSize+1]我注意到了我自己,但我完全忘了设置长度()。救了我一天!但是numberparts会被减除(上面的-1;)哦,非常感谢@filestring[i*partSize+1]我注意到了我自己,但我完全忘了设置长度()。救了我一天!但是numberparts会被减除(上面的-1;)哦,非常感谢@filestring[i*partSize+1]我注意到了我自己,但我完全忘了设置长度()。救了我一天!但是numberparts会被减除(上面的-1;)