Pacal再入門:「ファイル存在の確認」を分割したコード
procedure とか functionの使い方を思い出す為に無駄に分割してみた。
program sim2; uses sysutils; function argchk(c : integer) :boolean; var result : boolean; begin if c=2 then result := true else begin result:=false; if c<2 then writeln('Missing arg') else writeln('Too much args'); end; argchk:=result; end; function existchk(s : string):boolean; var result : boolean; begin if FileExists(s) then begin result := true; writeln(s, ' is Exists.') end else begin result := false; writeln(s, ' is not Exists.') end; existchk := result; end; procedure readfile(s : string); begin writeln('dummy'); end; procedure main(st : string); begin writeln('find arg', ' "', st, '"'); if existchk(st) then readfile(st); end; begin if argchk(argc) then main(argv[1]); end.
上記の単一コードのコンパイル・実行が可能な事を試した上で、unitに分けてみた。
unit myApp; interface function argchk(c : integer) :boolean; function existchk(s : string):boolean; procedure readfile(s : string); procedure main(st : string); implementation uses sysutils; function argchk(c : integer) :boolean; var result : boolean; begin if c=2 then result := true else begin result:=false; if c<2 then writeln('Missing arg') else writeln('Too much args'); end; argchk:=result; end; function existchk(s : string):boolean; var result : boolean; begin if FileExists(s) then begin result := true; writeln(s, ' is Exists.') end else begin result := false; writeln(s, ' is not Exists.') end; existchk := result; end; procedure readfile(s : string); begin writeln('dummy'); end; procedure main(st : string); begin writeln('find arg', ' "', st, '"'); if existchk(st) then readfile(st); end; end.
上記がユニット部。下記が実行部で個別にコンパイルできる。
program sim3; uses myApp; begin if argchk(argc) then main(argv[1]); end.
unitをコンパイルすると、ppuという拡張子を持つモジュールが出来上がる。自作したppuがコンパイル対象のファイルと同じィレクトリにあれば参照可能。
fpcにコマンドオプションをつければ、ppuのパスを指定できそう。
ところで、このコードをLazarusのIDE環境下でコンパイルしてみると、Unitの方のコンパイルで、変数resultがダブっているというメッセージが出て、コンパイルできない。(コンソールからfpcでコンパイルするぶんにはアラートはでない。)異なるスコープなので、問題はないはずなのだが、何故だか判らない謎。
仕方がないので、resultをresult1とresult2にリネームして試してみたが、今度はparameter s が使われていないという難癖。コンソール用のプログラムなのでarvc, argvを使っているのだが、プログラムに与える引数をどこで渡したらいいのか判らない。実行ファイルは出来上がっているが、shellから実行してみると、IDE環境下と同じエラーが出る。
とりあえず、IDEを使わないshellでのコンパイルには問題がない。このまま行くべきか、Lazarusの方の学習をするべきか。Pascalを思い出すという事が目的なので、安易の道を行くべきだろうという事で、shellでfpcを使う事を優先する。(delphiでtpcが見つからないが、コンソールで使うプログラムという事なら、Freebsdでも使えるfpcがいいだろう。)
こういうのを見つけたが、、、
Delphiのプログラムをmakeでビルドする(Delphi Advent Calendar 2012-12-02) - 偏った言語信者の垂れ流し
たしかに、コマンドプロンプトから、>make と打ち込むと、
>make
MAKE Version 5.41 Copyright (c) 1987, 2014 Embarcadero Technologies, Inc.
Fatal: Unable to open makefile
となる。ただ肝心のdcc32が以下のような状態
>dcc32
This version of the product does not support command line compiling.