我有两个arapper类型,便于处理/返回一维数组,我想写一个方法将一个转换为另一个(2d-float-Vector类到2d-int-point类)。写了一个简单的,但它只是抛出一些我不理解的错误。
unit UUtil;
interface
uses
UVector2f, Types, SysUtils;
type
Vector2fArrayWrapper = array of Vector2f;
PointArrayWrapper = array of TPoint;
implementation
function toPointArray(vw : Vector2fArrayWrapper) : PointArrayWrapper;
var pw : PointArrayWrapper;
i,x,y : Integer;
begin
setLength(pw, vw.length);
for i := 0 to vw.high do
begin
x := round(vw[i].getX());
y := round(vw[i].getY());
vw[i] := TPoint(x,y);
end;
result := pw;
end;
end.
这些是我得到的错误:
[Error] UUtil.pas(20): Record, object or class type required
[Error] UUtil.pas(21): Record, object or class type required
[Error] UUtil.pas(25): ')' expected but ',' found
[Error] UUtil.pas(27): Declaration expected but identifier 'result' found
[Error] UUtil.pas(28): '.' expected but ';' found
答案 0 :(得分:5)
动态数组不是对象,类或记录。他们没有定义方法。
而不是
vw.length
你必须写
Length(vw)
同样适用于high
。
接下来,TPoint
是一种类型。如果要创建一个新函数,可以使用辅助函数Point()
。
然后你分配给vw[i]
,但你的意思是指定给pw[i]
。
最后,不需要引入局部变量,然后为该局部变量分配Result
。您可以直接在Result
上完成所有工作。所以,我会写这样的代码:
function toPointArray(const vw: Vector2fArrayWrapper): PointArrayWrapper;
var
i: Integer;
begin
setLength( Result, Length(vw));
for i := 0 to high(vw) do
Result[i] := Point(round(vw[i].getX), round(vw[i].getY));
end;