2

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.

Mike Furlender
  • 3,869
  • 5
  • 47
  • 75

1 Answers1

2

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.

Rudy Velthuis
  • 28,387
  • 5
  • 46
  • 94
  • The C++ code had the following: while (nPts < maxPts && readPt(*dataIn, dataPts[nPts])) nPts++; Would your code fill the array (p) up in the same way? Or would it assign just 1 point? – Mike Furlender Aug 17 '11 at 00:58
  • I am not sure the array is a perfectly square array. It looks like it is rather an array of pointers to arrays with (dim) ANNcoords. – Rudy Velthuis Aug 17 '11 at 01:11
  • How would I then add `p` (ANNPoint) to `dataPts`(ANNPointArray)? – Mike Furlender Aug 17 '11 at 02:30
  • `TStream.Read` is not the equivalent function for this. The C++ code uses the `>>` operator to extract values from an `istream` into a `double`. That reads the stream *as text* and converts each token into a `double`. The Delphi code is reading the stream in binary mode to copy each eight-byte piece of the stream directly into each array element. – Rob Kennedy Aug 17 '11 at 06:18
  • @Rob: Oops, it seems you are right. istream::operator>> reads text, not binary data. istream::read reads binary data. – Rudy Velthuis Aug 17 '11 at 07:12
  • @Rob: I have been thinking hard and even looking around everywhere, but I can't think of an equivalent. Ok, System.Read and System.Readln will do the trick, but there is nothing in TStream that allows you to read and convert text that way. Or what am I missing? – Rudy Velthuis Aug 17 '11 at 07:36
  • I have been using Lazarus/FreePascal instead of delphi. Are these analogous functions? http://www.freepascal.org/docs-html/rtl/objects/tstream.strwrite.html http://www.freepascal.org/docs-html/rtl/objects/tstream.strread.html – Mike Furlender Aug 17 '11 at 12:51