2

Delphiで複製しようとしているC++の関数があります:

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

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.

于 2011-08-17T00:19:27.743 に答える