从C ++转换为Delphi(简单)

时间:2011-08-16 23:40:09

标签: c++ delphi zeos

我在C ++中有一个函数,我试图在delphi中复制:

typedef double  ANNcoord;        // coordinate data type
typedef ANNcoord* ANNpoint;      // a point     
typedef ANNpoint* ANNpointArray; // an array of points 

bool readPt(istream &in, ANNpoint p) // read point (false on EOF)
{
    for (int i = 0; i < dim; i++) {
        if(!(in >> p[i])) return false;
    }
    return true;
}

在Delphi中我相信我已经正确地声明了数据类型..(我可能错了):

type
  IPtr =  ^IStream; // pointer to Istream
  ANNcoord = Double;
  ANNpoint = ^ANNcoord;

function readPt(inpt: IPtr; p: ANNpoint): boolean;
var
  i: integer;
begin

  for i := 0 to dim do
  begin

  end;

end; 

但我无法弄清楚如何模仿C ++函数中的行为(可能是因为我不理解bitshift运算符)。

另外,我需要最终弄清楚如何将Zeos TZQuery对象中的点集转移到相同的数据类型 - 所以如果有人对此有任何输入,我会非常感激。

1 个答案:

答案 0 :(得分:2)

尝试:

type
  ANNcoord = Double;
  ANNpoint = ^ANNcoord;

function readPt(inStr: TStream; p: ANNpoint): boolean;
var
  Size: Integer; // number of bytes to read
begin
  Size := SizeOf(ANNcoord) * dim; 
  Result := inStr.Read(p^, Size) = Size;
end;

无需单独阅读每个ANNcoord。请注意,istream是C ++中的流类,而不是IStream接口。 Delphi相当于TStream。代码假定流被打开以供读取(使用适当的参数创建-d),当前流指针指向ANNcoords的数字(暗淡),就像C ++代码一样。

FWIW in >> p[i]从输入流ANNcoord读取inp[i],将p解释为指向ANNcoords数组的指针

更新

正如Rob Kennedy指出的那样,in >> myDouble从输入流中读取一个double,但该流被解释为 text 流,而不是二进制,即它看起来像:

1.345 3.56845 2.452345
3.234 5.141 3.512
7.81234 2.4123 514.1234

etc...   

AFAIK,在Delphi中没有与流相同的方法或操作。为此目的,只有System.ReadSystem.Readln。显然 Peter下面曾写过一个unit StreamIO,这样可以将System.ReadSystem.Readln用于流。我只能在新闻组帖子中找到one version

为可以从文本表示中读取双精度,整数,单数等的流编写包装器可能是有意义的。我还没见过。