
私は,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ファイルを作成する必要があるのか?
No.3ベストアンサー
- 回答日時:
まず、FortranとC++で1つのモジュールを作ることは出来ないと思います。
CとFortranではランタイムライブラリが違うし、さらに言うとVF8はIntel製です。やるなら、Fortranでライブラリ(staticまたはDynamic-link)を作り、C++からリンクするというやり方になると思います。
1.Visual C++で、MFCダイアログアプリを作成
2.新しいプロジェクトとして、Visual Fortranで、Static Libraryを追加。
3.test.fを以下の内容でFortranプロジェクトに追加
subroutine subsub( i, j)
!DEC$ ATTRIBUTES C::subsub
integer i, j
!DEC$ ATTRIBUTES REFERENCE :: i, j
c write(6,*) i,j
i = i + j
return
end
4.個の関数を呼ぶC++ソースで
extern "C"{
void subsub(int& i, int& j);
};
void CcmainDlg::OnBnClickedOk()
{
int i, j;
i = j = 1;
subsub(i, j);
TRACE("i=%d , j=%d\n", i,j);
OnOK();
}
5.C++のプロジェクトの依存関係の設定でFortranプロジェクトをチェック
ただ、Fortranの標準出力は使えません。
標準出力のライブラリはWindowsモジュールの
ライブラリと共存できないはずです。
リンクエラーが出ます
!DEC$ ATTRIBUTES
のところが一番知りたいところだと思いますが
スタートメニューの
[Intel(R) Software Development Tools]
[Intel(R) Fortran Compiler 8.0]
[Documentation Index]
を開いて、
Intel® Visual Fortran Compiler HTML Help Documentation
で
Programming with Mixed Languages Overview
を検索すれば載っています。
この辺はVF6の頃から変わっていなくて
わたしはVF6の日本語オンラインヘルプで読みましたが。
有難うございます。私もVF8の日本語ヘルプの該当個所を見つけることが出来ました。また,上記の方法で動作できました。
FORTRANにおける,!DEC$ ATTRIBUTESや
C++における extern "C" のところがいまいち理解できていません。命名規則や参照渡しに関する事項だと思いますが。
現状では,FORTRANのサブルーチンには全く手を加えたくないので,FORTRANは,subroutine subsub(i,j)まま(!DEC~を追加していない)で下記のようにしております。
VC++における呼び出し部では,
subsub(&i,&j);
ヘッダー部では,
extern "C"
{
void cdecl subsub(int*,int*);
}
として,うまく行ってます。
しかし,__stdcallを使うとうまく行かなかったりして,
路頭に迷っています。ご助言お願いします。
No.4
- 回答日時:
呼出規約の、cdeclと_stdcallは別物です。
アセンブラレベルで、どのレジスタを使うかとかというような規約です。さらに関数の名前付け規則でもあります。_stdcallは確か関数名の後に引数のバイト数が付きます。Microsoftのコンパイラはデフォルトでcdeclです。
なので、確かに
!DEC$ ATTRIBUTES C::subsub
はいりません。
>FORTRANのサブルーチンには全く手を加えたくない
標準入出力は使えませんよ?
_stdcallだと@4などと追加されていました。
標準出力は,visual c++では使えませんでした。
コマンドラインでは使えました。
みなさんアドバイス有難うございます。
マスターまでには時間がかかりそうですが,FORTRANとVC++の連動が出来ましたので,これにて締め切りさせて
頂きます。
No.2
- 回答日時:
詳しくは両方のコンパイラを持っていないとわかりませんので、概要程度です。
まず、fortranとCでは引数の渡し方が異なります。
fortranはcall by referenceと呼ばれる方法で、
Cはcall by valueと呼ばれる方法です。
意味は調べてみてください。
具体的にはコンパイラによって違うかも知れませんが、fortranで整数を渡している部分は、Cでは整数のポインタとして引数が来ている考える必要があります。
多次元配列を使っている場合、並び順がCとFORTRANでは異なるので合わせる必要があります。
Cならメモリに[0][0],[0][1],[0][2]の順にならびますが、FORTRANでは(0,0),(1,0),(2,0)の順になります。
それとコンパイラ依存になりますが、アセンブラレベルで引数を渡す方法を同じにする必要があります。
おおまかに言えば、全てスタックを使う場合と特定のレジスタを優先して使い足らない場合スタックを使う場合があります。
実際にどうかは各コンパイラについて調べて、合わせる必要があります。また、プログラム中で指定可能かも知れません。
(VC++にはある。)
あと、外部名を一致させる必要があります。
例えばCでfunc()という名まえの関数があってもこれはあくまで言語内部の名前で、他言語とのリンクを考える場合、リンカーが使う名前が問題になります。
確か、この場合は_func()という名前になったと思いますが。C++だと(オーバーロードがあるため)さらに複雑でおそらくそのまま使えませんから、Cインターフェイスを使用することになると思います。(extern "C")
逆にCからfunc()として呼び出すためには、_funcという名前にする必要があります。
fortranがどうなるかはコンパイラによります。多分、なんらかの手段は用意されていると思いますが。
多分、VFのマニュアルに説明があると思いますので調べてみてください。
初心者には難しいと思いますが。
有難うございます。理解できるよう調べていますが,まだうまくいきません。
おっしゃる通り,ソースコードが異なるFORTRANのサブルーチンを呼び出す場合は,ヘッダー部分に工夫が必要みたいですね。
No.1
- 回答日時:
VC++を使って出来たobjファイルがあるなら可能かもしれません。
場所は違うかもしれませんがvsv
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\bin\vcvars32.bat
を実行します。
cのソース(c.cpp)を改造します。
c.cppにプロトタイプ宣言を記述します。
void subroutine( int a, int b );
またよびだしたいところに、
subroutine( 10 , 20 );
を記述。
※aとbが整数型(32bit)だった場合です。
cのソースをコンパイルします。
cl c.cpp /c
これでc.objができます。
これをFortran8のobjとリンクします
cl c.obj f.obj
Intel Visual Fortran8.0については全く知らないので自信はありませんが。。。
アドバイス有難うございます。
試してみましたが,cl c.obj f.obj でリンクする際,
に未解決の外部シンボルとしてエラーが発生致しました。
FORTRANのサブルーチンを認識していないようです。
VC++
#include <stdio.h>
void subsub( int a, int b );
int main(void)
{
subsub( 10 , 20 );
return 0;
}
FORTRAN
subroutine subsub( i, j)
integer i, j
write(6,*) i,j
return
end
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) FORTRAN77の配列(除算) 2 2023/02/01 14:34
- その他(プログラミング・Web制作) Pythonの作業環境・作業フォルダの迅速な設定・指定方法 3 2022/04/01 07:55
- IT・エンジニアリング FORTRAN、COBOL、C、Java、C++とか誰が作ったのですか?言語習い使いまた出て、キリが 4 2023/05/06 23:11
- Visual Basic(VBA) フレームワーク「4.8.1」で、[Sub Main]が動かない。助けて下さい 3 2022/11/14 15:40
- Windows 10 Visual StudioとVisual C++ Build Toolsについて 1 2023/04/16 03:42
- その他(プログラミング・Web制作) Visual StudioでDjangoのプロジェクト配下のappを作成する方法 1 2022/05/01 03:47
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- C言語・C++・C# ExcelCS 1 2023/01/27 19:47
- C言語・C++・C# visual studioでフォームデザインを作成する時のVB.netとC#の違い 2 2023/06/22 03:04
- C言語・C++・C# 参考にいろいろとc言語、c++言語プログラミングでレジストリーを操作したいのですが、無料配布のc++ 3 2022/12/22 01:49
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数(関数)名の頭に_
-
C++でアボート(Abort)で処理が...
-
makeのエラーについて
-
sprintfを用いたフォーマット文...
-
C言語のワーニングメッセージの...
-
0除算して、落ちるプログラムと...
-
io.hをincludeするとそのような...
-
PC-9801用のフリーな高級言語を...
-
fortranでのNaNについて
-
初心者はIDE使わないほうが良く...
-
Excelで4096点以上のFFTの方法
-
あるプログラムのコマンドライ...
-
65536は2の何乗なのでしょうか?
-
Vba UserFormを前面に出す方法...
-
Bluestacks内でダウンロードし...
-
VBAの再計算が反映されない件に...
-
アルゴリズム
-
VBAで仕様書は書きますか?
-
拡張子 .gadget を開くプログラ...
-
正しい五十音順について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
C++ で、「)」が必要 というエ...
-
変数(関数)名の頭に_
-
Eclipseの環境設定について
-
ABAQUS ユーザーサブルーチン...
-
Visual C++とVisual C++.NETの違い
-
io.hをincludeするとそのような...
-
コンパイルできない
-
fortranでのNaNについて
-
「.c」拡張子でC++文法を使...
-
どのプログラミング言語ででき...
-
コンパイラフラグ(compiler fla...
-
関数の戻り値による変数の初期化
-
sprintfを用いたフォーマット文...
-
CPUが16bitでも32bitOSでコンパ...
-
不要なインクルードファイルの検出
-
volatile修飾について
-
IPアドレス表示プログラム
-
COBOL用のテキストエディタ
おすすめ情報