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を使う事を優先する。(delphitpcが見つからないが、コンソールで使うプログラムという事なら、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.

  starterこそ、コマンドラインからのコンパイルが必要そうな気もするが、まぁ無料で使わせて貰う身で贅沢は言えない。