• ベストアンサー

C言語からのFortranプログラムの呼び出し

Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したいのですが,具体的にどのようなコードを記述すればいいのかがわかりません.お教えいただけないでしょうか. サブルーチンinputおよびoutputでは入力および結果ファイルの入出力を行っています. 当方C言語はほぼ初心者です.Fortranのプログラミング環境としてはVisualStudio2005およびVisualFortran9.1を用いています. C言語のプログラミング環境としてはおなじくVisualStudio2005を使用したいとおもっております. [メインプログラム] open (5,file='input.dat') open (6,file='output.dat') /入出力用のファイルを開く call input(parameter1) /各サブルーチンで有限要素法を実行 call bound(parameter2) call matrix(parameter3) call solve(parameter4) call output(parameter5) close (5) /入出力用のファイルを閉じる close (6) stop end

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「Fortranで記述した以下のような構成の有限要素法プログラムをC言語から呼び出したい」ということですが, 見た感じではその Fortran プログラムはそれだけで完全なプログラムになっているので, 必要なデータをファイルに保存しておいて, しかる後に別プロセスとして実行すればいいだけではないでしょうか. system か ShellExecute か, そのあたり?

studio_one
質問者

お礼

回答ありがとうございます. 現時点で,私のプログラムでは変数の受け渡し等はなく,データファイルを介してデータをやりとりするだけなので,確かに別プロセスとして実行すれば問題ありませんでした(^ ^); ご指摘どうもありがとうございます! 今後のことを考えると,サブルーチンを呼び出すことも必要になってきそうなので,しばらく自分で色々トライしてみて,それでもわからない場合にはまたお世話になるかもしれません. みなさん早速のご回答どうもありがとうございました!

その他の回答 (2)

  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.2

#1です. すみません,私の回答は環境が違うと駄目ですね. 無視してください.

studio_one
質問者

お礼

早速の回答ありがとうございました. VisualStudio2005とVisualFortran9.1という環境でプログラミングしてらっしゃる方というのは意外と少ないのでしょうか. ネットを検索してもほとんど例が無いもので・・.

  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.1

とりあえず,このあたり参考になりませんか. http://www.hitachi.co.jp/Prod/comp/hpc/foruser/sr2201/tebiki/CtoF.html 私も似た様なこと(ただし,純粋なFortranではなく,Fortran準拠のMatlab関数呼び出し)を やったことがありますが,非常に面倒だったのを覚えています. たとえば,多次元配列で,Cですとメモリに行->列の順でアクセスするところを, Fortranだと列->行の順でアクセスするので,そこを考慮して配列の値の格納・取り出しを 行わないと変なことになる,など. 頑張ってください.

