【问题标题】:Conversion from C++ to Delphi (simple)从 C++ 到 Delphi 的转换(简单)
【发布时间】:2011-08-16 23:40:08
【问题描述】:

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

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

【问题讨论】:

    标签: c++ delphi zeos


    【解决方案1】:

    试试:

    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。该代码假定流已打开以供读取(使用适当参数的 Create-d),并且当前流指针指向一个数(dim)的 ANN 坐标,就像 C++ 代码一样。

    FWIW in &gt;&gt; p[i] 从输入流in 中读取ANNcoordp[i],将p 解释为指向ANNcoords 数组的指针。

    更新

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

    1.345 3.56845 2.452345
    3.234 5.141 3.512
    7.81234 2.4123 514.1234
    
    etc...   
    

    据我所知,在 Delphi 中没有等效的方法或操作用于流。为此目的只有System.ReadSystem.Readln。显然 Peter below 曾经写过一个 unit StreamIO,这使得使用 System.ReadSystem.Readln 成为可能。我只能在新闻组帖子中找到one version

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

    【讨论】:

    • C++ 代码有以下内容: while (nPts
    • 我不确定这个数组是不是一个完美的正方形数组。看起来它是一个指向带有(dim)ANNcoords 的数组的指针数组。
    • 我如何将p (ANNPoint) 添加到dataPts(ANNPointArray)?
    • TStream.Read 不是等效的函数。 C++ 代码使用&gt;&gt; 运算符将值从istream 提取到double。它读取流作为文本并将每个标记转换为double。 Delphi 代码以二进制模式读取流,将流的每个 8 字节片段直接复制到每个数组元素中。
    • @Rob:哎呀,看来你是对的。 istream::operator>> 读取文本,而不是二进制数据。 istream::read 读取二进制数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2014-04-30
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多