正如上面的主题所示,我想知道是否有一个很好的例子来处理在按顺序处理数据时在函数parms中传递的指针.我所拥有的是:
function myfunc(inptr: pointer; inptrsize: longint): boolean;
var
inproc: pointer;
i: integer;
begin
inproc := inptr;
for i := 1 to inptrsize do
begin
// do stuff against byte data here.
inc(longint(inproc), 1);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我的想法是,不管有多大的数据,我都希望它能够处理被推送的任何数据,而不是有限的数据.
现在谈到处理数据时,我已经想出了几种成功的方法.
有没有其他方法以这种方式有效地处理处理指针,或者是否有一些我缺少的方法,既干净又不浪费时间?
你的代码基本上没问题.我总是选择增加指针而不是强制转换为假数组.
但是你不应该转换为整数.这在语义上是错误的,只要您在指针大小与整数大小不同的平台上编译,您就会支付罚金.始终使用指向正确大小的元素的指针.在这种情况下,指向byte的指针.
function MyFunc(Data: PByte; Length: Integer): Boolean;
var
i: Integer;
begin
for i := 1 to Length do
begin
// do stuff against byte data here.
inc(Data);
end;
end;
Run Code Online (Sandbox Code Playgroud)
除非编译器有一个非常糟糕的一天,否则你会发现很难获得比这更好的代码.更重要的是,我认为这种风格实际上相当清晰,易于理解.大部分的清晰度增加都是为了避免投射.始终努力从代码中删除强制转换.
如果你想允许传递任何指针类型,那么你可以像这样写:
function MyFunc(P: Pointer; Length: Integer): Boolean;
var
i: Integer;
Data: PByte;
begin
Data := P;
for i := 1 to Length do
begin
// do stuff against byte data here.
inc(Data);
end;
end;
Run Code Online (Sandbox Code Playgroud)
或者,如果要避免在接口中使用指针,则使用无类型的const参数.
function MyFunc(const Buffer; Length: Integer): Boolean;
var
i: Integer;
Data: PByte;
begin
Data := PByte(@Buffer);
for i := 1 to Length do
begin
// do stuff against byte data here.
inc(Data);
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果需要修改缓冲区,请使用var参数.
归档时间: |
|
查看次数: |
314 次 |
最近记录: |