• 締切済み

Fortran "実引数の型が仮引数の型と異なります。"

Fortran "実引数の型が仮引数の型と異なります。" Intel Visual Fortranの最新版をMS Visual Studio 2008で使用(お試し)しています。 既存のFortranプログラムでエラーが出て、使えなくなりました。 問題点を要約すると以下のようなシンプルなコードに集約されました。 ---------------------- 00 program main 01 call sub1(10.d0) 02 call sub1(10.0) 03 end ! ---------------------- 04 subroutine sub1(rr) 05 real*8 rr 06 write(*,*) 'rr = ', rr 07 end subroutine ! --------------------- 昔のFortranでは、Subをcallする時に、仮引数の型と厳密に一致していなくても、うまく処理してくれたと思います。(倍精度でも整数でも、同じ数値とみなして) オプションのルーチンインターフェースのチェック(/warn:interfaces)をオフにすると、コンパイルは出来るようになるのですが、上記プログラムの計算結果は、01行と02行で結果が異なってきます。 (02行はおかしな値が入る) 本来、ランタイムエラー防止の観点からは、このような厳密性を要求するのは良いことだと思いますが、既存のプログラムが実行できなくなるのは痛手なので、何かオプションの変更で対応出来ないものでしょうか? よろしくお願いいたします。

みんなの回答

回答No.2

オプション指定の結果についての補足、拝見しました。 6つのうち、後ろ3つはともかく、前3つはどのような値でそうした結果になったのでしょうか。 また補足された他の例を見ると、定数解釈の違いというより、古い言語仕様で解釈するオプションが妥当な気がします。 解説を読むと該当部分を上手く処理できるようには思えないのですが、 http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg04_01_26.htm などどうでしょうか。

参考URL:
http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg04_01_26.htm
monomei
質問者

補足

現在サポートで確認中のため、質問者本人のみ投稿内容をご覧いただけます。ご迷惑おかけいたしますが、しばらくお待ちください。
回答No.1
参考URL:
http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg04_01_31.htm
monomei
質問者

補足

ご返答ありがとうございました。 早速テストしてみましたが、やっぱりダメでした(これで解決する、と思ったんですが。。。)。結果は、以下のようになります。 r = 524288.000000001 r = 5.398241245570834E-315 r = 2.641070453192158E-308 r = 10.0000000000000 r = 10.0000000000000 r = 10.0000000000000 補足ですが、倍精度・単精度の時だけでなく、文字列のサイズが違う場合や、以下のような配列の例でもだめのようです。 ------------------- real x call sub(1,x) ----------------------- subroutine sub(n,y) dimension y(n) ※1要素の配列と、変数(非配列)を同一視してもらえない。 既存のプログラムではこのように成っているので、昔はできたということだと思います。 申し訳ありませんが引き続きよろしくお願いいたします。

