Попытка перевести старый паскаль-скрипт на python: проблемы с паскальской «записью» - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время мне поручено перевести старый скрипт на паскале на python. Проблема в том, что у меня нет опыта работы с паскалем ... До сих пор все прошло хорошо (большая часть сценария довольно понятна), но теперь я столкнулся с небольшим фрагментом кода, который просто не могу понять. из:

# some other code here...

type MeasurementPoint = record
                         lambda : double;
                         value : double;
                        end;

# some more code...

procedure foo(MyFileName: string, somemoreargs):
var  somevars: integer; 
     somemorevars: double;
     temp: MeasurementPoint; 

# even more code...

  i:= 0;
  Assign(MyInFile,MyFileName);
  Reset(MyInFile);
  repeat
    Inc(i);
    SetLength(Reflexion, i);
    readln(MyInFile, temp.lambda, temp.value);
    Reflexion[i-1]:=temp;
  until EoF(MyInFile);
  Close(MyInFile);

Я просто не могу обернуться вокруг того, что эта часть кода должна делать ... Я так понимаю, что полный файл MyInFile читается строка за строкой, и что каждая строка содержит два значения, а именно 'lambda' и 'value', которые извлекаются как двойные.

Согласно паскаль-вики, record - это контейнер, способный хранить объекты разных типов и логически группировать их (можно ли сравнить со словарем в python?). Если я правильно понимаю SetLength, он используется для определения длины массива, что здесь имеет смысл. i увеличивается при каждом чтении строки, поэтому длина temp увеличивается, чтобы соответствовать числу пар lambda и value, уже извлеченных из файла (пожалуйста, исправьте меня, если мои предположения неверны!) , Но я не понимаю, что должен делать остальной код, особенно Reflexion[i-1]:=temp. Является ли Reflexion объектом типа MeasurementPoint длиной i-1? Или что эта часть означает? Почему lambda и value извлекаются как temp.lambda и temp.value? это автоматически соединяет их вместе в записи ...?

Если бы кто-нибудь мог мне помочь, объяснив это, я был бы очень признателен. И, конечно, если у вас есть идея, как это можно перевести на python 3.x, было бы еще лучше; -)

1 Ответ

0 голосов
/ 08 ноября 2018

Паскаль record похож на Питон namedtuple.Одна запись (namedtuple) читается поле за полем (следовательно, temp.lambda, temp.value) в функции readLn.

Reflexion[i-1]:=temp выглядит как массив (Python list) записей.Поскольку массивы имеют постоянную длину (объявленную при инициализации; n-1), новые записи хранятся в последовательных слотах.

Я надеюсь, что это ответит на ваши вопросы о том, что делает код Паскаля ...

...