fortranで文字列の配列を返すような関数を書こうと思ったら少し詰まったのでメモ。
コンパイラはgfortran
そもそもfortranで文字列の配列を宣言するのがちょっとめんどくさく
character(10,3) strings
character,dimension(10,3) strings
なんてのがうまく通らなかったりした。結局文字列の配列は
character*3 strings(10)
なんてので宣言できるんだが、これを返り値にしようとしたら、また一苦労。というのも、Cとかそのたぐいから入った人間なので
integer function hoge()
hogehoge
end function
みたいな形式しか知らず、この通りにさっきの型宣言を当てはめた
character*3(10) function hoge()
end function
なんてのは当然通らないわけだ。これを解決するのが、関数内で関数の型を宣言する方法で、
function hoge()
implicit none
character*3 hoge(10)
・・・・・・・
end function
とすれば関数の返り値を宣言できる。そしてメインプログラム内で使おうと思ったその時、更に壁が…
当然メイン内で関数の型を宣言しなくてはならぬのだ。
fortranは正直新しい情報をネットで見つけるのも一苦労で、externalで引用しようとしたが、やはりあの型の書き方だとうまくいかない。どうするかというと
interface
function hoge()
character*3 hoge(10)
end function
end interface
をメインプログラム内にかく。このinterface宣言、引数の型も決めることができるので、現代はこっちが使われて、externalはむしろ仕様非推奨だそうだ。
fortranは後方互換性を切らないのは利点でもあるが、仕様やらなんやらが混在した闇のプログラムみたいなのが存在するのがなかなかに厳しい。特にimplicitまみれは…辛い…