[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000459] Re: proto2c



堀之内です。

文字長問題について。

 > つまり、サブルーチン側で何文字を期待しているのかがメインからはわからない
 > ので、メインでは 10 文字を与えていいのかどうだかわからないと
 > 心配していらっしゃるのです。

ということですね。

Fortran では渡された文字変数に十分な長さが確保されていればよし、
確保されていなければその長さで切ったぶんだけを返します。f2cした
ものは文字長を引数として渡しますから同じことが出来ますし、そうす
るようになってるのでしょう。ですから、文字を返すサブルーチンから
の出力が切れて良ければ、適当な長さを allocate したポインターを渡
してやればいいわけです。しかし、切れたらあまり嬉しくないですよね。
そういうことを避けるためには、何文字返すつもりかを呼ぶ前に知って
ないとなりませんが、それは無理というものです。

ですから、実際問題としては、とりあえずありそうな最大長をえいやっ
と仮定することになるでしょう。それでは嫌でまじめに対応するなら以
下が考えられます。

  (1) 適当な長さ(128 文字とか)を仮定して、返り値が入るはずの char
      変数を allocate して渡す。

  (2) 返ってきた文字列を検査して、おしりが null でなければ、倍と
      かに増やして呼び直す(前のは free して新たに長いのを 
      allocate する)。これをおしりが null になるまで続ける。

  (3) 最終的に得られた文字列を検査して、頭から最初の null までを
      結果の文字列として切り出す(新たに必要十分な長さの領域を確
      保して、それを最終結果の置き場とする。今までのは free する)。

(3)はなくてもいいですが、実際に使用するときに余計な null が沢山
ついてるのは嬉しくないですよね。


高橋くん>
 > 結局 C との絡みで考えると,Fortran での終端文字は何か?
 > という問題になるように思うんですが.

Fortranでは文字の終わりの判別を null とかいった特定の文字で行っ
ているのではないようです。f2cしたソースでは文字列引数があると、
その文字列の長さを与える引数が新設されます。よって fortran の実
装では、文字列の長さを与える隠れ引数があるんだろうと思います。長
年の疑問が解けた気がしました(嘘かもしれませんが)。

null文字は何かという問題はあります。文字列を返す Fortran サブルー
チンが内部で、

  cresult(1:5)='hello'

的な代入をしてれば、6文字目以降は C の null のままでしょうし、

  cresult = 'hello'

なら Fortran なりの null を入れてくれるのでしょう。ただ、f2c し
た C の関数では恐らく C の null を使うのではないでしょうか。それ
なら、困らないですね。

堀之内 武                     horinout@xxxxxx
京都大学宙空電波科学研究センター (旧超高層電波研究センター)
611-0011 宇治市五ヶ庄  phone:0774-38-3812  fax:0774-31-8463