Паскаль - таинственное увеличение поля

Я пишу пользовательскую программу манипулирования структурой, и у меня есть следующие типы:

type
StrLen = 0..MaxLen;
Str = ^StrInst;

StrInst = record
length: StrLen;
data: array [StrPos] of char;
end;

Тогда у меня есть следующая процедура:

procedure  ReadStr(var S: Str);
var  pos: StrLen;
begin
      S^.length:=0;
      pos := 0;
      writeln('pos before entering:',pos);
      writeln;
      with  S^  do begin
        repeat
                Inc(pos);
                Read(data[pos]);
        until   (ord(data[pos]) = 13)   or   (pos > MaxLen+1);
        writeln('pos after entering:',pos);
        length := pos-1;
      end;
end;

Проблема в том, что когда я читаю второй объект этого типа, переменная pos и, следовательно, поле length таинственным образом увеличиваются на 1. Следующий код

ReadStr(S1);
ReadStr(S2);

выходы (когда я ввожу «123» в обоих случаях):

 pos before entering:0
 123 
 pos after entering:4

 pos before entering:0 
 123 
 pos after entering:5

Буду очень рад, если кто-то прояснит для меня ситуацию. Заранее спасибо.


person Arnthor    schedule 12.03.2011    source источник


Ответы (1)


Вы пропускаете некоторые, возможно, важные части программы. В частности, если это в Windows, то (в зависимости от того, как вы читаете файл) у вас может быть лишний символ во второй строке, потому что вы останавливаетесь на CR и не обрабатываете следующий LF.

person geekosaur    schedule 12.03.2011
comment
Ну, я не читаю ни одного файла, ввод читается в поле структуры. - person Arnthor; 12.03.2011
comment
@Nordvind - Как бы вы ни читали значение, это кажется наиболее правдоподобным объяснением. Тестировать легко, поменяйте «13» на «10» и посмотрите… Кстати, вы пропускаете первый элемент, вы хотели бы поменять местами «Inc» и «Read». - person Sertac Akyuz; 12.03.2011
comment
@Sertac Akyuz: я тоже думал, что Read должен стоять перед Inc, но потом я увидел, что массив был определен как data: array [StrPos] of char, и неизвестно, идентифицирует ли StrPos диапазон индексов, начинающихся с 0, хотя возможно, что OP имеет ошибочно поставил его вместо StrLen, который действительно начинается с 0. - person Andriy M; 12.03.2011
comment
Спасибо, не знал, что нажатие клавиши Enter фактически вставляет два символа вместо одного =) Кстати, массив правильный, мне не хватает StrPos = 1..MaxLen в определении типа. - person Arnthor; 12.03.2011