Преобразование из C++ в Delphi (простое)

У меня есть функция на С++, которую я пытаюсь воспроизвести в 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 в тот же тип данных, поэтому, если у кого-то есть какой-либо вклад в это, я был бы очень признателен.


person Mike Furlender    schedule 16.08.2011    source источник


Ответы (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 — это класс потока, а не интерфейс IStream в C++. Эквивалент Delphi — TStream. Код предполагает, что поток открыт для чтения (Create-d с соответствующими параметрами), а текущий указатель потока указывает на число (dim) ANNcoords, как это делает код C++.

FWIW in >> p[i] считывает ANNcoord из входного потока in в p[i], интерпретируя p как указатель на массив ANNcoords.

Обновлять

Как указал Роб Кеннеди, in >> myDouble считывает из входного потока двойное значение, но поток интерпретируется как текстовый поток, а не бинарный, т.е. выглядит так:

1.345 3.56845 2.452345
3.234 5.141 3.512
7.81234 2.4123 514.1234

etc...   

Насколько я знаю, в Delphi нет эквивалентного метода или операции для потоков. Для этого есть только System.Read и System.Readln. По-видимому, Питер Ниже однажды написал unit StreamIO, который позволяет использовать System.Read и System.Readln для потоков. Мне удалось найти только одну версию, в сообщении группы новостей.

Вероятно, имеет смысл написать оболочку для потоков, которая может считывать двойные, целые числа, одиночные числа и т. д. из их текстовых представлений. Я еще не видел ни одного.

person Rudy Velthuis    schedule 17.08.2011
comment
В коде C++ было следующее: while (nPts ‹ maxPts && readPt(*dataIn, dataPts[nPts])) nPts++; Будет ли ваш код заполнять массив (p) таким же образом? Или он присвоит только 1 балл? - person Mike Furlender; 17.08.2011
comment
Я не уверен, что массив является идеально квадратным массивом. Похоже, это скорее массив указателей на массивы с (тусклыми) ANNcoords. - person Rudy Velthuis; 17.08.2011
comment
Как мне тогда добавить p (ANNPoint) к dataPts(ANNPointArray)? - person Mike Furlender; 17.08.2011
comment
TStream.Read не является эквивалентной функцией для этого. Код C++ использует оператор >> для извлечения значений из istream в double. Это считывает поток как текст и преобразует каждый токен в double. Код Delphi считывает поток в двоичном режиме, чтобы копировать каждую восьмибайтовую часть потока непосредственно в каждый элемент массива. - person Rob Kennedy; 17.08.2011
comment
@Rob: Упс, кажется, ты прав. istream::operator›› читает текст, а не двоичные данные. istream::read читает двоичные данные. - person Rudy Velthuis; 17.08.2011
comment
@Rob: Я много думал и даже оглядывался повсюду, но не могу придумать эквивалента. Хорошо, System.Read и System.Readln сделают свое дело, но в TStream нет ничего, что позволяло бы вам читать и преобразовывать текст таким образом. Или что мне не хватает? - person Rudy Velthuis; 17.08.2011
comment
Я использую Lazarus/FreePascal вместо Delphi. Это аналогичные функции? freepascal.org/docs-html/rtl/objects/tstream. strwrite.html freepascal.org/docs-html /rtl/objects/tstream.strread.html - person Mike Furlender; 17.08.2011