関連するQ&A

  • FORTRAN の引数について

    FORTRAN の引数について FORTRANからCへの移植のため解析中なのですが引数の宣言について教えてください。 SUBROUTINEで次のような関数の時、引数の表現はどういった意味を表しているのでしょうか? SUBROUTINE AA(VAL1,VAL2,VAL3,VAL4,*,*,*) CALL AA(VALUE1,-5.D-03,5.D+04,1.D+00,*100,*3,*1) 引数はREAL型でこの時の2~4番目の表現と5番目以降の*付の数字の意味です。 ちなみにCALLは数箇所で呼ばれており、その度に*100以外の部分は宣言が 変わっています。

  • Fortranのサブルーチン引数について

    他人が作ったFortran(恐らくFortran77)のプログラムで計算をしようとしています。 コンパイルはできるのですが,実行するとエラーが出てしまい困っています。 エラーメッセージは 「forrtl:severe(157):Program Exception - access violation」 となっていて,実行時エラー番号で調べると 「プログラムが適切な参照権を持っていない仮想アドレスに書き込み,または読み取り を行おうとした」と出ていました。 Fortran初心者の自分にはイマイチ意味が判らないのですが,エラーが出た後に サブルーチンのある決まった場所に黄色い矢印が示されます。 そこで今,その部分のサブルーチンを確認しているところです。 前置きが長くなってしまいましたが サブルーチンの中を確認している途中で疑問に思った所が一つあります。 問題のサブルーチンは --------------------------------------- call dbesl(EN,0,BX0,BY0,BI0,BK0)     subroutine dbesl(X,NOR,BX,BY,BI,BK) FN = NOR  ・  ・  ・ 11 NOR = FN               <---この行に黄色い矢印が出る return end --------------------------------------- となっているのですが,サブルーチンを呼び出すcall文の所で 2つ目の引数が『0』となっているのは正しい使い方なのでしょうか? どうもサブルーチン内の計算をしてメインプログラムに引数を返す所が おかしいような気がしています。 因みにメインプログラムに戻る際の"FN"の値は『0』となっていました。 コンパイラはCompaq Visual Fortranを使用しています。 足りない情報は出来るだけ追記していきますので,ご教示宜しくお願いします。

  • 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とC#の引数の引き渡し

    古いFORTRANのソースコードに以下のような記述がありました。サブプログラムへの引数の引き渡し方がC#とは大きく異なるようです。2次元の配列を1次元で引き渡したり、その逆程度あれば理解できるのですが、配列の特定の要素を2次元配列で受け取るようなやり方は配列の要素がどのように対応するのか全く理解できません。 どなたか、こうした引数の引き渡しについて、配列の要素レベルで、どのようなやりとりになるのかお教え願います。 Main側 integer mx , my , mz , lwrk , lww 整数の定義 real  x(mx) , z(mx*my) , wrk(lwrk)   実数の配列の定義 mz=mx*my call sub1( x , mx , z , mz , wrk(lww) , lwrk) サブプログラムsub1の呼び出し stop end Subroutine側 subroutine sub1( x , mx , z , mz , wrk , lwrk)    サブプログラムsub1 integer mx , mz , lwrk メイン側と一致 real x(mx) , z(mz) , wrk(lwrk) メイン側と一致 call subsub1( x , mx , z , mz , kx1 , kx2 , wrk(lsx) , wrk(lax)) サブプログラムsubsub1の呼び出し 疑問1 mainでは引数がwrk(lww)ですが、サブプログラムではwrkが対応する引数になり、ここから参照するsubsub1ではwrk(lsx)を引数としています。C#であればwrk(lww)とwrk(lsx)は配列でないため、何が行われているか理解できません。 return end subroutine subsub1( x , mx , z , mz , kx1 , kx2 , spx , ax) サブプログラムsubsub1 integer mx , mz , kx1 , kx2 real x(mx) , z(mz) , spx(mx,kx1) , ax(nx,kx2) 疑問2 sub1の引数wrk(lsx) , wrk(lax)が2次元の配列spx(mx,kx1) , ax(nx,kx2)に対応するようになっています。配列の引数lsxとlaxはどのような意味をもち、sub1のwrkの配列要素はどのように書き換えられるのでしょうか do 200 it=1,mx do 100 i=1,kx1 spx(it,i) = float(i*100)+float(it) 100 continue 200 continue Reurn End

  • fortran subroutineについて

    fortran subroutineについて c c c kk.f c c integer a,b a=0 do 10 b=1,9,2 a=a+1 print * ,a 10 continue write(*,*) ,'No.1' call sub(a,b) stop end c subroutine sub(a,b) write(*,*) ,'No.2' return end  簡単に上記のようにつくってg77でコンパイルしたのですが、call文とsubroutine文の部分で警告が出ました。  実行ファイルは問題なく動作をするのですが、このままでもいいのでしょうか?ちなみに、警告文を読んでも僕には理解できませんでした。  以下、警告文です。 kk.f: In subroutine `sub': kk.f:13: warning: call sub(a,b) 1 kk.f:17: (continued): subroutine sub(a,b) 2 Argument #1 (named `a') of `sub' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS] kk.f:13: warning: call sub(a,b) 1 kk.f:17: (continued): subroutine sub(a,b) 2 Argument #2 (named `b') of `sub' is one type at (2) but is some other type at (1) [info -f g77 M GLOBALS]

  • FORTRANとC++の連動について

    私は,Fortranを用いて解析の業務をしている,プログラム初心者です。 購入したのは,Intel Visual Fortran8.0(VF)ですが,Windows環境でコンパイルリンクするには,Microsoft Visual C++ .NET 2003(VC++)が必要ということで,こちらも購入しました。 普段は,Fortranのコンソールで ifort **.f といったコマンドでコンパイルリンクし,実行しているだけです。 これからは,VC++の方に移行していきたいと考えていますが,しばらくはFortranで作成したサブルーチンを有効活用したと考えています。 そこで,VC++ベースのメインプログラムからFortranのサブルーチンを呼び出すプログラムの作成方法,コンパイルリンク方法をご教授ください。よろしくお願いします。 (1)ソースにどう記述するか? void CMyDlg::OnBnClickedOk() { ここで,FORTRANのサブルーチンを呼び出したい。     Fortranなら call subroutine( a, b ) } (2)コンパイルするときは, Visual Studio開発環境で,コンパイル→実行で良いのか? それとも,あらかじめVC++とVFで.objファイルを作成する必要があるのか?

  • fortran77教えてください

    fortran77のプログラムについての質問です。 次のプログラムを実行するとどのような結果になるか教えてください REAL A,B,C,D,E,F A=7.0 B=5.0 CALL WASA(A,B,C,D) CALL WASA(C,D,E,F) WRITE(*,*)E,F STOP END SUBROUTINE WASA(P,Q,R,S) REALP,Q,R,S R=P+Q S=P-Q RETURN END

  • FORTRAN subroutineと配列と繰り返し

     以下のように二次元配列の場合でsubroutineを使うときに、主プログラムで2重Doループ(iとj)で繰り返しをしているのですが、すでにsubroutineでDoループ(i)を用いて計算しています。これではsubroutineの利点をうまく使えていないと思うのですが、subroutineを使って配列、Doループをきれいにする方法をどなたか教えていただけませんか。  実際は4重ループ、4次元配列なので、プログラムをわかりやすくするためにサブルーチンを使いたいと思っています。 -------------------------------------------------------------- program S real,dimension(5,5) :: B real,dimension(5) :: A integer :: i,j do j=1,5 CALL sub1(A) do i=1,3 B(i,j)=A(i)*j write(*,*) B(i,j) end do end do end program S subroutine sub1(A) real,dimension(5) :: A integer :: i do i=1,3 A(i)=3.*i end do end subroutine sub1

  • サブルーチンに引数を2つ以上渡したい

    Access2002、vba上で サブルーチンに引数を2つ指定したいのですが、 なぜか「コンパイルエラー 修正候補=」 と出てしまいます。 引数を1つにするとうまく動作します。 どなたかお分かりの方いらっしゃいましたら教えて ください。 宜しくお願いします。 サンプルコード: -------------------------------- the_subroutine(a, b) ' ※ここでコンパイルエラー Sub the_subroutine(c As String, d As Object) End Sub -------------------------------

  • Fotran77 > 関数の実引数に*99

    Fortran77の古いプログラムにおいて、 CALL FUNCA(0.D+0,1.D+0,NA,DA,WA,IPR,*99) という関数があります。 この関数の最後の実引数の"*99"は何を渡しているのでしょうか? 関数の中身では*99の部分は"*"として仮引数となっています。 そもそも、こういう文法はどういうキーワードで探せばいいものでしょうか?

専門家に質問してみよう