Преобразование из C ++ в Delphi (просто) - PullRequest
2 голосов
/ 17 августа 2011

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

1 Ответ

2 голосов
/ 17 августа 2011

Попробуйте:

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...   

AFAIK не имеет эквивалентного метода или операции в Delphi для потоков. Для этой цели есть только System.Read и System.Readln. Очевидно, Peter Below однажды написал unit StreamIO, который позволяет использовать System.Read и System.Readln для потоков. Я мог найти только одну версию в сообщении группы новостей.

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

...