関連するQ&A

  • FortranプログラムからC言語で実装された関数を呼ぶには?

    Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか? ユーザーガイドによれば、「Fortranプログラム中に、C_EXTERNALという宣言をした関数は、Cの関数と同じくアクセスできるようになり、C側では、#extern <返り値>関数名(引数)を与えれば、Cの関数として呼び込むことができる。」とのことがかかれています。 実際に使っているファイルをいくつか書き出します。 <D:\fortran\sample.f> C_EXTERNAL WRITE 'WriteFile' : INTEGER*4 INTEGER*4 RESULT RESULT=WRITE() write(*,*) result return end <D:\fortran\sample.c> #extern int Writefile(int); <C:\Program Files\Silverfrost\FTN95\ftn95c.bat> ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 /link ちなみに、「Cpad for Salford FTN77」での実行/設定/実行/コンパイル時のパラメータは「/link /dreal」です。もちろんftn95.exeへのパスは通してあります。何が問題でしょうか? 何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

  • FortranプログラムからC言語で実装された関数を呼ぶ方法

    Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか?何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

  • FORTRANの入出力

    C言語にもFORTRANにも入出力関数がありますが、FORTRANの入出力関数はOS上のC言語 の入出力関数(api)とは別なんでしょうか? それともFORTRANの入出力関数はCの入出力関数に置き換える仕組みになってるのでしょうか? また、FORTARANってOSがないPC上でも動くのでしょうか(動いてたのでしょうか)

  • 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ファイルを作成する必要があるのか?

  • FORTRANについての質問です。

    最近課題でFORTRANをやっているのです。 サブルーチンのMINVS/D/Q/C/Bというのを使って3×3の行列の逆行列を出力するプログラミングを作っているのですが、うまくできません。 サブルーチンを使うのはほとんどはじめてなのでどう使えばいいのかさえ良くわかっていません。 なにかアドバイスがありましたらお願いします。

  • FORTRANのプログラムです。

    FORTRANのプログラムです。 下に記載したプログラムを、行列値の計算にするプログラムに改良するにはどうすればよいでしょうか? アドバイスお願いします。 c *************************** if(root.LT.x0) GOTO 11 x0=root; x1=xs0; x2=xs1 GOTO 99 11 x0=root; x1=xs0; x2=xs2 GOTO 99 c c *************************** OPEN(6,FILE='sum.dat') 1002 FORMAT(E12.5,3x,4(E12.5,4x)) CLOSE(6) STOP 100 END c ************************* SUBROUTINE FRES(x,F) DOUBLE PRECISION x,F c f=3.*x+DSIN(x)-DEXP(x) f=(x-1.)*(x-2.)*(x-3.)*(x-4.)*(x-5.)*(x-6.) RETURN END よろしくお願いいたします。

  • プログラミングの授業で Fortran 90/95 言語を使った 「計

    プログラミングの授業で Fortran 90/95 言語を使った 「計算機ソフトウェア」という授業があり,以下のような課題が出ました。 ファイルからデータを入力し,それに対して何らかの処理を行い,結果をファイルに出力する,Fortran 90/95 言語を使ったプログラムを作成する問題を自分で作り,その回答(プログラムリスト)を記述せよ。 ただし,以下の内容を満足すること。 ・入出力には書式を用いる ・配列を使用する ・DO文を使用する ・IF文を使用する ・関数またはサブルーチンを使用する ・レポートには,問題の説明と処理の方法の説明を書き,プログラムリストと結果の評価を添えること。 並みのプログラムではダメらしく,(アイデア的にも)素晴らしいプログラムを作らなければならないのですが,まったく良い案が思いつきません。 良かったら,何か,教授をあっと言わせるような,プログラムの案, もし良ければ,プログラムリストの内容(PROGRAM ○○  IMPLICIT NONE ~~~)を添えて回答いただけないでしょうか? どうか,よろしくお願いします。

  • Visual C++とVisual Fortranの変数を共用したい

    FORTRANで作成したサブルーチンを活用し、C++からコールする形でコードを再利用しようと考えています。 C++からFORTRANを呼び出すのはすぐに出来たのですが、データの引渡しで困っています。 FORTRAN側ではグローバルな変数を多数(100個以上)宣言しており、引数としては渡せないのでC++側でも同名の変数を宣言して共用し、データのアクセスをしようと目論んでいます。FORTRAN側のコードは極力触りたくありません。 しかし、FORTRANでexternに相当する宣言の仕方が分からず、うまく同じ領域を共用できるようになっていません。 具体的にどんなことをすれば良いのかご存知の方がいらっしゃいましたら、ぜひご教授願います。 宜しくお願いします。

  • fortran 配列宣言のオーバーフロー

    fortranの配列宣言について質問です。 下記の様に配列の変数をサブルーチンの内外で宣言することで違いが出てきました。 こういうものなのでしょうか。失礼します。 parameter(ine=4999) c call test1(ine) !error call test2() !OK stop end subroutine test1(ine) dimension ary1(ine,50) return end subroutine test2() parameter(ine=4999) dimension ary1(ine,50) return end

  • Fortran90/Fortran95→Fortran77

    大学の授業でFortranを使ったプログラミングを勉強しています。 以下の文が大学のPCに入っているコンパイラでは問題なくコンパイルでき実行できるのですが、家のPCだとコンパイルすることが出来ません(以下の文でエラーが出ます) 大学のPCの開発環境はFujitsu-FORTRANだと思います(^ ^; 家のPCはSalford FTN77 Personal Edition CompilerとCPad for Salford FTN77を組み合わせて使用しています なぜエラーがでるのか自分なりに考えた結果、Fortran90/Fortran95のプログラムをFortran77のコンパイラでコンパイルしているからだと思います(全くの勘違いだったら指摘して下さい) Fortran90/Fortran95の開発環境がフリーで整えばいいのですが、見つからないのでプログラムを修正したいと思います そこで、力を貸していただきたいのです 前置きが長くなりましたが、エラーが出る文は以下のところです open(8,file='freq_ex13.dat',action='write',status='replace') ここを、Fortran77のコンパイラでコンパイルできるようにアドバイスを下さい よろしくお願いします

専門家に質問してみよう