• 締切済み

CとFortranのコードを併用する方法

昔からあったと思いますが、最近CとFortranを併用することを考えています。片方の言語で関数とかサブルーチンを作っておいてコンパイルしてオブジェクトをだけを作成し、もう片方の言語でそれを呼び出してコンパイル時にリンクして使用するという風に考えています。コンパイラの組み合わせが何でもいいとは思えないのですが、どのようにするものでしょうか。あるいはコンパイラ以外のツールが必要だとか。コンパイラは両言語ともGNU, intelなど提供元をそろえる必要があるとか、そういうことになるのでしょうか。よろしくお願いします。

みんなの回答

  • puikyua
  • ベストアンサー率0% (0/0)
回答No.3

最近の Fortran は、C言語との連携を強化するように規格でインターフェースなどを規定して固めてきているので、昔に比べるとはるかに容易に相互運用できるようになっている。 Fortran で subroutine や function を定義する時、bind という修飾子でリンカーに見える名前を決定できるので、C 形式のインターフェースを持つ言語とは、その名前でリンク出来る。また仮引数の宣言時に value 修飾子をつけると call by value で呼ばれるので、C 側ですべてを call by reference にする必要もなくなった。 Fortran 側で interface を定義して C API を呼ぶのも同様。 subroutine kitajima(x, n, z) bind(c, name = 'subrou') real, value :: x integer, value :: n real, intent(in out) :: z(n) ... 上の例では Fortran のサブルーチン kitajima が、リンカ―には subrou という名前にみえることになる。スカラー変数 x, n は値呼び出し、配列 z は参照呼出しされる。 単純な関数・サブルーチンを呼ぶくらいなら、Linux 系では gnu / intel / llvm などをくんずほぐれつ混ぜこぜにして行ける。特別、用意すべきものもない。標準ツールと標準文法の範囲内の記述で話は済む。昔のようにバラバラなベンダー拡張などに頼る必要が無くなった。(32bit Windows は命名規則の問題で厄介。) 派生型/構造体程度なら簡単に共有できる。ただ Fortran は OO 化や allocatable のスマート・ポインタ化が進んでいて、この辺を C と連携させるのは最新規格で論じられているところでまだ難しい。 仔細に及ぶことは以下のタイトルの文書を検索して読めば一応詳しく書いてある。 The new features of Fortran2003 The new features of Fortran2008 The new features of Fortran2018

全文を見る
すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

とりあえず、お手軽なのはGCC(GNU Compiler Collection)かと。 CもFortranも含まれていますし考えておられることもできたはずです。

skmsk1941093
質問者

お礼

回答ありがとうございます。最近あまりそのことを説明する文献とかサイトが無くなっているように思います。Fortranをやる人の年齢があがって、新言語として学ぶ人が減ってこういう需要がなくなっているからかなと思いますが。若年層はPython, Juliaとかに向かうんだろうと思います。あとCを教養的に勉強しているとか。Fortranは高齢化しているように見えるのですが。

全文を見る
すると、全ての回答が全文表示されます。
  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.1

併用する理由は? メリットは皆無、デメリットしかないと思うのだが・・・ 両言語は、関数の引数や戻り値の扱いも異なるので混乱を招くだけでしょ。

skmsk1941093
質問者

お礼

