Delphi使用偏移量在部分字符串中拆分具有CopyMemory的字符串
我想把一个字符串拆分成X部分字符串 这是我目前的代码: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);
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()
将为您截断返回的子字符串。为什么要使用Win32CopyMemory()
函数,而不是使用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;)