Pacal再入門:ArgvとArgc
再入門だから、興味本位で順序は無茶苦茶。今更Algolがどうのこうのとか、教育用言語としての有効性を検証しても仕方がない。
argv, argcが組み込み関数だとしたら、別にprogramの引数として記述しなくても、特段の宣言をせずにコードの中に直接記述しても機能するはずという事で、次のようなコードを書いてみた。
program arg0;
var
count : integer;
begin
for count:=1 to argc-1 do writeln(argv[count]);
end.
結果としては、問題なく処理された。
ここでは、argvを配列のように扱っている。ところが、Oracleの解説では、
The argv procedure assigns the specified program argument to a string variable.
Syntax
argv(i, a)Arguments
i is an integer value.
a is a fixed- or variable-length string.Return Value
argv returns a string variable.Comments
argv returns the i'th argument of the current process to the string variable a. i
ranges from 0, the program name, to argc-1.
argc is a predeclared function that tells you how many arguments are being
passed to the program. argv is normally used in conjunction with argc.
となっていて、argvを完全に関数扱いしている。
昔読んだ入門書では配列扱いの解説だったので、特別な変数だと思い込んでいたのだが、ちょっと試してみる必要がある。
program arg1;
var
count : integer;
a : string;
begin
argv(3, a);
writeln(s);
end.
上のようなコードを書いてみたが、argv(3, a);のところで、
Syntax error, ";" expected but "(" found
とコンパイルエラーになった。対象としている処理系の仕様の違いだろう。非標準だから仕方がないし。いちいち変数を宣言してアサインして使うより、配列変数として振舞ってくれた方がシンプルで有難い。
ただ他のPascal処理系で使うとエラーになるという可能性は知っておく必要がある。
ちなみに、argv[0]はコマンドとして使われた文字列を引数も含めて全て返してくる。
argvとargcについては、これでいいだろう。