こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

fortran:関数副プログラムへ関数の引数 以外の変数を渡すには?

初心者で解説書のどこを見たらよいのかも分からない状態です。キーワードだけでもお願いいたします。
Fortranでプログラムを作っていますが、次のような状況です

do i=・・・
do j=・・・

call【既成のライブラリ関数名】(f,・・・)

・・・・・・・
(ほかの処理)
・・・・・・・
end do
end do

既成のライブラリ(今は数値積分)の要求する引数の中で1変数の関数名が要求されるのですが、実は今の自分の処理している問題ではfがdoループのカウンタの"i、j"に依存するのです。
実は、fはある行列Hにxで表される量を足したり引いたりした後の逆行列の(i,j)成分です。
だからfの依存性はf(x,i,j)というところです。

この状況でライブラリにfをあたかも積分変数の1変数関数であるかのようにわたすにはどうしたらよいのでしょうか?

ご存知の方はよろしくお願いいたします。

投稿日時 - 2002-05-10 01:40:15

QNo.267459

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

間に副プログラムg(x,i,j,z)をかませれば計算可能と思います。安易な考えですがとにかく作りたいのであれば試されてはどうでしょうか。帰ってきたzを
call【既成のライブラリ関数名】(z,・・・)
で使います。
subroutine g(x,i,j,z)
c--------
c 入力 :x,i,j
c 出力 :z(返値1)
c--------
:
:
c i,jの条件に従って関数f1..fnを呼ぶ
if(i.eq.....) then
call f1(....)
elseif(......) then
call f2(....)
:
endif
:
return
end

投稿日時 - 2002-05-10 11:33:44

お礼

お返事ありがとうございました。
お礼が遅れて大変申し訳ありません。
zに相当するものがそれ自身内部にパラメータをもった関数名z(x)なのです。ライブラリのなかでそれがdoループのカウンタとxに応じて呼び出されxで積分されるはずでした。

お返事を下さった方々にこの場をかりてお礼申し上げます。

投稿日時 - 2002-05-19 16:47:00

ANo.1

文法はやや適当なので,アルゴリズムだけ参考にしてください.
gは配列で,ixはその添え字です.
------------------------------------------------------------
配列 gの宣言

do i=・・・
do j=・・・

do ix=・・・
g[ix]=f(ix,i,j)
end do

call 積分(g,添え字の範囲)

・・・・・・・
(ほかの処理)
・・・・・・・
end do
end do
------------------------------------------------------------
こんな感じでよろしいでしょうか.

投稿日時 - 2002-05-10 02:13:45

補足

すばやいお答えありがとうございます。
でも、多分私の考えている問題ではg[ix]のixにあたるものが連続変数でなければいけないと思うのです。ライブラリの中から呼び出された時に呼び出された時点でのdoループのカウンタの値を使って関数を返してくれなければいけないのです。
説明が悪くて申し訳ありません。
ほかにいい手はないでしょうか・・

投稿日時 - 2002-05-10 02:29:23

お礼

先ほどはありがとうございました。

どうやらcommon文でうまくいくようです。
でも、この宣言文では、パラメータは渡せないのですね。
結局、副プログラム中にもパラメータを書くことになってしまうのですが、パラメータをいじった結果をしらべる目的のプログラムなので、いちいち主プログラムと副プログラムのパラメータを変更しなければいけないようで、困っています。
もし、よいお知恵をお持ちでしたらまたよろしくお願いします。

投稿日時 - 2002-05-10 03:41:20

あなたにオススメの質問