2011-03-12 14 views
1

私はカスタム構造操作プログラムを書いている、と私は、次のタイプを持っている:パスカル - 神秘的なフィールドの増加

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; 

問題は、そのタイプの2番目のオブジェクトであるという変数を読み込んで、の長さがフィールドになると、不思議な増加が1つ発生しています。次のコード

ReadStr(S1); 
ReadStr(S2); 

出力(いずれの場合も、I入力 '123'):誰かが私のために状況をクリアした場合

pos before entering:0 
123 
pos after entering:4 

pos before entering:0 
123 
pos after entering:5 

は、非常にgladfulなります。前もって感謝します。

答えて

1

あなたは、プログラムの関連性のある部分をいくつか見逃しています。特に、これがWindows上にある場合(ファイルの読み方によっては)、次のLFを処理せずにCRで停止しているため、2番目の文字列に余分な文字がある可能性があります。

+0

私はどんなファイルも読んでいません。入力は構造体のフィールドに読み込まれます。 – Arnthor

+0

@ Nordvind - あなたは価値観を読んでいるが、これはもっともらしい説明であるようだ。テストは簡単で、'13 'を' 10 'に切り替えて見てください。最初の要素をスキップしていますが、' Inc 'と' Read 'の場所を切り替えることになります。 –

+0

@Sertac Akyuz: 'Read'は' Inc'の前に来なければならないと思っていましたが、配列が 'data:array [StrPos] of char'として定義されていて、' StrPos'が0から始まる "StrLen"の代わりに誤ってOPを挿入している可能性がありますが、0から始まるインデックスの範囲です。 –

関連する問題