4

我有两种 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
4

1 回答 1

6

动态数组不是对象、类或记录。它们没有定义方法。

代替

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;
于 2013-05-18T21:03:28.657 回答