从 C++ 转换到德尔福(简单)

发布于 2024-11-29 19:52:24 字数 904 浏览 2 评论 0原文

我在 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 对象传输到相同的数据类型 - 因此,如果有人对此有任何意见,我将非常感激。

I have a function in C++ that I am attempting to replicate in 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;
}

In Delphi I believe that I have correctly declared the data types.. (I could be wrong):

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; 

But I cannot figure out how to mimic the behavior in the C++ function (probably because I do not understand the bitshift operator).

Also, I need to eventually figure out how to transfer the set of points from a Zeos TZQuery object to the same datatype - so if anyone has some any input on that I would really appreciate it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

同展鸳鸯锦 2024-12-06 19:52:24

尝试:

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。请注意,在 C++ 中,istream 是一个流类,而不是 IStream 接口。 Delphi 的等价物是TStream。该代码假设流已打开以供读取(使用正确的参数 Create-d),并且当前流指针指向多个(暗淡)ANNcoords,就像 C++ 代码一样。

FWIW 在>> p[i] 从输入流 in 读取 ANNcoordp[i],解释 p 作为指向 ANNcoords 数组的指针。

更新

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

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曾经写过一个单元StreamIO,它使得使用System.ReadSystem.Readln成为可能溪流。我只能找到一个版本,在新闻组帖子中。

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

Try:

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;

There is no need to read each ANNcoord separately. Note that istream is a stream class, not an IStream interface, in C++. Delphi's equivalent is TStream. The code assumes the stream is opened for reading (Create-d with the proper parameters) and the current stream pointer points to a number (dim) of ANNcoords, just like the C++ code does.

FWIW in >> p[i] reads an ANNcoord from the input stream in to p[i], interpreting p as a pointer to an array of ANNcoords.

Update

As Rob Kennedy pointed out, in >> myDouble reads a double from the input stream, but the stream is interpreted as text stream, not binary, i.e. it looks like:

1.345 3.56845 2.452345
3.234 5.141 3.512
7.81234 2.4123 514.1234

etc...   

There is, AFAIK, no equivalent method or operation in Delphi for streams. There is only System.Read and System.Readln for this purpose. Apparently Peter Below once wrote a unit StreamIO which makes it possible to use System.Read and System.Readln for streams. I could only find one version, in a newsgroup post.

It would probably make sense to write a wrapper for streams that can read doubles, integers, singles, etc. from their text representations. I haven't seen one yet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文