2012-07-31

[Fortran] 実在しない省略可能な仮引数を自動割付け配列の上下限にすることについて

なんかつじのさんがはまっているのでメモ

- https://twitter.com/TSUJINO_SATOKI/statuses/230263952209231872
- https://twitter.com/TSUJINO_SATOKI/statuses/230264236356558848

さて、これはダメなのはわかりますが Fortran 規格は何もいっていないのでしょうか。


JIS X 3001-1:2009 (いわゆる Fortran 2003)のいうには:

5.2.1.5.1 形状明示配列
C542 (R511) 上下限が初期値式でない形状明示配列は、副プログラム 又は 引用仕様本体の中でだけ宣言できる。

おや、制約ではありませんね。で、読み進めると、

形状明示配列が初期値式でない上下限をもつとき、その上下限 及び 配列の形状は、手続に入る時に、その上下限の式を評価して決まる。

といっています。べつにOPTIONAL属性があってはいかん、とはいっていません。
配列がダメなら手続だ、ということで12章にいくと、

12.4.1.6 実在しない仮引数に関する制限
(中略)
実在しない省略可能な仮引数は、次の制限を受ける。
(中略)
(1) 実在しない省略可能な仮引数がデータ実体である場合には、その実体は引用も確定もしてはならない。(後略)

というんですね。データ実体てのは変数とか引数とかです。引用の定義が気になりますね。

2.5.6 引用
データ実体引用 (data object reference) とは、実行中のその時点での値を要求する形でデータ実体特定子を書くこととする。

というわけで、回りくどいですが、実在しないときだけダメなことがわかりました。

しかし不親切ですね。実際問題、自動割付け配列の上下限に使ってしまったら最後、その引数は省略できないのですからオプショナルにする意味はないので、こんな無茶な用例には警告を出すよう、コンパイラベンダーに文句をいうことはできないのでしょうか。

実はお願いはできても文句は言えません。

1.5 規格合致性
(中略)
(3) 識別番号の付いた構文規則 及び 制約によって認められていない拡張された形
又は 関係 [付属書Bで規定する廃止事項(1.8.1)を含む。] を使用しているプログラム単位について、その使用を検出し報告する能力を持つ。
(後略)

つまり、構文規則でも制約でもない「してはならない」は、プログラマに対して禁止しているだけで、コンパイラベンダーに対しては、報告しなくてもいい、結果プログラムがセグフォしようがOSクラッシュしようが好きにしてよいといっているわけですね。

残念ですが、そういうものです。

0 件のコメント:

コメントを投稿