回答ありがとうございます。いずれもライブラリなどのソースコードがすでに確立している場合、呼び出し側・呼び出され側の仕様に齟齬がなければお互い利用すべきではないかと思うのですが。ライブラリの幅は広がるように思います。特にFortran側から見るCの方がビット処理とか文字列とか得意分野あるように思いますし、昔と違ってCのライブラリも多くなっているように思います(書籍のサンプルとか)。Fortranのいいところは言語としてのバージョンアップが少なく、はっきり区別できるように思います(Cはいろいろあり過ぎかと)し、古いライブラリはたっぷりあります。 得意分野と資産を利用して幅が広がるのではないかと思います。20年ぐらい前からそういうことができていて説明もあったと思いますが、最近はどうかなと思っているのですが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

  • GNUコンパイラとIntelコンパイラの違いについて

    今回fortranとC言語で書かれたWindows用プログラムをLinux用に移植することになりました。GNUのコンパイラを使用し無事コンパイルできたので実行したのですが"Segmentation fault"となりうまく実行できませんでした。そこで試しにIntelのコンパイラを使用しコンパイルしてみたところGNUのときとは違い"Segmentation fault"とは出ず、プログラム内のエラーチェックに引っかかり止ってしまいました。同じソースコードにもかかわらず止まる箇所が異なります。 今まで考えたことがなかったのですがGNUとIntelのコンパイラの違いはなんなのでしょうか?また、この二つ以外にいいコンパイラはあるのでしょうか?

  • Fortranのバージョンアップと古いソースコード

    Fortranは科学技術計算の古い資産が使えるということでまだ使われていると思います。 しかも、コンパイラ・リンカは製品としてバージョンアップしているわけですが、新しくなっても古いコードはコンパイル・リンク・実行できると思っていました。最近、intel fortranの更新をしたのですが、動作がかなり違ってきました。F77,F90,F95などの更新ではなく、intel社の製品としての最新版への更新です。コンパイル・リンクまでは行くのですが、実行させたとたん、ゼロ割のようなメッセージが出て、実行が打ち切られてしまいます。1時間ぐらい走るプログラムなのですが、1秒で打ち切りでした。必ずそうなるということではありません。特定のライブラリで生じます。そのライブラリは古い(言語としてはF77)ので当然ながら新しいコンパイラで動くなどと書いていません。ただソースコードの塊であり、古いコンパイラでは動いていたのです。古いと行っても2009年ぐらいに買ったintel visual fortran ver.11ぐらいのもので2016年のコンパイラと大幅な変更はないはずなのですが。例えば最新版(2016年2月時点)の方は並列関係の設定の方がデフォルトで並列計算しない設定をコンパイラオプションで指定しないとおかしくなるということでしょうか(たぶんGPUには対応していないと思いますが)。どっかに書いてあるかなと思案していますが。 何か心当たりがあればよろしくお願いします。

  • ABAQUS ユーザーサブルーチンの使用について

    ABAQUSで解析を行っております。 今回、FORTRANで記述したユーザーサブルーチンを使用することになりました。 ABAQUSサポートに問い合わせたところIntel FORTRANコンパイラのみ サポートしているとのことでしたが、今回のみの使用のため、フリー コンパイラもしくは、コンパイル済みのファイルを使用して解析が できないかと考えています。 Intelコンパイラを使用せずにユーザーサブルーチンを使用する方法 をご存知の方がおられましたら方法を教えていただけないでしょうか。 以上、よろしくお願いいたします。

  • fortran77 include文

    Intelのifcコンパイラでコンパイルしようとすると、fortran77で書かれたコード内のinclude文を読み込んでくれないのですが、この場合なにか対処法はありますか?教えてください。

  • C++からfortran77を呼び出す

    はじめまして。質問させて下さい。 私はfortran77で書かれたパッケージで使用されてる関数を、C++から呼び出して使えるコードを書いています。 けど、コンパイルがうまく通りません。 f77 -c -o main.o main.f f77 -c -o sub.o sub.f g++ -c Jikkou.cxx g++ main.o sub.o Jikkou.o -lg2c するとここで、以下のようなエラーを吐いちゃいます。 main.o: In function `main_': main.f:(.text+0x12c): undefined reference to `ran_' main.fとsub.fは、fortran77で書かれてるmainプログラムとサブルーチンです。 main.fの中で、乱数を出す為にRAN()を使ってるんですが、g++はこの関数が分からないようです。 どうにかg++にRAN()を分からせるいい方法はありませんか?

  • 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を使用しています。 足りない情報は出来るだけ追記していきますので,ご教示宜しくお願いします。

  • intel fortranコンパイラについて

    現在intel visual fortran コンパイラー11を使用しています その中で大規模な配列を使用する必要があり プラットフォームをx64にしコンパイルをしたところ LNK1248 イメージ サイズ ('size') が最大許容サイズ (80000000) を超えています と出てリンクができませんでした。x64でも4GBを確保する事は出来ないのでしょうか 以上宜しくお願い致します

  • シンボルに@n接尾辞がついているライブラリへのリンク(Fortran)

    インテル fortran Windows版 ver.11を使用しています。 あるライブラリを使用したf90のプログラムをビルドしようとしています。 コンパイルは通っているのですが、 リンクする際にシンボルが見つからずにリンクエラーとなってしまいます。 call func(varA, varB) のソース二対して、 LNK2019: 未解決の外部シンボル_FUNCが参照されました。 というような具合です。 ライブラリの中身を見てみると(nmコマンド) _FUNC@8 のようなシンボルが定義されているのですが、 一方でインテルコンパイラは _FUNC というシンボルを検索しているので未解決となってしまっているようです。 インテルのコンパイラオプション等でこのような@nの接尾辞がついたシンボルを 正しく検索、リンクできるようにする方法はないでしょうか? (サブルーチン名に@8を含めてしまうというのも一つの手段ですが、 @が予約語であるため、サブルーチン名に使用することができません。) ご存じの方がいらっしゃいましたら、ご教授いただけば幸いです。 よろしくお願いいたします。

  • FortranをC++(VC++)へ変換

    FortranをCまたはC++へ変換したいと考えています。 f2cを使うと、一応変換は行ってくれるものの、出来あがったCのプログラムをコンパイルする際、fortranのライブラリを参照する必要があるなどの制約が生じてしまいます。 VC/VC++に対応したプログラムソースへ変換するツールをご存知ないでしょうか? また、今だと、VC#まで変換してくれるツールがあると非常に便利なのですが・・・ 大量のソースコードを変換する必要があり、変換時のミスなどを考えるとツールで機械的に変換する方法を探しています。

このQ&Aのポイント
  • パソコンを使用する際に頻繫に表示されるSIMPPL ESTAR SOFTWAREの信頼性や必要性について教えてください。
  • SIMPPL ESTAR SOFTWAREの表示が頻繁に出る理由と、その信頼性や必要性について教えてください。
  • お使いのパソコンで頻繁に表示されるSIMPPL ESTAR SOFTWAREの信頼性や必要性について教えてください。
回答を見る

専門家に質問してみよう