2

我在 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++ 函数中的行为(可能是因为我不了解位移运算符)。

此外,我最终需要弄清楚如何将一组点从 ZeosTZQuery对象转移到相同的数据类型——所以如果有人对此有任何意见,我将不胜感激。

4

1 回答 1

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)并且当前流指针指向一个数字(暗淡)的 ANN 坐标,就像 C++ 代码一样。

FWIW从输入流中in >> p[i]读取一个到,解释为一个指向 的数组的指针。ANNcoordinp[i]pANNcoords

更新

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

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 below曾经写过一个unit StreamIO可以使用System.ReadSystem.Readln用于流的方法。我只能在新闻组帖子中找到一个版本

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

于 2011-08-17T00:19:27.743 回答