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

解決済みの質問

式の組み込み

implicit real*8 (a-h,o-z)
y=2.0d0
k=1.0d0+y
x=k+3.0d0
write(6,10) x
10 format(1H ,F7.3)
end

とすると、当然6.000が出力されます。ここにおいてk=1.0d0+yをfunction又は、subroutineで書こうと思い、
subroutineで書いたのを以下に載せます。
*main
implicit real*8 (a-h,o-z)
y=2.0d0
call setcns (y)
x=k+3.0d0
write(6,10) x
10 format(1H ,F7.3)
end
*sub
function setcns (y)
implicit real*8 (a-h,o-z)

k=1.0d0+y
return
end
これでビルドすると、『Variable K is used before its value has been defined』と警告されます。
走らすと、3.000と表示され、k=・・が反映されていないようです。

どの様にしたらいいのか教えて下さい。

投稿日時 - 2008-07-08 15:50:49

QNo.4160731

すぐに回答ほしいです

質問者が選んだベストアンサー

>subroutineで書いたのを以下に載せます。

function setcns (y)  とfunctionで書かれていますが
subroutine で書くなら、kも引数にしましょう。


ただ、この例なら一般的にはfunctionを使うべきでしょうね。

call setcns (y) が k=setcns (y) に変わり


k=1.0d0+y は  setcns=1.0d0+y ですね。

投稿日時 - 2008-07-08 17:49:48

お礼

ありがとうございます。
ってことは、1つのルーチンから2つの式をメインに返す場合は、サブルーチンですね。
そう考えて、組んでみたら見事できました。
こんな感じで作りました。
implicit real*8 (a-h,o-z)
y=2.0d0
call setcns (j,k,y)
A=j
B=k

x=A+3.0d0
z=B+3.0d0
write(6,10) y,x,z
10 format(1H ,3F7.3)
end

subroutine setcns (j,k,y)
implicit real*8 (a-h,o-z)

j=1.0d0+y
k=5.0d0
return
end

投稿日時 - 2008-07-08 19:11:43

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

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

回答(3)

ANo.2

#1さんと、同意見・・・

> call setcns (y)
> x=k+3.0d0
x=setcns(y)+3.0d0

> k=1.0d0+y
setcns=1.0d0+y

と、それぞれ置き換えじゃない?

投稿日時 - 2008-07-08 17:46:15

お礼

ずばりです!!
ありがとうございました。
1つのルーチンから2つの式を書くときはサブルーチン使ってやると良さそうですね☆上に載せてあるので、よかったら見てください。改善点ありましたら教えて下さい。

投稿日時 - 2008-07-08 19:14:05

ANo.1

古いFORTRANしか知らないので、見当違いかも知れませんが。。。

kの値をメインに返していないし、メイン側ではkに値を入れずに計算に使用しているから、kの値は0のままになっているからでは?

投稿日時 - 2008-07-08 17:17:46

お礼

おっしゃるとおりでした。
ありがとうございます。

投稿日時 - 2008-07-08 19:12:11

あなたにオススメの質問