• ベストアンサー

式の組み込み

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=・・が反映されていないようです。 どの様にしたらいいのか教えて下さい。

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

  • ベストアンサー
  • equinox2
  • ベストアンサー率48% (321/660)
回答No.3

>subroutineで書いたのを以下に載せます。 function setcns (y)  とfunctionで書かれていますが subroutine で書くなら、kも引数にしましょう。 ただ、この例なら一般的にはfunctionを使うべきでしょうね。 call setcns (y) が k=setcns (y) に変わり k=1.0d0+y は  setcns=1.0d0+y ですね。

BOY12345
質問者

お礼

ありがとうございます。 ってことは、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

その他の回答 (2)

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.2

#1さんと、同意見・・・ > call setcns (y) > x=k+3.0d0 x=setcns(y)+3.0d0 > k=1.0d0+y setcns=1.0d0+y と、それぞれ置き換えじゃない?

BOY12345
質問者

お礼

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

回答No.1

古いFORTRANしか知らないので、見当違いかも知れませんが。。。 kの値をメインに返していないし、メイン側ではkに値を入れずに計算に使用しているから、kの値は0のままになっているからでは?

BOY12345
質問者

お礼

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

関連するQ&A

  • なぜ計算結果が出力されないのか・・・

    エラーも何もないプログラムなのに、計算されません。 答えは、401.0になるはずなのに・・ 理由がわかりません。 コード載せておくので、どなたかお願いします。 implicit real*8 (a-h,o-z) Parr_M=1.0d0 Temp=1.0d0 Mc=val_Mc (p,M_C_gamma,M_C_alpha) x=Mc+1.0d0 write(6,10) x 10 format(1H ,F9.3) end ーーーーーーーーーーーーーー real*8 function val_p (Parr_M) implicit real*8 (a-h,o-z) val_p=Parr_M(ix,iy)**3 return end ーーーーーーーーーーーーーー real*8 function val_Mc (p,M_C_gamma,M_C_alpha) implicit real*8 (a-h,o-z) val_M_C_alpha=M_C_alpha(Temp) val_M_C_gamma=M_C_gamma(Temp) p=val_p (Parr_M) * val1=val_M_C_alpha val2=val_M_C_gamma*p val=val1*val2 * val_Mc=val return end ーーーーーーーーーーーーーーー real*8 function M_C_alpha(Temp) implicit real*8 (a-h,o-z) M_C_alpha=Temp/2.0d0 return end ーーーーーーーーーーーーーーー real*8 function M_C_gamma(Temp) implicit real*8 (a-h,o-z) M_C_gamma=Temp return end ーーーーーーーーーーーーーーー 以上をはしらせると、 『forrtl: severe (157):Program Exception - access violation』 と出てきます。謎です。結果もちゃんと出る様に、F9.3で入力してるはずだが・・

  • 配列Xの平均値を求める関数副プログラムaver(x,n)の作り方

    配列xに入っているデータの平均値を求める関数副プログラムaver(x,n)の作り方がよく分かりません。 function aver(x,n) implicit real*8(a-h,o-z) real*8 x(*) !!この部分が分かりません。!! return end 教えてください。 よろしくお願いします。

  • 配列 x に入っているデータの個数を求める関数の作り方

    配列 x に入っているデータのうちで、値が正(つまり x(i) .gt. 0.0d0 ) であるデータの個数を求める関数 numpos(x,n) を作り方を教えてください。n はデータの個数。 implicit real*8(a-h,o-z) real*8 x(1000) dummy = rand(13) 乱数の初期化 n = 1000 do 10 i=1,n x(i) = rand(0)-0.4d0 テストデータ 10 continue write(6,*) 'numpos =', numpos(x,n) stop end function numpos(x,n) implicit real*8(a-h,o-z) real*8 x(*) この部分が分かりません。(関数副プログラムなので、関数の値、つまり正のデータの個数は、関数名と同じ名前の変数、つまり numpos という名前の変数へ代入すること、らしいです。) return end とても困っていますし、急いでいます。 誰か助けてください。 よろしくお願いします。

  • UNIX フォートラン 数値計算精度

    フォートランでの数値計算精度に関して困っております。 サンマイクロシステムズ社製、UNIX、Solaris10(64bit)において、 下のフォートランプログラム、 IMPLICIT REAL*8(A-H,O-Z) X=1.0D0 A=SIN(X) WRITE(*,100)A 100 FORMAT(F50.40) STOP END を実行させると、 A=0.8414709848078965048756572286947630345821 となり、16桁以降にも数値が出てきます。 これはなぜでしょうか? UNIXコンパイラの特徴なのでしょうか?

  • 配列Xの最大値、最小値を求めるサブルーチンmaxminの作り方

    配列Xに入っているデータの最大値、最小値を求めるサブルーチンmaxminの作り方を教えてください。(n:データ数) subroutine maxof(x,n,xmax,xmin) implicit real*8(a-h,o-z) real*8 C 最大値は変数xmaxに、最小値は変数xminに代入する  !!この部分が分かりません!! return end 教えてください。 よろしくお願いします。

  • mの平方根の連分数展開なのですがうまく動きません。

    subroutine keisan(m) integer a,a0,n,i,m real t,X,Y,Z t=sqrt(real(m)) a0=int(t) write(*,*) 'a0=',a0 a=a0 X=1 Y=0 Z=1 do 10 n=1,20 if (Z==0.0) exit X=X*Z Y=Z*(-Y+real(a)*Z) Z=X*X*real(m)-(real(a)*Z-Y)**2 do 100 i=1,X if(real(i)==X) then X=X else if(((mod(int(X),i))==0).AND.((mod(int(Y),i))==0).AND.((mod(int(Z),i))==0)) then X=X/real(i) Y=Y/real(i) Z=Z/real(i) else X=X endif endif 100 continue a=int((X*t+Y)/Z) write(*,*) 'a',n,'=',a 10 continue end subroutine サブルーチンのみ載せてますけど・・・・どうなのでしょう??

  • 配列 x に入っているデータの最大値、最小値を求めるサブルーチンとそのヒストグラムの作り方

    配列 x に入っているデータの最大値、最小値を求めるサブルーチン maxmin(x,n,xmax,xmin) を作り方を教えてください。 n はデータ数。 最大値、最小値はそれぞれ xmin, xmax に代入する。 次に、そのサブルーチンを用い、x に入っているデータのヒストグラムを作成するプログラムを作り方も教えてください。 (途中までしか分かりません) implicit real*8(a-h,o-z) real*8 x(10000) integer count(100) ndiv = 40 分割数は 40 にする n = 10000 データ数は 10000 dummy = rand(13) 乱数の初期化 do 10 i=1, n sum = 0.0d0 do 20 j=1,5 sum = sum + rand(0) 5個の乱数の和 20 continue x(i) = sum 10 continue call maxmin(x,n,xmax,xmin) 最大・最小値を求める dx = (xmax - xmin)/ndiv 分割幅 !!count をゼロで初期化する do ループを追加!!(よく分かりません) !!ヒストグラムを作成する do ループを追加!!(よく分かりません) do 100 k=1, ndiv write(6,*) xmin+(k-0.5d0)*dx, count(k) データの中心値と個数を出力 100 continue stop end subroutine maxmin(x,n,xmax,xmin) implicit real*8(a-h,o-z) real*8 x(*) !!この部分を作成してサブルーチンの完成のさせ方が分かりません!! return end ところどころが分かりません。 とても困っていますし、急いでいます。 だれか教えてください。 よろしくお願いします。

  • fortran90 引数で渡された関数の呼び出し

    fortran90を始めて間もない者です。 メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。 このサブルーチンを自前で作成するのが目的です。 引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。 Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・ !-------------------------------- subroutine sub(func1, a) real::a interface real function func1(x) real::x end function func1 real function func2(x) real x end function func2 end interface call sub2(func2, a) write(*,*) a return end subroutine sub !-------------------------------- real function func2(x) real::func2, x ! ここでfunc1を呼び出したい ! func2=func1(x) end function func2 !-------------------------------- subroutine sub2(funca, a) real::a interface real function funca(x) real::x end function funca end interface a=funca(10.) return end !-------------------------------- program main external func real a call sub(func, a) write(*,*) a end program !-------------------------------- function func(x) real func, x func=2.*x*x end function func

  • fortran 実行結果がうまく表示されない

    グローバルモジュールを用いてプログラムを書いたのですが実行結果が表示されません、プログラム中に問題があるのでしょうか?教えて下さい。 module params implicit none integer :: n = 2 end module params module sample implicit none contains subroutine swapvec3(x,y) use params real(8), intent(inout) :: x(n), y(n) real(8) tmp(n) tmp(1:n) = x(1:n) x(1:n) = y(1:n) y(1:n) = tmp(1:n) end subroutine swapvec3 end module sample program main use sample implicit none real(8), allocatable :: a(:), b(:), tmp(:) integer n allocate(a(n),b(n),tmp(n)) call swapvec3(a,b) call random_seed call random_number(a) call random_number(b) call random_number(tmp) write(*,*) ' a = ', a(1:n) write(*,*) ' b = ', b(1:n) write(*,*) ' tmp = ', tmp(1:n) end program main 実行結果  a = b = tmp =

  • ニュートン法

    フォートランでf(x)=0の解を求めるこのようなプログラムを作りました。 program nyu-ton implicit none real::x,f,dfdx read(*,*)x do call FDF(x,f,dfdx) x=x-f/dfdx write(*,*)x,f if(abs(f)<1e-7)exit end do stop end program nyu-ton subroutine FDF(x,f,dfdx) implicit none real::x,f,dfdx f=x*(x-2.0) dfdx=2.0*x-2.0 end subroutine FDF このプログラムをニュートン法で複素関数の解を求めるプログラムにするには、どこをどのように変えればよいのかわかりません。 z^3+z=0 や z^3=512iのような問題を数値的に解くプログラムを作りたいんですが、教えてください願いします。

専門家に質問してみよう