2016-07-13 7 views
0

constant vs variable変数または定数式に必要な、現在のファイルを扱うパスカル

こんにちは、イム。グローバルに宣言されているCharのFile。私はcharのファイルに任意の文字(A、Bなど)を見つけようとしていますが、私は各行に1文字しかなく、ドットに変更したいと思います。 (変数TECKA - DOTの) 私はcharを書く場合は、 "定数式が期待される"と言いますが、私は定数(コードのコメントセクション)に変更すると、 "変数が必要です"と言います。私はここで間違って何をしていますか? 返信いただきありがとうございます。あなたは間違って何をやっている

procedure TForm1.Button3Click(Sender: TObject); 
var znak,tecka:char; 
begin 
    tecka:='.'; 
    assignfile(f,'Znaky.dat'); 
    reset(f); 
    While not eof(f) do begin 
    read(f,znak); 
    Case znak of 'a'..'z','A'..'Z': 
     seek(f,filepos(f)-1); 
     Write(f,tecka);   // write(f,'.'); 
    end; 
    end; 
    closefile(f); 
end; 
+0

コードを画像に挿入しないでください。コードを質問にテキストとして貼り付けてください。 – Johan

答えて

4

はラインwrite(f,tecka);とは何の関係もありませんが、すべてはパスカルでブロックルールをどうします。

あなたはあなたにcase文を変更する必要が文句を停止するようにコンパイラにしたい場合は

case znak of 
    'a'..'z','A'..'Z': begin 
    seek(f,filepos(f)-1); 
    write(f,tecka); 
    end; 
end; {case} 

問題は、case文がof後(例えば'a'..'z')は、1つまたは複数の定数式を期待していることです。 :の後には、単一のステートメントまたは開始ブロックだけを置くことができます。 :の後に2つのステートメントを置くので、パスカルは2番目のステートメントを別のcase節(たとえば、'0'..'9':)として解釈します。

セクションに複数のステートメントを配置する場合は、常に先頭のブロックを使用する必要があります。

これはまた、if文で落とし穴です:

if x then 
    statement1; 
    statement2; <-- statement2 will always be executed, because it's not part of the if 

これは次のようになります。

if x then begin 
    statement1; 
    statement2;  <-- statement2 depends on x. 
end; 

それは多くの人々が常に開始・終了ブロックを使用するのはこのためです。
単一のステートメントがあっても。
あなたは、コードを変更する場合は、後であなたがちょうどそこにすでにだとあなたはそれを置くことを忘れることができない始めるエンドのブロックにあなたの余分な文を入れては。

注assignfileリセットシークなどの呼び出しはかなり古くなっていること。
Delphiでは、文字列リストを使用して処理する方が効率的です。

ディスクI/Oを何度も使用するのではなく、2回だけ実行するため、パフォーマンスが向上します。

個人的なニックピック:casewhileのようなキーワードを大文字にしないでください。これはVBではなく、パスカルです。

+0

ああ、説明をありがとう。 – Solomone

+1

@Johan:すべての 'begin'を' end'に揃えて独自の行に入れてください。これはJavaやK&Rではなく、Delphiです。

関連する問題